001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.io.j2me.jcrmi;
028:
029: import javax.microedition.jcrmi.RemoteRef;
030:
031: /** JCRMI remote reference. */
032: class Reference implements RemoteRef {
033:
034: /**
035: * Remote reference uses this connection for card communication.
036: */
037: private Protocol connection;
038:
039: /**
040: * Remote object identifier.
041: */
042: private short objectID;
043:
044: /**
045: * Anticollision string for remote object.
046: */
047: private String hashModifier;
048:
049: /**
050: * The name of the most specific remote interface implemented by remote
051: * object.
052: */
053: private String className;
054:
055: /**
056: * Creates new remote reference object.
057: * @param connection Remote reference uses this connection for
058: * card communication.
059: * @param objectID Remote object identifier.
060: * @param hashModifier Anticollision string for remote object
061: * in UTF-8 representation.
062: * @param className the name of the most specific remote interface
063: * implemented by remote object.
064: */
065: Reference(Protocol connection, short objectID, String hashModifier,
066: String className) {
067:
068: this .connection = connection;
069: this .objectID = objectID;
070: this .hashModifier = hashModifier;
071: this .className = className;
072: }
073:
074: /**
075: * Returns object identifier for this reference.
076: * @return object identifier
077: */
078: short getObjectID() {
079: return objectID;
080: }
081:
082: /**
083: * Returns hash modifier for this reference.
084: * @return hash modifier
085: */
086: String getHashModifier() {
087: return hashModifier;
088: }
089:
090: /**
091: * Returns the name of the most specific remote interface implemented by
092: * remote object.
093: * @return the name of interface
094: */
095: String getClassName() {
096: return className;
097: }
098:
099: /**
100: * Invokes a remote method.
101: * <p>A remote method invocation consists of three steps:</p>
102: * <ol>
103: * <li>Marshall the representation for the method and parameters.</p>
104: * <p></p>
105: * <li>Communicate the method invocation to the host and unmarshall the
106: * return value or exception returned.</p>
107: * <p></p>
108: * <li>Return the result of the method invocation to the caller.</p>
109: * <p></p>
110: * </ol>
111: *
112: * The remote method invoked on the card can throw an exception to
113: * signal that an unexpected condition has been detected.<p>
114: *
115: * If the exception thrown on the card is an exception defined in
116: * the Java Card 2.2 API, then the same exception is thrown to the
117: * stub method. The client can access the reason code associated
118: * with Java Card-specific exceptions using the standard
119: * <code>getReason()</code> method.<p>
120: *
121: * If the exception thrown on the card is a subclass of an exception
122: * defined in the Java Card 2.2 API, then the closest exception defined
123: * in the API (along with the reason code, if applicable) is
124: * thrown to the stub method. The detail message string of the
125: * exception object may indicate that exception subclass was thrown
126: * on the card.<p>
127: *
128: * Apart from the exceptions thrown by the remote method itself,
129: * errors during communication, marshalling, protocol handling,
130: * unmarshalling, stub object instantiation, and so on, related
131: * to the JCRMI method invocation, results in a
132: * <code>RemoteException</code> being thrown to the stub method.
133: *
134: * @param method simple (not fully qualified) name of the method
135: * followed by the method descriptor. Representation of a
136: * method descriptor is the same as that described in The
137: * Java Virtual Machine Specification (§ 4.3.3)
138: * @param params the parameter list
139: * @return result of remote method invocation
140: * @exception java.lang.Exception if any exception occurs during
141: * the remote method invocation
142: */
143: public Object invoke(String method, Object[] params)
144: throws Exception {
145: return connection.invoke(this , method, params);
146: }
147:
148: /**
149: * Compares two remote references. Two remote references are equal
150: * if they refer to the same remote object.
151: * @param obj - the Object to compare with
152: * @return true if these Objects are equal; false otherwise
153: */
154: public boolean remoteEquals(RemoteRef obj) {
155:
156: if (obj == null || !(obj instanceof Reference)) {
157: return false;
158: }
159:
160: Reference r = (Reference) obj;
161: if (r.objectID != objectID) {
162: return false;
163: }
164:
165: if (r.connection == connection) {
166: return true;
167: }
168:
169: return (r.connection.getCardSessionId() == connection
170: .getCardSessionId())
171: && r.connection.isOpened() && connection.isOpened();
172: }
173:
174: /**
175: * Returns a hashcode for a remote object. Two remote object stubs
176: * that refer to the same remote object will have the same hash code.
177: *
178: * @return the remote object hashcode
179: */
180: public int remoteHashCode() {
181: return connection.getCardSessionId() << 16 + objectID;
182: }
183: }
|