Package com.esri.gpt.control.livedata

Source Code of com.esri.gpt.control.livedata.ArcIMSRendererFactory

/* 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.control.livedata;

import com.esri.gpt.control.livedata.selector.HttpRequestDefinition;
import com.esri.gpt.control.livedata.selector.IHttpResponseListener;
import com.esri.gpt.control.livedata.selector.IRegistry;
import com.esri.gpt.control.livedata.selector.ISetter;
import com.esri.gpt.framework.geometry.Envelope;
import com.esri.gpt.framework.http.ResponseInfo;
import com.esri.gpt.framework.util.Val;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
* ArcIMS renderer factory.
*/
/*package*/ class ArcIMSRendererFactory extends MapBasedRendererFactory {

  /** predicate */
  private static final String PREDICATE = "servlet/com.esri.esrimap.Esrimap?ServiceName=";
  /** context path */
  private String contextPath = "";
  /** proxy URL */
  private String proxyUrl = "";

  /**
   * Creates instance of the factory.
   * @param properties properties
   * @param contextPath context path
   * @param proxyUrl proxy url
   */
  public ArcIMSRendererFactory(ILiveDataProperties properties, String contextPath, String proxyUrl) {
    super(properties);
    this.contextPath = contextPath != null ? contextPath.trim() : "";
    this.proxyUrl = proxyUrl != null ? proxyUrl.trim() : "";
  }

  @Override
  public void register(IRegistry reg, final ISetter setter, final String url) {
    int qmark = url.indexOf(PREDICATE);
    if (qmark < 0)
      return;

    String service = url.substring(qmark + PREDICATE.length() + 1);
    if (service == null || service.length() == 0)
      return;

    String strRequest =
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
      + "<ARCXML version=\"1.1\">"
      + "<REQUEST>"
      + "<GET_SERVICE_INFO fields=\"false\" envelope=\"true\" dataframe=\"#DEFAULT#\" toc=\"false\"/>"
      + "</REQUEST>"
      + "</ARCXML>";

    reg.register(new HttpRequestDefinition(url, strRequest), new IHttpResponseListener() {

      public void onResponse(ResponseInfo info, String strContent, Document docContent) {
        if (docContent != null) {
          try {
            XPathFactory xPathFactory = XPathFactory.newInstance();
            XPath xPath = xPathFactory.newXPath();

            if (xPath.evaluate("/ARCXML/RESPONSE/ERROR", docContent, XPathConstants.NODE) == null) {
              Envelope env = null;
              Node ndEnvelope = (Node) xPath.evaluate("/ARCXML/RESPONSE/SERVICEINFO/PROPERTIES/ENVELOPE", docContent, XPathConstants.NODE);
              if (ndEnvelope != null) {
                String minx = Val.chkStr((String) xPath.evaluate("@minx", ndEnvelope, XPathConstants.STRING));
                String maxx = Val.chkStr((String) xPath.evaluate("@maxx", ndEnvelope, XPathConstants.STRING));
                String miny = Val.chkStr((String) xPath.evaluate("@miny", ndEnvelope, XPathConstants.STRING));
                String maxy = Val.chkStr((String) xPath.evaluate("@maxy", ndEnvelope, XPathConstants.STRING));
                String wkid = Val.chkStr((String) xPath.evaluate("/ARCXML/RESPONSE/SERVICEINFO/PROPERTIES/FEATURECOORDSYS/@id", docContent, XPathConstants.STRING), "4326");
                env = makeExtent(minx, miny, maxx, maxy, wkid);
              }
              final Envelope envelope = env;

              final String servUrl = url;

              setter.set(new ArcIMSRenderer() {

                @Override
                protected Envelope getExtent() {
                  return envelope;
                }

                @Override
                protected String getUrl() {
                  return servUrl;
                }

                @Override
                protected String getProxyUrl() {
                  return contextPath + proxyUrl;
                }

                @Override
                protected int getMapHeightAdjustment() {
                  return getProperties().getMapHeightAdjustment();
                }
              });
            }
          } catch (Exception ex) {
          }
        }
      }
    });
  }

  /**
   * Creates envelope from string reprezentations of coordinates.
   * @param sMinX minx
   * @param sMinY miny
   * @param sMaxX maxx
   * @param sMaxY maxy
   * @param wkid wkid
   * @return envelope or <code>null</code> if envelope can not be created
   */
  private Envelope makeExtent(String sMinX, String sMinY, String sMaxX, String sMaxY, String wkid) {
    if (sMinX.length() > 0 && sMaxX.length() > 0 && sMinY.length() > 0 && sMaxY.length() > 0) {
      double minx = Val.chkDbl(sMinX, -180.0);
      double maxx = Val.chkDbl(sMaxX, 180.0);
      double miny = Val.chkDbl(sMinY, -90.0);
      double maxy = Val.chkDbl(sMaxY, 90.0);
      Envelope envelope = new Envelope(minx, miny, maxx, maxy);
      envelope.setWkid(wkid);
      return envelope;
    }
    return null;
  }
}
TOP

Related Classes of com.esri.gpt.control.livedata.ArcIMSRendererFactory

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.