/*
* Copyright (c) 2005-2014, 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.carbon.inbound;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.locks.Lock;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.aspects.AspectConfiguration;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.config.xml.SynapseXMLConfigurationFactory;
import org.apache.synapse.inbound.InboundEndpoint;
import org.wso2.carbon.mediation.initializer.AbstractServiceBusAdmin;
import org.wso2.carbon.mediation.initializer.ServiceBusConstants;
import org.wso2.carbon.mediation.initializer.persistence.MediationPersistenceManager;
/**
* Admin service related to inbound endpoint
* */
public class CarbonInboundManagementService extends AbstractServiceBusAdmin {
private static Log log = LogFactory.getLog(CarbonInboundManagementService.class);
/**
* Get all the inbound endpoins available.
*
* @return List<InboundEndpointDTO> (This contains all the inbound endpoints)
* */
public InboundEndpointDTO[] getAllInboundEndpointNames() throws InboundManagementException {
Collection<InboundEndpoint> inboundEndpoints = getSynapseConfiguration().getInboundEndpoints();
InboundEndpointDTO[]lInboundEndpoints = new InboundEndpointDTO[inboundEndpoints.size()];
int i = 0;
for (InboundEndpoint inboundEndpoint : inboundEndpoints) {
lInboundEndpoints[i++] = new InboundEndpointDTO(inboundEndpoint);
}
return lInboundEndpoints;
}
/**
*
* Get specific inbound ep by name
*
* @param endointName
* @return
* @throws InboundManagementException
*/
public InboundEndpointDTO getInboundEndpointbyName(String endointName) throws InboundManagementException {
InboundEndpoint inboundEndpoint = getInboundEndpoint(endointName);
if (inboundEndpoint != null) {
return new InboundEndpointDTO(inboundEndpoint);
}
return null;
}
/**
*
* Create inbound EP based on the given parameters
*
* @param name
* @param sequence
* @param onError
* @param protocol
* @param classImpl
* @param sParams
* @throws InboundManagementException
*/
public void addInboundEndpoint(String name, String sequence, String onError, String protocol, String classImpl, String suspend, ParameterDTO[]lParameterDTOs) throws InboundManagementException {
try {
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://ws.apache.org/ns/synapse", "syn");
OMElement elem = fac.createOMElement("inboundEndpoint", omNs);
elem.addAttribute(fac.createOMAttribute("name", null, name));
if (sequence != null && sequence != "") {
elem.addAttribute(fac.createOMAttribute("sequence", null, sequence));
}
elem.addAttribute(fac.createOMAttribute("suspend", null, suspend));
if (onError != null && onError != "") {
elem.addAttribute(fac.createOMAttribute("onError", null, onError));
}
if (protocol != null) {
elem.addAttribute(fac.createOMAttribute("protocol", null, protocol));
} else {
elem.addAttribute(fac.createOMAttribute("class", null, classImpl));
}
OMElement params = fac.createOMElement("parameters", omNs);
for (ParameterDTO parameterDTO : lParameterDTOs) {
OMElement param = fac.createOMElement("parameter", omNs);
param.addAttribute(fac.createOMAttribute("name", null, parameterDTO.getName()));
if (parameterDTO.getKey() != null) {
param.addAttribute(fac.createOMAttribute("key", null, parameterDTO.getKey()));
} else if (parameterDTO.getValue() != null) {
param.setText(parameterDTO.getValue());
}
params.addChild(param);
}
elem.addChild(params);
SynapseXMLConfigurationFactory.defineInboundEndpoint(synapseConfiguration, elem, synapseConfiguration.getProperties());
InboundEndpoint inboundEndpoint = getInboundEndpoint(name);
persistInboundEndpoint(inboundEndpoint);
inboundEndpoint.init(getSynapseEnvironment());
} catch (Exception ex) {
log.error("Error adding inbound Endpoint", ex);
removeInboundEndpoint(name);
throw ex;
}
}
/**
*
* Adds new inbound endpoint from XML Config
*
* @param inboundElement
*/
public void addInboundEndpointFromXMLString(String inboundElement) {
XMLStreamReader reader = null;
try {
reader = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(inboundElement));
} catch (XMLStreamException e) {
log.error(e.getMessage());
}
StAXOMBuilder builder = new StAXOMBuilder(reader);
OMElement omElement = builder.getDocumentElement();
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
SynapseXMLConfigurationFactory.defineInboundEndpoint(synapseConfiguration, omElement, synapseConfiguration.getProperties());
String name = omElement.getAttributeValue(new QName("name"));
InboundEndpoint inboundEndpoint = null;
try {
inboundEndpoint = getInboundEndpoint(name);
} catch (InboundManagementException e) {
log.error(e.getMessage());
}
persistInboundEndpoint(inboundEndpoint);
inboundEndpoint.init(getSynapseEnvironment());
}
/**
*
* Update inbound endpoint with given parameters
*
* @param name
* @param sequence
* @param onError
* @param protocol
* @param classImpl
* @param lParameterDTOs
* @throws InboundManagementException
*/
public void updateInboundEndpoint(String name, String sequence, String onError, String protocol, String classImpl, String suspend, ParameterDTO[]lParameterDTOs) throws InboundManagementException {
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://ws.apache.org/ns/synapse", "syn");
OMElement elem = fac.createOMElement("inboundEndpoint", omNs);
elem.addAttribute(fac.createOMAttribute("name", null, name));
if (sequence != null && sequence != "") {
elem.addAttribute(fac.createOMAttribute("sequence", null, sequence));
}
elem.addAttribute(fac.createOMAttribute("suspend", null, suspend));
if (onError != null && onError != "") {
elem.addAttribute(fac.createOMAttribute("onError", null, onError));
}
if (protocol != null) {
elem.addAttribute(fac.createOMAttribute("protocol", null, protocol));
} else {
elem.addAttribute(fac.createOMAttribute("class", null, classImpl));
}
OMElement params = fac.createOMElement("parameters", omNs);
for (ParameterDTO lParameterDTO : lParameterDTOs) {
OMElement param = fac.createOMElement("parameter", omNs);
param.addAttribute(fac.createOMAttribute("name", null, lParameterDTO.getName()));
if (lParameterDTO.getKey() != null) {
param.addAttribute(fac.createOMAttribute("key", null, lParameterDTO.getKey()));
}else if (lParameterDTO.getValue() != null) {
param.setText(lParameterDTO.getValue());
}
params.addChild(param);
}
elem.addChild(params);
InboundEndpoint oldInboundEndpoint = synapseConfiguration.getInboundEndpoint(name);
if (oldInboundEndpoint != null) {
oldInboundEndpoint.destroy();
synapseConfiguration.removeInboundEndpoint(name);
}
SynapseXMLConfigurationFactory.defineInboundEndpoint(synapseConfiguration, elem, synapseConfiguration.getProperties());
InboundEndpoint inboundEndpoint = getInboundEndpoint(name);
/** If the inbound service deployed from artifact container, set the isEdited variable to true */
if (oldInboundEndpoint.getArtifactContainerName() != null) {
inboundEndpoint.setArtifactContainerName(oldInboundEndpoint.getArtifactContainerName());
inboundEndpoint.setIsEdited(true);
}
persistInboundEndpoint(inboundEndpoint);
try {
inboundEndpoint.init(getSynapseEnvironment());
} catch (Exception e) {
inboundEndpoint.destroy();
synapseConfiguration.removeInboundEndpoint(name);
synapseConfiguration.addInboundEndpoint(oldInboundEndpoint.getName(), oldInboundEndpoint);
persistInboundEndpoint(oldInboundEndpoint);
oldInboundEndpoint.init(getSynapseEnvironment());
throw e;
}
}
/**
*
* Removes the given inbound endpoint
*
* @param name
* @throws InboundManagementException
*/
public void removeInboundEndpoint(String name) throws InboundManagementException {
try {
if (log.isDebugEnabled()) {
log.debug("Deleting inbound service : " + name);
}
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
InboundEndpoint inboundEndpoint = synapseConfiguration.getInboundEndpoint(name);
if (inboundEndpoint != null && inboundEndpoint.getArtifactContainerName() == null) {
synapseConfiguration.removeInboundEndpoint(name);
inboundEndpoint.destroy();
MediationPersistenceManager pm = getMediationPersistenceManager();
pm.deleteItem(name, inboundEndpoint.getFileName(),
ServiceBusConstants.ITEM_TYPE_INBOUND);
if (log.isDebugEnabled()) {
log.debug("Inbound service : " + name + " deleted");
}
} else {
if (inboundEndpoint.getArtifactContainerName() != null) {
log.warn("Inbound service" + name + " deployed from artifact container. Will not be deleted.");
} else {
log.warn("No Inbound service exists by the name : " + name);
}
}
} catch (Exception e) {
log.error("Unable to delete inbound service : " + name, e);
}
}
public String enableStatistics(String inboundEndpointName) throws InboundManagementException {
final Lock lock = getLock();
try {
lock.lock();
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
InboundEndpoint inboundEndpoint = synapseConfiguration.getInboundEndpoint(inboundEndpointName);
if (inboundEndpoint != null) {
if (inboundEndpoint.getAspectConfiguration() == null) {
AspectConfiguration config = new AspectConfiguration(inboundEndpointName);
config.enableStatistics();
inboundEndpoint.configure(config);
} else {
inboundEndpoint.getAspectConfiguration().enableStatistics();
}
/** Persist the api service if it is not deployed via an artifact container */
if (inboundEndpoint.getArtifactContainerName() == null) {
persistInboundEndpoint(inboundEndpoint);
}
return inboundEndpointName;
} else {
handleException(log, "No defined Inbound Endpoint with name " + inboundEndpointName +
" found to enable statistics in the Synapse configuration", null);
}
} catch (Exception fault) {
handleException(log, "Couldn't enable statistics of the Inbound Endpoint " + inboundEndpointName + " : " +
fault.getMessage(), fault);
} finally {
lock.unlock();
}
return null;
}
public String disableStatistics(String inboundEndpointName) throws InboundManagementException {
final Lock lock = getLock();
try {
lock.lock();
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
InboundEndpoint inboundEndpoint = synapseConfiguration.getInboundEndpoint(inboundEndpointName);
if (inboundEndpoint != null) {
if (inboundEndpoint.getAspectConfiguration() == null) {
AspectConfiguration config = new AspectConfiguration(inboundEndpointName);
config.disableStatistics();
inboundEndpoint.configure(config);
} else {
inboundEndpoint.getAspectConfiguration().disableStatistics();
}
/** Persist the api service if it is not deployed via an artifact container */
if (inboundEndpoint.getArtifactContainerName() == null) {
persistInboundEndpoint(inboundEndpoint);
}
return inboundEndpointName;
} else {
handleException(log, "No defined Inbound Endpoint with name " + inboundEndpointName +
" found to disable statistics in the Synapse configuration", null);
}
} catch (Exception fault) {
handleException(log, "Couldn't disable statistics of the Inbound Endpoint " + inboundEndpointName + " : " +
fault.getMessage(), fault);
} finally {
lock.unlock();
}
return null;
}
public String enableTracing(String inboundEndpointName) throws InboundManagementException {
final Lock lock = getLock();
try {
lock.lock();
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
InboundEndpoint inboundEndpoint = synapseConfiguration.getInboundEndpoint(inboundEndpointName);
if (inboundEndpoint != null) {
if (inboundEndpoint.getAspectConfiguration() == null) {
AspectConfiguration config = new AspectConfiguration(inboundEndpointName);
config.enableTracing();
config.enableStatistics(); // Tracing need statistics to be enabled
inboundEndpoint.configure(config);
} else {
inboundEndpoint.getAspectConfiguration().enableTracing();
inboundEndpoint.getAspectConfiguration().enableStatistics(); // Tracing need statistics to be enabled
}
/** Persist the api service if it is not deployed via an artifact container */
if (inboundEndpoint.getArtifactContainerName() == null) {
persistInboundEndpoint(inboundEndpoint);
}
return inboundEndpointName;
} else {
handleException(log, "No defined Inbound Endpoint with name " + inboundEndpointName +
" found to enable tracing in the Synapse configuration", null);
}
} catch (Exception fault) {
handleException(log, "Couldn't enable tracing of the Inbound Endpoint " + inboundEndpointName + " : " +
fault.getMessage(), fault);
} finally {
lock.unlock();
}
return null;
}
public String disableTracing(String inboundEndpointName) throws InboundManagementException {
final Lock lock = getLock();
try {
lock.lock();
SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
InboundEndpoint inboundEndpoint = synapseConfiguration.getInboundEndpoint(inboundEndpointName);
if (inboundEndpoint != null) {
if (inboundEndpoint.getAspectConfiguration() == null) {
AspectConfiguration config = new AspectConfiguration(inboundEndpointName);
config.disableTracing();
inboundEndpoint.configure(config);
} else {
inboundEndpoint.getAspectConfiguration().disableTracing();
}
/** Persist the api service if it is not deployed via an artifact container */
if (inboundEndpoint.getArtifactContainerName() == null) {
persistInboundEndpoint(inboundEndpoint);
}
return inboundEndpointName;
} else {
handleException(log, "No defined Inbound Endpoint with name " + inboundEndpointName +
" found to disable tracing in the Synapse configuration", null);
}
} catch (Exception fault) {
handleException(log, "Couldn't disable tracing of the Inbound Endpoint " + inboundEndpointName + " : " +
fault.getMessage(), fault);
} finally {
lock.unlock();
}
return null;
}
private void persistInboundEndpoint(InboundEndpoint inboundEndpoint) {
MediationPersistenceManager pm = getMediationPersistenceManager();
if (pm == null) {
log.error("Cannot Persist sequence because persistence manager is null, "
+ "probably persistence is disabled");
} else if (inboundEndpoint.getArtifactContainerName() == null) {
pm.saveItem(inboundEndpoint.getName(), ServiceBusConstants.ITEM_TYPE_INBOUND);
}
}
private InboundEndpoint getInboundEndpoint(String endointName) throws InboundManagementException {
Collection<InboundEndpoint> inboundEndpoints = getSynapseConfiguration().getInboundEndpoints();
for (InboundEndpoint inboundEndpoint : inboundEndpoints) {
if (endointName.equals(inboundEndpoint.getName())) {
return (inboundEndpoint);
}
}
return null;
}
private void handleException(Log log, String message, Exception e) throws InboundManagementException {
if (e == null) {
InboundManagementException inboundManagementException = new InboundManagementException(message);
log.error(message, inboundManagementException);
throw inboundManagementException;
} else {
message = message + " :: " + e.getMessage();
log.error(message, e);
throw new InboundManagementException(message, e);
}
}
}