Package com.esri.gpt.catalog.search

Source Code of com.esri.gpt.catalog.search.ResourceIdentifier$ServiceInfo

/* 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.search;
import com.esri.gpt.catalog.context.CatalogConfiguration;
import com.esri.gpt.catalog.search.SearchEngineCSW.Scheme;
import com.esri.gpt.framework.context.ApplicationContext;
import com.esri.gpt.framework.context.ConfigurationException;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.context.UrnMap;
import com.esri.gpt.framework.util.Val;
import com.esri.gpt.server.csw.client.CswRecord;
import java.util.HashMap;
import java.util.List;

/**
* Identifies resource and content types.
*/
public class ResourceIdentifier {

  /** constructors ============================================================ */
 
  /** Default constructor. */
  public ResourceIdentifier() {}

  /** methods ================================================================= */
     
  /**
   * Guesses the ArcGIS Server SOAP endpoint for a MapServer server.
   * </br>Only MapServer services are considered.
   * @param serviceUrl the service URL
   * @return the ArcGIS MapServer SOAP endpoint (without "?wsdl", null if unknown)
   */
  public String guessAgsMapServerSoapUrl(String serviceUrl) {
    serviceUrl = Val.chkStr(serviceUrl);
    String url = serviceUrl.toLowerCase();
    if ((url.indexOf("arcgis/services") >= 0) &&
        (url.endsWith("/mapserver") || url.endsWith("/mapserver?wsdl"))) {
      int index = url.indexOf("/mapserver");
      return serviceUrl.substring(0,index+"/mapserver".length());
    }
    return null;
  }
 
  /**
   * Guesses the ArcGIS Server rest endpoint for a service.
   * @param serviceUrl the service URL
   * @return the service's ArcGIS Server rest endpoint (null if unknown)
   */
  public String guessAgsServiceRestUrl(String serviceUrl) {
    serviceUrl = Val.chkStr(serviceUrl);
    String url = serviceUrl.toLowerCase();
    if (url.contains("arcgis/rest") || url.contains("rest/services")) {
      String[] types = {"mapserver","imageserver","globeserver","gpserver",
                        "geocodeserver","geometryserver","networkserver","geodataserver"};
      for (String type: types) {
        int index = url.indexOf("/"+type);
        if (index > 0) {
          String serviceHomeUrl = serviceUrl.substring(0,index+("/"+type).length());
          if (serviceHomeUrl.contains("arcgis/rest") || serviceHomeUrl.contains("rest/services")) {
            return serviceHomeUrl;
          }
        }
      }
    }
    return null;
  }
 
  /**
   * Guesses the ArcIMS content type based upon a supplied resource type.
   * @param resourceType the resource type
   * @return the ArcIMS content type (empty String if none)
   */
  public String guessArcIMSContentTypeFromResourceType(String resourceType) {
    HashMap<String, String> map = new HashMap<String, String>();
 
    // ArcIMS codes
    map.put("livedata", "liveData");
    map.put("downloadabledata", "downloadableData");
    map.put("offlinedata", "offlineData");
    map.put("staticmapimage", "staticMapImage");
    map.put("document", "document");
    map.put("application", "application");
    map.put("geographicservice", "geographicService");
    map.put("clearinghouse", "clearinghouse");
    map.put("mapfiles", "mapFiles");
    map.put("geographicactivities", "geographicActivities");
    map.put("unknown", "unknown");
 
    // ISO CI_OnLineFunctionCode
    map.put("download", "downloadableData");
    map.put("order", "downloadableData");
    map.put("offlineaccess", "offlineData");
    map.put("search", "application");
    map.put("information", "application");
   
    // ISO hierarchyLevel/MD_ScopeCode@codeListValue
    map.put("service", "liveData");
    map.put("dataset", "downloadableData");
    map.put("series", "offlineData");
    //map.put("attribute", "");
    //map.put("attributeType", "");
    //map.put("collectionHardware", "");
    //map.put("collectionSession", "");
    //map.put("nonGeographicDataset", "");
    //map.put("dimensionGroup", "");
    //map.put("feature", "");
    //map.put("featureType", "");
    //map.put("propertyType", "");
    map.put("fieldSession", "geographicActivities");
    map.put("software", "application");
    map.put("model", "geographicService");
    map.put("tile", "staticMapImage");
   
    // FGDC Resource Descriptions
    map.put("live data and maps", "liveData");
    map.put("downloadable data", "downloadableData");
    map.put("offline data", "offlineData");
    map.put("static map images", "staticMapImage");
    map.put("other documents", "document");
    map.put("applications", "application");
    map.put("geographic services", "geographicService");
    map.put("clearinghouses", "clearinghouse");
    map.put("map files", "mapFiles");
    map.put("geographic activities", "geographicActivities");
 
    // FGDC variations
    map.put("live data", "liveData");
    map.put("static map image", "staticMapImage");
    map.put("other document", "document");
    map.put("documents", "document");
    map.put("geographic service", "geographicService");
    map.put("map file", "mapFiles");
    map.put("geographic activity", "geographicActivities");
 
    // Esri-Iso codes
    map.put("001", "liveData");
    map.put("002", "downloadableData");
    map.put("003", "offlineData");
    map.put("004", "staticMapImage");
    map.put("005", "document");
    map.put("006", "application");
    map.put("007", "geographicService");
    map.put("008", "clearinghouse");
    map.put("009", "mapFiles");
    map.put("010", "geographicActivities");
 
    resourceType = Val.chkStr(resourceType).toLowerCase();
    String imsContentType = Val.chkStr(map.get(resourceType));
    return imsContentType;
  }
 
