objectfactoryimpl.java

来自「主要是对串口驱动的的一些控制源码!!! 在下载javacomm20-win32」· Java 代码 · 共 379 行

JAVA
379
字号
/**
 * $Log: ObjectFactoryImpl.java,v $
 * Revision 1.3  2003/02/03 14:16:03  mwulff
 * changed ExceptionHandling; differentiation between local and remote errors
 *
 * Revision 1.2  2003/02/02 13:20:35  mwulff
 * the method name for FindByPrimaryKey-Requests is now explicitly set
 *
 * Revision 1.1  2003/01/16 13:12:40  mwulff
 * initial version
 *
 * Revision 1.3  2002/12/20 18:52:25  mwulff
 * no message
 *
 * Revision 1.2  2002/12/15 16:55:07  mwulff
 * adjusted to reorganisation of the client logging system
 *
 * Revision 1.1  2002/12/13 20:08:22  mwulff
 * no message
 *
 * Revision 1.7  2002/12/09 18:08:05  mwulff
 * no message
 *
 * Revision 1.6  2002/12/08 11:23:00  mwulff
 * no message
 *
 * Revision 1.5  2002/12/05 21:33:50  mwulff
 * reengineering of the complete communication component
 *
 * Revision 1.4  2002/12/01 21:40:16  mwulff
 * adapted to changes in ResourceManager
 *
 * Revision 1.3  2002/12/01 13:02:14  mwulff
 * accomodated to ClientResourceManager and ClientLoggingManager,
 * that are now implemented as singleton
 *
 * Revision 1.2  2002/11/30 11:53:07  mwulff
 * no message
 *
 * Revision 1.1  2002/11/22 16:42:45  mwulff
 * moved
 *
 * Revision 1.8  2002/11/21 11:07:43  mwulff
 * removed bug: method createObject(Class, String) called itself, instead of
 * createObject(Class, String, Object[])
 *
 * Revision 1.7  2002/11/17 17:58:28  mwulff
 * -in all methods, the class name of the inferface implemented by the proxy is
 * nolonger given as String. A class object is given, from wich the name of the
 * interface can be retrieved by class.getName();
 *
 * -added no parameter methods:
 * createObject(Class, String)
 * createEJB(Class, String)
 *
 * -added method findByPrimaryKey(Class, Object[], String)
 *
 * Revision 1.6  2002/11/15 18:23:55  mwulff
 * - addes support for ejb creation
 *
 * Revision 1.5  2002/11/08 19:23:41  mwulff
 * is now responsible for compression check
 * of the DeflaterByteArrayOutputStream
 *
 * Revision 1.4  2002/11/07 16:30:29  mwulff
 * rearranged logging statements
 *
 * Revision 1.3  2002/11/05 19:49:14  mwulff
 * class is now inherited from CommunicationHandler and therefore supports
 * transfering local LoggingEvents to the server
 *
 * Revision 1.2  2002/11/03 21:06:20  mwulff
 * added support for handling compressed and uncompressed stream
 *
 * Revision 1.1.1.1  2002/10/23 14:13:23  mwulff
 * initial checkin
 *
 */
package de.fhm.jkf.comm.cl;

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import de.fhm.jkf.comm.clsv.CreationRequest;
import de.fhm.jkf.comm.clsv.EJBCreationRequest;
import de.fhm.jkf.comm.clsv.EJBFindByPrimKeyRequest;
import de.fhm.jkf.comm.clsv.EJBFindByXXXRequest;
import de.fhm.jkf.comm.clsv.EJBFindByXXXResponse;
import de.fhm.jkf.comm.clsv.RemoteObjectCreationException;
import de.fhm.jkf.comm.clsv.RemoteObjectID;
import de.fhm.jkf.comm.clsv.Response;
import de.fhm.jkf.resource.cl.JKFClientLogger;
/**
 * @author marten wulff
 * 
 * <br><br><center><table border="1" width="80%"><hr>
 * <strong><a href="http://jkf.sourceforge.net">The JKF Project</a></strong>
 * <p>
 * Copyright (C) 2002 by Marten Wulff
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the <a href="http://www.gnu.org/copyleft/lesser.html">
 * GNU Lesser General Public License</a> along with this library; if not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA  02111-1307  USA
 * <hr></table></center>
 * 
 * 
 * ObjectFactoryImpl is the entrypoint for all applications, that 
 * wants to make use off the jkf communication framework.<p>
 * 
 * ObjectFactoryImpl provides methods for creation of remote java objects.<br>
 * The create-methods return a Proxy, that manages the communication<br>
 * between client and the remote object, the Proxy is responsible for.<p>
 * 
 * The remote object can be a simple java class or an ejb, running <br>
 * running on a different or the same application server on which <br>
 * the JKF Framework is installed.<p>
 * 
 * @see ProxyStub
 * @stereotype implementationClass
 */
final class ObjectFactoryImpl extends CommunicationHandler implements ObjectFactory {
	
	ObjectFactoryImpl() {
		super();
	}
	
	/**
	 * Method for creating a simple remote java object<br>
	 * without constructor parameters.
	 * 
	 * @param interfaceClass  
	 * @param remoteClassName
	 * 
	 * @return Object  a Proxy instance that must be casted <br>
	 * 					to the desired Interface
	 */
	public Object createObject(
		Class interfaceClass,
		String remoteClassName)
		throws RemoteObjectCreationException {
		return createObject(
			interfaceClass,
			remoteClassName,
			null);
	}

