001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @@author Scott Ferguson
027: */
028:
029: package com.caucho.ejb.hessian;
030:
031: import com.caucho.java.WorkDir;
032: import com.caucho.hessian.io.AbstractHessianInput;
033: import com.caucho.hessian.io.HessianOutput;
034: import com.caucho.hessian.io.HessianRemoteResolver;
035: import com.caucho.hessian.io.HessianSerializerInput;
036: import com.caucho.server.util.CauchoSystem;
037: import com.caucho.vfs.Path;
038: import com.caucho.vfs.Vfs;
039:
040: import java.io.IOException;
041: import java.io.InputStream;
042: import java.io.OutputStream;
043:
044: /**
045: * Factory for creating Hessian client stubs. The returned stub will
046: * call the remote object for all methods.
047: *
048: * <pre>
049: * String url = "http://localhost:8080/ejb/hello";
050: * HelloHome hello = (HelloHome) factory.create(HelloHome.class, url);
051: * </pre>
052: *
053: * After creation, the stub can be like a regular Java class. Because
054: * it makes remote calls, it can throw more exceptions than a Java class.
055: * In particular, it may throw protocol exceptions.
056: */
057:
058: public class HessianStubFactory implements HessianRemoteResolver {
059: private HessianRemoteResolver _resolver;
060: private Path _workPath;
061:
062: public HessianStubFactory() {
063: _resolver = this ;
064: }
065:
066: /**
067: * Returns the remote resolver.
068: */
069: public HessianRemoteResolver getRemoteResolver() {
070: return _resolver;
071: }
072:
073: public void setWorkPath(Path path) {
074: _workPath = path;
075: }
076:
077: public Path getWorkPath() {
078: if (_workPath != null)
079: return _workPath;
080: else
081: return WorkDir.getLocalWorkDir();
082: }
083:
084: /**
085: * Creates a new proxy with the specified URL. The returned object
086: * is a proxy with the interface specified by api.
087: *
088: * <pre>
089: * String url = "http://localhost:8080/ejb/hello");
090: * HelloHome hello = (HelloHome) factory.create(HelloHome.class, url);
091: * </pre>
092: *
093: * @@param api the interface the proxy class needs to implement
094: * @@param url the URL where the client object is located.
095: *
096: * @@return a proxy to the object with the specified interface.
097: */
098: public Object create(Class api, String url) throws Exception {
099: StubGenerator gen = new StubGenerator();
100: gen.setClassDir(getWorkPath().lookup("ejb"));
101:
102: Class cl = gen.createStub(api);
103:
104: HessianStub stub = (HessianStub) cl.newInstance();
105:
106: stub._hessian_setURLPath(Vfs.lookup(url));
107: stub._hessian_setClientContainer(this );
108:
109: return stub;
110: }
111:
112: public AbstractHessianInput getHessianInput(InputStream is) {
113: AbstractHessianInput in = new HessianSerializerInput(is);
114: in.setRemoteResolver(_resolver);
115:
116: return in;
117: }
118:
119: public HessianOutput getHessianOutput(OutputStream os) {
120: return new HessianWriter(os);
121: }
122:
123: /**
124: * Looks up a proxy object.
125: */
126: public Object lookup(String type, String url) throws IOException {
127: try {
128: Class api = CauchoSystem.loadClass(type);
129:
130: return create(api, url);
131: } catch (Exception e) {
132: throw new IOException(String.valueOf(e));
133: }
134: }
135: }
|