| /* |
| * 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.transport.testkit.axis2.endpoint; |
| |
| import java.io.PrintWriter; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.List; |
| import java.util.UUID; |
| |
| import junit.framework.Assert; |
| |
| 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.transport.TransportListener; |
| import org.apache.axis2.transport.base.BaseUtils; |
| import org.apache.axis2.transport.base.event.TransportError; |
| import org.apache.axis2.transport.base.event.TransportErrorListener; |
| import org.apache.axis2.transport.base.event.TransportErrorSource; |
| import org.apache.axis2.transport.testkit.axis2.AxisServiceConfigurator; |
| import org.apache.axis2.transport.testkit.channel.Channel; |
| import org.apache.axis2.transport.testkit.name.Name; |
| import org.apache.axis2.transport.testkit.tests.Setup; |
| import org.apache.axis2.transport.testkit.tests.TearDown; |
| import org.apache.axis2.transport.testkit.tests.Transient; |
| import org.apache.axis2.transport.testkit.util.LogManager; |
| |
| /** |
| * Base class for Axis2 based test endpoints. |
| */ |
| @Name("axis") |
| public abstract class AxisTestEndpoint { |
| private @Transient AxisTestEndpointContext context; |
| private @Transient TransportErrorSource transportErrorSource; |
| private @Transient TransportErrorListener errorListener; |
| @Transient AxisService service; |
| |
| @Setup @SuppressWarnings("unused") |
| private void setUp(LogManager logManager, AxisTestEndpointContext context, Channel channel, |
| AxisServiceConfigurator[] configurators) throws Exception { |
| |
| this.context = context; |
| |
| TransportListener listener = context.getTransportListener(); |
| if (listener instanceof TransportErrorSource) { |
| transportErrorSource = (TransportErrorSource)listener; |
| errorListener = new TransportErrorListener() { |
| public void error(TransportError error) { |
| AxisService s = error.getService(); |
| if (s == null || s == service) { |
| onTransportError(error.getException()); |
| } |
| } |
| }; |
| transportErrorSource.addErrorListener(errorListener); |
| } else { |
| transportErrorSource = null; |
| } |
| |
| String path; |
| try { |
| path = new URI(channel.getEndpointReference().getAddress()).getPath(); |
| } catch (URISyntaxException ex) { |
| path = null; |
| } |
| String serviceName; |
| if (path != null && path.startsWith(Channel.CONTEXT_PATH + "/")) { |
| serviceName = path.substring(Channel.CONTEXT_PATH.length()+1); |
| } else { |
| serviceName = "TestService-" + UUID.randomUUID(); |
| } |
| service = new AxisService(serviceName); |
| service.addOperation(createOperation()); |
| if (configurators != null) { |
| for (AxisServiceConfigurator configurator : configurators) { |
| configurator.setupService(service, false); |
| } |
| } |
| |
| // Output service parameters to log file |
| // FIXME: This actually doesn't give the expected result because the AxisTestEndpoint might be reused |
| // by several test cases and in that case the log file is only produced once |
| List<Parameter> params = (List<Parameter>)service.getParameters(); |
| if (!params.isEmpty()) { |
| PrintWriter log = new PrintWriter(logManager.createLog("service-parameters"), false); |
| try { |
| for (Parameter param : params) { |
| log.print(param.getName()); |
| log.print("="); |
| log.println(param.getValue()); |
| } |
| } finally { |
| log.close(); |
| } |
| } |
| |
| // We want to receive all messages through the same operation: |
| service.addParameter(AxisService.SUPPORT_SINGLE_OP, true); |
| |
| context.getAxisConfiguration().addService(service); |
| |
| // The transport may disable the service. In that case, fail directly. |
| if (!BaseUtils.isUsingTransport(service, context.getTransportName())) { |
| Assert.fail("The service has been disabled by the transport"); |
| } |
| } |
| |
| @TearDown @SuppressWarnings("unused") |
| private void tearDown() throws Exception { |
| if (transportErrorSource != null) { |
| transportErrorSource.removeErrorListener(errorListener); |
| } |
| context.getAxisConfiguration().removeService(service.getName()); |
| } |
| |
| /** |
| * Create an operation appropriate for the message exchange pattern implemented |
| * by the test endpoint. The operation returned should have a |
| * {@link MessageReceiver} set. |
| * |
| * @return the operation |
| */ |
| protected abstract AxisOperation createOperation(); |
| |
| /** |
| * Process a transport error. Note that this method will only be called if |
| * the underlying transport supports reporting of transport errors. |
| * |
| * @param ex the exception describing the transport error |
| */ |
| protected abstract void onTransportError(Throwable ex); |
| } |