Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClass.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClass.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClass.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClass.java Sun Jul 5 11:41:39 2020 @@ -1,286 +1,286 @@ -/* - * 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.river.reggie; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InvalidObjectException; -import java.io.ObjectInputStream; -import java.io.Serializable; -import java.rmi.MarshalException; -import java.rmi.UnmarshalException; -import java.security.DigestOutputStream; -import java.security.MessageDigest; -import org.apache.river.proxy.CodebaseProvider; -import org.apache.river.proxy.MarshalledWrapper; - -/** - * An EntryClass is a descriptor for an entry class, packaged up for - * transmission between client-side proxies and the registrar server. - * Instances are never visible to clients, they are private to the - * communication between the proxies and the server. Note that we don't - * transmit information about interfaces implemented by the class, because it - * isn't necessary given the specific use of type information for entries. - * <p> - * This class only has a bare minimum of methods, to minimize - * the amount of code downloaded into clients. - * <p> - * - * @author Sun Microsystems, Inc. - * - * @see ClassMapper - */ -class EntryClass implements Serializable { - - private static final long serialVersionUID = 2L; - - /** - * Class name - * - * @serial - */ - protected String name; - /** - * Hash for the type - * - * @serial - */ - protected long hash; - /** - * Descriptor for the superclass - * - * @serial - */ - protected EntryClass superclass; - /** - * Number of public fields - * - * @serial - */ - protected int numFields; - /** Number of instances of this class in service registrations */ - protected transient int numInstances; - /** Number of templates of this class in event registrations */ - protected transient int numTemplates; - /** - * An instance containing only name and hash, no superclass info. - * This is only used on the registrar side, to minimize the amount - * of info transmitted back to clients. - */ - protected transient EntryClass replacement; - /** - * Flag set to true if this instance was unmarshalled from an - * integrity-protected stream, or false otherwise - */ - private transient boolean integrity = false; - - /** Should only be called by ClassMapper */ - public EntryClass(Class clazz, EntryClass superclass) - throws MarshalException - { - name = clazz.getName(); - this.superclass = superclass; - ClassMapper.EntryField[] fields = ClassMapper.getFields(clazz); - numFields = fields.length; - computeHash(fields); - } - - /** - * Constructor used for creating replacement instances, - * containing only name and hash. - */ - private EntryClass(EntryClass orig) { - name = orig.name; - hash = orig.hash; - } - - /** Return the superclass descriptor */ - public EntryClass getSuperclass() { - return superclass; - } - - /** Return the number of public fields (including superclasses) */ - public int getNumFields() { - return numFields; - } - - /** Set the number of instances of this class */ - public void setNumInstances(int numInstances) { - this.numInstances = numInstances; - } - - /** Set the number of templates of this class */ - public void setNumTemplates(int numTemplates) { - this.numTemplates = numTemplates; - } - - /** Return the replacement, if any, containing only name and rep. */ - public synchronized EntryClass getReplacement() { - if (replacement == null) - replacement = new EntryClass(this); - return replacement; - } - - /** - * This is really only needed in the registrar, but it's very - * convenient to have here. - * @see Class#isAssignableFrom - */ - public boolean isAssignableFrom(EntryClass cls) { - for (EntryClass sup = cls; sup != null; sup = sup.superclass) { - if (hash == sup.hash) - return true; - } - return false; - } - - /** - * Returns the number of times this type is used in service - * registrations - * @return number of instances of this type in use in service - * registrations - */ - public int getNumInstances() { - return numInstances; - } - - /** - * Returns the number of times this type is used in event - * registrations - * @return number of times this type is used in event registrations - */ - public int getNumTemplates() { - return numTemplates; - } - - // Converts this type descriptor to a Class object - public Class toClass(String codebase) - throws IOException, ClassNotFoundException - { - Class cls = - CodebaseProvider.loadClass(codebase, name, null, integrity, null); - EntryClass local; - try { - local = ClassMapper.toEntryClassBase(cls).eclass; - } catch (MarshalException e) { - throw new UnmarshalException("problem obtaining local version of " - + toString(), e); - } - if (hash != local.hash) - throw new UnmarshalException("incoming entry type: " + toString() - + " is not assignable to the local" - + " version of the type: " + local); - return cls; - } - - /** - * Returns the name of this type - * @return the name of this type - */ - public String getName() { - return name; - } - - /** - * Returns true if the object passed in is an instance of EntryClass - * with the same type hash as this object. Returns false otherwise. - * @param o object to compare this object against - * @return true if this object equals the object passed in; false - * otherwise. - */ - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof EntryClass)) - return false; - EntryClass t = (EntryClass) o; - return hash == t.hash; - } - - /** - * Return a hashcode for this type. - * @return int the hashcode for this type - */ - public int hashCode() { - return (int) (hash ^ (hash >>> 32)); - } - - /* Inherit javadoc */ - public String toString() { - return getClass() + "[name=" + getName() + ", hash=" + hash + "]"; - } - - /** - * Computes a SHA-1 digest from the hash of the superclass, if there - * is a superclass, followed by the name of this class, followed by - * the name and type for each field, if any, declared by this class and - * ordered alphabetically by field name. The first 8 bytes of the digest - * are used to form the 64-bit hash value for this type. - */ - private void computeHash(ClassMapper.EntryField[] fields) - throws MarshalException - { - hash = 0; - try { - MessageDigest md = MessageDigest.getInstance("SHA"); - DataOutputStream out = new DataOutputStream( - new DigestOutputStream(new ByteArrayOutputStream(127),md)); - if (superclass != null) - out.writeLong(superclass.hash); - out.writeUTF(name); - int startDeclaredFields = superclass != null ? - superclass.numFields : 0; - for (int i = startDeclaredFields; i < fields.length; i++) { - out.writeUTF(fields[i].field.getName()); - out.writeUTF(fields[i].field.getType().getName()); - } - out.flush(); - byte[] digest = md.digest(); - for (int i = Math.min(8, digest.length); --i >= 0; ) { - hash += ((long) (digest[i] & 0xFF)) << (i * 8); - } - } catch (Exception e) { - throw new MarshalException("Unable to calculate type hash for " - + name, e); - } - } - - /** - * Samples integrity protection setting (if any) of the stream from which - * this instance is being deserialized and checks that valid values - * for this object have been read from the stream. - */ - private void readObject(ObjectInputStream in) - throws IOException, ClassNotFoundException - { - in.defaultReadObject(); - if (name == null) - throw new InvalidObjectException("name cannot be null"); - if (hash == 0) - throw new InvalidObjectException("hash cannot be zero"); - integrity = MarshalledWrapper.integrityEnforced(in); - } - - /** - * Throws InvalidObjectException, since data for this class is required. - */ - private void readObjectNoData() throws InvalidObjectException { - throw new InvalidObjectException("no data"); - } - -} +/* + * 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.river.reggie.proxy; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.io.Serializable; +import java.rmi.MarshalException; +import java.rmi.UnmarshalException; +import java.security.DigestOutputStream; +import java.security.MessageDigest; +import org.apache.river.proxy.CodebaseProvider; +import org.apache.river.proxy.MarshalledWrapper; + +/** + * An EntryClass is a descriptor for an entry class, packaged up for + * transmission between client-side proxies and the registrar server. + * Instances are never visible to clients, they are private to the + * communication between the proxies and the server. Note that we don't + * transmit information about interfaces implemented by the class, because it + * isn't necessary given the specific use of type information for entries. + * <p> + * This class only has a bare minimum of methods, to minimize + * the amount of code downloaded into clients. + * <p> + * + * @author Sun Microsystems, Inc. + * + * @see ClassMapper + */ +public class EntryClass implements Serializable { + + private static final long serialVersionUID = 2L; + + /** + * Class name + * + * @serial + */ + protected String name; + /** + * Hash for the type + * + * @serial + */ + protected long hash; + /** + * Descriptor for the superclass + * + * @serial + */ + protected EntryClass superclass; + /** + * Number of public fields + * + * @serial + */ + protected int numFields; + /** Number of instances of this class in service registrations */ + protected transient int numInstances; + /** Number of templates of this class in event registrations */ + protected transient int numTemplates; + /** + * An instance containing only name and hash, no superclass info. + * This is only used on the registrar side, to minimize the amount + * of info transmitted back to clients. + */ + protected transient EntryClass replacement; + /** + * Flag set to true if this instance was unmarshalled from an + * integrity-protected stream, or false otherwise + */ + private transient boolean integrity = false; + + /** Should only be called by ClassMapper */ + public EntryClass(Class clazz, EntryClass superclass) + throws MarshalException + { + name = clazz.getName(); + this.superclass = superclass; + ClassMapper.EntryField[] fields = ClassMapper.getFields(clazz); + numFields = fields.length; + computeHash(fields); + } + + /** + * Constructor used for creating replacement instances, + * containing only name and hash. + */ + private EntryClass(EntryClass orig) { + name = orig.name; + hash = orig.hash; + } + + /** Return the superclass descriptor */ + public EntryClass getSuperclass() { + return superclass; + } + + /** Return the number of public fields (including superclasses) */ + public int getNumFields() { + return numFields; + } + + /** Set the number of instances of this class */ + public void setNumInstances(int numInstances) { + this.numInstances = numInstances; + } + + /** Set the number of templates of this class */ + public void setNumTemplates(int numTemplates) { + this.numTemplates = numTemplates; + } + + /** Return the replacement, if any, containing only name and rep. */ + public synchronized EntryClass getReplacement() { + if (replacement == null) + replacement = new EntryClass(this); + return replacement; + } + + /** + * This is really only needed in the registrar, but it's very + * convenient to have here. + * @see Class#isAssignableFrom + */ + public boolean isAssignableFrom(EntryClass cls) { + for (EntryClass sup = cls; sup != null; sup = sup.superclass) { + if (hash == sup.hash) + return true; + } + return false; + } + + /** + * Returns the number of times this type is used in service + * registrations + * @return number of instances of this type in use in service + * registrations + */ + public int getNumInstances() { + return numInstances; + } + + /** + * Returns the number of times this type is used in event + * registrations + * @return number of times this type is used in event registrations + */ + public int getNumTemplates() { + return numTemplates; + } + + // Converts this type descriptor to a Class object + public Class toClass(String codebase) + throws IOException, ClassNotFoundException + { + Class cls = + CodebaseProvider.loadClass(codebase, name, null, integrity, null); + EntryClass local; + try { + local = ClassMapper.toEntryClassBase(cls).eclass; + } catch (MarshalException e) { + throw new UnmarshalException("problem obtaining local version of " + + toString(), e); + } + if (hash != local.hash) + throw new UnmarshalException("incoming entry type: " + toString() + + " is not assignable to the local" + + " version of the type: " + local); + return cls; + } + + /** + * Returns the name of this type + * @return the name of this type + */ + public String getName() { + return name; + } + + /** + * Returns true if the object passed in is an instance of EntryClass + * with the same type hash as this object. Returns false otherwise. + * @param o object to compare this object against + * @return true if this object equals the object passed in; false + * otherwise. + */ + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EntryClass)) + return false; + EntryClass t = (EntryClass) o; + return hash == t.hash; + } + + /** + * Return a hashcode for this type. + * @return int the hashcode for this type + */ + public int hashCode() { + return (int) (hash ^ (hash >>> 32)); + } + + /* Inherit javadoc */ + public String toString() { + return getClass() + "[name=" + getName() + ", hash=" + hash + "]"; + } + + /** + * Computes a SHA-1 digest from the hash of the superclass, if there + * is a superclass, followed by the name of this class, followed by + * the name and type for each field, if any, declared by this class and + * ordered alphabetically by field name. The first 8 bytes of the digest + * are used to form the 64-bit hash value for this type. + */ + private void computeHash(ClassMapper.EntryField[] fields) + throws MarshalException + { + hash = 0; + try { + MessageDigest md = MessageDigest.getInstance("SHA"); + DataOutputStream out = new DataOutputStream( + new DigestOutputStream(new ByteArrayOutputStream(127),md)); + if (superclass != null) + out.writeLong(superclass.hash); + out.writeUTF(name); + int startDeclaredFields = superclass != null ? + superclass.numFields : 0; + for (int i = startDeclaredFields; i < fields.length; i++) { + out.writeUTF(fields[i].field.getName()); + out.writeUTF(fields[i].field.getType().getName()); + } + out.flush(); + byte[] digest = md.digest(); + for (int i = Math.min(8, digest.length); --i >= 0; ) { + hash += ((long) (digest[i] & 0xFF)) << (i * 8); + } + } catch (Exception e) { + throw new MarshalException("Unable to calculate type hash for " + + name, e); + } + } + + /** + * Samples integrity protection setting (if any) of the stream from which + * this instance is being deserialized and checks that valid values + * for this object have been read from the stream. + */ + private void readObject(ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + if (name == null) + throw new InvalidObjectException("name cannot be null"); + if (hash == 0) + throw new InvalidObjectException("hash cannot be zero"); + integrity = MarshalledWrapper.integrityEnforced(in); + } + + /** + * Throws InvalidObjectException, since data for this class is required. + */ + private void readObjectNoData() throws InvalidObjectException { + throw new InvalidObjectException("no data"); + } + +}
Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClassBase.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClassBase.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClassBase.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryClassBase.java Sun Jul 5 11:41:39 2020 @@ -1,77 +1,77 @@ -/* - * 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.river.reggie; - -import java.io.Serializable; -import org.apache.river.proxy.CodebaseProvider; - -/** - * An EntryClass annotated with a codebase. - * - * @author Sun Microsystems, Inc. - * - */ -class EntryClassBase implements Serializable { - - private static final long serialVersionUID = 2L; - - /** - * The EntryClass. - * - * @serial - */ - public final EntryClass eclass; - /** - * The codebase. - * - * @serial - */ - public String codebase; - - /** Simple constructor */ - public EntryClassBase(EntryClass eclass, String codebase) { - this.eclass = eclass; - this.codebase = codebase; - } - - /** Sets the codebase to the codebase of the given class. */ - public void setCodebase(Class cls) { - codebase = CodebaseProvider.getClassAnnotation(cls); - } - - /** - * Converts an array of EntryClassBase to an array of Class. If a - * class cannot be loaded, it is left as null. - */ - public static Class[] toClass(EntryClassBase[] eclasses) - { - Class[] classes = null; - if (eclasses != null) { - classes = new Class[eclasses.length]; - for (int i = eclasses.length; --i >= 0; ) { - try { - EntryClassBase eclass = eclasses[i]; - classes[i] = eclass.eclass.toClass(eclass.codebase); - } catch (Throwable e) { - RegistrarProxy.handleException(e); - } - } - } - return classes; - } -} +/* + * 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.river.reggie.proxy; + +import java.io.Serializable; +import org.apache.river.proxy.CodebaseProvider; + +/** + * An EntryClass annotated with a codebase. + * + * @author Sun Microsystems, Inc. + * + */ +public class EntryClassBase implements Serializable { + + private static final long serialVersionUID = 2L; + + /** + * The EntryClass. + * + * @serial + */ + public final EntryClass eclass; + /** + * The codebase. + * + * @serial + */ + public String codebase; + + /** Simple constructor */ + public EntryClassBase(EntryClass eclass, String codebase) { + this.eclass = eclass; + this.codebase = codebase; + } + + /** Sets the codebase to the codebase of the given class. */ + public void setCodebase(Class cls) { + codebase = CodebaseProvider.getClassAnnotation(cls); + } + + /** + * Converts an array of EntryClassBase to an array of Class. If a + * class cannot be loaded, it is left as null. + */ + public static Class[] toClass(EntryClassBase[] eclasses) + { + Class[] classes = null; + if (eclasses != null) { + classes = new Class[eclasses.length]; + for (int i = eclasses.length; --i >= 0; ) { + try { + EntryClassBase eclass = eclasses[i]; + classes[i] = eclass.eclass.toClass(eclass.codebase); + } catch (Throwable e) { + RegistrarProxy.handleException(e); + } + } + } + return classes; + } +} Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryRep.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryRep.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryRep.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EntryRep.java Sun Jul 5 11:41:39 2020 @@ -1,207 +1,207 @@ -/* - * 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.river.reggie; - -import org.apache.river.proxy.MarshalledWrapper; -import org.apache.river.reggie.ClassMapper.EntryField; -import java.io.IOException; -import java.io.Serializable; -import java.lang.reflect.Field; -import java.rmi.MarshalException; -import java.rmi.RemoteException; -import net.jini.core.entry.Entry; - -/** - * An EntryRep contains the fields of an Entry packaged up for - * transmission between client-side proxies and the registrar server. - * Instances are never visible to clients, they are private to the - * communication between the proxies and the server. - * <p> - * This class only has a bare minimum of methods, to minimize - * the amount of code downloaded into clients. - * - * @author Sun Microsystems, Inc. - * - */ -class EntryRep implements Serializable, Cloneable { - - private static final long serialVersionUID = 2L; - - /** - * The Class of the Entry converted to EntryClass. - * - * @serial - */ - public EntryClass eclass; - /** - * The codebase of the entry class. - * - * @serial - */ - public String codebase; - /** - * The public fields of the Entry, each converted as necessary to - * a MarshalledWrapper (or left as is if of known java.lang immutable - * type). The fields are in super- to subclass order. - * - * @serial - */ - public Object[] fields; - - /** - * Converts an Entry to an EntryRep. Any exception that results - * is bundled up into a MarshalException. - */ - public EntryRep(Entry entry) throws RemoteException { - EntryClassBase ecb = ClassMapper.toEntryClassBase(entry.getClass()); - eclass = ecb.eclass; - codebase = ecb.codebase; - try { - EntryField[] efields = ClassMapper.getFields(entry.getClass()); - fields = new Object[efields.length]; - for (int i = efields.length; --i >= 0; ) { - EntryField f = efields[i]; - Object val = f.field.get(entry); - if (f.marshal && val != null) - val = new MarshalledWrapper(val); - fields[i] = val; - } - } catch (IOException e) { - throw new MarshalException("error marshalling arguments", e); - } catch (IllegalAccessException e) { - throw new MarshalException("error marshalling arguments", e); - } - } - - /** - * Convert back to an Entry. If the Entry cannot be constructed, - * null is returned. If a field cannot be unmarshalled, it is set - * to null. - */ - public Entry get() { - try { - Class clazz = eclass.toClass(codebase); - EntryField[] efields = ClassMapper.getFields(clazz); - Entry entry = (Entry)clazz.newInstance(); - for (int i = efields.length; --i >= 0; ) { - Object val = fields[i]; - EntryField f = efields[i]; - Field rf = f.field; - try { - if (f.marshal && val != null) - val = ((MarshalledWrapper) val).get(); - rf.set(entry, val); - } catch (Throwable e) { - if (e instanceof IllegalArgumentException) { - // fix 4872566: work around empty exception message - String msg = "unable to assign " + - ((val != null) ? - "value of type " + val.getClass().getName() : - "null") + - " to field " + rf.getDeclaringClass().getName() + - "." + rf.getName() + " of type " + - rf.getType().getName(); - e = new ClassCastException(msg).initCause(e); - } - RegistrarProxy.handleException(e); - } - } - return entry; - } catch (Throwable e) { - RegistrarProxy.handleException(e); - } - return null; - } - - /** - * We don't need this in the client or the server, but since we - * redefine equals we provide a minimal hashCode that works. - */ - public int hashCode() { - return eclass.hashCode(); - } - - /** - * EntryReps are equal if they have the same class and the fields - * are pairwise equal. This is really only needed in the server, - * but it's very convenient to have here. - */ - public boolean equals(Object obj) { - if (obj instanceof EntryRep) { - EntryRep entry = (EntryRep)obj; - if (!eclass.equals(entry.eclass) || - fields.length != entry.fields.length) - return false; - for (int i = fields.length; --i >= 0; ) { - if ((fields[i] == null && entry.fields[i] != null) || - (fields[i] != null && !fields[i].equals(entry.fields[i]))) - return false; - } - return true; - } - return false; - } - - /** - * Deep clone (which just means cloning the fields array too). - * This is really only needed in the server, but it's very - * convenient to have here. - */ - public Object clone() { - try { - EntryRep entry = (EntryRep)super.clone(); - entry.fields = (Object[])entry.fields.clone(); - return entry; - } catch (CloneNotSupportedException e) { - throw new InternalError(); - } - } - - /** - * Converts an array of Entry to an array of EntryRep. If needCodebase - * is false, then the codebase of every EntryRep will be null. - */ - public static EntryRep[] toEntryRep(Entry[] entries, boolean needCodebase) - throws RemoteException - { - EntryRep[] reps = null; - if (entries != null) { - reps = new EntryRep[entries.length]; - for (int i = entries.length; --i >= 0; ) { - if (entries[i] != null) { - reps[i] = new EntryRep(entries[i]); - if (!needCodebase) - reps[i].codebase = null; - } - } - } - return reps; - } - - /** Converts an array of EntryRep to an array of Entry. */ - public static Entry[] toEntry(EntryRep[] reps) { - Entry[] entries = null; - if (reps != null) { - entries = new Entry[reps.length]; - for (int i = reps.length; --i >= 0; ) { - entries[i] = reps[i].get(); - } - } - return entries; - } -} +/* + * 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.river.reggie.proxy; + +import org.apache.river.proxy.MarshalledWrapper; +import org.apache.river.reggie.proxy.ClassMapper.EntryField; +import java.io.IOException; +import java.io.Serializable; +import java.lang.reflect.Field; +import java.rmi.MarshalException; +import java.rmi.RemoteException; +import net.jini.core.entry.Entry; + +/** + * An EntryRep contains the fields of an Entry packaged up for + * transmission between client-side proxies and the registrar server. + * Instances are never visible to clients, they are private to the + * communication between the proxies and the server. + * <p> + * This class only has a bare minimum of methods, to minimize + * the amount of code downloaded into clients. + * + * @author Sun Microsystems, Inc. + * + */ +public class EntryRep implements Serializable, Cloneable { + + private static final long serialVersionUID = 2L; + + /** + * The Class of the Entry converted to EntryClass. + * + * @serial + */ + public EntryClass eclass; + /** + * The codebase of the entry class. + * + * @serial + */ + public String codebase; + /** + * The public fields of the Entry, each converted as necessary to + * a MarshalledWrapper (or left as is if of known java.lang immutable + * type). The fields are in super- to subclass order. + * + * @serial + */ + public Object[] fields; + + /** + * Converts an Entry to an EntryRep. Any exception that results + * is bundled up into a MarshalException. + */ + public EntryRep(Entry entry) throws RemoteException { + EntryClassBase ecb = ClassMapper.toEntryClassBase(entry.getClass()); + eclass = ecb.eclass; + codebase = ecb.codebase; + try { + EntryField[] efields = ClassMapper.getFields(entry.getClass()); + fields = new Object[efields.length]; + for (int i = efields.length; --i >= 0; ) { + EntryField f = efields[i]; + Object val = f.field.get(entry); + if (f.marshal && val != null) + val = new MarshalledWrapper(val); + fields[i] = val; + } + } catch (IOException e) { + throw new MarshalException("error marshalling arguments", e); + } catch (IllegalAccessException e) { + throw new MarshalException("error marshalling arguments", e); + } + } + + /** + * Convert back to an Entry. If the Entry cannot be constructed, + * null is returned. If a field cannot be unmarshalled, it is set + * to null. + */ + public Entry get() { + try { + Class clazz = eclass.toClass(codebase); + EntryField[] efields = ClassMapper.getFields(clazz); + Entry entry = (Entry)clazz.newInstance(); + for (int i = efields.length; --i >= 0; ) { + Object val = fields[i]; + EntryField f = efields[i]; + Field rf = f.field; + try { + if (f.marshal && val != null) + val = ((MarshalledWrapper) val).get(); + rf.set(entry, val); + } catch (Throwable e) { + if (e instanceof IllegalArgumentException) { + // fix 4872566: work around empty exception message + String msg = "unable to assign " + + ((val != null) ? + "value of type " + val.getClass().getName() : + "null") + + " to field " + rf.getDeclaringClass().getName() + + "." + rf.getName() + " of type " + + rf.getType().getName(); + e = new ClassCastException(msg).initCause(e); + } + RegistrarProxy.handleException(e); + } + } + return entry; + } catch (Throwable e) { + RegistrarProxy.handleException(e); + } + return null; + } + + /** + * We don't need this in the client or the server, but since we + * redefine equals we provide a minimal hashCode that works. + */ + public int hashCode() { + return eclass.hashCode(); + } + + /** + * EntryReps are equal if they have the same class and the fields + * are pairwise equal. This is really only needed in the server, + * but it's very convenient to have here. + */ + public boolean equals(Object obj) { + if (obj instanceof EntryRep) { + EntryRep entry = (EntryRep)obj; + if (!eclass.equals(entry.eclass) || + fields.length != entry.fields.length) + return false; + for (int i = fields.length; --i >= 0; ) { + if ((fields[i] == null && entry.fields[i] != null) || + (fields[i] != null && !fields[i].equals(entry.fields[i]))) + return false; + } + return true; + } + return false; + } + + /** + * Deep clone (which just means cloning the fields array too). + * This is really only needed in the server, but it's very + * convenient to have here. + */ + public Object clone() { + try { + EntryRep entry = (EntryRep)super.clone(); + entry.fields = (Object[])entry.fields.clone(); + return entry; + } catch (CloneNotSupportedException e) { + throw new InternalError(); + } + } + + /** + * Converts an array of Entry to an array of EntryRep. If needCodebase + * is false, then the codebase of every EntryRep will be null. + */ + public static EntryRep[] toEntryRep(Entry[] entries, boolean needCodebase) + throws RemoteException + { + EntryRep[] reps = null; + if (entries != null) { + reps = new EntryRep[entries.length]; + for (int i = entries.length; --i >= 0; ) { + if (entries[i] != null) { + reps[i] = new EntryRep(entries[i]); + if (!needCodebase) + reps[i].codebase = null; + } + } + } + return reps; + } + + /** Converts an array of EntryRep to an array of Entry. */ + public static Entry[] toEntry(EntryRep[] reps) { + Entry[] entries = null; + if (reps != null) { + entries = new Entry[reps.length]; + for (int i = reps.length; --i >= 0; ) { + entries[i] = reps[i].get(); + } + } + return entries; + } +} Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EventLease.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EventLease.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EventLease.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/EventLease.java Sun Jul 5 11:41:39 2020 @@ -1,117 +1,117 @@ -/* - * 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.river.reggie; - -import java.io.InvalidObjectException; -import java.io.ObjectStreamException; -import java.rmi.RemoteException; -import net.jini.core.constraint.RemoteMethodControl; -import net.jini.core.lease.UnknownLeaseException; -import net.jini.core.lookup.ServiceID; -import net.jini.id.Uuid; - -/** - * When a registrar (lookup service) grants a lease on an event registration - * on behalf of some object (client), a proxy is employed to allow the client - * to interact with the lease; this class is the implementation of that proxy. - * Clients only see instances of this class via the Lease interface. - * - * @author Sun Microsystems, Inc. - * - */ -class EventLease extends RegistrarLease { - - private static final long serialVersionUID = 2L; - /** The type of the lease used in toString() calls. */ - private static final String LEASE_TYPE = "event"; - - /** - * The eventID returned in the EventRegistration. - * - * @serial - */ - final long eventID; - - /** - * Returns EventLease or ConstrainableEventLease instance, depending on - * whether given server implements RemoteMethodControl. - */ - static EventLease getInstance(Registrar server, - ServiceID registrarID, - long eventID, - Uuid leaseID, - long expiration) - { - return (server instanceof RemoteMethodControl) ? - new ConstrainableEventLease( - server, registrarID, eventID, leaseID, expiration, null) : - new EventLease(server, registrarID, eventID, leaseID, expiration); - } - - /** Constructor for use by getInstance(), ConstrainableEventLease. */ - EventLease(Registrar server, - ServiceID registrarID, - long eventID, - Uuid leaseID, - long expiration) - { - super(server, registrarID, leaseID, expiration); - this.eventID = eventID; - } - - // This method's javadoc is inherited from an interface of this class - public void cancel() throws UnknownLeaseException, RemoteException { - server.cancelEventLease(eventID, leaseID); - } - - /** - * Renews the event lease associated with an instance of this class. - * Each instance of this class corresponds to a lease on an event - * registration for a particular client. This method renews that - * lease on behalf of the client. - * - * @param duration the requested duration for the lease being renewed - * @return long value representing the new duration that was granted - * for the renewed lease. Note that the duration returned may - * be less than the duration requested. - * @exception UnknownLeaseException indicates the lease does not exist; - * typically because the lease has expired. - */ - protected long doRenew(long duration) - throws UnknownLeaseException, RemoteException - { - return server.renewEventLease(eventID, leaseID, duration); - } - - // This method's javadoc is inherited from a super class of this class - Object getRegID() { - return Long.valueOf(eventID); - } - - // inherit javadoc - String getLeaseType() { - return LEASE_TYPE; - } - - /** - * Throws InvalidObjectException, since data for this class is required. - */ - private void readObjectNoData() throws ObjectStreamException { - throw new InvalidObjectException("no data"); - } -} +/* + * 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.river.reggie.proxy; + +import java.io.InvalidObjectException; +import java.io.ObjectStreamException; +import java.rmi.RemoteException; +import net.jini.core.constraint.RemoteMethodControl; +import net.jini.core.lease.UnknownLeaseException; +import net.jini.core.lookup.ServiceID; +import net.jini.id.Uuid; + +/** + * When a registrar (lookup service) grants a lease on an event registration + * on behalf of some object (client), a proxy is employed to allow the client + * to interact with the lease; this class is the implementation of that proxy. + * Clients only see instances of this class via the Lease interface. + * + * @author Sun Microsystems, Inc. + * + */ +public class EventLease extends RegistrarLease { + + private static final long serialVersionUID = 2L; + /** The type of the lease used in toString() calls. */ + private static final String LEASE_TYPE = "event"; + + /** + * The eventID returned in the EventRegistration. + * + * @serial + */ + final long eventID; + + /** + * Returns EventLease or ConstrainableEventLease instance, depending on + * whether given server implements RemoteMethodControl. + */ + public static EventLease getInstance(Registrar server, + ServiceID registrarID, + long eventID, + Uuid leaseID, + long expiration) + { + return (server instanceof RemoteMethodControl) ? + new ConstrainableEventLease( + server, registrarID, eventID, leaseID, expiration, null) : + new EventLease(server, registrarID, eventID, leaseID, expiration); + } + + /** Constructor for use by getInstance(), ConstrainableEventLease. */ + EventLease(Registrar server, + ServiceID registrarID, + long eventID, + Uuid leaseID, + long expiration) + { + super(server, registrarID, leaseID, expiration); + this.eventID = eventID; + } + + // This method's javadoc is inherited from an interface of this class + public void cancel() throws UnknownLeaseException, RemoteException { + server.cancelEventLease(eventID, leaseID); + } + + /** + * Renews the event lease associated with an instance of this class. + * Each instance of this class corresponds to a lease on an event + * registration for a particular client. This method renews that + * lease on behalf of the client. + * + * @param duration the requested duration for the lease being renewed + * @return long value representing the new duration that was granted + * for the renewed lease. Note that the duration returned may + * be less than the duration requested. + * @exception UnknownLeaseException indicates the lease does not exist; + * typically because the lease has expired. + */ + protected long doRenew(long duration) + throws UnknownLeaseException, RemoteException + { + return server.renewEventLease(eventID, leaseID, duration); + } + + // This method's javadoc is inherited from a super class of this class + Object getRegID() { + return Long.valueOf(eventID); + } + + // inherit javadoc + String getLeaseType() { + return LEASE_TYPE; + } + + /** + * Throws InvalidObjectException, since data for this class is required. + */ + private void readObjectNoData() throws ObjectStreamException { + throw new InvalidObjectException("no data"); + } +} Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Item.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Item.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Item.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Item.java Sun Jul 5 11:41:39 2020 @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.river.reggie; +package org.apache.river.reggie.proxy; import org.apache.river.action.GetBooleanAction; import org.apache.river.logging.Levels; @@ -46,7 +46,7 @@ import net.jini.security.Security; * @author Sun Microsystems, Inc. * */ -class Item implements Serializable, Cloneable { +public class Item implements Serializable, Cloneable { private static final long serialVersionUID = 2L; @@ -129,7 +129,7 @@ class Item implements Serializable, Clon attributeSets = EntryRep.toEntryRep(item.attributeSets, true); } - Item(ServiceID serviceID, + public Item(ServiceID serviceID, ServiceType serviceType, String codebase, MarshalledWrapper service, Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Matches.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Matches.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Matches.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Matches.java Sun Jul 5 11:41:39 2020 @@ -1,65 +1,65 @@ -/* - * 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.river.reggie; - -import java.io.Serializable; -import java.rmi.RemoteException; -import java.util.ArrayList; -import java.util.List; -import net.jini.core.lookup.ServiceMatches; - -/** - * A Matches contains the fields of a ServiceMatches packaged up for - * transmission between client-side proxies and the registrar server. - * Instances are never visible to clients, they are private to the - * communication between the proxies and the server. - * <p> - * This class only has a bare minimum of methods, to minimize - * the amount of code downloaded into clients. - * - * @author Sun Microsystems, Inc. - * - */ -class Matches implements Serializable { - - private static final long serialVersionUID = 2L; - - /** - * ServiceMatches.items as an ArrayList of Item - * - * @serial - */ - private final List items; - /** - * ServiceMatches.totalMatches - * - * @serial - */ - private final int totalMatches; - - /** Simple constructor. */ - public Matches(List items, int totalMatches) { - this.items = items; - this.totalMatches = totalMatches; - } - - /** Converts a Matches to a ServiceMatches. */ - ServiceMatches get() throws RemoteException { - return new ServiceMatches(Item.toServiceItem(items), totalMatches); - } -} +/* + * 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.river.reggie.proxy; + +import java.io.Serializable; +import java.rmi.RemoteException; +import java.util.ArrayList; +import java.util.List; +import net.jini.core.lookup.ServiceMatches; + +/** + * A Matches contains the fields of a ServiceMatches packaged up for + * transmission between client-side proxies and the registrar server. + * Instances are never visible to clients, they are private to the + * communication between the proxies and the server. + * <p> + * This class only has a bare minimum of methods, to minimize + * the amount of code downloaded into clients. + * + * @author Sun Microsystems, Inc. + * + */ +public class Matches implements Serializable { + + private static final long serialVersionUID = 2L; + + /** + * ServiceMatches.items as an ArrayList of Item + * + * @serial + */ + private final List items; + /** + * ServiceMatches.totalMatches + * + * @serial + */ + private final int totalMatches; + + /** Simple constructor. */ + public Matches(List items, int totalMatches) { + this.items = items; + this.totalMatches = totalMatches; + } + + /** Converts a Matches to a ServiceMatches. */ + ServiceMatches get() throws RemoteException { + return new ServiceMatches(Item.toServiceItem(items), totalMatches); + } +} Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/ProxyVerifier.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/ProxyVerifier.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/ProxyVerifier.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/ProxyVerifier.java Sun Jul 5 11:41:39 2020 @@ -1,154 +1,154 @@ -/* - * 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.river.reggie; - -import java.io.IOException; -import java.io.InvalidObjectException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.rmi.RemoteException; -import net.jini.core.constraint.RemoteMethodControl; -import net.jini.core.lookup.ServiceID; -import net.jini.security.TrustVerifier; -import net.jini.security.proxytrust.TrustEquivalence; - -/** - * Trust verifier for smart proxies used by Reggie. - * - * @author Sun Microsystems, Inc. - * - */ -final class ProxyVerifier implements TrustVerifier, Serializable { - - private static final long serialVersionUID = 2L; - - /** - * Canonical service reference, used for comparison with inner server - * references extracted from smart proxies to verify. - * - * @serial - */ - private final RemoteMethodControl server; - /** - * The registrar's service ID, used for comparison with registrar service - * IDs extracted from smart proxies to verify. - */ - private transient ServiceID registrarID; - - /** - * Constructs proxy verifier which compares server references extracted - * from smart proxies with the given canonical server reference, which must - * implement both RemoteMethodControl and TrustEquivalence. For proxies - * which contain a copy of the registrar's service ID, that copy is - * compared against the given service ID to ensure consistency. - */ - ProxyVerifier(Registrar server, ServiceID registrarID) { - if (!(server instanceof RemoteMethodControl)) { - throw new UnsupportedOperationException( - "server does not implement RemoteMethodControl"); - } else if (!(server instanceof TrustEquivalence)) { - throw new UnsupportedOperationException( - "server does not implement TrustEquivalence"); - } - this.server = (RemoteMethodControl) server; - this.registrarID = registrarID; - } - - /** - * Returns true if the given object is a trusted proxy, or false otherwise. - * The given object is trusted if it is trust equivalent to the canonical - * server reference carried by this trust verifier, or if it is an instance - * of one of Reggie's constrainable smart proxy classes, and all component - * proxies it contains are trusted, and its inner server reference is trust - * equivalent to the canonical server reference, and its inner copy of the - * registrar's service ID (if it has one) is equal to the service ID - * carried by this verifier. - */ - public boolean isTrustedObject(Object obj, TrustVerifier.Context ctx) - throws RemoteException - { - if (obj == null || ctx == null) { - throw new NullPointerException(); - } - RemoteMethodControl inputServer; - ServiceID inputRegistrarID; - if (obj instanceof ConstrainableRegistrarProxy) { - RegistrarProxy proxy = (RegistrarProxy) obj; - inputServer = (RemoteMethodControl) proxy.server; - inputRegistrarID = proxy.registrarID; - } else if (obj instanceof ConstrainableAdminProxy) { - AdminProxy proxy = (AdminProxy) obj; - inputServer = (RemoteMethodControl) proxy.server; - inputRegistrarID = proxy.registrarID; - } else if (obj instanceof ConstrainableRegistration) { - Registration reg = (Registration) obj; - if (!isTrustedObject(reg.lease, ctx)) { - return false; - } - inputServer = (RemoteMethodControl) reg.server; - inputRegistrarID = registrarID; - } else if (obj instanceof ConstrainableEventLease || - obj instanceof ConstrainableServiceLease) - { - RegistrarLease lease = (RegistrarLease) obj; - inputServer = (RemoteMethodControl) lease.server; - inputRegistrarID = lease.registrarID; - } else if (obj instanceof RemoteMethodControl) { - inputServer = (RemoteMethodControl) obj; - inputRegistrarID = registrarID; - } else { - return false; - } - - TrustEquivalence trustEquiv = (TrustEquivalence) - server.setConstraints(inputServer.getConstraints()); - return trustEquiv.checkTrustEquivalence(inputServer) && - registrarID.equals(inputRegistrarID); - } - - /** - * Writes the default serializable field value for this instance, followed - * by the registrar's service ID encoded as specified by the - * ServiceID.writeBytes method. - */ - private void writeObject(ObjectOutputStream out) throws IOException { - out.defaultWriteObject(); - registrarID.writeBytes(out); - } - - /** - * Reads the default serializable field value for this instance, followed - * by the registrar's service ID encoded as specified by the - * ServiceID.writeBytes method. Verifies that the deserialized registrar - * reference implements both RemoteMethodControl and TrustEquivalence. - */ - private void readObject(ObjectInputStream in) - throws IOException, ClassNotFoundException - { - in.defaultReadObject(); - registrarID = new ServiceID(in); - if (!(server instanceof RemoteMethodControl)) { - throw new InvalidObjectException( - "server does not implement RemoteMethodControl"); - } else if (!(server instanceof TrustEquivalence)) { - throw new InvalidObjectException( - "server does not implement TrustEquivalence"); - } - } -} +/* + * 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.river.reggie.proxy; + +import java.io.IOException; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.rmi.RemoteException; +import net.jini.core.constraint.RemoteMethodControl; +import net.jini.core.lookup.ServiceID; +import net.jini.security.TrustVerifier; +import net.jini.security.proxytrust.TrustEquivalence; + +/** + * Trust verifier for smart proxies used by Reggie. + * + * @author Sun Microsystems, Inc. + * + */ +public final class ProxyVerifier implements TrustVerifier, Serializable { + + private static final long serialVersionUID = 2L; + + /** + * Canonical service reference, used for comparison with inner server + * references extracted from smart proxies to verify. + * + * @serial + */ + private final RemoteMethodControl server; + /** + * The registrar's service ID, used for comparison with registrar service + * IDs extracted from smart proxies to verify. + */ + private transient ServiceID registrarID; + + /** + * Constructs proxy verifier which compares server references extracted + * from smart proxies with the given canonical server reference, which must + * implement both RemoteMethodControl and TrustEquivalence. For proxies + * which contain a copy of the registrar's service ID, that copy is + * compared against the given service ID to ensure consistency. + */ + public ProxyVerifier(Registrar server, ServiceID registrarID) { + if (!(server instanceof RemoteMethodControl)) { + throw new UnsupportedOperationException( + "server does not implement RemoteMethodControl"); + } else if (!(server instanceof TrustEquivalence)) { + throw new UnsupportedOperationException( + "server does not implement TrustEquivalence"); + } + this.server = (RemoteMethodControl) server; + this.registrarID = registrarID; + } + + /** + * Returns true if the given object is a trusted proxy, or false otherwise. + * The given object is trusted if it is trust equivalent to the canonical + * server reference carried by this trust verifier, or if it is an instance + * of one of Reggie's constrainable smart proxy classes, and all component + * proxies it contains are trusted, and its inner server reference is trust + * equivalent to the canonical server reference, and its inner copy of the + * registrar's service ID (if it has one) is equal to the service ID + * carried by this verifier. + */ + public boolean isTrustedObject(Object obj, TrustVerifier.Context ctx) + throws RemoteException + { + if (obj == null || ctx == null) { + throw new NullPointerException(); + } + RemoteMethodControl inputServer; + ServiceID inputRegistrarID; + if (obj instanceof ConstrainableRegistrarProxy) { + RegistrarProxy proxy = (RegistrarProxy) obj; + inputServer = (RemoteMethodControl) proxy.server; + inputRegistrarID = proxy.registrarID; + } else if (obj instanceof ConstrainableAdminProxy) { + AdminProxy proxy = (AdminProxy) obj; + inputServer = (RemoteMethodControl) proxy.server; + inputRegistrarID = proxy.registrarID; + } else if (obj instanceof ConstrainableRegistration) { + Registration reg = (Registration) obj; + if (!isTrustedObject(reg.lease, ctx)) { + return false; + } + inputServer = (RemoteMethodControl) reg.server; + inputRegistrarID = registrarID; + } else if (obj instanceof ConstrainableEventLease || + obj instanceof ConstrainableServiceLease) + { + RegistrarLease lease = (RegistrarLease) obj; + inputServer = (RemoteMethodControl) lease.server; + inputRegistrarID = lease.registrarID; + } else if (obj instanceof RemoteMethodControl) { + inputServer = (RemoteMethodControl) obj; + inputRegistrarID = registrarID; + } else { + return false; + } + + TrustEquivalence trustEquiv = (TrustEquivalence) + server.setConstraints(inputServer.getConstraints()); + return trustEquiv.checkTrustEquivalence(inputServer) && + registrarID.equals(inputRegistrarID); + } + + /** + * Writes the default serializable field value for this instance, followed + * by the registrar's service ID encoded as specified by the + * ServiceID.writeBytes method. + */ + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + registrarID.writeBytes(out); + } + + /** + * Reads the default serializable field value for this instance, followed + * by the registrar's service ID encoded as specified by the + * ServiceID.writeBytes method. Verifies that the deserialized registrar + * reference implements both RemoteMethodControl and TrustEquivalence. + */ + private void readObject(ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + registrarID = new ServiceID(in); + if (!(server instanceof RemoteMethodControl)) { + throw new InvalidObjectException( + "server does not implement RemoteMethodControl"); + } else if (!(server instanceof TrustEquivalence)) { + throw new InvalidObjectException( + "server does not implement TrustEquivalence"); + } + } +} Modified: river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Registrar.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Registrar.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Registrar.java (original) +++ river/jtsk/modules/modularize/apache-river/river-services/reggie/reggie-dl/src/main/java/org/apache/river/reggie/proxy/Registrar.java Sun Jul 5 11:41:39 2020 @@ -1,198 +1,198 @@ -/* - * 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.river.reggie; - -import org.apache.river.admin.DestroyAdmin; -import org.apache.river.proxy.MarshalledWrapper; -import org.apache.river.start.ServiceProxyAccessor; -import java.rmi.MarshalledObject; -import java.rmi.Remote; -import java.rmi.RemoteException; -import net.jini.admin.Administrable; -import net.jini.admin.JoinAdmin; -import net.jini.core.discovery.LookupLocator; -import net.jini.core.event.EventRegistration; -import net.jini.core.event.RemoteEventListener; -import net.jini.core.lease.UnknownLeaseException; -import net.jini.core.lookup.ServiceID; -import net.jini.core.lookup.ServiceRegistration; -import net.jini.id.Uuid; -import net.jini.lookup.DiscoveryAdmin; - -/** - * Registrar defines the private protocol between the various client-side - * proxies and the registrar server. - * <p> - * The declared methods are pretty straightforward transformations of the - * ServiceRegistrar and ServiceRegistration interfaces, with external classes - * (ServiceItem, ServiceTemplate, ServiceMatches, Entry) converted to internal - * classes (Item, Template, Matches, EntryRep). In addition, there are - * methods for transformed Lease and LeaseMap interfaces, for service and - * event leases. - * - * @author Sun Microsystems, Inc. - * - */ -interface Registrar - extends Remote, ServiceProxyAccessor, Administrable, - DiscoveryAdmin, JoinAdmin, DestroyAdmin -{ - /** - * Register a new service or re-register an existing service. - * @see net.jini.core.lookup.ServiceRegistrar#register - */ - ServiceRegistration register(Item item, long leaseDuration) - throws RemoteException; - - /** - * Returns the service object (i.e., just ServiceItem.service) from an - * item matching the template, or null if there is no match. - * @see net.jini.core.lookup.ServiceRegistrar#lookup - */ - MarshalledWrapper lookup(Template tmpl) throws RemoteException; - - /** - * Returns at most maxMatches items matching the template, plus the total - * number of items that match the template. - * @see net.jini.core.lookup.ServiceRegistrar#lookup - */ - Matches lookup(Template tmpl, int maxMatches) throws RemoteException; - - /** - * Registers for event notification. - * @see net.jini.core.lookup.ServiceRegistrar#notify - */ - EventRegistration notify(Template tmpl, - int transitions, - RemoteEventListener listener, - MarshalledObject handback, - long leaseDuration) - throws RemoteException; - - /** - * Looks at all service items that match the specified template, finds - * every entry (among those service items) that either doesn't match any - * entry templates or is a subclass of at least one matching entry - * template, and returns the set of the (most specific) classes of those - * entries. - * @see net.jini.core.lookup.ServiceRegistrar#getEntryClasses - */ - EntryClassBase[] getEntryClasses(Template tmpl) throws RemoteException; - - /** - * Looks at all service items that match the specified template, finds - * every entry (among those service items) that matches - * tmpl.attributeSetTemplates[setIndex], and returns the set of values - * of the specified field of those entries. - * The field name has been converted to an index (fields numbered - * from super to subclass). - * - * @see net.jini.core.lookup.ServiceRegistrar#getFieldValues - */ - Object[] getFieldValues(Template tmpl, int setIndex, int field) - throws RemoteException; - - /** - * Looks at all service items that match the specified template, and for - * every service item finds the most specific type (class or interface) - * or types the service item is an instance of that are neither equal to, - * nor a superclass of, any of the service types in the template and that - * have names that start with the specified prefix, and returns the set - * of all such types. - * @see net.jini.core.lookup.ServiceRegistrar#getServiceTypes - */ - ServiceTypeBase[] getServiceTypes(Template tmpl, String prefix) - throws RemoteException; - - /** - * Returns a LookupLocator that can be used if necessary for unicast - * discovery of the lookup service. - * @see net.jini.core.lookup.ServiceRegistrar#getLocator - */ - LookupLocator getLocator() throws RemoteException; - - /** - * Adds the specified attribute sets (those that aren't duplicates of - * existing attribute sets) to the registered service item. - * @see net.jini.core.lookup.ServiceRegistration#addAttributes - */ - void addAttributes(ServiceID serviceID, Uuid leaseID, EntryRep[] attrSets) - throws UnknownLeaseException, RemoteException; - - /** - * Modifies existing attribute sets of a registered service item. - * @see net.jini.core.lookup.ServiceRegistration#modifyAttributes - */ - void modifyAttributes(ServiceID serviceID, - Uuid leaseID, - EntryRep[] attrSetTmpls, - EntryRep[] attrSets) - throws UnknownLeaseException, RemoteException; - - /** - * Deletes all of the service item's existing attributes, and replaces - * them with the specified attribute sets. - * @see net.jini.core.lookup.ServiceRegistration#setAttributes - */ - void setAttributes(ServiceID serviceID, Uuid leaseID, EntryRep[] attrSets) - throws UnknownLeaseException, RemoteException; - - /** - * Cancels a service lease. - * @see net.jini.core.lease.Lease#cancel - */ - void cancelServiceLease(ServiceID serviceID, Uuid leaseID) - throws UnknownLeaseException, RemoteException; - - /** - * Renews a service lease. - * @see net.jini.core.lease.Lease#renew - */ - long renewServiceLease(ServiceID serviceID, Uuid leaseID, long duration) - throws UnknownLeaseException, RemoteException; - - /** - * Cancels an event lease. - * @see net.jini.core.lease.Lease#cancel - */ - void cancelEventLease(long eventID, Uuid leaseID) - throws UnknownLeaseException, RemoteException; - - /** - * Renews an event lease. - * @see net.jini.core.lease.Lease#renew - */ - long renewEventLease(long eventID, Uuid leaseID, long duration) - throws UnknownLeaseException, RemoteException; - - /** - * Renews service and event leases from a LeaseMap. - * @see net.jini.core.lease.LeaseMap#renewAll - */ - RenewResults renewLeases(Object[] regIDs, - Uuid[] leaseIDs, - long[] durations) - throws RemoteException; - - /** - * Cancels service and event leases from a LeaseMap. - * @see net.jini.core.lease.LeaseMap#cancelAll - */ - Exception[] cancelLeases(Object[] regIDs, Uuid[] leaseIDs) - throws RemoteException; -} +/* + * 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.river.reggie.proxy; + +import org.apache.river.admin.DestroyAdmin; +import org.apache.river.proxy.MarshalledWrapper; +import org.apache.river.start.moveMe.ServiceProxyAccessor; +import java.rmi.MarshalledObject; +import java.rmi.Remote; +import java.rmi.RemoteException; +import net.jini.admin.Administrable; +import net.jini.admin.JoinAdmin; +import net.jini.core.discovery.LookupLocator; +import net.jini.core.event.EventRegistration; +import net.jini.core.event.RemoteEventListener; +import net.jini.core.lease.UnknownLeaseException; +import net.jini.core.lookup.ServiceID; +import net.jini.core.lookup.ServiceRegistration; +import net.jini.id.Uuid; +import net.jini.lookup.DiscoveryAdmin; + +/** + * Registrar defines the private protocol between the various client-side + * proxies and the registrar server. + * <p> + * The declared methods are pretty straightforward transformations of the + * ServiceRegistrar and ServiceRegistration interfaces, with external classes + * (ServiceItem, ServiceTemplate, ServiceMatches, Entry) converted to internal + * classes (Item, Template, Matches, EntryRep). In addition, there are + * methods for transformed Lease and LeaseMap interfaces, for service and + * event leases. + * + * @author Sun Microsystems, Inc. + * + */ +public interface Registrar + extends Remote, ServiceProxyAccessor, Administrable, + DiscoveryAdmin, JoinAdmin, DestroyAdmin +{ + /** + * Register a new service or re-register an existing service. + * @see net.jini.core.lookup.ServiceRegistrar#register + */ + ServiceRegistration register(Item item, long leaseDuration) + throws RemoteException; + + /** + * Returns the service object (i.e., just ServiceItem.service) from an + * item matching the template, or null if there is no match. + * @see net.jini.core.lookup.ServiceRegistrar#lookup + */ + MarshalledWrapper lookup(Template tmpl) throws RemoteException; + + /** + * Returns at most maxMatches items matching the template, plus the total + * number of items that match the template. + * @see net.jini.core.lookup.ServiceRegistrar#lookup + */ + Matches lookup(Template tmpl, int maxMatches) throws RemoteException; + + /** + * Registers for event notification. + * @see net.jini.core.lookup.ServiceRegistrar#notify + */ + EventRegistration notify(Template tmpl, + int transitions, + RemoteEventListener listener, + MarshalledObject handback, + long leaseDuration) + throws RemoteException; + + /** + * Looks at all service items that match the specified template, finds + * every entry (among those service items) that either doesn't match any + * entry templates or is a subclass of at least one matching entry + * template, and returns the set of the (most specific) classes of those + * entries. + * @see net.jini.core.lookup.ServiceRegistrar#getEntryClasses + */ + EntryClassBase[] getEntryClasses(Template tmpl) throws RemoteException; + + /** + * Looks at all service items that match the specified template, finds + * every entry (among those service items) that matches + * tmpl.attributeSetTemplates[setIndex], and returns the set of values + * of the specified field of those entries. + * The field name has been converted to an index (fields numbered + * from super to subclass). + * + * @see net.jini.core.lookup.ServiceRegistrar#getFieldValues + */ + Object[] getFieldValues(Template tmpl, int setIndex, int field) + throws RemoteException; + + /** + * Looks at all service items that match the specified template, and for + * every service item finds the most specific type (class or interface) + * or types the service item is an instance of that are neither equal to, + * nor a superclass of, any of the service types in the template and that + * have names that start with the specified prefix, and returns the set + * of all such types. + * @see net.jini.core.lookup.ServiceRegistrar#getServiceTypes + */ + ServiceTypeBase[] getServiceTypes(Template tmpl, String prefix) + throws RemoteException; + + /** + * Returns a LookupLocator that can be used if necessary for unicast + * discovery of the lookup service. + * @see net.jini.core.lookup.ServiceRegistrar#getLocator + */ + LookupLocator getLocator() throws RemoteException; + + /** + * Adds the specified attribute sets (those that aren't duplicates of + * existing attribute sets) to the registered service item. + * @see net.jini.core.lookup.ServiceRegistration#addAttributes + */ + void addAttributes(ServiceID serviceID, Uuid leaseID, EntryRep[] attrSets) + throws UnknownLeaseException, RemoteException; + + /** + * Modifies existing attribute sets of a registered service item. + * @see net.jini.core.lookup.ServiceRegistration#modifyAttributes + */ + void modifyAttributes(ServiceID serviceID, + Uuid leaseID, + EntryRep[] attrSetTmpls, + EntryRep[] attrSets) + throws UnknownLeaseException, RemoteException; + + /** + * Deletes all of the service item's existing attributes, and replaces + * them with the specified attribute sets. + * @see net.jini.core.lookup.ServiceRegistration#setAttributes + */ + void setAttributes(ServiceID serviceID, Uuid leaseID, EntryRep[] attrSets) + throws UnknownLeaseException, RemoteException; + + /** + * Cancels a service lease. + * @see net.jini.core.lease.Lease#cancel + */ + void cancelServiceLease(ServiceID serviceID, Uuid leaseID) + throws UnknownLeaseException, RemoteException; + + /** + * Renews a service lease. + * @see net.jini.core.lease.Lease#renew + */ + long renewServiceLease(ServiceID serviceID, Uuid leaseID, long duration) + throws UnknownLeaseException, RemoteException; + + /** + * Cancels an event lease. + * @see net.jini.core.lease.Lease#cancel + */ + void cancelEventLease(long eventID, Uuid leaseID) + throws UnknownLeaseException, RemoteException; + + /** + * Renews an event lease. + * @see net.jini.core.lease.Lease#renew + */ + long renewEventLease(long eventID, Uuid leaseID, long duration) + throws UnknownLeaseException, RemoteException; + + /** + * Renews service and event leases from a LeaseMap. + * @see net.jini.core.lease.LeaseMap#renewAll + */ + RenewResults renewLeases(Object[] regIDs, + Uuid[] leaseIDs, + long[] durations) + throws RemoteException; + + /** + * Cancels service and event leases from a LeaseMap. + * @see net.jini.core.lease.LeaseMap#cancelAll + */ + Exception[] cancelLeases(Object[] regIDs, Uuid[] leaseIDs) + throws RemoteException; +}
