/*
* Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.carbon.proxyadmin.ui.client;
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.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
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.axis2.transport.http.HTTPConstants;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.core.axis2.ProxyService;
import org.wso2.carbon.proxyadmin.stub.ProxyServiceAdminStub;
import org.wso2.carbon.proxyadmin.stub.types.carbon.Entry;
import org.wso2.carbon.proxyadmin.stub.types.carbon.MetaData;
import org.wso2.carbon.proxyadmin.stub.types.carbon.ProxyData;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.ByteArrayInputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
public class ProxyServiceAdminClient {
private static final String FAILED = "failed";
private static final Log log = LogFactory.getLog(ProxyServiceAdminClient.class);
private static final String BUNDLE = "org.wso2.carbon.proxyadmin.ui.i18n.Resources";
private ResourceBundle bundle;
public ProxyServiceAdminStub stub;
public ProxyServiceAdminClient(ConfigurationContext configCtx, String backendServerURL,
String cookie, Locale locale) throws AxisFault {
bundle = ResourceBundle.getBundle(BUNDLE, locale);
String serviceURL = backendServerURL + "ProxyServiceAdmin";
stub = new ProxyServiceAdminStub(configCtx, serviceURL);
ServiceClient client = stub._getServiceClient();
Options options = client.getOptions();
options.setTimeOutInMilliSeconds(15 * 60 * 1000);
options.setProperty(HTTPConstants.SO_TIMEOUT, 15 * 60 * 1000);
options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, 15 * 60 * 1000);
options.setManageSession(true);
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, cookie);
}
public String disableStatistics(String proxyName60) throws AxisFault {
try {
return stub.disableStatistics(proxyName60);
} catch (Exception e) {
handleException(MessageFormat.format(
bundle.getString("unable.to.disable.statistics.for.proxy.service"), proxyName60), e);
}
return FAILED;
}
public String[] getAvailableEndpoints() throws AxisFault {
try {
return stub.getAvailableEndpoints();
} catch (Exception e) {
handleException(bundle.getString("unable.to.get.declared.endpoints"), e);
}
return null;
}
public String redeployProxyService(String proxyName65) throws AxisFault {
try {
return stub.redeployProxyService(proxyName65);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.redeploy.proxy.service"), proxyName65), e);
}
return FAILED;
}
public void addProxy(ProxyData pd67) throws AxisFault {
try {
stub.addProxy(pd67);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.add.proxy.service"), pd67.getName()), e);
}
}
public void modifyProxy(ProxyData pd69) throws AxisFault {
try {
stub.modifyProxy(pd69);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.modify.proxy.service"), pd69.getName()), e);
}
}
public String disableTracing(String proxyName71) throws AxisFault {
try {
return stub.disableTracing(proxyName71);
} catch (Exception e) {
handleException(MessageFormat.format(
bundle.getString("unable.to.disable.tracing.for.proxy.service"), proxyName71), e);
}
return FAILED;
}
public MetaData getMetaData() throws AxisFault {
try {
return stub.getMetaData();
} catch (Exception e) {
handleException(bundle.getString("unable.to.get.metadata"), e);
}
return null;
}
public ProxyData getProxy(String proxyName73) throws AxisFault {
try {
return stub.getProxy(proxyName73);
} catch (Exception e) {
handleException(MessageFormat.format(
bundle.getString("unable.to.retrieve.data.for.proxy.service"), proxyName73), e);
}
return null;
}
public String[] getAvailableTransports() throws AxisFault {
try {
return stub.getAvailableTransports();
} catch (Exception e) {
handleException(bundle.getString("unable.to.get.available.transports"), e);
}
return null;
}
public void startProxyService(String proxyName80) throws AxisFault {
try {
stub.startProxyService(proxyName80);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.start.proxy.service"), proxyName80), e);
}
}
public String enableTracing(String proxyName82) throws AxisFault {
try {
return stub.enableTracing(proxyName82);
} catch (Exception e) {
handleException(MessageFormat.format(
bundle.getString("unable.to.enable.tracing.for.proxy.service"), proxyName82), e);
}
return FAILED;
}
public String getSourceView(ProxyData pd84) throws AxisFault {
try {
return stub.getSourceView(pd84);
} catch (Exception e) {
handleException(bundle.getString("unable.to.generate.the.source.for.the.given.design"), e);
}
return null;
}
/**
* Populates a proxy data object based on the given XML. This mehtod will not validate any information
* since this may be called with incomplete information
* @param proxyXML88 proxy service configuration
* @return the <code>ProxyData</code> object populated with given information
* @throws AxisFault if the given XML cannot be parsed
*/
public ProxyData getDesignView(String proxyXML88) throws AxisFault {
ProxyData pd = new ProxyData();
try {
OMElement elem = new StAXOMBuilder(
new ByteArrayInputStream(proxyXML88.getBytes())).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;
}
}
if (!synapseNSPresent) {
// Oops! synpase namespace is not present
throw new AxisFault(bundle.getString("synapse.namespace.not.present"));
}
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"));
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) {
// todo handle exception
}
OMAttribute key = resourceElem.getAttribute(
new QName(XMLConfigConstants.NULL_NAMESPACE, "key"));
if (key == null) {
// todo handle exception
}
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);
}
} catch (XMLStreamException e) {
handleException(bundle.getString("unable.to.build.the.design.view.from.the.given.xml"), e);
}
return pd;
}
public void stopProxyService(String proxyName92) throws AxisFault {
try {
stub.stopProxyService(proxyName92);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.stop.proxy.service"), proxyName92), e);
}
}
public String enableStatistics(String proxyName94) throws AxisFault {
try {
return stub.enableStatistics(proxyName94);
} catch (Exception e) {
handleException(MessageFormat.format(
bundle.getString("unable.to.enable.statistics.for.proxy"), proxyName94), e);
}
return FAILED;
}
public String[] getAvailableSequences() throws AxisFault {
try {
return stub.getAvailableSequences();
} catch (Exception e) {
handleException(bundle.getString("unable.to.get.declared.sequences"), e);
}
return null;
}
public void deleteProxyService(String proxyName99) throws AxisFault {
try {
stub.deleteProxyService(proxyName99);
} catch (Exception e) {
handleException(MessageFormat.format(bundle.getString("unable.to.delete.proxy.service"), proxyName99), e);
}
}
private void handleException(String msg, Exception e) throws AxisFault {
log.error(msg, e);
throw new AxisFault(msg, e);
}
}