/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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 org.apache.synapse.config;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class Util {
private static final Log log = LogFactory.getLog(Util.class);
/**
* Return a StreamSource for the given Object
* @param o the object
* @return the StreamSource
*/
public static StreamSource getStreamSource(Object o) {
if (o == null) {
handleException("Cannot convert null to a StreamSource");
} else if (o instanceof OMNode) {
OMNode omNode = (OMNode) o;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
omNode.serialize(baos);
return new StreamSource(new ByteArrayInputStream(baos.toByteArray()));
} catch (XMLStreamException e) {
handleException("Error converting to a StreamSource", e);
}
} else {
handleException("Cannot convert object to a StreamSource");
}
return null;
}
public static InputStream getInputStream(Object o) {
if (o == null) {
handleException("Cannot convert null to a StreamSource");
} else if (o instanceof OMElement) {
OMElement omElement = (OMElement) o;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
omElement.serialize(baos);
return new ByteArrayInputStream(baos.toByteArray());
} catch (XMLStreamException e) {
handleException("Error converting to a StreamSource", e);
}
} else {
handleException("Cannot convert object to a StreamSource");
}
return null;
}
/**
* Get an object from a given URL. Will first fetch the content from the
* URL and depending on the content-type, a suitable XMLToObjectMapper
* (if available) would be used to transform this content into an Object.
* If a suitable XMLToObjectMapper cannot be found, the content would be
* treated as XML and an OMNode would be returned
* @param url the URL to the resource
* @return an Object created from the given URL
*/
public static Object getObject(URL url) {
try {
URLConnection urlc = url.openConnection();
XMLToObjectMapper xmlToObject =
getXmlToObjectMapper(urlc.getContentType());
try {
XMLStreamReader parser = XMLInputFactory.newInstance().
createXMLStreamReader(urlc.getInputStream());
StAXOMBuilder builder = new StAXOMBuilder(parser);
OMElement omElem = builder.getDocumentElement();
// detach from URL connection and keep in memory
// TODO remove this
omElem.build();
if (xmlToObject != null) {
return xmlToObject.getObjectFromOMNode(omElem);
} else {
return omElem;
}
} catch (XMLStreamException e) {
log.warn("Content at URL : " + url + " is non XML..");
return urlc.getContent();
}
} catch (IOException e) {
handleException("Error connecting to URL : " + url, e);
}
return null;
}
private static void handleException(String msg, Exception e) {
log.error(msg, e);
throw new SynapseException(msg, e);
}
private static void handleException(String msg) {
log.error(msg);
throw new SynapseException(msg);
}
/**
* Return a suitable XMLToObjectMapper for the given content type if one
* is available, else return null;
* @param contentType the content type for which a mapper is required
* @return a suitable XMLToObjectMapper or null if none can be found
*/
public static XMLToObjectMapper getXmlToObjectMapper(String contentType) {
return null;
}
}