001: /*
002: * $Id: GenericResultWaiter.java,v 1.2 2003/11/25 23:56:07 ajzeneski Exp $
003: *
004: * Copyright (c) 2001, 2002 The Open For Business Project - www.ofbiz.org
005: *
006: * Permission is hereby granted, free of charge, to any person obtaining a
007: * copy of this software and associated documentation files (the "Software"),
008: * to deal in the Software without restriction, including without limitation
009: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
010: * and/or sell copies of the Software, and to permit persons to whom the
011: * Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included
014: * in all copies or substantial portions of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
017: * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
018: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
019: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
020: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
021: * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
022: * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
023: *
024: */
025: package org.ofbiz.service;
026:
027: import java.util.Map;
028:
029: import org.ofbiz.base.util.Debug;
030:
031: /**
032: * Generic Result Waiter Class
033: *
034: * @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
035: * @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>
036: * @version $Revision: 1.2 $
037: * @since 2.0
038: */
039: public class GenericResultWaiter implements GenericRequester {
040:
041: public static final String module = GenericResultWaiter.class
042: .getName();
043:
044: /** Status code for a running service */
045: public static final int SERVICE_RUNNING = -1;
046: /** Status code for a failed service */
047: public static final int SERVICE_FAILED = 0;
048: /** Status code for a successful service */
049: public static final int SERVICE_FINISHED = 1;
050:
051: private boolean completed = false;
052: private int status = -1;
053: private Map result = null;
054: private Throwable t = null;
055:
056: /**
057: * @see org.ofbiz.service.GenericRequester#receiveResult(java.util.Map)
058: */
059: public synchronized void receiveResult(Map result) {
060: this .result = result;
061: completed = true;
062: status = SERVICE_FINISHED;
063: notify();
064: if (Debug.verboseOn())
065: Debug.logVerbose("Received Result (" + completed + ") -- "
066: + result, module);
067: }
068:
069: /**
070: * @see org.ofbiz.service.GenericRequester#receiveThrowable(java.lang.Throwable)
071: */
072: public synchronized void receiveThrowable(Throwable t) {
073: this .t = t;
074: completed = true;
075: status = SERVICE_FAILED;
076: notify();
077: }
078:
079: /**
080: * Returns the status of the service.
081: * @return int Status code
082: */
083: public synchronized int status() {
084: return this .status;
085: }
086:
087: /**
088: * If the service has completed return true
089: * @return boolean
090: */
091: public synchronized boolean isCompleted() {
092: return completed;
093: }
094:
095: /**
096: * Returns the exception which was thrown or null if none
097: * @return Exception
098: */
099: public synchronized Throwable getThrowable() {
100: if (!isCompleted())
101: throw new java.lang.IllegalStateException(
102: "Cannot return exception, synchronous call has not completed.");
103: return this .t;
104: }
105:
106: /**
107: * Gets the results of the service or null if none
108: * @return Map
109: */
110: public synchronized Map getResult() {
111: if (!isCompleted())
112: throw new java.lang.IllegalStateException(
113: "Cannot return result, asynchronous call has not completed.");
114: return result;
115: }
116:
117: /**
118: * Waits for the service to complete
119: * @return Map
120: */
121: public synchronized Map waitForResult() {
122: return this .waitForResult(10);
123: }
124:
125: /**
126: * Waits for the service to complete, check the status ever n milliseconds
127: * @param milliseconds
128: * @return Map
129: */
130: public synchronized Map waitForResult(long milliseconds) {
131: if (Debug.verboseOn())
132: Debug.logVerbose("Waiting for results...", module);
133: while (!isCompleted()) {
134: try {
135: this .wait(milliseconds);
136: if (Debug.verboseOn())
137: Debug.logVerbose("Waiting...", module);
138: } catch (java.lang.InterruptedException e) {
139: Debug.logError(e, module);
140: }
141: }
142: return this.getResult();
143: }
144: }
|