/**
* Copyright 2010 JBoss Inc
*
* 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 org.drools.task.service.responsehandlers;
import java.lang.reflect.Constructor;
import org.drools.task.service.ResponseHandler;
/**
* Abstract base class for client ResponseHandlers. Provides synchonized access to <field>done</field> which represents
* if the response is completed. Also has an <field>error</field> which will be set when there is a problem with
* a response. Users of this class should check to see if the response completed successfully, via
* the <method>isDone</method> and the <method>hasError</method>.
* <p/>
* Please note that the <field>error</field> is actually the Exception that occured on the server while
* processing the request.
*
* @author <a href="mailto:stampy88@yahoo.com">dave sinclair</a>
*/
public abstract class AbstractBaseResponseHandler implements ResponseHandler {
private volatile boolean done;
private RuntimeException error;
public synchronized boolean hasError() {
return error != null;
}
public synchronized RuntimeException getError() {
return error;
}
public synchronized void setError(RuntimeException error) {
this.error = error;
notifyAll();
}
public synchronized boolean isDone() {
return done;
}
protected synchronized void setDone(boolean done) {
this.done = done;
notifyAll();
}
/**
* This method will take the specified serverSideException, and create a new one for the client based
* on the serverSideException. This is done so a proper stack trace can be made for the client, as opposed
* to seeing the server side stack.
*
* @param serverSideException exception used to create client side exception
* @return client side exception
*/
protected static RuntimeException createSideException(RuntimeException serverSideException) {
RuntimeException clientSideException;
try {
Constructor<? extends RuntimeException> constructor = serverSideException.getClass().getConstructor(String.class);
clientSideException = constructor.newInstance(
"Server-side Exception: " + serverSideException.getMessage());
} catch (Exception e) {
// this should never happen - if it does, it is a programming error
throw new RuntimeException("Could not create client side exception", e);
}
return clientSideException;
}
}