blob: bf405afb85975abb33372afd5420933a2784ddc2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.axis2.description;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.context.ServiceGroupContext;
import org.apache.axis2.deployment.DeploymentConstants;
import org.apache.axis2.description.java2wsdl.XMLSchemaTest;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.Utils;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class AxisServiceTest extends XMLSchemaTest {
public static final String PARAM_NAME = "CustomParameter";
public static final Object PARAM_VALUE = new Object();
private AxisService service;
private ArrayList<XmlSchema> sampleSchemas;
class MyObserver implements ParameterObserver {
public boolean gotIt = false;
public void parameterChanged(String name, Object value) {
if (PARAM_NAME.equals(name)) {
assertEquals("Wrong value", PARAM_VALUE, value);
gotIt = true;
}
}
}
@Override
protected void setUp() throws Exception {
service = new AxisService();
sampleSchemas = new ArrayList<XmlSchema>();
super.setUp();
}
@Override
protected void tearDown() throws Exception {
service = null;
sampleSchemas = null;
super.tearDown();
}
public void testAddMessageElementQNameToOperationMappingBasic() {
AxisOperation op1 = new InOnlyAxisOperation();
QName opName = new QName("foo");
// test registering the same operation multiple times
assertEquals(null, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op1);
assertEquals(op1, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op1);
assertEquals(op1, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op1);
assertEquals(op1, service.getOperationByMessageElementQName(opName));
}
public void testAddMessageElementQNameToOperationMappingOverloading() {
AxisOperation op1 = new InOnlyAxisOperation();
AxisOperation op2 = new InOnlyAxisOperation();
AxisOperation op3 = new InOnlyAxisOperation();
QName opName = new QName("foo");
// test registering different operations under the same opName
assertEquals(null, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op1);
assertEquals(op1, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op2);
assertEquals(null, service.getOperationByMessageElementQName(opName));
service.addMessageElementQNameToOperationMapping(opName, op3);
assertEquals(null, service.getOperationByMessageElementQName(opName));
}
public void testParameterObserver() throws Exception {
MyObserver observer = new MyObserver();
service.addParameterObserver(observer);
service.addParameter(PARAM_NAME, PARAM_VALUE);
assertTrue("Didn't get notification", observer.gotIt);
}
/**
* Simple test to ensure that Parameters marked as Transient
* are not persisted.
* @throws Exception
*/
public void testTransientParameters() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Parameter p1 = new Parameter("NORMAL", "Hello World");
Parameter p2 = new Parameter("TRANSIENT", "Hello World");
p2.setTransient(true);
// The header in an object output is 4 bytes
final int HEADER_LENGTH = 4;
// Make sure that non-transient value is written
ObjectOutputStream oos = new ObjectOutputStream(baos);
p1.writeExternal(oos);
oos.flush();
oos.close();
int length1 = baos.toByteArray().length;
assertTrue( length1 > HEADER_LENGTH);
// Make sure the transient value is not written
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
p2.writeExternal(oos);
oos.flush();
oos.close();
int length2 = baos.toByteArray().length;
assertTrue( length2 <= HEADER_LENGTH);
}
/**
* Simple test to make verify that the MessageContext listener
* is invoked when a ServiceContext is attached to the MessageContext
* @throws Exception
*/
public void testMessageContextListener() throws Exception {
AxisConfiguration ac = new AxisConfiguration();
ConfigurationContext cc = new ConfigurationContext(ac);
// Create a dummy AxisService
AxisService service = new AxisService();
service.setName("dummy");
AxisServiceGroup asg = new AxisServiceGroup();
asg.addService(service);
// Attach a ServiceContextListener
// The ServiceContextListener will copy sample information from
// the ServiceContext onto the MessageContext
service.addMessageContextListener(new MyMessageContextListener());
// Create a Dummy ServiceContext
ServiceGroupContext sgc = new ServiceGroupContext(cc, asg);
ServiceContext sc = sgc.getServiceContext(service);
sc.setProperty("SERVICE_PROPERTY", "SUCCESSFUL");
// Create a MessageContext
MessageContext mc = new MessageContext();
// Attach the ServiceContext and MessageContext.
// This will trigger the MyServiceContextListener.attachEvent
mc.setServiceContext(sc);
// Verify success
assertTrue("SUCCESSFUL".equals(mc.getProperty("MESSAGE_PROPERTY")));
}
public void testOperationActionMapping() throws Exception {
AxisOperation op1 = new InOutAxisOperation();
AxisOperation op2 = new InOutAxisOperation();
op2.addParameter(DeploymentConstants.TAG_ALLOWOVERRIDE, "true");
AxisOperation op3 = new InOutAxisOperation();
service.mapActionToOperation("testaction1", op1);
assertEquals(service.getOperationByAction("testaction1"), op1);
//Test duplicate registration with same operation
service.mapActionToOperation("testaction1", op1);
assertEquals(service.getOperationByAction("testaction1"), op1);
//Test duplicate registration with different operation and allowOverride
service.mapActionToOperation("testaction1", op2);
assertEquals(service.getOperationByAction("testaction1"), op1);
//Test registration of new operation with allowOverride
service.mapActionToOperation("testaction2", op2);
assertEquals(service.getOperationByAction("testaction1"), op1);
assertEquals(service.getOperationByAction("testaction2"), op2);
//Test duplicate registration with different operation and no allowOverride
service.mapActionToOperation("testaction1", op3);
assertNull(service.getOperationByAction("testaction1"));
assertEquals(service.getOperationByAction("testaction2"), op2);
}
public void testReleaseSchemaList() throws Exception {
loadSampleSchemaFile(sampleSchemas);
service.addSchema(sampleSchemas);
assertTrue(service.getSchema().size() != 0);
service.releaseSchemaList();
assertTrue(service.getSchema().size() == 0);
}
public void testPrintSchema() throws Exception {
loadSampleSchemaFile(sampleSchemas);
service.addSchema(sampleSchemas);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
service.printSchema(stream);
String a = stream.toString();
stream.reset();
for (XmlSchema schema : sampleSchemas) {
schema.write(stream);
}
String b = stream.toString();
stream.close();
assertEquals(a, b);
}
public void testPrintXSD() throws Exception {
InputStream is = new FileInputStream(SampleSchemasDirectory + "sampleSchema1.xsd");
XmlSchemaCollection schemaCol = new XmlSchemaCollection();
XmlSchema schema = schemaCol.read(new StreamSource(is));
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ArrayList<XmlSchema> xmlSchemas = new ArrayList<XmlSchema>();
xmlSchemas.add(schema);
service.addSchema(xmlSchemas);
service.printXSD(stream, "");
// service has a single schema and it is printed. The it is compared
// with the saved file
assertSimilarXML(readXMLfromSchemaFile(SampleSchemasDirectory
+ "printXSDReference.xsd"), stream.toString());
}
public void testPrintWSDL() throws Exception {
service = Utils.createSimpleService(new QName("test"), "", new QName("test"));
ByteArrayOutputStream stream = new ByteArrayOutputStream();
service.printWSDL(stream);
String s = readWSDLFromFile("test-resources" + File.separator + "wsdl" + File.separator
+ "printWSDLreference.wsdl");
assertSimilarXML(s, stream.toString());
}
public String convertXMLFileToString(String fileName) {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
InputStream inputStream = new FileInputStream(new File(fileName));
org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(
inputStream);
DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
return lsSerializer.writeToString(doc);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void testGetSchema() throws Exception {
loadSampleSchemaFile(sampleSchemas);
service.addSchema(sampleSchemas);
assertEquals(service.getSchema(0), sampleSchemas.get(0));
}
public void testGetSchemaElement() throws Exception {
loadSampleSchemaFile(sampleSchemas);
service.addSchema(sampleSchemas);
XmlSchemaElement schemaElement1 = service.getSchemaElement(new QName(
"http://www.w3schools.com", "note"));
XmlSchemaElement schemaElement2 = sampleSchemas.get(0).getElementByName(
new QName("http://www.w3schools.com", "note"));
assertEquals(schemaElement1, schemaElement2);
}
/**
* Sameple MessageContextListener which sets a property
* on the MessageContext when the SerivceContext is attached.
*/
class MyMessageContextListener implements MessageContextListener {
public void attachEnvelopeEvent(MessageContext mc) {
}
public void attachServiceContextEvent(ServiceContext sc, MessageContext mc) {
String value = (String) sc.getProperty("SERVICE_PROPERTY");
mc.setProperty("MESSAGE_PROPERTY", value);
}
}
}