blob: 5038a51b31cead5f7be6ae191823ad3dfeaf6f5f [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.asyncdoclit.server;
import javax.jws.WebService;
import javax.xml.ws.Holder;
import javax.xml.ws.WebServiceException;
import org.test.asyncdoclit.ExceptionTypeEnum;
import org.test.asyncdoclit.ThrowExceptionFaultBean;
/*
import jaxws.async.wsfvt.common.Constants;
import jaxws.async.wsfvt.common.doclitwr.AsyncPort;
import jaxws.async.wsfvt.common.doclitwr.ExceptionTypeEnum;
import jaxws.async.wsfvt.common.doclitwr.ThrowExceptionFault;
import jaxws.async.wsfvt.common.doclitwr.ThrowExceptionFaultBean;
*/
/**
* 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="AsyncService2",
endpointInterface="org.apache.axis2.jaxws.sample.asyncdoclit.server.AsyncPort")
public class DocLitWrappedPortImpl implements AsyncPort {
private static final boolean DEBUG = true;
// message on which the sleep method is sleeping on
private static String msg = "";
// thread instance that is currently sleeping so it can be interrupted from
// wakeup
private static Thread sleeper = null;
// interrupt flag for wakeUp to set
private static boolean doCancell = false;
public void sleep(Holder<String> message) {
try {
if (message == null || message.value == null) {
System.out.println("DocLitWrappedPortImpl.sleep(null) Enter");
}
if (DEBUG) System.out.println("DocLitWrappedPortImpl.sleep(" + message.value + ") Enter");
boolean cancelRequested = false;
msg = message.value;
synchronized (msg) {
Thread myThread = Thread.currentThread();
sleeper = myThread;
try {
doCancell = false;
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.sleep: going to sleep on "
+ myThread.getId() + " " + msg);
// wait until either a timeout or client releases us
// or if another request begins (lockId changes)
long sec = 15; //Constants.SERVER_SLEEP_SEC;
while (sec > 0 && !doCancell && sleeper == myThread) {
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.sleep: " + myThread.getId()
+ " timeLeft=" + sec);
sec--;
msg.wait(1000);
}
} catch (InterruptedException e) {
System.out.println("DocLitWrappedPortImpl.sleep: interrupted on " + myThread.getId());
} finally {
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.sleep: WokeUp " + myThread.getId());
// if we timed out while waiting then
// release the wait
if (sleeper == myThread) {
cancelRequested = doCancell;
doCancell = false;
sleeper = null;
}
// only notify if cancel was requested
if (cancelRequested) {
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.sleep: Notify " + myThread.getId()
+ " isDone");
// wake up the release thread
msg.notify();
}
}
}// synch
msg = null;
if (DEBUG) System.out.println("DocLitWrappedPortImpl.sleep(" + message.value + ") Exit");
} catch (Exception e){
System.out.println("DocLitWrappedPortImpl.sleep: " + e);
e.printStackTrace(System.out);
}
}
public String isAsleep() {
if (DEBUG) System.out.println("DocLitWrappedPortImpl.isAsleep() Enter");
String ret = (sleeper != null) ? msg : null;
if (DEBUG) System.out.println("DocLitWrappedPortImpl.isAsleep() = " + ret);
return ret;
}
public String wakeUp() {
if (DEBUG) System.out.println("DocLitWrappedPortImpl.wakeUp() Enter");
String wakeUp = null;
if (sleeper == null) {
if (DEBUG) System.out.println("DocLitWrappedPortImpl.wakeUp: No one to wake up");
} else {
if (DEBUG) System.out.println("DocLitWrappedPortImpl.wakeUp: Interrupting " + sleeper.getId());
// interrupt the sleeper & set inteerupt flag in case
// the sleep isn't sleeping but actually doing work
wakeUp = msg;
sleeper.interrupt();
doCancell = true;
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.wakeUp: about to enter sync block "
+ System.currentTimeMillis());
// block until sleep completes
if (msg != null) {
synchronized (msg) {
if (DEBUG)
System.out.println("DocLitWrappedPortImpl.wakeUp: enter sync block "
+ System.currentTimeMillis());
doCancell = false;
}
}
msg = null;
}
if (DEBUG) System.out.println("DocLitWrappedPortImpl.wakeUp() = " + wakeUp);
return wakeUp;
}
/**
* 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) {
System.out.println("DocLitWrappedPortImpl.invokeAsync " + request);
return request;
}
public String customAsync(String request) {
System.out.println("DocLitWrappedPortImpl.customAsync " + request);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return request;
}
public String another(String request) {
System.out.println("DocLitWrappedPortImpl.another " + request);
return request;
}
public String ping(String message) {
System.out.println("DocLitWrappedPortImpl.ping " + message);
return message;
}
public String throwException(ExceptionTypeEnum exceptionType)
throws ThrowExceptionFault {
System.out.println("DocLitWrappedPortImpl.throwException " + exceptionType);
switch (exceptionType) {
case DIVIDE_BY_ZERO:
int div = 10 / 0;
break;
case NPE:
String x = null;
x.toString();
break;
case WSE:
throw new WebServiceException("WebServiceFault");
case WSDL_FAULT:
ThrowExceptionFaultBean tefb = new ThrowExceptionFaultBean();
tefb.setText("faultBean");
throw new ThrowExceptionFault("message", tefb);
}
return null;
}
}