Package com.esri.gpt.control.webharvest.client.atom

Source Code of com.esri.gpt.control.webharvest.client.atom.AtomProxy$NativeImpl

/* 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.webharvest.client.atom;

import java.io.IOException;
import java.util.logging.Logger;

import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.esri.gpt.catalog.schema.NamespaceContextImpl;
import com.esri.gpt.catalog.schema.Namespaces;
import com.esri.gpt.framework.http.HttpClientRequest;
import com.esri.gpt.framework.http.XmlHandler;
import com.esri.gpt.framework.resource.api.Native;
import com.esri.gpt.framework.resource.api.SourceUri;
import com.esri.gpt.framework.resource.common.CommonPublishable;
import com.esri.gpt.framework.resource.common.UrlUri;
import com.esri.gpt.framework.util.ResourceXml;
import com.esri.gpt.framework.util.Val;
import com.esri.gpt.framework.xml.DomUtil;
import com.esri.gpt.framework.xml.NodeListAdapter;
import com.esri.gpt.framework.xml.XmlIoUtil;

/**
* Atom feed proxy.
*/
class AtomProxy {
/** logger */
private static final Logger LOGGER = Logger.getLogger(AtomProxy.class.getCanonicalName());
/** service info */
private BaseAtomInfo info;

/**
* Creates instance of the proxy.
* @param info service info
*/
public AtomProxy(BaseAtomInfo info) {
  if (info==null) throw new IllegalArgumentException("No info provided.");
  this.info = info;
}

public String read(String sourceUri) throws IOException {
  LOGGER.finer("Reading metadata of source URI: \"" +sourceUri+ "\" through proxy: "+this);
  try {
    sourceUri = Val.chkStr(sourceUri).replaceAll("\\{", "%7B").replaceAll("\\}", "%7D");
    HttpClientRequest cr = new HttpClientRequest();
    cr.setUrl(info.newReadMetadataUrl(sourceUri));
    XmlHandler sh = new XmlHandler(false);
    cr.setContentHandler(sh);
    cr.setCredentialProvider(info.newCredentialProvider());
    cr.setBatchHttpClient(info.getBatchHttpClient());
    cr.execute();
    Document doc = sh.getDocument();
    XPath xPath = XPathFactory.newInstance().newXPath();
    Node node = (Node) xPath.evaluate(
        "/feed/entry",
        doc, XPathConstants.NODE);
    Node elementNode = null;
    for (Node nd : new NodeListAdapter(node.getChildNodes())) {
      if (nd.getNodeType()==Node.ELEMENT_NODE) {
        elementNode = nd;
        break;
      }
    }
    if (elementNode==null) {
      throw new IOException("Error extracting metadata from <metadata> node.");
    }
    Document mdDoc = DomUtil.newDocument();
    mdDoc.appendChild(mdDoc.importNode(elementNode, true));
    String mdText = XmlIoUtil.domToString(mdDoc);
    LOGGER.finer("Received metadata of source URI: \"" +sourceUri+ "\" through proxy: "+this);
    LOGGER.finest(mdText);
    return mdText;
  } catch (TransformerException ex) {
    throw new IOException("Error accessing metadata. Cause: "+ex.getMessage());
  } catch (SAXException ex) {
    throw new IOException("Error accessing metadata. Cause: "+ex.getMessage());
  } catch (ParserConfigurationException ex) {
    throw new IOException("Error accessing metadata. Cause: "+ex.getMessage());
  } catch (XPathExpressionException ex) {
    throw new IOException("Error accessing metadata. Cause: "+ex.getMessage());
  }
}

@Override
public String toString() {
  return info.toString();
}

/**
* Gets native resource.
* @return native resource
*/
public Native getNativeResource() {
  return new NativeImpl();
}
/**
* Native implementation.
*/
private class NativeImpl extends CommonPublishable implements Native {
 
    @Override
  public SourceUri getSourceUri() {
    return new UrlUri(info.getUrl());
  }

    @Override
  public String getContent() throws IOException, SAXException {
    ResourceXml resourceXml = new ResourceXml();
    String feedXml = resourceXml.makeResourceXmlFromResponse(info.getUrl().replaceAll("\\{", "'").replaceAll("\\}","'"));
    Document fDom = null;
  try {
    fDom = DomUtil.makeDomFromString(feedXml, true);
  } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  XPath xPath = AtomNamespaceUtil.makeXPath(true);
    NodeList entries = null;
    Node feedNd = null;
  try {
    feedNd = (Node) xPath.evaluate("/atom:feed", fDom, XPathConstants.NODE);
    entries = (NodeList) xPath.evaluate("/atom:feed/atom:entry", fDom, XPathConstants.NODESET);   
  } catch (XPathExpressionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
    for (Node entry : new NodeListAdapter(entries)) {
      feedNd.removeChild(entry);
    }
    try {
      String xml = Val.chkStr(XmlIoUtil.domToString(fDom));
      if(xml.length() > 0){
        int endTagStartIdx = xml.lastIndexOf("</");
        int endTagEndIdx = xml.lastIndexOf(">");
        String lastTag = xml.substring(endTagStartIdx,endTagEndIdx+1);
        String[] parts = xml.split(lastTag);
        if(parts != null && parts.length > 0){
          parts[0] = parts[0].trim();
        }
        xml = parts[0] + "\n" + lastTag;
      }
     
    return xml;
  } catch (TransformerException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  return feedXml;
  }
}
}
TOP

Related Classes of com.esri.gpt.control.webharvest.client.atom.AtomProxy$NativeImpl

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.