/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You 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.catalog.schema; import java.util.HashMap; import java.util.Map; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import com.esri.gpt.catalog.discovery.IStoreable; import com.esri.gpt.catalog.schema.indexable.Indexables; import com.esri.gpt.catalog.search.ResourceIdentifier; import com.esri.gpt.framework.util.UuidUtil; import com.esri.gpt.framework.util.Val; import org.w3c.dom.Document; import org.w3c.dom.Node; /** * Maintains information associated with ESRI tags within a metadata document. */ public class EsriTags { // class variables ============================================================= public static Map<String,String> DATA_THEME_CODES; // instance variables ========================================================== private String _aimsContentType = ""; private String _contentDevType = ""; private String _primaryOnlink = ""; private String _publishedDocId = ""; private String _pubSource = ""; private String _resourceType = ""; private String _resourceUrl = ""; private String _server = ""; private String _service = ""; private String _serviceParams = ""; private String _serviceType = ""; private String _thumbnailBinary = null; // static initialization ======================================================= static { HashMap<String,String> map = new HashMap<String,String>(); map.put("001","farming"); map.put("002","biota"); map.put("003","boundaries"); map.put("004","climatologyMeteorologyAtmosphere"); map.put("005","economy"); map.put("006","elevation"); map.put("007","environment"); map.put("008","geoscientificInformation"); map.put("009","health"); map.put("010","imageryBaseMapsEarthCover"); map.put("011","intelligenceMilitary"); map.put("012","inlandWaters"); map.put("013","location"); map.put("014","oceans"); map.put("015","planningCadastre"); map.put("016","society"); map.put("017","structure"); map.put("018","transportation"); map.put("019","utilitiesCommunication"); DATA_THEME_CODES = map; } // constructors ================================================================ /** Default constructor. */ public EsriTags() {} // properties ================================================================== /** * Gets the ArcIMS content type. * @return the ArcIMS content type */ public String getArcIMSContentType() { return _aimsContentType; } /** * Sets the ArcIMS content type. * @param type the ArcIMS content type */ public void setArcIMSContentType(String type) { _aimsContentType = Val.chkStr(type); } /** * Gets the content developer type. * @return the content developer type */ public String getContentDevType() { return _contentDevType; } /** * Sets the content developer type. * @param type the content developer type */ public void setContentDevType(String type) { _contentDevType = Val.chkStr(type); } /** * Gets the primary online linkage url. * @return the primary online linkage url */ public String getPrimaryOnlink() { return _primaryOnlink; } /** * Sets the primary online linkage url. * @param url the primary online linkage url */ public void setPrimaryOnlink(String url) { _primaryOnlink = Val.chkStr(url); } /** * Gets the published UUID for the document. * @return the published UUID */ public String getPublishedDocId() { return _publishedDocId; } /** * Sets the published UUID for the document. * @param uuid the published UUID */ public void setPublishedDocId(String uuid) { _publishedDocId = UuidUtil.addCurlies(uuid); } /** * Gets the publication source. * @return the publication source */ public String getPubSource() { return _pubSource; } /** * Sets the publication source. * @param source the publication source */ public void setPubSource(String source) { _pubSource = Val.chkStr(source); } /** * Gets the resource type. * @return the resource type */ public String getResourceType() { return _resourceType; } /** * Sets the resource type. * @param type the resource type */ public void setResourceType(String type) { _resourceType = Val.chkStr(type); } /** * Gets the resource URL. * @return the resource URL */ private String getResourceUrl() { return _resourceUrl; } /** * Sets the resource URL. * @param url the resource URL */ private void setResourceUrl(String url) { _resourceUrl = Val.chkStr(url); } /** * Gets the map server. * @return the map server */ public String getServer() { return _server; } /** * Sets the map server. * @param server the map server */ public void setServer(String server) { _server = Val.chkStr(server); } /** * Gets the map service. * @return the map service */ public String getService() { return _service; } /** * Sets the map service. * @param service the map service */ public void setService(String service) { _service = Val.chkStr(service); } /** * Gets the map service query parameters. * @return the map service query parameters */ public String getServiceParams() { return _serviceParams; } /** * Sets the map service query parameters. * @param parameters the map service query parameters */ public void setServiceParams(String parameters) { _serviceParams = Val.chkStr(parameters); } /** * Gets the map service type. * @return the map service type */ public String getServiceType() { return _serviceType; } /** * Sets the map service type. * @param type the map service type */ public void setServiceType(String type) { _serviceType = Val.chkStr(type); } /** * Gets the base64 encoded string for the thumbnail image. * @return the base64 encoded string for the thumbnail image */ public String getThumbnailBinary() { return _thumbnailBinary; } /** * Sets the base64 encoded string for the thumbnail image. * @param base64 the base64 encoded string for the thumbnail image */ public void setThumbnailBinary(String base64) { _thumbnailBinary = base64; } // methods ===================================================================== /** * Applies meaning associated with evaluated ESRI tags * @param schema the schema to which evaluated meanings will be applied * @param esriTags the evaluated ESRI tags */ private void apply(Schema schema) { ResourceIdentifier ri = ResourceIdentifier.newIdentifier(null); // published doc id String sEsriDocID = schema.getMeaning().getEsriDocID(); if ((sEsriDocID == null) || (sEsriDocID.length() == 0)) { sEsriDocID = this.getPublishedDocId(); if ((sEsriDocID != null) && (sEsriDocID.length() > 0)) { schema.getMeaning().setEsriDocID(sEsriDocID); } } // thumbnail binary String base64Thumbnail = schema.getMeaning().getThumbnailBinary(); if ((base64Thumbnail == null) || (base64Thumbnail.length() == 0)) { base64Thumbnail = this.getThumbnailBinary(); if ((base64Thumbnail != null) && (base64Thumbnail.length() > 0)) { schema.getMeaning().setThumbnailBinary(base64Thumbnail); } } // website URL String sWebsiteUrl = schema.getMeaning().getWebsiteUrl(); if ((sWebsiteUrl == null) || (sWebsiteUrl.length() == 0)) { sWebsiteUrl = this.getPrimaryOnlink(); if ((sWebsiteUrl != null) && (sWebsiteUrl.length() > 0)) { IStoreable storeable = schema.getMeaning().getStoreables().get(Meaning.MEANINGTYPE_WEBSITE_URL); if (storeable != null) { storeable.setValue(sWebsiteUrl); } } } // resource URL String sResourceUrl = schema.getMeaning().getResourceUrl(); //if ((sResourceUrl == null) || (sResourceUrl.length() == 0)) { sResourceUrl = Val.chkStr(this.makeResourceUrl(ri)); if (sResourceUrl.length() > 0) { IStoreable storeable = schema.getMeaning().getStoreables().get(Meaning.MEANINGTYPE_RESOURCE_URL); if (storeable != null) { storeable.setValue(sResourceUrl); try { for (Section section : schema.getSections().values()) { for (Parameter param : section.getParameters().values()) { if (param.getMeaningType().equalsIgnoreCase(Meaning.MEANINGTYPE_RESOURCE_URL)) { if ((param.getContent() != null) && (param.getContent().getSingleValue() != null)) { //String sCurrent = param.getContent().getSingleValue().getValue(); //if ((sCurrent == null) || (sCurrent.length() == 0)) { param.getContent().getSingleValue().setValue(sResourceUrl); //} } } } } } catch (Exception e) {} } } //} // content type String sContentType = schema.getMeaning().getArcIMSContentType(); if ((sContentType == null) || (sContentType.length() == 0)) { sContentType = this.getArcIMSContentType(); if ((sContentType != null) && (sContentType.length() > 0)) { schema.getMeaning().setArcIMSContentType(sContentType); } } } /** * Evaluates ESRI tags within a document. * @param schema the schema being evaluated * @param dom the XML document associated with the schema */ public void evaluate(Schema schema, Document dom) { try { XPath xpath = XPathFactory.newInstance().newXPath(); Node ndEsri = (Node)xpath.evaluate("/metadata/Esri",dom,XPathConstants.NODE); if (ndEsri != null) { this.setPublishedDocId(xpath.evaluate("PublishedDocID",ndEsri)); this.setServer(xpath.evaluate("Server",ndEsri)); this.setService(xpath.evaluate("Service",ndEsri)); this.setServiceType(xpath.evaluate("ServiceType",ndEsri)); this.setServiceParams(xpath.evaluate("ServiceParam",ndEsri)); this.setPrimaryOnlink(xpath.evaluate("primaryOnlink",ndEsri)); this.setContentDevType(xpath.evaluate("ContentDevType",ndEsri)); this.setResourceType(xpath.evaluate("resourceType",ndEsri)); this.setPubSource(xpath.evaluate("PubSourceCd",ndEsri)); } String base64Thumbnail = xpath.evaluate("/metadata/Binary/Thumbnail/Data",dom); if ((base64Thumbnail != null) && (base64Thumbnail.length() > 0)) { this.setThumbnailBinary(base64Thumbnail); } } catch (XPathExpressionException e) { // ignore, never thrown } } /** * Makes a resource URL from a set of ESRI tags. */ public String makeResourceUrl(ResourceIdentifier resourceIdentifier) { // initialize String sResourceUrl = ""; String sServer = this.getServer(); String sService = this.getService(); String sServiceType = this.getServiceType(); String sServiceParams = this.getServiceParams(); if (sServer.length() > 0) { // ArcIMS image/feature/metadata services if (sServiceType.equalsIgnoreCase("image") || sServiceType.equalsIgnoreCase("feature") || sServiceType.equalsIgnoreCase("metadata")) { String sEsrimap = "servlet/com.esri.esrimap.Esrimap"; if (sServer.indexOf(sEsrimap) == -1) { if ((sServer.indexOf("?") == -1) && (sServer.indexOf("&") == -1)) { if (!sServer.endsWith("/")) sServer += "/"; if (sService.length() > 0) sResourceUrl = sServer+sEsrimap+"?ServiceName="+sService; } } else { if ((sServer.indexOf("?") == -1) && (sServer.indexOf("&") == -1)) { if (!sServer.endsWith("/")) sServer += "/"; if (sService.length() > 0) sResourceUrl = sServer+"?ServiceName="+sService; } else if (sServer.indexOf("ServiceName=") == -1) { if (sServer.indexOf("?") == -1) { if (!sServer.endsWith("/")) sServer += "/"; sResourceUrl = sServer+"?ServiceName="+sService; } else { sResourceUrl = sServer+"&ServiceName="+sService; } } } if (sResourceUrl.length() > 0) { if (sServiceType.equalsIgnoreCase("image")) { this.setArcIMSContentType("liveData"); } else if (sServiceType.equalsIgnoreCase("feature")) { //if (meaning != null) meaning.setArcIMSContentType("liveData"); sResourceUrl = ""; } else if (sServiceType.equalsIgnoreCase("metadata")) { //if (meaning != null) meaning.setArcIMSContentType("liveData"); sResourceUrl = ""; } } // OGC services } else { if ((sServer.indexOf("?") == -1) && (sServer.indexOf("&") == -1)) { if (sServiceParams.length() > 0) { if (!sServiceParams.startsWith("?")) sServer += "?"; sServer += sServiceParams; } } String sContentType = resourceIdentifier.guessArcIMSContentTypeFromUrl(sServer); if ((sContentType.length() > 0) && !sContentType.equalsIgnoreCase("unknown")) { this.setArcIMSContentType(sContentType); sResourceUrl = sServer; } } } return sResourceUrl; } }