	public Object createObject(
		Class interfaceClass,
		String remoteClassName,
		Object[] params)
		throws RemoteObjectCreationException {

		if (JKFClientLogger.isDebugEnabled()) {
		JKFClientLogger.debug(
			"trying to create new remote object [ "
				+ remoteClassName
				+ " ] ...");
		}

		Object generatedObject = null;
		Response response = null;

		CreationRequest request = new CreationRequest();
		request.setClassName(remoteClassName);
		request.setParams(params);

		try {
			prepareConnection(request);				
			this.compressionHandler.sendObject(request);
			response = (Response) this.compressionHandler.receiveObject();

			followUpConnection(response);			
			
			generatedObject =
				Proxy.newProxyInstance(
					Class.forName(interfaceClass.getName()).getClassLoader(),
					new Class[] { Class.forName(interfaceClass.getName())},
					new ProxyStub(response.getRemoteObjectId()));

			if (JKFClientLogger.isDebugEnabled()) {
				JKFClientLogger.debug(
					"remote object " + remoteClassName + " created... !");
			}

		} catch (Exception ex) {
			throw new RemoteObjectCreationException(
				"[LocalError] creating Object", ex);
		}

		// check if any exceptions on server side occured
		if (response.errorOccured()) {
			Exception ex = response.getRemoteException();
			throw new RemoteObjectCreationException(
				"[RemoteError] creating Object", ex);
		}

		return generatedObject;
	}

	public Object createEJB(Class interfaceClass, String jndiName)
		throws RemoteObjectCreationException {

		return createEJB(interfaceClass, null, jndiName);
	}

	public Object createEJB(
		Class interfaceClass,
		Object[] params,
		String jndiName)
		throws RemoteObjectCreationException {

		Object generatedObject = null;
		Response response = null;

		EJBCreationRequest request = new EJBCreationRequest();
		request.setJndiName(jndiName);
		request.setParams(params);
		request.setMethodName("create");

		try {	
			prepareConnection(request);				
			this.compressionHandler.sendObject(request);
			response = (Response) this.compressionHandler.receiveObject();

			followUpConnection(response);


			generatedObject =
				Proxy.newProxyInstance(
					Class.forName(interfaceClass.getName()).getClassLoader(),
					new Class[] { Class.forName(interfaceClass.getName())},
					new ProxyStub(response.getRemoteObjectId()));

			if (JKFClientLogger.isDebugEnabled()) {
				JKFClientLogger.debug(
					"remote object "
						+ interfaceClass.getName()
						+ " created... !");
			}

		} catch (Exception ex) {
			throw new RemoteObjectCreationException(
				"[LocalError] creating EJB", ex);
		}
		
		// check if any exceptions on server side occured
		if (response.errorOccured()) {
			Exception ex = response.getRemoteException();
			throw new RemoteObjectCreationException(
				"[RemoteError] creating EJB", ex);
		}


		return generatedObject;
	}

	/**
	 * Method for finding an EJB by its primary key.
	 */
	public Object findByPrimaryKey(
		Class interfaceClass,
		Object[] params,
		String jndiName)
		throws RemoteObjectCreationException {

		Object generatedObject = null;
		Response response = null;

		EJBFindByPrimKeyRequest request = new EJBFindByPrimKeyRequest();
		request.setJndiName(jndiName);
		request.setMethodName("findByPrimaryKey");
		request.setParams(params);

		try {	
			prepareConnection(request);				
			this.compressionHandler.sendObject(request);
			response = (Response) this.compressionHandler.receiveObject();

			followUpConnection(response);
											
			generatedObject =
				Proxy.newProxyInstance(
					Class.forName(interfaceClass.getName()).getClassLoader(),
					new Class[] { Class.forName(interfaceClass.getName())},
					new ProxyStub(response.getRemoteObjectId()));

			if (JKFClientLogger.isDebugEnabled()) {
				JKFClientLogger.debug(
					"remote object "
						+ interfaceClass.getName()
						+ " found ... !");
			}

		} catch (Exception ex) {
			throw new RemoteObjectCreationException(
				"[LocalError] finding EJB by PK", ex);
		}
		
		// check if any exceptions on server side occured
		if (response.errorOccured()) {
			Exception ex = response.getRemoteException();
			throw new RemoteObjectCreationException(
				"[RemoteError] finding EJB by PK", ex);
		}


		return generatedObject;
	}	
	
	public Collection findByXXX(
		Class interfaceClass,
		Object[] params,
		String jndiName,
		String method) 
		throws RemoteObjectCreationException {

		ArrayList generatedObjects = new ArrayList();
		EJBFindByXXXResponse response = null;

		EJBFindByXXXRequest request = new EJBFindByXXXRequest();
		request.setJndiName(jndiName);
		request.setParams(params);
		request.setMethodName(method);

		try {	
			prepareConnection(request);				
			this.compressionHandler.sendObject(request);
			response = (EJBFindByXXXResponse) this.compressionHandler.receiveObject();

			followUpConnection(response);
								
			Collection allRemoteIds= (Collection)response.getRemoteObjectIds();
			
			Iterator it = allRemoteIds.iterator();
			while(it.hasNext()) {
				generatedObjects.add(
					Proxy.newProxyInstance(
						Class.forName(interfaceClass.getName()).getClassLoader(),
						new Class[] { Class.forName(interfaceClass.getName())},
						new ProxyStub((RemoteObjectID)it.next())));
			}

			if (JKFClientLogger.isDebugEnabled()) {
				JKFClientLogger.debug(
					"remote object "
						+ interfaceClass.getName()
						+ " found ... !");
			}

		} catch (Exception ex) {
			throw new RemoteObjectCreationException(
				"[LocalError] finding EJB by: " + request.getMethodName(), ex);
		}

		// check if any exceptions on server side occured
		if (response.errorOccured()) {
			Exception ex = response.getRemoteException();
			throw new RemoteObjectCreationException(
				"[RemoteError] finding EJB by: " + request.getMethodName(), ex);
		}

		return generatedObjects;
		
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?