  /**
   * Guesses the ArcIMS content type based upon a resultant CSW record.
   * @param cswRecord the CSW record resulting from a search
   * @return the ArcIMS content type ("unknown" is returned if the content type cannot be determined
   */
  public String guessArcIMSContentTypeFromResult(CswRecord cswRecord) {
   
    HashMap<String, String> map = new HashMap<String, String>();
   
    // ArcIMS codes
    map.put("livedata", "liveData");
    map.put("downloadabledata", "downloadableData");
    map.put("offlinedata", "offlineData");
    map.put("staticmapimage", "staticMapImage");
    map.put("document", "document");
    map.put("application", "application");
    map.put("geographicservice", "geographicService");
    map.put("clearinghouse", "clearinghouse");
    map.put("mapfiles", "mapFiles");
    map.put("geographicactivities", "geographicActivities");
    map.put("unknown", "unknown");
   
    String contentType = "";
    List<String> schemeVals = cswRecord.getTypes().get(Scheme.CONTENTTYPE_FGDC.getUrn());
    if (schemeVals.size() < 1) {
      schemeVals = cswRecord.getTypes().get(Scheme.CONTENTTYPE_ISO.getUrn());
    }
    if (schemeVals.size() < 1) {
      schemeVals = cswRecord.getTypes().get(null);
    }
    if (schemeVals.size() > 0) {
      contentType = schemeVals.get(0);
    }
   
    contentType = Val.chkStr(map.get(contentType));
    if (contentType.length() == 0) contentType = "unknown";
    return contentType;
   
  }

  /**
   * Guesses the ArcIMS content type based upon a given url.
   * @param url the resource url
   * @return the ArcIMS content type (empty String if none)
   */
  public String guessArcIMSContentTypeFromUrl(String url) {
 
    String imsContentType = "";
    url = Val.chkStr(url).toLowerCase();
 
    if (url.contains("service=wms") || url.contains("wmsserver")
        || url.contains("com.esri.wms.esrimap")) {
      imsContentType = "liveData";
    } else if (url.contains("service=wfs") || url.contains("wfsserver")) {
      imsContentType = "liveData";
    } else if (url.contains("service=wcs") || url.contains("wcsserver")) {
      imsContentType = "liveData";
    } else if (url.contains("service=csw") || url.contains("cswserver")) {
    } else if (url.contains("service=sos")) {
      imsContentType = "liveData";
    } else if (url.contains("com.esri.esrimap.esrimap")) {
      imsContentType = "liveData";
    } else if (url.endsWith(".nmf") || (url.indexOf("f=nmf") != -1)) {
      imsContentType = "liveData";
    } else if (url.endsWith(".lyr") || (url.indexOf("f=lyr") != -1)) {
      imsContentType = "liveData";
    } else if (url.endsWith(".zip")) {
      imsContentType = "downloadableData";
    } else if (url.endsWith(".lpk") || url.endsWith(".pkinfo") || url.endsWith(".e00")) {
      imsContentType = "downloadableData";
    } else if (url.startsWith("ftp://") || url.startsWith("ftps://")) {
      imsContentType = "downloadableData";
    } else if (url.endsWith(".gz") || url.endsWith(".tgz") || url.endsWith(".tar") ||
               url.endsWith(".rar") || url.endsWith(".dbf") || url.endsWith(".shp") ||
               url.endsWith(".xls") || url.endsWith(".txt") || url.endsWith(".dwg") ||
               url.endsWith(".dxf") || url.endsWith(".dgn")) {
      imsContentType = "downloadableData";
    } else if (url.endsWith(".mxd")) {
      imsContentType = "liveData";
    } else if (url.endsWith(".kml") || url.endsWith(".kmz")
        || (url.indexOf("f=kml") > -1)) {
      imsContentType = "geographicActivities";
    } else if (url.endsWith(".xml")
        && (url.contains("rss") || url.contains("georss"))) {
      imsContentType = "geographicActivities";
    } else if (url.contains("arcgis/rest") || url.contains("arcgis/services") ||
               url.contains("rest/services")) {
      if (url.contains("/mapserver")) {
        imsContentType = "liveData";
      } else if (url.contains("/globeserver")) {
        imsContentType = "liveData";
      } else if (url.contains("/imageserver")) {
        imsContentType = "liveData";
      } else if (url.contains("/gpserver")) {
        imsContentType = "geographicService";
      } else if (url.contains("/geocodeserver")) {
        imsContentType = "geographicService";
      } else if (url.contains("/geometryserver")) {
        imsContentType = "geographicService";
      } else if (url.contains("/networkserver")) {
        imsContentType = "geographicService";
      } else if (url.contains("/geodataserver")) {
        imsContentType = "geographicService";
      } else {
        imsContentType = "geographicService";
      }
    }
    return imsContentType;
  }

