001 /**
002 *
003 * Copyright 2005 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.codehaus.activesoap.wsif;
019
020 import org.apache.wsif.WSIFException;
021 import org.apache.wsif.WSIFMessage;
022 import org.apache.wsif.WSIFPort;
023 import org.apache.wsif.base.WSIFDefaultOperation;
024 import org.apache.commons.logging.Log;
025 import org.apache.commons.logging.LogFactory;
026 import org.codehaus.activesoap.MessageExchange;
027 import org.codehaus.activesoap.RestClient;
028 import org.codehaus.activesoap.handler.stax.AnyElementMarshaler;
029
030 import javax.wsdl.Operation;
031 import javax.wsdl.Output;
032
033 /**
034 * Represents an operation in <a href="http://ws.apache.org/wsif/">WSIF</a>
035 *
036 * @version $Revision: 1.3 $
037 */
038 public class ASOperation extends WSIFDefaultOperation {
039 private static final transient Log log = LogFactory.getLog(ASOperation.class);
040
041 private WSIFPort port;
042 private Operation operation;
043 private RestClient client;
044 private AnyElementMarshaler marshaler;
045 private String outputName;
046
047 public ASOperation(WSIFPort port, Operation operation, RestClient client, AnyElementMarshaler marshaler) {
048 this.port = port;
049 this.operation = operation;
050 this.client = client;
051 this.marshaler = marshaler;
052 Output output = operation.getOutput();
053 if (output != null) {
054 this.outputName = output.getName();
055 }
056 }
057
058 public void executeInputOnlyOperation(WSIFMessage in) throws WSIFException {
059 try {
060 MessageExchange exchange = createMessageExchange();
061 client.invokeOneWay(exchange, createClientHandler(in));
062 }
063 catch (Exception e) {
064 throw new WSIFException("Failed to process oneway for: " + operation + ". Reason: " + e, e);
065 }
066 }
067
068 public boolean executeRequestResponseOperation(WSIFMessage in, WSIFMessage out, WSIFMessage fault) throws WSIFException {
069 try {
070 MessageExchange exchange = createMessageExchange();
071 Object inputBody = in.getObjectPart("body");
072 Object output = client.invokeRequestReply(exchange, inputBody);
073 out.setObjectPart("body", output);
074 out.setName(outputName);
075 }
076 catch (Exception e) {
077 log.error("Caught: " + e, e);
078 throw new WSIFException("Failed to process oneway for: " + operation + ". Reason: " + e, e);
079 }
080 return true;
081 }
082
083 public WSIFPort getWSIFPort() {
084 return port;
085 }
086
087 protected Operation getOperation() throws Exception {
088 return operation;
089 }
090
091 protected WSIFHandler createClientHandler(WSIFMessage in) {
092 return new WSIFHandler(in, marshaler);
093 }
094
095 protected MessageExchange createMessageExchange() {
096 MessageExchange exchange = client.createMessageExchange();
097 return exchange;
098 }
099
100 }