com.esri.gpt.catalog.arcgis.agportal.publication.ItemInfoLuceneAdapter.java Source code

Java tutorial

Introduction

Here is the source code for com.esri.gpt.catalog.arcgis.agportal.publication.ItemInfoLuceneAdapter.java

Source

/* 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;
    }

}