  /**
   * Guesses a service type from a URL.
   * @param url the url
   * @return the service type
   */
  public String guessServiceTypeFromUrl(String url) {
    ServiceInfo si = guessServiceFromUrl(url);
    return si!=null? si.getServiceType(): "";
  }

  /**
   * Guesses an URN of service type from a URL.
   * @param url the url
   * @return URN of service type
   */
  public String guessServiceUrnFromUrl(String url) {
    ServiceInfo si = guessServiceFromUrl(url);
    return si!=null? si.getServiceUrn(): "";
  }

  /**
   * Guesses a service info from a URL.
   * @param url the url
   * @return service info
   */
  private ServiceInfo guessServiceFromUrl(String url) {
    url = Val.chkStr(url).toLowerCase();
    if (url.contains("service=wms") || url.contains("wmsserver")
        || url.contains("com.esri.wms.esrimap")) {
      return createServiceInfoFor("wms");
    } else if (url.contains("service=wfs") || url.contains("wfsserver")) {
      return createServiceInfoFor("wfs");
    } else if (url.contains("service=wcs") || url.contains("wcsserver")) {
      return createServiceInfoFor("wcs");
    } else if (url.contains("com.esri.esrimap.esrimap")) {
      return createServiceInfoFor("aims");
    } else if (url.contains("arcgis/rest") || url.contains("arcgis/services") ||
               url.contains("rest/services")) {
      return createServiceInfoFor("ags");
    } else if (url.indexOf("service=csw") > 0) {
      return createServiceInfoFor("csw");
    } else if (url.indexOf("service=sos") > 0) {
      return createServiceInfoFor("sos");
    } else if (url.endsWith(".nmf")) {
      return createServiceInfoFor("ArcGIS:nmf");
    } else if (url.endsWith(".lyr")) {
      return createServiceInfoFor("ArcGIS:lyr");
    } else if (url.endsWith(".mxd")) {
      return createServiceInfoFor("ArcGIS:mxd");
    } else if (url.endsWith(".kml")) {
      return createServiceInfoFor("kml");
    } else if (url.endsWith(".kmz")) {
      return createServiceInfoFor("kml");
    }
    return null;
  }
 
  private ServiceInfo createServiceInfoFor(String name) {
    UrnMap urnMap = UrnMap.getInstance();
    String urn = urnMap.getUrn("", name);
    return new ServiceInfo(name, urn);
  }
 
  /**
   * Instantiates a new resource identifier.
   * <p/>
   * By default, a new instance of
   * com.esri.gpt.catalog.search.ResourceIdentifier is returned.
   * <p/>
   * This can be overridden by the configuration parameter:
   * /gptConfig/catalog/parameter@key="resourceLinkIdentifier"
   * @param context the active request context
   * @return the resource identifier
   */
  public static ResourceIdentifier newIdentifier(RequestContext context) {
 
    // initialize
    CatalogConfiguration catCfg = null;
    if (context != null) {
      catCfg = context.getCatalogConfiguration();
    } else {
      ApplicationContext appCtx = ApplicationContext.getInstance();
      catCfg = appCtx.getConfiguration().getCatalogConfiguration();
    }
 
    // look for a configured class name for the resource identifier
    String className = Val.chkStr(catCfg.getParameters().getValue("resourceLinkIdentifier"));
    if (className.length() == 0) {
      className = com.esri.gpt.catalog.search.ResourceIdentifier.class.getName();
    }
 
    // instantiate the object
    try {
      Class<?> cls = Class.forName(className);
      Object obj = cls.newInstance();
      if (obj instanceof ResourceIdentifier) {
        ResourceIdentifier linkIdentifier = (ResourceIdentifier)obj;
        return linkIdentifier;
      } else {
        String sMsg = "The configured resourceLinkIdentifier parameter is invalid: "+className;
        throw new ConfigurationException(sMsg);
      }
    } catch (ConfigurationException t) {
      throw t;
    } catch (Throwable t) {
      String sMsg = "Error instantiating resource link identifier: " + className;
      throw new ConfigurationException(sMsg, t);
    }
  }
 
  /**
   * Service info.
   */
  private static class ServiceInfo {
    private String serviceType;
    private String serviceUrn;
   
    public ServiceInfo(String serviceType, String serviceUrn) {
      this.serviceType = Val.chkStr(serviceType);
      this.serviceUrn = Val.chkStr(serviceUrn);
    }
   
    public String getServiceType() {
      return serviceType;
    }
   
    public String getServiceUrn() {
      return serviceUrn;
    }
  }
}
TOP

Related Classes of com.esri.gpt.catalog.search.ResourceIdentifier$ServiceInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.