Java tutorial
/* * 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.ode.jca.server.rmi; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.jca.server.ConnectionProvider; import org.apache.ode.ra.transports.rmi.OdeRemote; import org.apache.ode.ra.transports.rmi.OdeTransportPipeRemote; /** * Server-side of the RMI transport. Manages a collection of communication * "pipes", each represented by its own remote object. */ public class RmiTransportServerImpl implements OdeRemote { private static final Log __log = LogFactory.getLog(RmiTransportServerImpl.class); private List<RmiPipeServerImpl> _pipes = new ArrayList<RmiPipeServerImpl>(); private int _port = 1099; private Remote _remote; private ConnectionProvider _connProvider; private String _id; private Registry _registry; public RmiTransportServerImpl() { } public void setId(String id) { _id = id; } public void setConnectionProvider(ConnectionProvider connprovider) { _connProvider = connprovider; ; } public void setPort(int port) { _port = port; } public int getPort() { return _port; } public synchronized void start() throws RemoteException { if (_id == null) throw new IllegalStateException("Must set id!"); if (_connProvider == null) throw new IllegalStateException("Must set connection provider."); _remote = UnicastRemoteObject.exportObject(this, 0); // Bind the RMI-server to the registry, creating one if necessary try { _registry = LocateRegistry.createRegistry(_port); __log.debug("Created registry on port " + _port); } catch (Exception ex) { __log.debug("Could not create registry on port " + _port + " (perhaps it's already there)"); /* ignore */ } Registry registry = LocateRegistry.getRegistry(_port); registry.rebind(_id, _remote); __log.debug("Bound JCA server as \"" + _id + "\" on registry port " + _port); } public synchronized void stop() throws RemoteException { for (RmiPipeServerImpl pipe : _pipes) { unexport(pipe); } if (_registry != null) { unexport(_registry); } unexport(this); } public synchronized OdeTransportPipeRemote newPipe() throws RemoteException { RmiPipeServerImpl pipe = new RmiPipeServerImpl(this, _connProvider.createConnectionObject(), _connProvider.getConnectionIntefaces()); OdeTransportPipeRemote remote = (OdeTransportPipeRemote) UnicastRemoteObject.exportObject(pipe, 0); pipe.remote = remote; _pipes.add(pipe); return remote; } void pipeClosed(RmiPipeServerImpl pipe) { if (__log.isDebugEnabled()) __log.debug("Closing RMI pipe " + pipe); unexport(pipe); synchronized (this) { _pipes.remove(pipe); } _connProvider.destroyConnectionObject(pipe.target); } void unexport(Remote remote) { try { UnicastRemoteObject.unexportObject(remote, false); } catch (Exception e) { // ignore } } }