/* * 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.tuscany.sca.binding.erlang.impl; import org.apache.tuscany.sca.binding.erlang.ErlangBinding; import org.apache.tuscany.sca.binding.erlang.impl.types.TypeHelpersProxy; import org.apache.tuscany.sca.invocation.Invoker; import org.apache.tuscany.sca.invocation.Message; import org.apache.tuscany.sca.runtime.RuntimeComponentReference; import com.ericsson.otp.erlang.OtpConnection; import com.ericsson.otp.erlang.OtpEpmd; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpMbox; import com.ericsson.otp.erlang.OtpMsg; import com.ericsson.otp.erlang.OtpNode; import com.ericsson.otp.erlang.OtpPeer; import com.ericsson.otp.erlang.OtpSelf; /** * @version $Rev: $ $Date: $ */ public class ErlangInvoker implements Invoker { private RuntimeComponentReference reference; private ErlangBinding binding; private OtpNode node; public ErlangInvoker(RuntimeComponentReference reference, ErlangBinding binding) { this.reference = reference; this.binding = binding; } private Message sendMessage(Message msg) { OtpMbox tmpMbox = null; try { String nodeName = "_connector_to_" + binding.getNode(); node = new OtpNode(nodeName); tmpMbox = node.createMbox(); Object[] args = msg.getBody(); OtpErlangObject msgPayload = TypeHelpersProxy.toErlang(args); tmpMbox.send(msg.getOperation().getName(), binding.getNode(), msgPayload); if (msg.getOperation().getOutputType() != null) { OtpMsg resultMsg = tmpMbox.receiveMsg(); OtpErlangObject result = resultMsg.getMsg(); msg.setBody(TypeHelpersProxy.toJava(result, msg.getOperation().getOutputType().getPhysical())); } } catch (Exception e) { msg.setFaultBody(e); } finally { if (tmpMbox != null) { tmpMbox.close(); } if (node != null) { OtpEpmd.unPublishPort(node); node.close(); } } return msg; } private Message invokeOperation(Message msg) { OtpSelf self = null; OtpPeer other = null; OtpConnection connection = null; try { String nodeName = "_connector_to_" + binding.getNode(); self = new OtpSelf(nodeName); other = new OtpPeer(binding.getNode()); connection = self.connect(other); OtpErlangList params = TypeHelpersProxy.toErlangAsList((Object[])msg.getBody()); connection.sendRPC(binding.getModule(), msg.getOperation().getName(), params); if (msg.getOperation().getOutputType() != null) { OtpErlangObject result = connection.receiveRPC(); msg.setBody(TypeHelpersProxy.toJava(result, msg.getOperation().getOutputType().getPhysical())); } } catch (Exception e) { msg.setFaultBody(e); } finally { if (connection != null) { connection.close(); } } return msg; } /** * @see org.apache.tuscany.sca.invocation.Invoker#invoke(org.apache.tuscany.sca.invocation.Message) */ public Message invoke(Message msg) { if (binding.isMbox()) { return sendMessage(msg); } else { return invokeOperation(msg); } } }