blob: 070c49b10da333ae07b54f421ebe729bc9bbaf99 [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.jaxws.sample.parallelasync.server;
import org.apache.axis2.jaxws.TestLogger;
import org.apache.axis2.jaxws.sample.parallelasync.common.Constants;
import org.test.parallelasync.AnotherResponse;
import org.test.parallelasync.CustomAsyncResponse;
import org.test.parallelasync.InvokeAsyncResponse;
import org.test.parallelasync.PingResponse;
import org.test.parallelasync.SleepResponse;
import javax.jws.WebService;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Holder;
import javax.xml.ws.Response;
import java.util.Hashtable;
import java.util.concurrent.Future;
/**
* Async endpoint used for Async client side tests. Clients will invokeAsync
* sleep method to force the server to block until wakeUp is called. The client
* can call isAsleep to verify that sleep has been called by the async thread.
*/
/*
@WebService(
serviceName="AsyncService",
portName="AsyncPort",
targetNamespace = "http://org/test/parallelasync",
endpointInterface = "org.test.parallelasync.AsyncPort",
wsdlLocation="WEB-INF/wsdl/async_doclitwr.wsdl")
*/
@WebService(serviceName="AsyncService",
endpointInterface="org.apache.axis2.jaxws.sample.parallelasync.server.AsyncPort")
public class DocLitWrappedPortImpl implements AsyncPort {
private static final boolean DEBUG = false;
// in order to allow multiple sleeping requests to be held at the same time
// use a table where
// the key is the request string
// the value is the object used to block on
//
private static Hashtable sleepers = new Hashtable();
// intended to flag the need to cancel current requests being held (ie, sleeping)
// does not stop new requests
// not settable yet
// need to determine when to reset it when dealing with multiple operations
// currently reset when the sleepers table doesn't have any more requests
private static boolean doCancell = false;
// strings used for logging
private String myClassName = "DocLitWrappedPortImpl.";
/**
* This operation takes the request and holds it in the web service until
* <UL>
* <LI>the client asks for it via wakeUp()
* <LI>the operation times out
* <LI>the operation is interrupted
* </UL>
*
* @param request The request identifier
*/
public void sleep(Holder<String> request) {
boolean cancelRequested = false;
String key = new String(request.value);
String msg = request.value;
String title = myClassName+"sleep("+msg+"): ";
String tid = " threadID ["+ Thread.currentThread().getId() + "] ";
//if (DEBUG)
//{
// System.out.println(title + tid + "Enter");
//}
if (sleepers.get(key) != null)
{
// already holding this request id
return;
}
Thread myThread = Thread.currentThread();
long threadID = myThread.getId();
// add this request to our list
sleepers.put(key,myThread);
// set the timeout value
long sec = Constants.SERVER_SLEEP_SEC;
try {
//if (DEBUG)
// System.out.println(title + "Starting to sleep on "
// + " threadID ["+ threadID + "]" );
// hold this request until
// - the wait time expires
// - the client explicits asks for this request via wakeUp()
// - the wait is interrupted
// - a cancel occurs
while (sec > 0 && !doCancell) {
if (DEBUG)
TestLogger.logger.debug(title + "Sleeping on "
+ " threadID [" + threadID + "]"
+ " timeLeft=" + sec);
sec--;
//msg.wait(500);
myThread.sleep(500);
}
}
catch (InterruptedException e) {
TestLogger.logger.debug(title + "Sleep interrupted on "
+ " threadID [" + threadID + "]"
+ " timeLeft=[" + sec + "]");
}
finally {
if (DEBUG)
TestLogger.logger.debug(title + "final processing for "
+ " threadID [" + threadID + "]");
// remove this request from the list
sleepers.remove(key);
// for now, reset the cancellation flag when the list of
// waiting requests go to zero
if (sleepers.isEmpty())
{
doCancell = false;
}
}
}
/**
* Checks the specified request to determine whether
* it is still being held by the web service.
*
* @param request The request identifier to check
* @return The String being used as a wait object if the
* request is still being held by the server
* or NULL if the request is not held by the server
*/
public String isAsleep(String request) {
String title = myClassName+"isAsleep("+request+"): ";
String tid = " threadID ["+ Thread.currentThread().getId() + "] ";
if (sleepers.isEmpty())
{
if (DEBUG)
TestLogger.logger.debug(title + tid + " Not sleeping");
return null;
}
Thread value = (Thread) sleepers.get(request);
if (value == null)
{
if (DEBUG)
TestLogger.logger.debug(title + tid + " Not sleeping");
return null;
}
if (DEBUG)
TestLogger.logger.debug(title + tid + " sleeping on [" + request + "]");
return request;
}
public String wakeUp(String request) {
String title = myClassName+"wakeUp(): ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (sleepers.isEmpty())
{
if (DEBUG)
TestLogger.logger.debug(title + tid + " No one to wake up");
return null;
}
Thread value = (Thread) sleepers.get(request);
if (value == null)
{
if (DEBUG)
TestLogger.logger.debug(title + tid + " Thread not available. No one to wake up.");
return null;
}
if (DEBUG)
TestLogger.logger.debug(title + tid + " Interrupting "
+ " threadID [" + value.getId() + "]");
// interrupt the sleeper
try
{
value.interrupt();
}
catch (Exception e)
{
if (DEBUG)
TestLogger.logger.debug(title + tid + " Interrupting "
+ " threadID [" + value.getId() + "] got Exception [" +
e.getClass().getName() + "] [" + e.getMessage() + "]");
}
return request;
}
/**
* client side tests for remapping operation names, on the server side all
* we need to do is roundtrip the message
*/
public String invokeAsync(String request) {
String title = myClassName+"invokeAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return request;
}
public String customAsync(String request) {
String title = myClassName+"customeAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return request + "from customAsync method";
}
public String another(String request) {
String title = myClassName+"another("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return request;
}
public String ping(String request) {
String title = myClassName+"ping("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return request;
}
public String remapped(String request) {
// TODO Auto-generated method stub
String title = myClassName+"remapped("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return request;
}
// NOT USED:
public String anotherAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+"anotherAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Future<?> anotherAsyncAsync(String request, AsyncHandler<AnotherResponse> asyncHandler) {
// TODO Auto-generated method stub
String title = myClassName+" Future<?> anotherAsyncAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Response<AnotherResponse> anotherAsyncAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+" Response<AnotherResponse> anotherAsyncAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Future<?> invokeAsyncAsync(String request, AsyncHandler<InvokeAsyncResponse> asyncHandler) {
// TODO Auto-generated method stub
String title = myClassName+" Future<?> invokeAsyncAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Response<InvokeAsyncResponse> invokeAsyncAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+" Response<InvokeAsyncResponse> invokeAsyncAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Future<?> pingAsync(String request, AsyncHandler<PingResponse> asyncHandler) {
// TODO Auto-generated method stub
String title = myClassName+" Future<?> pingAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Response<PingResponse> pingAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+" Response<PingResponse> pingAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Future<?> remappedAsync(String request, AsyncHandler<CustomAsyncResponse> asyncHandler) {
// TODO Auto-generated method stub
String title = myClassName+" Future<?> remappedAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Response<CustomAsyncResponse> remappedAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+" Response<CustomAsyncResponse> remappedAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Future<?> sleepAsync(String request, AsyncHandler<SleepResponse> asyncHandler) {
// TODO Auto-generated method stub
String title = myClassName+" Future<?> sleepAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
public Response<SleepResponse> sleepAsync(String request) {
// TODO Auto-generated method stub
String title = myClassName+" Response<SleepResponse> sleepAsync("+request+") : ";
String tid = " threadID ["+ Thread.currentThread().getId() + "]";
if (DEBUG)
TestLogger.logger.debug(title + "Enter" + tid);
return null;
}
}