/*
*Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*WSO2 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 org.wso2.esb.integration.common.clients.proxy.admin;
import junit.framework.Assert;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.WSDL2Constants;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.core.axis2.ProxyService;
import org.wso2.carbon.proxyadmin.stub.ProxyServiceAdminProxyAdminException;
import org.wso2.carbon.proxyadmin.stub.ProxyServiceAdminStub;
import org.wso2.carbon.proxyadmin.stub.types.carbon.Entry;
import org.wso2.carbon.proxyadmin.stub.types.carbon.ProxyData;
import org.wso2.carbon.proxyadmin.stub.types.carbon.ProxyServicePolicyInfo;
import org.wso2.esb.integration.common.clients.client.utils.AuthenticateStub;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* This class exposing internal command methods to invoke ProxyAdmin admin service
*/
public class ProxyServiceAdminClient {
private static final Log log = LogFactory.getLog(ProxyServiceAdminClient.class);
private ProxyServiceAdminStub proxyServiceAdminStub;
private final String serviceName = "ProxyServiceAdmin";
/**
* Authenticate stub
*
* @param backEndUrl server backend URL
* @throws org.apache.axis2.AxisFault
*/
public ProxyServiceAdminClient(String backEndUrl, String sessionCookie) throws AxisFault {
String endPoint = backEndUrl + serviceName;
proxyServiceAdminStub = new ProxyServiceAdminStub(endPoint);
AuthenticateStub.authenticateStub(sessionCookie, proxyServiceAdminStub);
}
public ProxyServiceAdminClient(String backEndUrl, String userName, String password)
throws AxisFault {
String endPoint = backEndUrl + serviceName;
proxyServiceAdminStub = new ProxyServiceAdminStub(endPoint);
AuthenticateStub.authenticateStub(userName, password, proxyServiceAdminStub);
}
/**
* Adding proxy service
*
* @param proxyName Name of the proxy service
* @param wsdlURI WSDL URI
* @param serviceEndPoint Service endpoint location
* @throws ProxyServiceAdminProxyAdminException
* proxyAdmin Service exception
* @throws java.rmi.RemoteException Remote Exception
*/
public void addProxyService(String proxyName, String wsdlURI,
String serviceEndPoint)
throws Exception {
String[] transport = {"http", "https"};
ProxyData data = new ProxyData();
data.setName(proxyName);
data.setWsdlURI(wsdlURI);
data.setTransports(transport);
data.setStartOnLoad(true);
//data.setEndpointKey("http://localhost:9000/services/SimpleStockQuoteService");
data.setEndpointXML("<endpoint xmlns=\"http://ws.apache.org/ns/synapse\"><address uri=\"" + serviceEndPoint + "\" /></endpoint>");
data.setEnableSecurity(true);
try {
proxyServiceAdminStub.addProxy(data);
} catch (Exception e) {
throw new Exception("Error while adding proxy ", e);
}
log.info("Proxy Added");
}
/**
* Adding proxy service
*
* @param dh Data Handler
* @throws ProxyServiceAdminProxyAdminException
* Proxy service admin exception
* @throws java.rmi.RemoteException Remote exception
* @throws javax.xml.stream.XMLStreamException
* Exception
*/
public void addProxyService(DataHandler dh)
throws ProxyServiceAdminProxyAdminException, IOException, XMLStreamException {
XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(dh.getInputStream());
//create the builder
StAXOMBuilder builder = new StAXOMBuilder(parser);
//get the root element (in this case the envelope)
OMElement documentElement = builder.getDocumentElement();
ProxyData proxyData = getProxyData(documentElement.toString());
log.info("Proxy Added");
}
/**
* @param data
* @throws ProxyServiceAdminProxyAdminException
*
* @throws java.io.IOException
* @throws javax.xml.stream.XMLStreamException
*/
public void addProxyService(OMElement data)
throws Exception {
ProxyData proxyData = getProxyData(data.toString());
try {
proxyServiceAdminStub.addProxy(proxyData);
} catch (Exception e) {
throw new Exception("Error while adding proxy ", e);
}
log.info("Proxy Added");
}
/**
* Delete proxy service
*
* @param proxyName Name of the proxy service to be deleted
* @throws ProxyServiceAdminProxyAdminException
* proxy admin exception
* @throws java.rmi.RemoteException remote exception
*/
public void deleteProxy(String proxyName)
throws ProxyServiceAdminProxyAdminException, RemoteException {
AuthenticateStub auth = new AuthenticateStub();
proxyServiceAdminStub.deleteProxyService(proxyName);
log.info("Proxy Deleted");
}
/**
* Stop proxy service
*
* @param proxyName name of the proxy
* @throws ProxyServiceAdminProxyAdminException
* proxy admin exception
* @throws java.rmi.RemoteException remote exception
*/
public void stopProxyService(String proxyName)
throws ProxyServiceAdminProxyAdminException, RemoteException {
proxyServiceAdminStub.stopProxyService(proxyName);
log.info("Proxy Deactivated");
}
/**
* Start proxy service
*
* @param proxyName name of the proxy
* @throws ProxyServiceAdminProxyAdminException
* proxy admin exception
* @throws java.rmi.RemoteException remote exception
*/
public void startProxyService(String proxyName)
throws ProxyServiceAdminProxyAdminException, RemoteException {
proxyServiceAdminStub.startProxyService(proxyName);
log.info("Proxy activated");
}
/**
* Redeploy proxy service
*
* @param proxyName name of the proxy
* @throws ProxyServiceAdminProxyAdminException
* proxy admin exception
* @throws java.rmi.RemoteException Remote Exception
*/
public void reloadProxyService(String proxyName)
throws ProxyServiceAdminProxyAdminException, RemoteException {
proxyServiceAdminStub.redeployProxyService(proxyName);
log.info("Proxy Redeployed");
}
/**
* Get proxy service details
*
* @param proxyName proxy service name
* @return proxy data
* @throws ProxyServiceAdminProxyAdminException
* Admin stub exception
* @throws java.rmi.RemoteException Remote Exception
*/
public ProxyData getProxyDetails(String proxyName)
throws ProxyServiceAdminProxyAdminException, RemoteException {
return proxyServiceAdminStub.getProxy(proxyName);
}
/**
* Method used to create proxy data
*
* @param proxyString proxy configuration
* @return proxy data
*/
//this function from org.wso2.carbon.org.wso2.carbon.org.wso2.carbon.proxyadmin.service in proxy-admin modules
public ProxyData getProxyData(String proxyString) {
final String BUNDLE = "org.wso2.carbon.proxyadmin.Resources";
ProxyData pd = new ProxyData();
ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE, Locale.US);
try {
byte[] bytes = null;
try {
bytes = proxyString.getBytes("UTF8");
} catch (UnsupportedEncodingException e) {
log.error("Unable to extract bytes in UTF-8 encoding. " +
"Extracting bytes in the system default encoding" + e.getMessage());
bytes = proxyString.getBytes();
}
OMElement elem = new StAXOMBuilder(
new ByteArrayInputStream(bytes)).getDocumentElement();
// check whether synapse namespace is present in the configuration.
Iterator itr = elem.getAllDeclaredNamespaces();
OMNamespace ns;
boolean synapseNSPresent = false;
while (itr.hasNext()) {
ns = (OMNamespace) itr.next();
if (XMLConfigConstants.SYNAPSE_NAMESPACE.equals(ns.getNamespaceURI())) {
synapseNSPresent = true;
break;
}
}
OMAttribute name = elem.getAttribute(new QName("name"));
if (name != null) {
pd.setName(name.getAttributeValue());
}
OMAttribute statistics = elem.getAttribute(new QName(XMLConfigConstants.STATISTICS_ATTRIB_NAME));
if (statistics != null) {
String statisticsValue = statistics.getAttributeValue();
if (statisticsValue != null) {
if (XMLConfigConstants.STATISTICS_ENABLE.equals(statisticsValue)) {
pd.setEnableStatistics(true);
} else if (XMLConfigConstants.STATISTICS_DISABLE.equals(statisticsValue)) {
pd.setEnableStatistics(false);
}
}
}
OMAttribute trans = elem.getAttribute(new QName("transports"));
if (trans != null) {
String transports = trans.getAttributeValue();
if (transports == null || "".equals(transports) || ProxyService.ALL_TRANSPORTS.equals(transports)) {
// default to all transports using service name as destination
} else {
String[] arr = transports.split(",");
if (arr != null && arr.length != 0) {
pd.setTransports(arr);
}
}
}
OMAttribute pinnedServers = elem.getAttribute(new QName("pinnedServers"));
if (pinnedServers != null) {
String pinnedServersValue = pinnedServers.getAttributeValue();
if (pinnedServersValue == null || "".equals(pinnedServersValue)) {
// default to all servers
} else {
String[] arr = pinnedServersValue.split(",");
if (arr != null && arr.length != 0) {
pd.setPinnedServers(arr);
}
}
}
OMAttribute trace = elem.getAttribute(new QName(XMLConfigConstants.TRACE_ATTRIB_NAME));
if (trace != null) {
String traceValue = trace.getAttributeValue();
if (traceValue != null) {
if (traceValue.equals(XMLConfigConstants.TRACE_ENABLE)) {
pd.setEnableTracing(true);
} else if (traceValue.equals(XMLConfigConstants.TRACE_DISABLE)) {
pd.setEnableTracing(false);
}
}
}
OMAttribute startOnLoad = elem.getAttribute(new QName("startOnLoad"));
String val;
if (startOnLoad != null && (val = startOnLoad.getAttributeValue()) != null && !"".equals(val)) {
pd.setStartOnLoad(Boolean.valueOf(val));
} else {
pd.setStartOnLoad(true);
}
// read definition of the target of this proxy service. The target could be an 'endpoint'
// or a named sequence. If none of these are specified, the messages would be mediated
// by the Synapse main mediator
OMElement target = elem.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "target"));
if (target != null) {
OMAttribute inSequence = target.getAttribute(new QName("inSequence"));
if (inSequence != null) {
pd.setInSeqKey(inSequence.getAttributeValue());
} else {
OMElement inSequenceElement = target.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "inSequence"));
if (inSequenceElement != null) {
pd.setInSeqXML(inSequenceElement.toString());
}
}
OMAttribute outSequence = target.getAttribute(new QName("outSequence"));
if (outSequence != null) {
pd.setOutSeqKey(outSequence.getAttributeValue());
} else {
OMElement outSequenceElement = target.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "outSequence"));
if (outSequenceElement != null) {
pd.setOutSeqXML(outSequenceElement.toString());
}
}
OMAttribute faultSequence = target.getAttribute(new QName("faultSequence"));
if (faultSequence != null) {
pd.setFaultSeqKey(faultSequence.getAttributeValue());
} else {
OMElement faultSequenceElement = target.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "faultSequence"));
if (faultSequenceElement != null) {
pd.setFaultSeqXML(faultSequenceElement.toString());
}
}
OMAttribute tgtEndpt = target.getAttribute(new QName("endpoint"));
if (tgtEndpt != null) {
pd.setEndpointKey(tgtEndpt.getAttributeValue());
} else {
OMElement endpointElement = target.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "endpoint"));
if (endpointElement != null) {
pd.setEndpointXML(endpointElement.toString());
}
}
}
Iterator props = elem.getChildrenWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "parameter"));
ArrayList<Entry> params = new ArrayList<Entry>();
Entry entry = null;
while (props.hasNext()) {
Object o = props.next();
if (o instanceof OMElement) {
OMElement prop = (OMElement) o;
OMAttribute pname = prop.getAttribute(new QName("name"));
OMElement propertyValue = prop.getFirstElement();
if (pname != null) {
if (propertyValue != null) {
entry = new Entry();
entry.setKey(pname.getAttributeValue());
entry.setValue(propertyValue.toString());
params.add(entry);
} else {
entry = new Entry();
entry.setKey(pname.getAttributeValue());
entry.setValue(prop.getText().trim());
params.add(entry);
}
}
}
}
pd.setServiceParams(params.toArray(new Entry[params.size()]));
OMElement wsdl = elem.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "publishWSDL"));
if (wsdl != null) {
OMAttribute wsdlkey = wsdl.getAttribute(
new QName(XMLConfigConstants.NULL_NAMESPACE, "key"));
OMAttribute wsdlEP = wsdl.getAttribute(
new QName(XMLConfigConstants.NULL_NAMESPACE, "endpoint"));
if (wsdlEP != null) {
//Commenting out this line because of the possible API change in stub
// pd.setPublishWSDLEndpoint(wsdlEP.getAttributeValue());
} else if (wsdlkey != null) {
pd.setWsdlKey(wsdlkey.getAttributeValue());
} else {
OMAttribute wsdlURI = wsdl.getAttribute(
new QName(XMLConfigConstants.NULL_NAMESPACE, "uri"));
if (wsdlURI != null) {
pd.setWsdlURI(wsdlURI.getAttributeValue());
} else {
OMElement wsdl11 = wsdl.getFirstChildWithName(
new QName(WSDLConstants.WSDL1_1_NAMESPACE, "definitions"));
String wsdlDef;
if (wsdl11 != null) {
wsdlDef = wsdl11.toString().replaceAll("\n|\\r|\\f|\\t", "");
wsdlDef = wsdlDef.replaceAll("> +<", "><");
pd.setWsdlDef(wsdlDef);
} else {
OMElement wsdl20 = wsdl.getFirstChildWithName(
new QName(WSDL2Constants.WSDL_NAMESPACE, "description"));
if (wsdl20 != null) {
wsdlDef = wsdl20.toString().replaceAll("\n|\\r|\\f|\\t", "");
wsdlDef = wsdlDef.replaceAll("> +<", "><");
pd.setWsdlDef(wsdlDef);
}
}
}
}
Iterator it = wsdl.getChildrenWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "resource"));
ArrayList<Entry> resources = new ArrayList<Entry>();
Entry resource = null;
while (it.hasNext()) {
OMElement resourceElem = (OMElement) it.next();
OMAttribute location = resourceElem.getAttribute
(new QName(XMLConfigConstants.NULL_NAMESPACE, "location"));
if (location == null) {
throw new XMLStreamException("location element not found in xml file");
}
OMAttribute key = resourceElem.getAttribute(
new QName(XMLConfigConstants.NULL_NAMESPACE, "key"));
if (key == null) {
throw new XMLStreamException("key element not found in xml file");
}
resource = new Entry();
resource.setKey(location.getAttributeValue());
resource.setValue(key.getAttributeValue());
resources.add(resource);
}
pd.setWsdlResources(resources.toArray(new Entry[resources.size()]));
}
OMElement enableSec = elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE,
"enableSec"));
if (enableSec != null) {
pd.setEnableSecurity(true);
}
OMElement description = elem.getFirstChildWithName(
new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "description"));
if (description != null) {
pd.setDescription(description.getText());
}
Iterator policies = elem.getChildrenWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "policy"));
while (policies.hasNext()) {
OMElement policyElement = (OMElement) policies.next();
String policyKey = policyElement.getAttributeValue(new QName("key"));
ProxyServicePolicyInfo policyInfo = new ProxyServicePolicyInfo();
policyInfo.setKey(policyKey);
pd.addPolicies(policyInfo);
}
} catch (XMLStreamException e) {
log.error(bundle.getString("unable.to.build.the.design.view.from.the.given.xml"), e);
Assert.fail(bundle.getString("unable.to.build.the.design.view.from.the.given.xml"));
}
return pd;
}
/**
* @param data - Proxy Configuration element
* @throws ProxyServiceAdminProxyAdminException
*
* @throws java.rmi.RemoteException
*/
public void updateProxy(OMElement data)
throws ProxyServiceAdminProxyAdminException, RemoteException {
ProxyData proxyData = getProxyData(data.toString());
proxyServiceAdminStub.modifyProxy(proxyData);
log.info("Proxy Updated");
}
/**
* @param proxyData
* @throws ProxyServiceAdminProxyAdminException
*
* @throws java.rmi.RemoteException
*/
public void updateProxy(ProxyData proxyData)
throws ProxyServiceAdminProxyAdminException, RemoteException {
proxyServiceAdminStub.modifyProxy(proxyData);
log.info("Proxy Updated");
}
}