From: <jes...@us...> - 2009-03-10 09:15:49
|
Revision: 2456 http://geonetwork.svn.sourceforge.net/geonetwork/?rev=2456&view=rev Author: jesseeichar Date: 2009-03-10 09:15:29 +0000 (Tue, 10 Mar 2009) Log Message: ----------- emails are sent and items are unpublished Modified Paths: -------------- sandbox/geocat.ch/trunk/.gitignore sandbox/geocat.ch/trunk/src/org/fao/geonet/services/metadata/DetectOld.java sandbox/geocat.ch/trunk/web/geonetwork/WEB-INF/config-metadata.xml sandbox/geocat.ch/trunk/web/geonetwork/loc/eng/xml/strings.xml Added Paths: ----------- sandbox/geocat.ch/trunk/web/geonetwork/xsl/metadata_expire_operations.xsl Modified: sandbox/geocat.ch/trunk/.gitignore =================================================================== --- sandbox/geocat.ch/trunk/.gitignore 2009-03-10 09:12:20 UTC (rev 2455) +++ sandbox/geocat.ch/trunk/.gitignore 2009-03-10 09:15:29 UTC (rev 2456) @@ -1,3 +1,4 @@ +junk gast/setup/sample-data/*.mef web/geonetwork/WEB-INF/data/* web/geonetwork/WEB-INF/db/* Modified: sandbox/geocat.ch/trunk/src/org/fao/geonet/services/metadata/DetectOld.java =================================================================== --- sandbox/geocat.ch/trunk/src/org/fao/geonet/services/metadata/DetectOld.java 2009-03-10 09:12:20 UTC (rev 2455) +++ sandbox/geocat.ch/trunk/src/org/fao/geonet/services/metadata/DetectOld.java 2009-03-10 09:15:29 UTC (rev 2456) @@ -1,11 +1,15 @@ package org.fao.geonet.services.metadata; +import static java.text.MessageFormat.format; + import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.Calendar; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Properties; @@ -26,7 +30,6 @@ import jeeves.server.ServiceConfig; import jeeves.server.context.ServiceContext; import jeeves.utils.Util; -import jeeves.utils.Xml; import org.apache.lucene.document.Document; import org.apache.lucene.search.ConstantScoreRangeQuery; @@ -66,17 +69,29 @@ public class DetectOld implements Service { - private Element uiRequestResponse; - private String smtpHost; - private ServiceType serviceType; - private String baseURL; - private String emailFrom; + private static final String UNSENT_NOTIFICATIONS = "unsentNotifications"; + private static final String SENT_NOTIFICATIONS = "sentNotifications"; + public static final String AUTHOR_SUBJECT = "Please update metadata"; + public static final String ADMIN_OLD_METADATA_SUBJECT = "Metadata not updated recently"; + public static final String ADMIN_FAILED_EMAIL_SUBJECT = "Failures notifying metadata owners of expiredMetadata"; + public static final String ADMIN_UNPUBLISH_SUBJECT = "Old Metadata have been unpublished"; + public static final String AUTHOR_INTRO = "The following metadata entries have not been updated within the last {0} months. They must be updated or they will be unpublished.\n\n Login as the user: {1} in order to edit the metadata elements\n\n"; + public static final String ADMIN_OLD_DATA_INTRO = "The following metadata entries have not been updated in {0} months."; + public static final String ADMIN_FAILED_EMAIL_INTRO = "The following metadata elements need to be updated but authors cannot be contacted:"; + public static final String ADMIN_UNPUBLISH_INTRO = "The following metadata entries have not been updated in {0} months and have been unpublished."; + public static final String USER_SUMMARY = "\n\nuser: {0} email: {1} \n====================================================\n"; + public static final String METADATA_SUMMARY = "{0}\nURL: {1}\nLast updated: {2}\n\n"; + + private Element uiRequestResponse; + private String smtpHost; + private ServiceType serviceType; + private String baseURL; + private String adminEmail; + public Element exec(Element params, ServiceContext context) throws Exception { - int limit; - Multimap<String, EmailInfo> results; switch (serviceType) { @@ -89,12 +104,31 @@ default: limit = parseLimit(params); results = doSearch(limit, context); - break; + Element notifications = emailResults(limit, results).getChild(SENT_NOTIFICATIONS); + notifications.setName("unpublishedItems"); + unpublish (results,context); + return notifications; + } - return null; } + private void unpublish(Multimap<String, EmailInfo> results, ServiceContext context) throws Exception + { + if( results.size()>1 ){ + Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB); + StringBuilder query = new StringBuilder("DELETE FROM OperationAllowed WHERE groupId=1 AND (metadataId="); + Iterator<EmailInfo> iter = results.values().iterator(); + query.append(iter.next().metadataId); + while (iter.hasNext()) { + query.append(" OR metadataId="); + query.append(iter.next().metadataId); + } + query.append(")"); + dbms.execute(query.toString()); + } + } + private int parseLimit(Element params) throws BadInputEx { String limit; @@ -116,6 +150,7 @@ ISODate to = new ISODate(calendar.getTimeInMillis()); ConstantScoreRangeQuery query = new ConstantScoreRangeQuery("_changeDate", null, to.getDate(), false, false); + DuplicateDocFilter filter = new DuplicateDocFilter(query); MultiLingualIndexSupport support = new MultiLingualIndexSupport(sm.getLuceneDir()); @@ -127,15 +162,49 @@ Iterator iterator = hits.iterator(); Multimap<String, EmailInfo> results = new HashMultimap<String, EmailInfo>(); while (iterator.hasNext()) { - Document document = ((Hit) iterator.next()).getDocument(); + Hit hit = (Hit) iterator.next(); + Document document = hit.getDocument(); EmailInfo emailInfo = new EmailInfo(document, baseURL); + results.put(emailInfo.ownerId, emailInfo); } + removeUnpublishedElements(results,context); updateEmails(results, context); return results; } + private void removeUnpublishedElements(Multimap<String, EmailInfo> results, ServiceContext context) throws Exception + { + if (results.size() > 0) { + StringBuilder query = new StringBuilder("SELECT metadataId FROM OperationAllowed WHERE groupId=1 AND (metadataId="); + + Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB); + Iterator<EmailInfo> iter = results.values().iterator(); + query.append(iter.next().metadataId); + while (iter.hasNext()) { + query.append(" OR metadataId="); + query.append(iter.next().metadataId); + } + + query.append(")"); + + List<Element> listAllow = dbms.select(query.toString()).getChildren(); + HashSet<String> set = new HashSet<String>(); + + for (Element element : listAllow) { + set.add(element.getChildText("metadataid")); + } + + for (Iterator<EmailInfo> infoIter = results.values().iterator(); infoIter.hasNext(); ) { + EmailInfo info = infoIter.next(); + if( !set.contains(info.metadataId) ){ + infoIter.remove(); + } + } + } + } + private void updateEmails(Multimap<String, EmailInfo> results, ServiceContext context) throws Exception { if (results.size() > 0) { @@ -167,69 +236,76 @@ { Element xmlResponse = new Element("oldElements"); - Element failedNotifications = new Element("unsentItems"); - Element notifications = new Element("sentItems"); + Element failedNotifications = new Element(UNSENT_NOTIFICATIONS); + Element notifications = new Element(SENT_NOTIFICATIONS); xmlResponse.addContent(failedNotifications); xmlResponse.addContent(notifications); - + + StringBuilder adminMessage; + if (ServiceType.EMAIL == serviceType) { + adminMessage = new StringBuilder(format(ADMIN_OLD_DATA_INTRO, limit)); + } else { + adminMessage = new StringBuilder(format(ADMIN_UNPUBLISH_INTRO, limit)); + } + // dont need a specific message for unpublish because this is used only + // by email + StringBuilder failedMessage = new StringBuilder(ADMIN_FAILED_EMAIL_INTRO); + for (Map.Entry<String, Collection<EmailInfo>> data : results.asMap().entrySet()) { - - EmailInfo sampleInfo=null; - Element item = new Element("item"); - - Element metadata = new Element("metadata"); + EmailInfo sampleInfo = null; + + Element owner = new Element("owner"); + + final StringBuilder metadataSummary = new StringBuilder(); for (EmailInfo info : data.getValue()) { + Element metadata = new Element("metadata"); sampleInfo = info; - + metadata.setAttribute("changeDate", info.changeDate); metadata.setAttribute("id", info.metadataId); metadata.setAttribute("title", info.title); Element url = new Element("url"); url.setText(info.metadataUrl.toExternalForm()); + metadata.addContent(url); + owner.addContent(metadata); + + metadataSummary.append(format(METADATA_SUMMARY, info.title, info.metadataUrl, info.changeDate)); } String emailTo = sampleInfo.email; - - Element owner = new Element("owner"); + owner.setAttribute("ownerUsername", sampleInfo.ownerUsername); owner.setAttribute("id", sampleInfo.ownerId); owner.setAttribute("email", emailTo); - item.addContent(owner); - item.addContent(metadata); + String userSummary = format(USER_SUMMARY, sampleInfo.ownerUsername, sampleInfo.email); - if (emailTo == null || emailTo.length() == 0) { - failedNotifications.addContent(item); - continue; + if (serviceType == ServiceType.EMAIL && (emailTo == null || emailTo.length() == 0)) { + failedNotifications.addContent(owner); + failedMessage.append(userSummary); + failedMessage.append(metadataSummary); } else { - notifications.addContent(item); - - final String emailSubject = "Please update metadata"; - - final String intro = "The following metadata entries are {0} months old and must be updated or they will be unpublished.\n\n You must login as the user: {1} in order to edit the metadata elements\n\n"; - final StringBuilder emailBody = new StringBuilder(); - emailBody.append(MessageFormat.format(intro, limit, sampleInfo.ownerUsername)); - for ( EmailInfo info : data.getValue()) { - emailBody.append(info.title); - emailBody.append("\nURL: "); - emailBody.append(info.metadataUrl); - emailBody.append("\nLast updated: "); - emailBody.append(info.changeDate); - emailBody.append("\n\n"); + if (serviceType == ServiceType.EMAIL) { + String msg = MessageFormat.format(AUTHOR_INTRO, limit, sampleInfo.ownerUsername) + metadataSummary; + sendEmail(emailTo, AUTHOR_SUBJECT, msg); } - sendEmail(emailTo, emailSubject, emailBody.toString()); + notifications.addContent(owner); + adminMessage.append(userSummary); + adminMessage.append(metadataSummary); } } - - if( !failedNotifications.getChildren().isEmpty() ){ - String emailBody="The following document lists metadata owners that the metadata.expired.email service was incapable of contacting about their expiring metdata:\n"; - - String xml = Xml.getString(failedNotifications); - sendEmail(emailFrom, "Failures notifying metadata owners of expiredMetadata", emailBody+xml); + if (serviceType == ServiceType.EMAIL) { + sendEmail(adminEmail, ADMIN_OLD_METADATA_SUBJECT, adminMessage.toString()); + } else { + sendEmail(adminEmail, ADMIN_UNPUBLISH_SUBJECT, adminMessage.toString()); } - + + if (!failedNotifications.getChildren().isEmpty()) { + sendEmail(adminEmail, ADMIN_FAILED_EMAIL_SUBJECT, failedMessage.toString()); + } + return xmlResponse; } @@ -242,7 +318,7 @@ final Session session = Session.getInstance(props, null); final MimeMessage message = new MimeMessage(session); - message.setFrom(new InternetAddress(emailFrom)); + message.setFrom(new InternetAddress(adminEmail)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); message.setSubject(emailSubject); @@ -266,13 +342,18 @@ case EMAIL: smtpHost = params.getMandatoryValue("smtphost"); baseURL = params.getMandatoryValue("baseURL"); - if( !baseURL.endsWith("/") ){ + if (!baseURL.endsWith("/")) { baseURL += "/"; } - emailFrom = params.getMandatoryValue("from"); + adminEmail = params.getMandatoryValue("from"); break; case UNPUBLISH: - // do nothing + smtpHost = params.getMandatoryValue("smtphost"); + baseURL = params.getMandatoryValue("baseURL"); + if (!baseURL.endsWith("/")) { + baseURL += "/"; + } + adminEmail = params.getMandatoryValue("from"); break; default: { @@ -306,6 +387,7 @@ final String title; final String changeDate; final String metadataId; + final String language; public EmailInfo(Document doc, String basicAddress) throws MalformedURLException { @@ -318,7 +400,9 @@ } changeDate = doc.get("_changeDate"); metadataId = doc.get("_id"); + language = doc.get("_locale"); } } + } Modified: sandbox/geocat.ch/trunk/web/geonetwork/WEB-INF/config-metadata.xml =================================================================== --- sandbox/geocat.ch/trunk/web/geonetwork/WEB-INF/config-metadata.xml 2009-03-10 09:12:20 UTC (rev 2455) +++ sandbox/geocat.ch/trunk/web/geonetwork/WEB-INF/config-metadata.xml 2009-03-10 09:15:29 UTC (rev 2456) @@ -415,8 +415,8 @@ <service name="metadata.expired.email" type="xml"> <class name=".services.metadata.DetectOld"> + <param name="serviceType" value="email" /> <param name="smtphost" value="mail.camptocamp.com" /> - <param name="serviceType" value="email" /> <param name="from" value="jes...@ca..." /> <param name="baseURL" value="http://lhotse.wrk.lsn.camptocamp.com:8080/geonetwork/srv/eng" /> </class> @@ -425,6 +425,8 @@ <service name="metadata.expired.unpublish" type="xml"> <class name=".services.metadata.DetectOld"> <param name="serviceType" value="unpublish" /> + <param name="smtphost" value="mail.camptocamp.com" /> + <param name="from" value="jes...@ca..." /> <param name="baseURL" value="http://lhotse.wrk.lsn.camptocamp.com:8080/geonetwork/srv/eng" /> </class> </service> Modified: sandbox/geocat.ch/trunk/web/geonetwork/loc/eng/xml/strings.xml =================================================================== --- sandbox/geocat.ch/trunk/web/geonetwork/loc/eng/xml/strings.xml 2009-03-10 09:12:20 UTC (rev 2455) +++ sandbox/geocat.ch/trunk/web/geonetwork/loc/eng/xml/strings.xml 2009-03-10 09:15:29 UTC (rev 2456) @@ -672,4 +672,5 @@ <xmlInsertTitle>XML Metadata Insert</xmlInsertTitle> <xmlTab>XML view</xmlTab> <zip>Zip</zip> + <metadata.expired.formTitle>Expired Metadata</metadata.expired.formTitle> </strings> Added: sandbox/geocat.ch/trunk/web/geonetwork/xsl/metadata_expire_operations.xsl =================================================================== --- sandbox/geocat.ch/trunk/web/geonetwork/xsl/metadata_expire_operations.xsl (rev 0) +++ sandbox/geocat.ch/trunk/web/geonetwork/xsl/metadata_expire_operations.xsl 2009-03-10 09:15:29 UTC (rev 2456) @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + <xsl:output method="html" /> + <xsl:include href="main.xsl" /> + <xsl:template name="content"> + <table width="100%" height="100%"> + <tr> + <td> + <xsl:call-template name="formLayout"> + <xsl:with-param name="title"> + <xsl:value-of select="/root/gui/strings/metadata.expired.formTitle" /> + </xsl:with-param> + + <xsl:with-param name="content"> + <xsl:call-template name="form" /> + </xsl:with-param> + <xsl:with-param name="buttons"> + <button onclick="javascript:doSearchSubmit(1);" class="content"> + <xsl:value-of select="/root/gui/strings/search" /> + </button> +   + <xsl:call-template name="buttonAdd"> + <xsl:with-param name="typename"> + <xsl:value-of select="/root/response/wfs/featureType/@typename" /> + </xsl:with-param> + <xsl:with-param name="wfs"> + <xsl:value-of select="/root/response/wfs/@id" /> + </xsl:with-param> + </xsl:call-template> +   + <button class="content" type="button" onclick="load('{/root/gui/locService}/admin');"><xsl:value-of select="/root/gui/strings/back"/></button> + </xsl:with-param> + <xsl:with-param name="formfooter" select="'false'"/> + </xsl:call-template> + </td> + </tr> + </table> + </xsl:template> + + +</xsl:stylesheet> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |