Package com.esri.gpt.catalog.arcgis.agportal.publication

Source Code of com.esri.gpt.catalog.arcgis.agportal.publication.ItemInfoLuceneAdapter

/* 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.arcgis.agportal.publication;

import java.io.IOException;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.document.MapFieldSelector;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.IndexSearcher;

import com.esri.gpt.catalog.arcgis.agportal.itemInfo.ESRI_ItemInformation;
import com.esri.gpt.catalog.lucene.LuceneIndexAdapter;
import com.esri.gpt.catalog.lucene.Storeables;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.geometry.Envelope;
import com.esri.gpt.framework.util.Val;
import java.util.Arrays;

/**
* Builds ESRI_ItemInformation by querying Lucene index.
* NOTE! This is EXPERIMENTAL feature. It might be removed at any time in the future.
*/
public class ItemInfoLuceneAdapter {

  /**
   * instance variables ======================================================
   */
  private LuceneIndexAdapter baseAdapter;
  private IndexSearcher searcher;

  /**
   * constructors ============================================================
   */

  /** Default constructor */
  public ItemInfoLuceneAdapter() {
  }

  /**
   * methods =================================================================
   */

  /**
   * Closes any open resources.
   */
  public void close() {
    if ((this.baseAdapter != null) && (this.searcher != null)) {
      this.baseAdapter.closeSearcher(this.searcher);
    }
  }

  /**
   * Gets the index srch.
   *
   * @param context
   *          the operation context
   * @return the index srch
   * @throws CorruptIndexException
   *           if the index is corrupt
   * @throws IOException
   *           if an I/O exception occurs
   */
  private IndexSearcher getSearcher(RequestContext context)
      throws CorruptIndexException, IOException {
    if (this.searcher != null) {
      return this.searcher;
    } else {
      if (this.baseAdapter == null) {
        this.baseAdapter = new LuceneIndexAdapter(context);
      }
      this.searcher = this.baseAdapter.newSearcher();
      return this.searcher;
    }
  }

  /**
   * Returns the field values associated with a document
   *
   * @param context
   *          the operation context
   * @param fields
   *          array of fields to fetch
   * @param uuid
   *          the document uuid
   * @return the field values (null if not found)
   * @throws CorruptIndexException
   *           if the index is corrupt
   * @throws IOException
   *           if an I/O exception occurs
   */
  public ESRI_ItemInformation makeItemInfoByUuid(RequestContext context, String[] fields,
      String uuid) throws CorruptIndexException, IOException {
    TermDocs termDocs = null;
    IndexReader reader = null;
    MapFieldSelector selector = null;
    try {
      uuid = Val.chkStr(uuid);
      if (uuid.length() > 0) {
        IndexSearcher srch = this.getSearcher(context);
        reader = srch.getIndexReader();
        if (fields != null) {
          selector = new MapFieldSelector(fields);
        }
        termDocs = reader.termDocs();
        termDocs.seek(new Term(Storeables.FIELD_UUID, uuid));
        if (termDocs.next()) {
          Document document = reader.document(termDocs.doc(), selector);
          List<Fieldable> flds = document.getFields();
                   
          ESRI_ItemInformation itemInfo = new ESRI_ItemInformation();
                    itemInfo.setType("Map Service");
                    itemInfo.setTags(Arrays.asList(new String[]{"ArcGIS","Server map","service"}));
                   
          Envelope extent = new Envelope();
          for (Fieldable fld : flds) {
            String fieldName = fld.name();
            String[] vals = document.getValues(fieldName);
                        if (fieldName.contains("uuid")) {
                          itemInfo.setId(vals[0].replaceAll("^\\{|\\}$|\\-", ""));
                        } else if (fieldName.contains("title")) {
              itemInfo.setTitle(vals[0]);
              itemInfo.setName(vals[0]);
            } else if (fieldName.contains("resource.url")) {
              itemInfo.setUrl(vals[0]);
              String type = Val.chkStr(guessServiceTypeFromUrl(vals[0]));
              if (type.length() > 0) {
                itemInfo.setType(type);
              }
            } else if (fieldName.contains("contentType")) {
            } else if (fieldName.contains("keywords")) {
              itemInfo.setTypeKeywords(Arrays.asList(vals));
              itemInfo.setTags(Arrays.asList(vals));
            } else if (fieldName.contains("dataTheme")) {
              itemInfo.setTags(Arrays.asList(vals));
            } else if (fieldName.contains("abstract")) {
              itemInfo.setDescription(vals[0]);
//            } else if (fieldName.contains("xml")) {
//              itemInfo.setXml(vals[0]);
            } else if (fieldName.contains("minx")) {
              extent.setMinX(vals[0]);
            } else if (fieldName.contains("miny")) {
              extent.setMinY(vals[0]);
            } else if (fieldName.contains("maxx")) {
              extent.setMaxX(vals[0]);
            } else if (fieldName.contains("maxy")) {
              extent.setMaxY(vals[0]);
            } else if (fieldName.contains("thumbnail.url")) {
              itemInfo.setThumbnailUrl(vals[0]);
            }
          }
          itemInfo.setExtent(extent);
          return itemInfo;
        }
      }
    } finally {
      try {
        if (termDocs != null)
          termDocs.close();
        if (reader != null)
          reader.close();
      } catch (Exception ef) {
      }
    }
    return null;
  }

  /**
   * Guesses a service type from a URL.
   *
   * @param url
   *          the url
   * @return the service type
   */
  private String guessServiceTypeFromUrl(String url) {
    String serviceType = "";
    String[] types = { "mapserver", "imageserver", "globeserver",
        "featureserver", "gpserver", "geocodeserver", "geometryserver",
        "networkserver", "geodataserver" };
    url = Val.chkStr(url).toLowerCase();
    if (url.contains("arcgis/rest") || url.contains("arcgis/services")
        || url.contains("rest/services")) {
      serviceType = "ags";
      if (url.contains(types[0])) {
        serviceType = "Map Service";
      } else if (url.contains(types[1])) {
        serviceType = "Image Service";
      } else if (url.contains(types[2])) {
        serviceType = "Globe Service";
      } else if (url.contains(types[3])) {
        serviceType = "Feature Service";
      } else {
        serviceType = "Map Service";
      }
    } else if (url.contains("wmsserver")) {
      serviceType = "Web Map";
    } else if (url.endsWith(".nmf")) {
      serviceType = "Explorer Document";
    } else if (url.endsWith(".lyr")) {
      serviceType = "Layer File";
    } else if (url.endsWith(".mxd")) {
      serviceType = "ArcMap Document";
    } else if (url.endsWith(".lpk")) {
      serviceType = "Layer Package";
    } else if (url.endsWith(".ncgf")) {
      serviceType = "Explorer Application Configuration";
    } else if (url.endsWith(".mpk")) {
      serviceType = "Map Package";
    } else if (url.endsWith(".wmpk")) {
      serviceType = "Mobile Package";
    } else if (url.endsWith(".zip")) {
      serviceType = "Map template";
    } else if (url.endsWith(".esriaddin")) {
      serviceType = "Desktop Add In";
    } else if (url.endsWith(".eaz")) {
      serviceType = "Explorer Add In";
    }

    return serviceType;
  }

}
TOP

Related Classes of com.esri.gpt.catalog.arcgis.agportal.publication.ItemInfoLuceneAdapter

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.