001: /*
002: * $Id: SimpleServiceEngine.java,v 1.1 2003/08/17 06:06:13 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.minilang;
026:
027: import java.util.Map;
028:
029: import org.ofbiz.service.DispatchContext;
030: import org.ofbiz.service.GenericServiceException;
031: import org.ofbiz.service.ModelService;
032: import org.ofbiz.service.ServiceDispatcher;
033: import org.ofbiz.service.engine.GenericAsyncEngine;
034:
035: /**
036: * Standard Java Static Method Service Engine
037: *
038: * @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
039: * @version $Revision: 1.1 $
040: * @since 2.0
041: */
042: public final class SimpleServiceEngine extends GenericAsyncEngine {
043:
044: /** Creates new Engine */
045: public SimpleServiceEngine(ServiceDispatcher dispatcher) {
046: super (dispatcher);
047: }
048:
049: /** Run the service synchronously and IGNORE the result
050: * @param context Map of name, value pairs composing the context
051: */
052: public void runSyncIgnore(String localName,
053: ModelService modelService, Map context)
054: throws GenericServiceException {
055: Map result = runSync(localName, modelService, context);
056: }
057:
058: /** Run the service synchronously and return the result
059: * @param context Map of name, value pairs composing the context
060: * @return Map of name, value pairs composing the result
061: */
062: public Map runSync(String localName, ModelService modelService,
063: Map context) throws GenericServiceException {
064: Object result = serviceInvoker(localName, modelService, context);
065: if (result == null || !(result instanceof Map))
066: throw new GenericServiceException(
067: "Service did not return expected result");
068: return (Map) result;
069: }
070:
071: // Invoke the simple method from a service context
072: private Object serviceInvoker(String localName,
073: ModelService modelService, Map context)
074: throws GenericServiceException {
075: // static java service methods should be: public Map methodName(DispatchContext dctx, Map context)
076: DispatchContext dctx = dispatcher.getLocalContext(localName);
077:
078: // check the package and method names
079: if (modelService.location == null
080: || modelService.invoke == null)
081: throw new GenericServiceException(
082: "Cannot locate service to invoke (location or invoke name missing)");
083:
084: // get the classloader to use
085: ClassLoader classLoader = null;
086:
087: if (dctx != null)
088: classLoader = dctx.getClassLoader();
089:
090: // if the classLoader is null, no big deal, SimpleMethod will use the
091: // current thread's ClassLoader by default if null passed in
092:
093: try {
094: return SimpleMethod.runSimpleService(modelService.location,
095: modelService.invoke, dctx, context, classLoader);
096: } catch (MiniLangException e) {
097: throw new GenericServiceException(
098: "Error running simple method ["
099: + modelService.invoke + "] in XML file ["
100: + modelService.location + "]: ", e);
101: }
102: }
103: }
|