/* * Copyright 2012 Esri. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.esri.gpt.server.erosfeed; import com.esri.gpt.catalog.search.*; import com.esri.gpt.control.georss.AtomFeedWriter; import com.esri.gpt.control.georss.IFeedRecord; import com.esri.gpt.control.georss.IFeedRecords; import com.esri.gpt.framework.util.Val; import java.io.PrintWriter; import java.io.Writer; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; /** * Eros atom feed writer. */ public class ErosAtomFeedWriter extends AtomFeedWriter { private static String namespace = "sdi"; /** * The LOGGER. */ private static final Logger LOGGER = Logger.getLogger(AtomFeedWriter.class.getName()); /** * The DAT e_ forma t_ pattern. */ private final String DATE_FORMAT_PATTERN = "yyyy-MM-dd"; /** * The TIM e_ forma t_ pattern. */ private final String TIME_FORMAT_PATTERN = "kk:mm:ss"; private PrintWriter _writer; ErosEmailFinder emailFinder; private ResourceIdentifier resourceIdentifier; public ErosAtomFeedWriter(ErosEmailFinder emailFinder, ResourceIdentifier resourceIdentifier, PrintWriter writer) { super(writer); this.emailFinder = emailFinder; this.resourceIdentifier = resourceIdentifier; this._writer = writer; } public ErosAtomFeedWriter(ErosEmailFinder emailFinder, ResourceIdentifier resourceIdentifier, PrintWriter writer, String entryBaseUrl) { super(writer, entryBaseUrl); this.emailFinder = emailFinder; this.resourceIdentifier = resourceIdentifier; this._writer = writer; } @Override public void write(IFeedRecords records) { AtomFeed af = new AtomFeed(); af.addStringToXmlHeader(" xmlns:" + namespace + "=\"http://www.geodata.gov/" + namespace + "_atom\""); String sTitle = getMessageBroker().retrieveMessage("catalog.rest.title"); String sDescription = getMessageBroker().retrieveMessage("catalog.rest.description"); String sCopyright = getMessageBroker().retrieveMessage("catalog.rest.copyright"); String sGenerator = getMessageBroker().retrieveMessage("catalog.rest.generator"); if (sTitle.startsWith("???")) { sTitle = ""; } if (sDescription.startsWith("???")) { sDescription = ""; } if (sCopyright.startsWith("???")) { sCopyright = ""; } if (sGenerator.startsWith("???")) { sGenerator = ""; } af.setTitle(sTitle); af.setDescription(sDescription); af.setAuthor(sGenerator); af.setCopyright(sCopyright); af.setLink(getEntryBaseUrl()); af.setId(getEntryBaseUrl()); af.setUpdated(new Date()); af.setOsProps(records.getOpenSearchProperties()); for (IFeedRecord record : records) { ErosAtomEntry ae = new ErosAtomEntry(); ae.setId(record.getUuid()); ae.setPublished(record.getModfiedDate()); ae.setTitle(record.getTitle()); ae.setSummary(record.getAbstract()); for (ResourceLink link : record.getResourceLinks()) { ae.addResourceLink(link); } ae.addResourceLink(record.getResourceLinks().getThumbnail()); if (record.getEnvelope() != null) { ae.setMinx(record.getEnvelope().getMinX()); ae.setMiny(record.getEnvelope().getMinY()); ae.setMaxx(record.getEnvelope().getMaxX()); ae.setMaxy(record.getEnvelope().getMaxY()); } // Eros specific ae.setResourceUrl(record.getResourceUrl()); ae.setEmailAddress(findEmailAddress(record)); ae.setServiceType(findServiceType(record)); ae.setMetadataUrl(findMetadataUrl(record)); af.addEntry(ae); } af.WriteTo(_writer); } private String findEmailAddress(IFeedRecord record) { return emailFinder.findEmail(record.getUuid()); } private String findServiceType(IFeedRecord record) { String serviceType = record.getServiceType().isEmpty() ? resourceIdentifier.guessServiceTypeFromUrl(record.getResourceUrl()) : record.getServiceType(); if (serviceType.equals("ags") ) { if (record.getResourceUrl().endsWith("MapServer")) { serviceType += "mapserver"; } if (record.getResourceUrl().endsWith("FeatureServer")) { serviceType += "featureserver"; } if (record.getResourceUrl().endsWith("ImageServer")) { serviceType += "imageserver"; } } return serviceType; } private String findMetadataUrl(IFeedRecord record) { ResourceLinks rLinks = record.getResourceLinks(); return rLinks != null ? Val.chkStr(rLinks.findUrlByTag(ResourceLink.TAG_METADATA)) : ""; } public class ErosAtomEntry extends AtomEntry { /** * The ENTIT y_ ope n_ tag. */ private final String ENTITY_OPEN_TAG = "<entry>"; /** * The ENTIT y_ clos e_ tag. */ private final String ENTITY_CLOSE_TAG = "</entry>"; /** * The TITL e_ ope n_ tag. */ private final String TITLE_OPEN_TAG = "<title>"; /** * The TITL e_ clos e_ tag. */ private final String TITLE_CLOSE_TAG = "</title>"; // private final String LINK_TAG = "<link type=\"text/html\" href=\"?\"/>"; /** * The LIN k_ tag. */ private final String LINK_TAG = "<link href=\"?\"/>"; /** * The I d_ ope n_ tag. */ private final String ID_OPEN_TAG = "<id>"; /** * The I d_ clos e_ tag. */ private final String ID_CLOSE_TAG = "</id>"; /** * The UPDATE d_ ope n_ tag. */ private final String UPDATED_OPEN_TAG = "<updated>"; /** * The UPDATE d_ clos e_ tag. */ private final String UPDATED_CLOSE_TAG = "</updated>"; /** * The SUMMAR y_ ope n_ tag. */ private final String SUMMARY_OPEN_TAG = "<summary>"; /** * The SUMMAR y_ clos e_ tag. */ private final String SUMMARY_CLOSE_TAG = "</summary>"; /** * The BO x_ ope n_ tag. */ private final String BOX_OPEN_TAG = "<georss:box>"; /** * The BO x_ clos e_ tag. */ private final String BOX_CLOSE_TAG = "</georss:box>"; /** * The RES t_ fin d_ pattern. */ private final String REST_FIND_PATTERN = "/rest/document/"; private String resourceUrl; private String serviceType; private String emailAddress; private String metadataUrl; public String getResourceUrl() { return resourceUrl; } public void setResourceUrl(String resourceUrl) { this.resourceUrl = Val.chkStr(resourceUrl); } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } public String getServiceType() { return serviceType; } public void setServiceType(String serviceType) { this.serviceType = serviceType; } public String getMetadataUrl() { return metadataUrl; } public void setMetadataUrl(String metadataUrl) { this.metadataUrl = metadataUrl; } @Override public void WriteTo(Writer writer) { String data = ""; if (writer == null) { return; } try { writer.append(ENTITY_OPEN_TAG); if (getTitle() != null) { try { data = TITLE_OPEN_TAG + Val.escapeXml(getTitle()) + TITLE_CLOSE_TAG; writer.append(data); } catch (Exception e) { LOGGER.log(Level.WARNING, "", e); } } // add the rest of links if they exist // if (getLinks() != null) { // // for (String lnk : getLinks()) { // try { // data = LINK_TAG.replace("?", Val.escapeXml(lnk)); // writer.append(data); // } catch (Exception e) { // LOGGER.log(Level.WARNING, "", e); // } // } // } if (getId() != null) { try { data = Val.escapeXml(getId()); data = ID_OPEN_TAG + data + ID_CLOSE_TAG; writer.append(data); } catch (Exception e) { LOGGER.log(Level.WARNING, "", e); } } // if (getPublished() != null) { // try { // SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_PATTERN); // data = format.format(getPublished()); // format = new SimpleDateFormat(TIME_FORMAT_PATTERN); // data = data + "T" + format.format(getPublished()) + "Z"; // data = UPDATED_OPEN_TAG + data + UPDATED_CLOSE_TAG; // writer.append(data); // } catch (Exception e) { // LOGGER.log(Level.WARNING, "", e); // } // } // if (getSummary() != null) { // try { // data = SUMMARY_OPEN_TAG + Val.escapeXml(getSummary()) // + SUMMARY_CLOSE_TAG; // writer.append(data); // } catch (Exception e) { // LOGGER.log(Level.WARNING, "", e); // } // } // if (hasEnvelope()) { // try { // data = BOX_OPEN_TAG + getMiny() + " " + getMinx() + " " + getMaxy() // + " " + getMaxx() + BOX_CLOSE_TAG; // writer.append(data); // } catch (Exception e) { // LOGGER.log(Level.WARNING, "", e); // } // } // if (getCustomElements() != null) { // writer.append(Val.chkStr(getCustomElements())); // } // Eros specific writer.append("<" + namespace + ":serviceUrl>" + Val.escapeXml(getResourceUrl()) + "</" + namespace + ":serviceUrl>"); writer.append("<" + namespace + ":serviceType>" + Val.escapeXml(getServiceType()) + "</" + namespace + ":serviceType>"); writer.append("<" + namespace + ":emailAddress>" + Val.escapeXml(getEmailAddress()) + "</" + namespace + ":emailAddress>"); // writer.append("<" + namespace + ":emailAddress>" + "" + "</" + namespace + ":emailAddress>"); writer.append("<" + namespace + ":metadataUrl>" + Val.escapeXml(getMetadataUrl()) + "</" + namespace + ":metadataUrl>"); writer.append(ENTITY_CLOSE_TAG); } catch (Exception e) { LOGGER.log(Level.WARNING, "", e); } } /** * Checks for envelope. * * @return true, if successful */ private boolean hasEnvelope() { return !(getMinx() == 0 && getMiny() == 0 && getMaxx() == 0 && getMaxy() == 0); } } }