blob: 15241bc8aee59b6ffdd5b7ae0e61f131fb6f1447 [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* 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 sample.groovy;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
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.axiom.om.util.StAXUtils;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.MessageReceiver;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
public class GroovyReceiver
extends AbstractInOutSyncMessageReceiver
implements MessageReceiver {
public void invokeBusinessLogic(
MessageContext inMessage,
MessageContext outMessage)
throws AxisFault {
try {
AxisService service =
inMessage
.getOperationContext()
.getServiceContext()
.getAxisService();
Parameter implInfoParam = service.getParameter("GroovyClass");
if (implInfoParam == null) {
throw new AxisFault(
Messages.getMessage("paramIsNotSpecified", "ServiceClass"));
}
InputStream groovyFileStream =
service.getClassLoader().getResourceAsStream(
implInfoParam.getValue().toString());
if (groovyFileStream == null) {
throw new AxisFault(
Messages.getMessage("groovyUnableToLoad", implInfoParam.getValue().toString()));
}
//look at the method name. if available this should be a groovy method
AxisOperation op =
inMessage.getOperationContext().getAxisOperation();
if (op == null) {
throw new AxisFault(
Messages.getMessage("notFound", "Operation"));
}
String methodName = op.getName().getLocalPart();
OMElement firstChild =
(OMElement) inMessage.getEnvelope().getBody().getFirstOMChild();
inMessage.getEnvelope().build();
StringWriter writer = new StringWriter();
firstChild.build();
firstChild.serialize(writer);
writer.flush();
String value = writer.toString();
if (value != null) {
GroovyClassLoader loader = new GroovyClassLoader();
Class groovyClass = loader.parseClass(groovyFileStream);
GroovyObject groovyObject =
(GroovyObject) groovyClass.newInstance();
Object[] arg = {new StringReader(value)};
Object obj = groovyObject.invokeMethod(methodName, arg);
if (obj == null) {
throw new AxisFault(Messages.getMessage("groovyNoanswer"));
}
SOAPFactory fac ;
if (inMessage.isSOAP11()) {
fac = OMAbstractFactory.getSOAP11Factory();
} else {
fac = OMAbstractFactory.getSOAP12Factory();
}
SOAPEnvelope envelope = fac.getDefaultEnvelope();
OMNamespace ns =
fac.createOMNamespace("http://soapenc/", "res");
OMElement responseElement =
fac.createOMElement(methodName + "Response", ns);
String outMessageString = obj.toString();
// System.out.println("outMessageString = " + outMessageString);
// responseElement.setText(outMessageString);
responseElement.addChild(getpayLoad(outMessageString));
envelope.getBody().addChild(responseElement);
outMessage.setEnvelope(envelope);
}
} catch (Exception e) {
throw new AxisFault(e);
}
}
private OMElement getpayLoad(String str) throws XMLStreamException {
XMLStreamReader xmlReader =
StAXUtils.createXMLStreamReader(
new ByteArrayInputStream(str.getBytes()));
OMFactory fac = OMAbstractFactory.getOMFactory();
StAXOMBuilder staxOMBuilder =
new StAXOMBuilder(fac, xmlReader);
return staxOMBuilder.getDocumentElement();
}
}