/*
* 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.carbon.mediator.ejb;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.xml.ValueFactory;
import org.apache.synapse.config.xml.ValueSerializer;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.mediators.Value;
import org.apache.synapse.mediators.bean.BeanConstants;
import org.apache.synapse.mediators.bean.enterprise.EJBConstants;
import org.wso2.carbon.mediator.service.MediatorException;
import org.wso2.carbon.mediator.service.ui.AbstractMediator;
public class EJBMediator extends AbstractMediator {
private static final QName EJB_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "ejb");
private static final QName ARGS_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "args");
private static final QName ARG_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "arg");
private static final QName ATT_CLASS = new QName("class");
private static final QName ATT_BEANSTALK = new QName("beanstalk");
private static final QName ATT_METHOD = new QName("method");
private static final QName ATT_TARGET = new QName("target");
private static final QName ATT_JNDI_NAME = new QName("jndiName");
private static final QName ATT_STATEFUL = new QName("stateful");
private static final QName ATT_ID = new QName("id");
private static final QName ATT_REMOVE = new QName("remove");
private String clazz;
private String beanstalk;
private String method;
private String target;
private String jndiName;
private Value id;
private Boolean stateful;
private Boolean remove;
private List<Value> arguments = new ArrayList<Value>();
public String getTagLocalName() {
return "ejb";
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public String getBeanstalk() {
return beanstalk;
}
public void setBeanstalk(String beanstalk) {
this.beanstalk = beanstalk;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getJndiName() {
return jndiName;
}
public void setJndiName(String jndiName) {
this.jndiName = jndiName;
}
public Value getId() {
return id;
}
public void setId(Value id) {
this.id = id;
}
public Boolean getStateful() {
return stateful;
}
public void setStateful(Boolean stateful) {
this.stateful = stateful;
}
public List<Value> getArguments() {
return arguments;
}
public void setArguments(List<Value> arguments) {
this.arguments = arguments;
}
public void addArguments(Value value) {
this.arguments.add(value);
}
public Boolean getRemove() {
return remove;
}
public void setRemove(Boolean remove) {
this.remove = remove;
}
public OMElement serialize(OMElement parent) {
OMElement ejbElem = fac.createOMElement(EJB_Q);
if (clazz != null && !clazz.isEmpty()) {
OMAttribute clazzAtt = fac.createOMAttribute("class", nullNS, clazz);
ejbElem.addAttribute(clazzAtt);
}
if (beanstalk != null && !beanstalk.isEmpty()) {
OMAttribute beanstalkAtt = fac.createOMAttribute("beanstalk", nullNS, beanstalk);
ejbElem.addAttribute(beanstalkAtt);
}
if (method != null && !method.isEmpty()) {
OMAttribute methodAtt = fac.createOMAttribute("method", nullNS, method);
ejbElem.addAttribute(methodAtt);
}
if (target != null && !target.isEmpty()) {
OMAttribute targetAtt = fac.createOMAttribute("target", nullNS, target);
ejbElem.addAttribute(targetAtt);
}
if (jndiName != null && !jndiName.isEmpty()) {
OMAttribute jndiNameAtt = fac.createOMAttribute("jndiName", nullNS, jndiName);
ejbElem.addAttribute(jndiNameAtt);
}
if (id != null) {
new ValueSerializer().serializeValue(id, EJBConstants.BEAN_ID, ejbElem);
}
if (stateful != null) {
OMAttribute statefulAttr =
fac.createOMAttribute("stateful", nullNS,
stateful.toString());
ejbElem.addAttribute(statefulAttr);
}
if (remove != null) {
OMAttribute removeAttr = fac.createOMAttribute("remove", nullNS, remove.toString());
ejbElem.addAttribute(removeAttr);
}
if (arguments != null && arguments.size() > 0) {
OMElement argumentsElem = fac.createOMElement(EJBConstants.ARGS, synNS);
for (Value arg : arguments) {
OMElement argElem = fac.createOMElement(EJBConstants.ARG, synNS);
new ValueSerializer().serializeValue(arg, BeanConstants.VALUE, argElem);
argumentsElem.addChild(argElem);
}
ejbElem.addChild(argumentsElem);
}
try {
this.validateEJBMethod();
} catch (MediatorException e) {
throw e;
}
if (parent != null) {
parent.addChild(ejbElem);
}
return ejbElem;
}
/**
* Validating EJB method parameters
* *
* @throws Exception
*/
private void validateEJBMethod() throws MediatorException {
try {
if (this.clazz != null) {
//first validate the class existence..
Class.forName(this.clazz.trim());
}
if (this.clazz != null && this.method != null) {
//Second checking the method definition existence
Class clazz = Class.forName(this.clazz.trim());
if (clazz != null) {
boolean foundMethod = false;
for (Method method : clazz.getMethods()){
if (this.method.equals(method.getName())) {
foundMethod = true;
}
}
if(!foundMethod){
throw new MediatorException("Couldn't load method definition "+method+" name under the class " + this.clazz);
}
}
}
if(this.clazz != null && this.method != null && this.arguments != null){
Class clazz = Class.forName(this.clazz);
if (clazz != null) {
boolean argumetnsOk = false;
for (Method method : clazz.getMethods()){
if (this.method.equals(method.getName())) {
if (method.getName().equals(this.method) && method.getParameterTypes().length == this.arguments.size()) {
argumetnsOk = true;
}
}
}
if(!argumetnsOk){
throw new MediatorException("Invalid number of argments provided for method "+ this.method);
}
}
}
} catch (ClassNotFoundException e) {
throw new MediatorException("Couldn't load class name " + this.clazz);
}
}
public void build(OMElement elem) {
// after successfully creating the mediator
// set its common attributes such as tracing etc
processAuditStatus(this, elem);
ValueFactory valueFactory = new ValueFactory();
OMAttribute clazz = elem.getAttribute(ATT_CLASS);
if (clazz != null) {
this.clazz = clazz.getAttributeValue();
}
OMAttribute beanstalk = elem.getAttribute(ATT_BEANSTALK);
if (beanstalk != null) {
this.beanstalk = beanstalk.getAttributeValue();
}
OMAttribute stateful = elem.getAttribute(ATT_STATEFUL);
if (stateful != null) {
this.stateful = new Boolean(stateful.getAttributeValue());
}
OMAttribute remove = elem.getAttribute(ATT_REMOVE);
if (remove != null) {
this.remove = new Boolean(remove.getAttributeValue());
}
OMAttribute jndiName = elem.getAttribute(ATT_JNDI_NAME);
if (jndiName != null) {
this.jndiName = jndiName.getAttributeValue();
}
OMAttribute target = elem.getAttribute(ATT_TARGET);
if (target != null) {
this.target = target.getAttributeValue();
}
OMAttribute method = elem.getAttribute(ATT_METHOD);
if (method != null) {
this.method = method.getAttributeValue();
}
OMAttribute id = elem.getAttribute(ATT_ID);
if (id != null) {
Value beanId = valueFactory.createValue("id", elem);
this.id = beanId;
}
Iterator argsitr = elem.getChildrenWithName(ARGS_Q);
if (argsitr != null) {
List<Value> args = new ArrayList<Value>();
while (argsitr.hasNext()) {
OMElement argsElm = (OMElement) argsitr.next();
if (argsElm != null) {
Iterator argItr = argsElm.getChildrenWithName(ARG_Q);
if (argItr != null) {
while (argItr.hasNext()) {
OMElement argElm = (OMElement) argItr.next();
if (argElm != null) {
Value value = valueFactory.createValue("value", argElm);
args.add(value);
}
}
}
}
}
this.arguments.addAll(args);
}
}
private void handleException(String msg) {
LogFactory.getLog(this.getClass()).error(msg);
throw new SynapseException(msg);
}
}