You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@river.apache.org by Peter Firmstone <ji...@zeus.net.au> on 2010/04/15 03:14:05 UTC
Re: svn commit: r934258 [1/2] - in /incubator/river/jtsk/trunk: ./
qa/ qa/harness/policy/ src/com/sun/jini/constants/ src/com/sun/jini/norm/
src/com/sun/jini/outrigger/ src/com/sun/jini/phoenix/ src/com/sun/jini/reggie/
src/manifest/ src/net/jini/activatio...
This commit includes Gregg Wonderly's patch from River-336, thank you
Gregg, much appreciated.
Regards,
Peter.
peter_firmstone@apache.org wrote:
> Author: peter_firmstone
> Date: Thu Apr 15 01:11:12 2010
> New Revision: 934258
>
> URL: http://svn.apache.org/viewvc?rev=934258&view=rev
> Log:
> This patch integrates changes to replace the RMIClassLoaderSPI with a CodebaseAccessClassLoader as per River-336. Although it doesn't include all changes to PreferredClassProvider.
>
> Additional changes to net.jini.io have been made to allow a subset of this package to be built at a later stage for CDC Personal Profile 1.11 (a subset of Java 1.4.2).
>
> An additional interface has been created, which is a subset of ServiceRegistrar, which ServiceRegistrar now extends, this is to enable building a release for CDC Personal Profile 1.11 or greater at a later point in time, without causing any breakage to existing application software.
>
> Furthermore additional permissions have been granted to the qa test defaulttest.policy in order for some random test failures to pass. This was specific to the Java 1.6 platform and I believe related to the -source=5 and -target=jsr14 compiler optimisations that load a security manager earlier, it is also related to the removal of the need to utilise the jre/etc directory for jsk-policy.jar
>
> These changes are experimental, and some incomplete, please feel free to make comments and reccommendations or hightlite any unforseen issues.
>
> The Apache River version has been changed to 2.2.0
>
> Added:
> incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/Convert.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/PackageVersion.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/io/ToMOInputStream.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/loader/CodebaseAccessClassLoader.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/loader/CodebaseAccessOverridePermission.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/loader/CodebaseClassAccess.java (with props)
> incubator/river/jtsk/trunk/src/net/jini/loader/RMIClassLoaderCodebaseAccess.java (with props)
> incubator/river/jtsk/trunk/test/src/net/jini/io/
> incubator/river/jtsk/trunk/test/src/net/jini/io/ConvertTest.java (with props)
> incubator/river/jtsk/trunk/test/src/net/jini/io/PackageVersionTest.java (with props)
> Modified:
> incubator/river/jtsk/trunk/ (props changed)
> incubator/river/jtsk/trunk/common.xml
> incubator/river/jtsk/trunk/qa/build.xml
> incubator/river/jtsk/trunk/qa/harness/policy/defaulttest.policy
> incubator/river/jtsk/trunk/src/com/sun/jini/constants/VersionConstants.java
> incubator/river/jtsk/trunk/src/com/sun/jini/norm/NormServerBaseImpl.java
> incubator/river/jtsk/trunk/src/com/sun/jini/outrigger/EntryRep.java
> incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupImpl.java
> incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupInit.java
> incubator/river/jtsk/trunk/src/com/sun/jini/reggie/EntryClassBase.java
> incubator/river/jtsk/trunk/src/manifest/jsk-platform.mf
> incubator/river/jtsk/trunk/src/net/jini/activation/ActivationGroup.java
> incubator/river/jtsk/trunk/src/net/jini/core/lookup/ServiceRegistrar.java
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalInputStream.java
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalOutputStream.java
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstance.java
> incubator/river/jtsk/trunk/src/net/jini/io/MarshalledObject.java
> incubator/river/jtsk/trunk/src/net/jini/loader/ClassAnnotation.java
> incubator/river/jtsk/trunk/src/net/jini/loader/ClassLoading.java
> incubator/river/jtsk/trunk/src/net/jini/loader/DownloadPermission.java
> incubator/river/jtsk/trunk/src/net/jini/loader/pref/PreferredClassProvider.java
> incubator/river/jtsk/trunk/src/net/jini/loader/pref/RequireDlPermProvider.java
> incubator/river/jtsk/trunk/src/net/jini/security/proxytrust/ProxyTrustVerifier.java
>
> Propchange: incubator/river/jtsk/trunk/
> ------------------------------------------------------------------------------
> --- svn:ignore (original)
> +++ svn:ignore Thu Apr 15 01:11:12 2010
> @@ -1,10 +1,11 @@
> classes
> lib-ext
> build.properties
> -deps
> configentry
> +deps
> nbproject
> -build
> .*
> +build
> +qa_output.txt
> lib-dl
> dist
>
> Modified: incubator/river/jtsk/trunk/common.xml
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/common.xml?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/common.xml (original)
> +++ incubator/river/jtsk/trunk/common.xml Thu Apr 15 01:11:12 2010
> @@ -25,7 +25,7 @@
> <property file="${root}/build.properties" />
>
> <!-- Product version info -->
> - <property name="version" value="2.1.2-SNAPSHOT"/>
> + <property name="version" value="2.2.0-SNAPSHOT"/>
> <property name="product.name" value="apache-river-${version}-incubating"/>
> <property name="product.title" value="Apache River v${version}"/>
>
>
> Modified: incubator/river/jtsk/trunk/qa/build.xml
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/qa/build.xml?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/qa/build.xml (original)
> +++ incubator/river/jtsk/trunk/qa/build.xml Thu Apr 15 01:11:12 2010
> @@ -250,8 +250,9 @@
>
> <target name="run-tests" depends="" description="Execute specific QA test(s)">
> <!--<property name="run.tests" value="com/sun/jini/test/impl/discoverymanager/RemoveGroupsLocsDiscard.td"/>-->
> - <property name="run.tests" value="com/sun/jini/test/impl/locatordiscovery/DelayDiscoveryAfterDiscard.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoGetProperty.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoAccessClass.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoAccessClass.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoGetProperty.td"/>
> + <!--<property name="run.tests" value="com/sun/jini/test/impl/locatordiscovery/DelayDiscoveryAfterDiscard.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoGetProperty.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoAccessClass.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoAccessClass.td,com/sun/jini/test/spec/policyprovider/dynamicPolicyProvider/SecurityExceptionConstructorNoGetProperty.td"/>-->
> <!--<property name="run.tests" value="com/sun/jini/test/impl/joinmanager/LeaseRenewDurRFE.td"/>-->
> + <property name="run.tests" value="com/sun/jini/test/spec/policyprovider/policyFileProvider/NullPolicy.td"/>
> <testrun>
> <!-- Run specific test(s) -->
> <arg value="-tests"/>
>
> Modified: incubator/river/jtsk/trunk/qa/harness/policy/defaulttest.policy
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/qa/harness/policy/defaulttest.policy?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/qa/harness/policy/defaulttest.policy (original)
> +++ incubator/river/jtsk/trunk/qa/harness/policy/defaulttest.policy Thu Apr 15 01:11:12 2010
> @@ -1,3 +1,24 @@
> +// Grants required for jdk1.6 combined with source=5 and target=jsr14
> +// I think this has something to do with the new java 6 Policy implementation,
> +// the visibility of our policy implementations on the boot classpath and
> +// jdk1.6 compiler optimisations. See River-334
> +grant codebase "file:${com.sun.jini.jsk.home}${/}lib-ext${/}*" {
> + permission java.security.AllPermission "", "";
> + //permission java.security.SecurityPermission "getProperty.net.jini.security.policy.PolicyFileProvider.basePolicyClass";
> + //permission java.util.PropertyPermission "java.security.policy", "read";
> + //permission java.util.PropertyPermission "java.security.policy", "write";
> + //permission java.lang.RuntimePermission "accessClassInPackage.sun.security.provider";
> + //permission java.lang.RuntimePermission "getProtectionDomain";
> + //permission net.jini.security.GrantPermission "java.security.AllPermission \"\", \"\"";
> +};
> +
> +// Grants required for jdk1.6 combined with source=5 and target=jsr14
> +// I think this has something to do with the new java 6 Policy implementation,
> +// the visibility of our policy implementations on the boot classpath and
> +// jdk1.6 compiler optimisations. See River-334
> +grant codebase "file:${com.sun.jini.test.home}${/}lib-ext${/}*" {
> + permission java.security.AllPermission "", "";
> +};
>
> grant codebase "file:${com.sun.jini.jsk.home}${/}lib${/}jsk-platform.jar" {
> permission java.security.AllPermission "", "";
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/constants/VersionConstants.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/constants/VersionConstants.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/constants/VersionConstants.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/constants/VersionConstants.java Thu Apr 15 01:11:12 2010
> @@ -25,5 +25,5 @@ package com.sun.jini.constants;
> */
> public interface VersionConstants {
> /** Current version of the Apache River release */
> - String SERVER_VERSION = "2.1.2";
> + String SERVER_VERSION = "2.2.0";
> }
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/norm/NormServerBaseImpl.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/norm/NormServerBaseImpl.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/norm/NormServerBaseImpl.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/norm/NormServerBaseImpl.java Thu Apr 15 01:11:12 2010
> @@ -26,7 +26,6 @@ import java.io.OutputStream;
> import java.rmi.MarshalledObject;
> import java.rmi.NoSuchObjectException;
> import java.rmi.RemoteException;
> -import java.rmi.server.RMIClassLoader;
> import java.security.PrivilegedActionException;
> import java.security.PrivilegedExceptionAction;
> import java.util.Collection;
> @@ -44,13 +43,10 @@ import java.util.logging.Logger;
> import javax.security.auth.Subject;
> import javax.security.auth.login.LoginContext;
>
> -import net.jini.admin.Administrable;
> -import net.jini.admin.JoinAdmin;
> import net.jini.config.Configuration;
> import net.jini.config.ConfigurationException;
> import net.jini.config.ConfigurationProvider;
> import net.jini.config.NoSuchEntryException;
> -import net.jini.core.constraint.RemoteMethodControl;
> import net.jini.core.discovery.LookupLocator;
> import net.jini.core.entry.Entry;
> import net.jini.core.event.EventRegistration;
> @@ -77,7 +73,6 @@ import net.jini.security.BasicProxyPrepa
> import net.jini.security.ProxyPreparer;
> import net.jini.security.TrustVerifier;
> import net.jini.security.proxytrust.ServerProxyTrust;
> -import net.jini.security.proxytrust.TrustEquivalence;
>
> import com.sun.jini.config.Config;
> import com.sun.jini.constants.ThrowableConstants;
> @@ -88,7 +83,6 @@ import com.sun.jini.landlord.LandlordUti
> import com.sun.jini.landlord.LeaseFactory;
> import com.sun.jini.landlord.LeasePeriodPolicy;
> import com.sun.jini.landlord.LocalLandlord;
> -import com.sun.jini.logging.Levels;
> import com.sun.jini.lookup.entry.BasicServiceType;
> import com.sun.jini.norm.event.EventType;
> import com.sun.jini.norm.event.EventTypeGenerator;
> @@ -99,6 +93,9 @@ import com.sun.jini.start.LifeCycle;
> import com.sun.jini.reliableLog.LogException;
> import com.sun.jini.reliableLog.LogHandler;
> import com.sun.jini.thread.InterruptedStatusThread;
> +import net.jini.core.constraint.RemoteMethodControl;
> +import net.jini.loader.CodebaseAccessClassLoader;
> +import net.jini.security.proxytrust.TrustEquivalence;
>
> /**
> * Base class for implementations of NormServer. Provides a complete
> @@ -297,7 +294,7 @@ abstract class NormServerBaseImpl
> "Adding lease of class {0} with annotation {1}",
> new Object[] {
> leaseToRenew.getClass(),
> - RMIClassLoader.getClassAnnotation(lc) });
> + CodebaseAccessClassLoader.getClassAnnotation(lc) });
> }
>
> // Add the lease to the set
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/outrigger/EntryRep.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/outrigger/EntryRep.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/outrigger/EntryRep.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/outrigger/EntryRep.java Thu Apr 15 01:11:12 2010
> @@ -34,12 +34,10 @@ import java.lang.reflect.Modifier;
> import java.net.MalformedURLException;
> import java.rmi.MarshalException;
> import java.rmi.UnmarshalException;
> -import java.rmi.server.RMIClassLoader;
> import java.security.DigestOutputStream;
> import java.security.MessageDigest;
> import java.util.ArrayList;
> import java.util.Arrays;
> -import java.util.Iterator;
> import java.util.Comparator;
> import java.util.WeakHashMap;
> import java.util.logging.Logger;
> @@ -50,6 +48,8 @@ import net.jini.id.Uuid;
> import net.jini.id.UuidFactory;
> import net.jini.io.MarshalledInstance;
> import net.jini.loader.ClassLoading;
> +import net.jini.loader.CodebaseAccessClassLoader;
> +import net.jini.space.JavaSpace;
>
> /**
> * An <code>EntryRep</code> object contains a packaged
> @@ -234,7 +234,7 @@ class EntryRep implements StorableResour
> if (validate)
> ensureValidClass(realClass);
> className = realClass.getName();
> - codebase = RMIClassLoader.getClassAnnotation(realClass);
> + codebase = CodebaseAccessClassLoader.getClassAnnotation(realClass);
>
> /*
> * Build up the per-field and superclass information through
> @@ -489,6 +489,10 @@ class EntryRep implements StorableResour
> } catch (MarshalException e) {
> // because we call findHash() w/ false, should never happen
> throw new AssertionError(e);
> + } catch (IOException e) {
> + // see above
> + throw throwNewUnusableEntryException("I/O Error " +
> + "associated with entry of type " + className, e);
> }
> }
>
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupImpl.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupImpl.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupImpl.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupImpl.java Thu Apr 15 01:11:12 2010
> @@ -32,7 +32,6 @@ import java.rmi.Remote;
> import java.rmi.RemoteException;
> import java.rmi.activation.*;
> import java.rmi.server.ExportException;
> -import java.rmi.server.RMIClassLoader;
> import java.rmi.server.RemoteObject;
> import java.rmi.server.UnicastRemoteObject;
> import java.security.AccessController;
> @@ -55,6 +54,7 @@ import net.jini.export.Exporter;
> import net.jini.export.ProxyAccessor;
> import net.jini.jeri.BasicJeriExporter;
> import net.jini.jeri.tcp.TcpServerEndpoint;
> +import net.jini.loader.CodebaseAccessClassLoader;
> import net.jini.security.BasicProxyPreparer;
> import net.jini.security.ProxyPreparer;
> import net.jini.security.Security;
> @@ -617,7 +617,7 @@ public class ActivationGroupImpl extends
> * <p>Otherwise:
> *
> * <p>The class for the object is loaded by invoking {@link
> - * RMIClassLoader#loadClass(String,String) RMIClassLoader.loadClass}
> + * CodebaseAccessClassLoader#loadClass(String,String) CodebaseAccessClassLoader.loadClass}
> * passing the class location (obtained by invoking {@link
> * ActivationDesc#getLocation getLocation} on the activation
> * descriptor) and the class name (obtained by invoking {@link
> @@ -693,7 +693,7 @@ public class ActivationGroupImpl extends
> }
>
> String className = desc.getClassName();
> - final Class cl = RMIClassLoader.loadClass(desc.getLocation(),
> + final Class cl = CodebaseAccessClassLoader.loadClass(desc.getLocation(),
> className);
> final Thread t = Thread.currentThread();
> final ClassLoader savedCcl = t.getContextClassLoader();
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupInit.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupInit.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupInit.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/phoenix/ActivationGroupInit.java Thu Apr 15 01:11:12 2010
> @@ -22,9 +22,9 @@ import java.lang.reflect.Method;
> import java.rmi.activation.ActivationGroup;
> import java.rmi.activation.ActivationGroupDesc;
> import java.rmi.activation.ActivationGroupID;
> -import java.rmi.server.RMIClassLoader;
> import java.util.Collections;
> import net.jini.io.MarshalInputStream;
> +import net.jini.loader.CodebaseAccessClassLoader;
>
> /**
> * This is the bootstrap code to start a virtual machine (VM) executing an
> @@ -70,7 +70,7 @@ class ActivationGroupInit {
> ActivationGroupID id = (ActivationGroupID)in.readObject();
> ActivationGroupDesc desc = (ActivationGroupDesc)in.readObject();
> long incarnation = in.readLong();
> - Class cl = RMIClassLoader.loadClass(desc.getLocation(),
> + Class cl = CodebaseAccessClassLoader.loadClass(desc.getLocation(),
> desc.getClassName());
> try {
> Method create =
>
> Modified: incubator/river/jtsk/trunk/src/com/sun/jini/reggie/EntryClassBase.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/reggie/EntryClassBase.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/com/sun/jini/reggie/EntryClassBase.java (original)
> +++ incubator/river/jtsk/trunk/src/com/sun/jini/reggie/EntryClassBase.java Thu Apr 15 01:11:12 2010
> @@ -17,9 +17,8 @@
> */
> package com.sun.jini.reggie;
>
> -import java.rmi.server.RMIClassLoader;
> -import java.io.IOException;
> import java.io.Serializable;
> +import net.jini.loader.CodebaseAccessClassLoader;
>
> /**
> * An EntryClass annotated with a codebase.
> @@ -52,7 +51,7 @@ class EntryClassBase implements Serializ
>
> /** Sets the codebase to the codebase of the given class. */
> public void setCodebase(Class cls) {
> - codebase = RMIClassLoader.getClassAnnotation(cls);
> + codebase = CodebaseAccessClassLoader.getClassAnnotation(cls);
> }
>
> /**
>
> Modified: incubator/river/jtsk/trunk/src/manifest/jsk-platform.mf
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/manifest/jsk-platform.mf?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/manifest/jsk-platform.mf (original)
> +++ incubator/river/jtsk/trunk/src/manifest/jsk-platform.mf Thu Apr 15 01:11:12 2010
> @@ -1,2 +1,4 @@
> Manifest-Version: 1.0
> Class-Path: jsk-resources.jar
> +Implementation-Vendor: Apache Software Foundation
> +Implementation-Version: 2.2.0
>
> Modified: incubator/river/jtsk/trunk/src/net/jini/activation/ActivationGroup.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/activation/ActivationGroup.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/activation/ActivationGroup.java (original)
> +++ incubator/river/jtsk/trunk/src/net/jini/activation/ActivationGroup.java Thu Apr 15 01:11:12 2010
> @@ -23,10 +23,10 @@ import java.rmi.activation.ActivationExc
> import java.rmi.activation.ActivationGroupDesc;
> import java.rmi.activation.ActivationGroupID;
> import java.rmi.activation.ActivationID;
> -import java.rmi.server.RMIClassLoader;
> import java.security.PrivilegedExceptionAction;
> import java.security.PrivilegedActionException;
> import net.jini.export.Exporter;
> +import net.jini.loader.CodebaseAccessClassLoader;
> import net.jini.security.Security;
>
> /**
> @@ -129,7 +129,7 @@ public abstract class ActivationGroup
> Class cl = (Class) Security.doPrivileged(
> new PrivilegedExceptionAction() {
> public Object run() throws Exception {
> - return RMIClassLoader.loadClass(location, className);
> + return CodebaseAccessClassLoader.loadClass(location, className);
> }
> });
> return ActivationGroup.class.isAssignableFrom(cl);
>
> Added: incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,219 @@
> +/*
> + * 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 net.jini.core.lookup;
> +
> +import java.rmi.RemoteException;
> +import net.jini.core.discovery.LookupLocator;
> +
> +/**
> + *
> + * @author peter
> + */
> +public interface PortableServiceRegistrar {
> + /**
> + * An event is sent when the changed item matches the template both
> + * before and after the operation.
> + */
> + int TRANSITION_MATCH_MATCH = 1 << 2;
> + /**
> + * An event is sent when the changed item matches the template before
> + * the operation, but doesn't match the template after the operation
> + * (this includes deletion of the item).
> + */
> + int TRANSITION_MATCH_NOMATCH = 1 << 0;
> + /**
> + * An event is sent when the changed item doesn't match the template
> + * before the operation (this includes not existing), but does match
> + * the template after the operation.
> + */
> + int TRANSITION_NOMATCH_MATCH = 1 << 1;
> +
> + /**
> + * 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. Duplicate classes are eliminated, and the order of classes
> + * within the returned array is arbitrary. Null (not an empty array) is
> + * returned if there are no such entries or no matching items. If a
> + * returned class cannot be deserialized, that element of the returned
> + * array is set to null and no exception is thrown.
> + *
> + * @param tmpl template to match
> + * @return an array of entry Classes (attribute sets) for every service
> + * that matches the specified template
> + * @throws java.rmi.RemoteException
> + */
> + Class[] getEntryClasses(ServiceTemplate 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. Duplicate values are
> + * eliminated, and the order of values within the returned array is
> + * arbitrary. Null (not an empty array) is returned if there are no
> + * matching items. If a returned value cannot be deserialized, that
> + * element of the returned array is set to null and no exception is
> + * thrown.
> + *
> + * @param tmpl template to match
> + * @param setIndex index into tmpl.attributeSetTemplates
> + * @param field name of field of tmpl.attributeSetTemplates[setIndex]
> + *
> + * @return an array of objects that represents field values of entries
> + * associated with services that meet the specified matching
> + * criteria
> + *
> + * @throws NoSuchFieldException field does not name a field of the
> + * entry template
> + * @throws java.rmi.RemoteException
> + */
> + Object[] getFieldValues(ServiceTemplate tmpl, int setIndex, String field) throws NoSuchFieldException, RemoteException;
> +
> + /**
> + * Returns the set of groups that this lookup service is currently a
> + * member of.
> + *
> + * @return a String array of groups that this lookup service is currently
> + * a member of.
> + * @throws java.rmi.RemoteException
> + */
> + String[] getGroups() throws RemoteException;
> +
> + /**
> + * Returns a LookupLocator that can be used if necessary for unicast
> + * discovery of the lookup service.
> + *
> + * @return a LookupLocator that can be used for unicast discovery of
> + * the lookup service, if necessary.
> + * @throws java.rmi.RemoteException
> + */
> + LookupLocator getLocator() throws RemoteException;
> +
> + /**
> + * Returns the service ID of the lookup service. Note that this does not
> + * make a remote call. A lookup service is always registered with itself
> + * under this service ID, and if a lookup service is configured to
> + * register itself with other lookup services, it will register with all
> + * of them using this same service ID.
> + *
> + * @return the service ID of the lookup service.
> + */
> + ServiceID getServiceID();
> +
> + /**
> + * 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. Duplicate types are eliminated, and the order of
> + * types within the returned array is arbitrary. Null (not an empty
> + * array) is returned if there are no such types. If a returned type
> + * cannot be deserialized, that element of the returned array is set to
> + * null and no exception is thrown.
> + *
> + * @param tmpl template to match
> + * @param prefix class name prefix
> + *
> + * @return an array of Classes of all services that either match the
> + * specified template or match the specified prefix
> + * @throws java.rmi.RemoteException
> + */
> + Class[] getServiceTypes(ServiceTemplate tmpl, String prefix) throws RemoteException;
> +
> + /**
> + * Returns the service object (i.e., just ServiceItem.service) from an
> + * item matching the template, or null if there is no match. If multiple
> + * items match the template, it is arbitrary as to which service object
> + * is returned. If the returned object cannot be deserialized, an
> + * UnmarshalException is thrown with the standard RMI semantics.
> + *
> + * @param tmpl template to match
> + * @return an object that represents a service that matches the
> + * specified template
> + * @throws java.rmi.RemoteException
> + */
> + Object lookup(ServiceTemplate tmpl) throws RemoteException;
> +
> + /**
> + * Returns at most maxMatches items matching the template, plus the total
> + * number of items that match the template. The return value is never
> + * null, and the returned items array is only null if maxMatches is zero.
> + * For each returned item, if the service object cannot be deserialized,
> + * the service field of the item is set to null and no exception is
> + * thrown. Similarly, if an attribute set cannot be deserialized, that
> + * element of the attributeSets array is set to null and no exception
> + * is thrown.
> + *
> + * @param tmpl template to match
> + * @param maxMatches maximum number of matches to return
> + * @return a ServiceMatches instance that contains at most maxMatches
> + * items matching the template, plus the total number of items
> + * that match the template. The return value is never null, and
> + * the returned items array is only null if maxMatches is zero.
> + * @throws java.rmi.RemoteException
> + */
> + ServiceMatches lookup(ServiceTemplate tmpl, int maxMatches) throws RemoteException;
> +
> + /**
> + * Register a new service or re-register an existing service. The method
> + * is defined so that it can be used in an idempotent fashion.
> + * Specifically, if a call to register results in a RemoteException (in
> + * which case the item might or might not have been registered), the
> + * caller can simply repeat the call to register with the same parameters,
> + * until it succeeds.
> + * <p>
> + * To register a new service, item.serviceID should be null. In that
> + * case, if item.service does not equal (using MarshalledObject.equals)
> + * any existing item's service object, then a new service ID will be
> + * assigned and included in the returned ServiceRegistration. The
> + * service ID is unique over time and space with respect to all other
> + * service IDs generated by all lookup services. If item.service does
> + * equal an existing item's service object, the existing item is first
> + * deleted from the lookup service (even if it has different attributes)
> + * and its lease is cancelled, but that item's service ID is reused for
> + * the newly registered item.
> + * <p>
> + * To re-register an existing service, or to register the service in any
> + * other lookup service, item.serviceID should be set to the same service
> + * ID that was returned by the initial registration. If an item is
> + * already registered under the same service ID, the existing item is
> + * first deleted (even if it has different attributes or a different
> + * service instance) and its lease is cancelled. Note that service
> + * object equality is not checked in this case, to allow for reasonable
> + * evolution of the service (e.g., the serialized form of the stub
> + * changes, or the service implements a new interface).
> + * <p>
> + * Any duplicate attribute sets included in a service item are eliminated
> + * in the stored representation of the item. The lease duration request
> + * is not exact; the returned lease is allowed to have a shorter (but not
> + * longer) duration than what was requested. The registration is
> + * persistent across restarts (crashes) of the lookup service until the
> + * lease expires or is cancelled.
> + *
> + * @param item service item to register
> + * @param leaseDuration requested lease duration, in milliseconds
> + * @return a ServiceRegistration in this lookup service for the specified
> + * service item
> + * @throws java.rmi.RemoteException
> + */
> + ServiceRegistration register(ServiceItem item, long leaseDuration) throws RemoteException;
> +
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/core/lookup/PortableServiceRegistrar.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Modified: incubator/river/jtsk/trunk/src/net/jini/core/lookup/ServiceRegistrar.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/core/lookup/ServiceRegistrar.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/core/lookup/ServiceRegistrar.java (original)
> +++ incubator/river/jtsk/trunk/src/net/jini/core/lookup/ServiceRegistrar.java Thu Apr 15 01:11:12 2010
> @@ -19,7 +19,6 @@ package net.jini.core.lookup;
>
> import java.rmi.RemoteException;
> import java.rmi.MarshalledObject;
> -import net.jini.core.discovery.LookupLocator;
> import net.jini.core.event.EventRegistration;
> import net.jini.core.event.RemoteEventListener;
>
> @@ -40,107 +39,7 @@ import net.jini.core.event.RemoteEventLi
> *
> * @since 1.0
> */
> -public interface ServiceRegistrar {
> -
> - /**
> - * Register a new service or re-register an existing service. The method
> - * is defined so that it can be used in an idempotent fashion.
> - * Specifically, if a call to register results in a RemoteException (in
> - * which case the item might or might not have been registered), the
> - * caller can simply repeat the call to register with the same parameters,
> - * until it succeeds.
> - * <p>
> - * To register a new service, item.serviceID should be null. In that
> - * case, if item.service does not equal (using MarshalledObject.equals)
> - * any existing item's service object, then a new service ID will be
> - * assigned and included in the returned ServiceRegistration. The
> - * service ID is unique over time and space with respect to all other
> - * service IDs generated by all lookup services. If item.service does
> - * equal an existing item's service object, the existing item is first
> - * deleted from the lookup service (even if it has different attributes)
> - * and its lease is cancelled, but that item's service ID is reused for
> - * the newly registered item.
> - * <p>
> - * To re-register an existing service, or to register the service in any
> - * other lookup service, item.serviceID should be set to the same service
> - * ID that was returned by the initial registration. If an item is
> - * already registered under the same service ID, the existing item is
> - * first deleted (even if it has different attributes or a different
> - * service instance) and its lease is cancelled. Note that service
> - * object equality is not checked in this case, to allow for reasonable
> - * evolution of the service (e.g., the serialized form of the stub
> - * changes, or the service implements a new interface).
> - * <p>
> - * Any duplicate attribute sets included in a service item are eliminated
> - * in the stored representation of the item. The lease duration request
> - * is not exact; the returned lease is allowed to have a shorter (but not
> - * longer) duration than what was requested. The registration is
> - * persistent across restarts (crashes) of the lookup service until the
> - * lease expires or is cancelled.
> - *
> - * @param item service item to register
> - * @param leaseDuration requested lease duration, in milliseconds
> - * @return a ServiceRegistration in this lookup service for the specified
> - * service item
> - * @throws java.rmi.RemoteException
> - */
> - ServiceRegistration register(ServiceItem 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. If multiple
> - * items match the template, it is arbitrary as to which service object
> - * is returned. If the returned object cannot be deserialized, an
> - * UnmarshalException is thrown with the standard RMI semantics.
> - *
> - * @param tmpl template to match
> - * @return an object that represents a service that matches the
> - * specified template
> - * @throws java.rmi.RemoteException
> - */
> - Object lookup(ServiceTemplate tmpl) throws RemoteException;
> -
> - /**
> - * Returns at most maxMatches items matching the template, plus the total
> - * number of items that match the template. The return value is never
> - * null, and the returned items array is only null if maxMatches is zero.
> - * For each returned item, if the service object cannot be deserialized,
> - * the service field of the item is set to null and no exception is
> - * thrown. Similarly, if an attribute set cannot be deserialized, that
> - * element of the attributeSets array is set to null and no exception
> - * is thrown.
> - *
> - * @param tmpl template to match
> - * @param maxMatches maximum number of matches to return
> - * @return a ServiceMatches instance that contains at most maxMatches
> - * items matching the template, plus the total number of items
> - * that match the template. The return value is never null, and
> - * the returned items array is only null if maxMatches is zero.
> - * @throws java.rmi.RemoteException
> - */
> - ServiceMatches lookup(ServiceTemplate tmpl, int maxMatches)
> - throws RemoteException;
> -
> - /**
> - * An event is sent when the changed item matches the template before
> - * the operation, but doesn't match the template after the operation
> - * (this includes deletion of the item).
> - */
> - int TRANSITION_MATCH_NOMATCH = 1 << 0;
> -
> - /**
> - * An event is sent when the changed item doesn't match the template
> - * before the operation (this includes not existing), but does match
> - * the template after the operation.
> - */
> - int TRANSITION_NOMATCH_MATCH = 1 << 1;
> -
> - /**
> - * An event is sent when the changed item matches the template both
> - * before and after the operation.
> - */
> - int TRANSITION_MATCH_MATCH = 1 << 2;
> +public interface ServiceRegistrar extends PortableServiceRegistrar {
>
> /**
> * Registers for event notification. The registration is leased; the
> @@ -170,101 +69,4 @@ public interface ServiceRegistrar {
> 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. Duplicate classes are eliminated, and the order of classes
> - * within the returned array is arbitrary. Null (not an empty array) is
> - * returned if there are no such entries or no matching items. If a
> - * returned class cannot be deserialized, that element of the returned
> - * array is set to null and no exception is thrown.
> - *
> - * @param tmpl template to match
> - * @return an array of entry Classes (attribute sets) for every service
> - * that matches the specified template
> - * @throws java.rmi.RemoteException
> - */
> - Class[] getEntryClasses(ServiceTemplate 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. Duplicate values are
> - * eliminated, and the order of values within the returned array is
> - * arbitrary. Null (not an empty array) is returned if there are no
> - * matching items. If a returned value cannot be deserialized, that
> - * element of the returned array is set to null and no exception is
> - * thrown.
> - *
> - * @param tmpl template to match
> - * @param setIndex index into tmpl.attributeSetTemplates
> - * @param field name of field of tmpl.attributeSetTemplates[setIndex]
> - *
> - * @return an array of objects that represents field values of entries
> - * associated with services that meet the specified matching
> - * criteria
> - *
> - * @throws NoSuchFieldException field does not name a field of the
> - * entry template
> - * @throws java.rmi.RemoteException
> - */
> - Object[] getFieldValues(ServiceTemplate tmpl, int setIndex, String field)
> - throws NoSuchFieldException, 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. Duplicate types are eliminated, and the order of
> - * types within the returned array is arbitrary. Null (not an empty
> - * array) is returned if there are no such types. If a returned type
> - * cannot be deserialized, that element of the returned array is set to
> - * null and no exception is thrown.
> - *
> - * @param tmpl template to match
> - * @param prefix class name prefix
> - *
> - * @return an array of Classes of all services that either match the
> - * specified template or match the specified prefix
> - * @throws java.rmi.RemoteException
> - */
> - Class[] getServiceTypes(ServiceTemplate tmpl, String prefix)
> - throws RemoteException;
> -
> - /**
> - * Returns the service ID of the lookup service. Note that this does not
> - * make a remote call. A lookup service is always registered with itself
> - * under this service ID, and if a lookup service is configured to
> - * register itself with other lookup services, it will register with all
> - * of them using this same service ID.
> - *
> - * @return the service ID of the lookup service.
> - */
> - ServiceID getServiceID();
> -
> - /**
> - * Returns a LookupLocator that can be used if necessary for unicast
> - * discovery of the lookup service.
> - *
> - * @return a LookupLocator that can be used for unicast discovery of
> - * the lookup service, if necessary.
> - * @throws java.rmi.RemoteException
> - */
> - LookupLocator getLocator() throws RemoteException;
> -
> - /**
> - * Returns the set of groups that this lookup service is currently a
> - * member of.
> - *
> - * @return a String array of groups that this lookup service is currently
> - * a member of.
> - * @throws java.rmi.RemoteException
> - */
> - String[] getGroups() throws RemoteException;
> }
>
> Added: incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,59 @@
> +/*
> + * 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 net.jini.core.lookup;
> +
> +import java.rmi.RemoteException;
> +import net.jini.io.CDCMarshalledObject;
> +import net.jini.core.event.EventRegistration;
> +import net.jini.core.event.RemoteEventListener;
> +
> +/**
> + *
> + * @author Peter Firmstone
> + */
> +public interface StreamingServiceRegistrar extends PortableServiceRegistrar{
> +
> + /**
> + * Registers for event notification. The registration is leased; the
> + * lease expiration request is not exact. The registration is persistent
> + * across restarts (crashes) of the lookup service until the lease expires
> + * or is cancelled. The event ID in the returned EventRegistration is
> + * unique at least with respect to all other active event registrations
> + * in this lookup service with different service templates or transitions.
> + * <p>
> + * While the event registration is in effect, a ServiceEvent is sent to
> + * the specified listener whenever a register, lease cancellation or
> + * expiration, or attribute change operation results in an item changing
> + * state in a way that satisfies the template and transition combination.
> + *
> + * @param tmpl template to match
> + * @param transitions bitwise OR of any non-empty set of transition values
> + * @param listener listener to send events to
> + * @param handback object to include in every ServiceEvent generated
> + * @param leaseDuration requested lease duration
> + * @return an EventRegistration object to the entity that registered the
> + * specified remote listener
> + * @throws java.rmi.RemoteException
> + */
> + EventRegistration notify(ServiceTemplate tmpl,
> + int transitions,
> + RemoteEventListener listener,
> + CDCMarshalledObject handback,
> + long leaseDuration)
> + throws RemoteException;
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/core/lookup/StreamingServiceRegistrar.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added: incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,281 @@
> +/*
> + * 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 net.jini.io;
> +
> +import java.io.ByteArrayInputStream;
> +import java.io.ByteArrayOutputStream;
> +import java.io.IOException;
> +import java.io.InvalidObjectException;
> +import java.io.ObjectInputStream;
> +import java.io.ObjectOutputStream;
> +import java.io.ObjectStreamException;
> +import java.io.Serializable;
> +import java.util.Arrays;
> +import java.util.Collection;
> +import java.util.Collections;
> +import net.jini.io.context.IntegrityEnforcement;
> +
> +/**
> + * This is an experimental implementation and may be subject to change or
> + * removal.
> + * A <code>CDCMarshalledObject</code> contains an object in serialized
> + * form. The contained object can be deserialized on demand when
> + * explicitly requested. This allows an object to be sent from one VM
> + * to another in a way that allows the receiver to control when and if
> + * the object is deserialized.
> + * <p>
> + * The contained object is specified at construction time and can
> + * either be provided in unserialized or serialized form. If provided
> + * in unserialized form it will be serialized during construction
> + * with the serialization semantics defined by
> + * <code>MarshalOutputStream</code>. In particular, classes are annotated
> + * with a codebase URL from which the class can be loaded (if available).
> + * <p>
> + * If the <code>CDCMarshalledObject</code> needs to deserialize the
> + * contained object then the contained object will be deserialized with the
> + * deserialization semantics defined by <code>MarshalInputStream</code>.
> + * In particular, the codebase annotations associated with the contained
> + * object may be used to load classes referenced by the contained object.
> + * <p>
> + * <code>CDCMarshalledObject</code> provides functionality similar to
> + * <code>java.rmi.MarshalledObject</code>, but additionally provides
> + * for the verification of codebase integrity. Unlike
> + * <code>java.rmi.MarshalledObject</code>, it does not perform remote
> + * object-to-stub replacement.
> + * <p>
> + * <code>CDCMarshalledObject</code> differes from <code>MarshalledInstance</code>
> + * in lacking a dependency upon java.rmi.MarshalledObject as the CDC Personal Profile
> + * lacks the rmi server implementation. <code>Convert</code> provides methods
> + * for conversion between the various implementations.
> + * </p>
> + *
> + *
> + * @param T - Type of Object
> + * @author Peter Firmstone.
> + * @since 2.2.0
> + */
> +public class CDCMarshalledObject<T> implements Serializable {
> +
> + /**
> + * @serial Bytes of serialized representation. If <code>objBytes</code> is
> + * <code>null</code> then the object marshalled was a <code>null</code>
> + * reference.
> + */
> + private byte[] objBytes;
> +
> + /**
> + * @serial Bytes of location annotations, which are ignored by
> + * <code>equals</code>. If <code>locBytes</code> is null, there were no
> + * non-<code>null</code> annotations during marshalling.
> + */
> + private byte[] locBytes;
> +
> + /**
> + * @serial Stored hash code of contained object.
> + *
> + * @see #hashCode
> + */
> + private final int hash;
> +
> + private final PackageVersion packageVersion;
> +
> + static final long serialVersionUID = 1L;
> +
> + CDCMarshalledObject(MarshalledObject<T> mo, PackageVersion pv){
> + // Don't worry about defensive copies this is package private
> + objBytes = mo.objBytes;
> + locBytes = mo.locBytes;
> + hash = mo.hash;
> + packageVersion = pv;
> + }
> +
> + /**
> + * Creates a new <code>MarshalledInstance</code> that contains the
> + * marshalled representation of the current state of the supplied
> + * object. The object is serialized with the semantics defined by
> + * <code>MarshalOutputStream</code>. The output stream used to marshal the
> + * object implements {@link ObjectStreamContext} and returns an empty
> + * collection from its {@link ObjectStreamContext#getObjectStreamContext
> + * getObjectStreamContext} method.
> + *
> + * @param obj The Object to be contained in the new
> + * <code>MarshalledInstance</code>
> + * @throws IOException if the object cannot be serialized
> + */
> + public CDCMarshalledObject(T obj) throws IOException {
> + this(obj, Collections.EMPTY_SET);
> + }
> +
> + /**
> + * Creates a new <code>MarshalledInstance</code> that contains the
> + * marshalled representation of the current state of the supplied
> + * object. The object is serialized with the semantics defined by
> + * <code>MarshalOutputStream</code>. The output stream used to marshal the
> + * object implements {@link ObjectStreamContext} and returns the given
> + * collection from its {@link ObjectStreamContext#getObjectStreamContext
> + * getObjectStreamContext} method.
> + *
> + * @param obj The Object to be contained in the new
> + * <code>MarshalledInstance</code>
> + * @param context the collection of context information objects
> + * @throws IOException if the object cannot be serialized
> + * @throws NullPointerException if <code>context</code> is <code>null</code>
> + */
> + public CDCMarshalledObject(T obj, Collection context)
> + throws IOException
> + {
> + if (context == null) throw new NullPointerException();
> + if (obj == null) {
> + hash = 13; // null hash for java.rmi.MarshalledObject
> + objBytes = null;
> + locBytes = null;
> + packageVersion = null;
> + return;
> + }
> + ByteArrayOutputStream bout = new ByteArrayOutputStream();
> + ByteArrayOutputStream lout = new ByteArrayOutputStream();
> + MarshalledInstanceOutputStream out =
> + new MarshalledInstanceOutputStream(bout, lout, context);
> + out.writeObject(obj);
> + out.flush();
> + objBytes = bout.toByteArray();
> + // locBytes is null if no annotations
> + locBytes = (out.hadAnnotations() ? lout.toByteArray() : null);
> +
> + // Calculate hash from the marshalled representation of object
> + // so the hashcode will be comparable when sent between VMs.
> + //
> + // Note: This calculation must match the calculation in
> + // java.rmi.MarshalledObject since we use this hash
> + // in the converted MarshalledObject. The reverse is
> + // also true in that we use the MarshalledObject's
> + // hash for our hash. (see the MarshalledInstance(
> + // MarshalledObject) constructor)
> + //
> + int h = 0;
> + for (int i = 0; i < objBytes.length; i++) {
> + h = 31 * h + objBytes[i];
> + }
> + hash = h;
> + packageVersion = PackageVersion.getInstance(obj);
> + }
> +
> + MarshalledObject<T> asMarshalledObject(){
> + MarshalledObject<T> mo = new MarshalledObject<T>();
> + // Don't worry about defensive copies, this is package private.
> + mo.objBytes = objBytes;
> + mo.locBytes = locBytes;
> + mo.hash = hash;
> + return mo;
> + }
> + @Override
> + public boolean equals(Object obj) {
> + if (obj == this) {
> + return true;
> + }
> + if (obj instanceof CDCMarshalledObject) {
> + CDCMarshalledObject other = (CDCMarshalledObject) obj;
> + if (hash != other.hash) {
> + return false;
> + }
> + return Arrays.equals(objBytes, other.objBytes);
> + }
> + return false;
> + }
> +
> + public boolean fullyEquals(Object obj) {
> + if (equals(obj)) {
> + CDCMarshalledObject other = (CDCMarshalledObject) obj;
> + return Arrays.equals(locBytes, other.locBytes);
> + }
> + return false;
> + }
> +
> + public PackageVersion getPackageVersion(){
> + return packageVersion;
> + }
> +
> + public T get(final boolean verifyCodebaseIntegrity) throws IOException, ClassNotFoundException {
> + return get(null, verifyCodebaseIntegrity, null, null);
> + }
> +
> + public T get(ClassLoader defaultLoader, final boolean verifyCodebaseIntegrity, ClassLoader verifierLoader, Collection context) throws IOException, ClassNotFoundException {
> + if (objBytes == null) {
> + // must have been a null object
> + return null;
> + }
> + if (context == null) {
> + context = Collections.singleton(new IntegrityEnforcement() {
> +
> + public boolean integrityEnforced() {
> + return verifyCodebaseIntegrity;
> + }
> + });
> + }
> + ByteArrayInputStream bin = new ByteArrayInputStream(objBytes);
> + ByteArrayInputStream lin = locBytes == null ? null : new ByteArrayInputStream(locBytes);
> + MarshalledInstanceInputStream in = new MarshalledInstanceInputStream(bin, lin, defaultLoader, verifyCodebaseIntegrity, verifierLoader, context);
> + in.useCodebaseAnnotations();
> + @SuppressWarnings("unchecked")
> + T obj = (T) in.readObject();
> + in.close();
> + return obj;
> + }
> +
> + /**
> + * Returns the hash code for this <code>MarshalledInstance</code>.
> + * The hash code is calculated only from the serialized form
> + * of the contained object.
> + * @return The hash code for this object
> + */
> + @Override
> + public int hashCode() {
> + return hash;
> + }
> +
> + private void writeObject(ObjectOutputStream out) throws IOException{
> + out.defaultWriteObject();
> + }
> +
> + /**
> + * Verify the case of null contained object.
> + */
> + private void readObject(ObjectInputStream in)
> + throws IOException, ClassNotFoundException
> + {
> + in.defaultReadObject();
> +
> + // If contained object is null, then hash and locBytes must be
> + // proper
> + //
> + if ((objBytes == null) && ((hash != 13) || (locBytes != null)))
> + throw new InvalidObjectException("Bad hash or annotation");
> + // Defensive copy of arrays to prevent unmarshalling attack using
> + // stolen reference for mutable fields. array.clone() not working? jdk1.6
> + objBytes = Arrays.copyOf(objBytes, objBytes.length);
> + locBytes = Arrays.copyOf(locBytes, locBytes.length);
> + }
> +
> + /**
> + * Protect against missing superclass.
> + */
> + private void readObjectNoData() throws ObjectStreamException {
> + throw new InvalidObjectException("Bad class hierarchy");
> + }
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/io/CDCMarshalledObject.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added: incubator/river/jtsk/trunk/src/net/jini/io/Convert.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/Convert.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/Convert.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/Convert.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,126 @@
> +/*
> + * 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 net.jini.io;
> +
> +import java.io.ByteArrayInputStream;
> +import java.io.ByteArrayOutputStream;
> +import java.io.IOException;
> +import java.io.ObjectInputStream;
> +import java.io.ObjectOutputStream;
> +import java.util.Collections;
> +
> +/**
> + * Rather than utilise a static class, an empty object class can be utilised
> + * for conversion of a particular Object type, to preserve Generic semantics.
> + *
> + * Note that java.rmi.MarshalledObject didn't take Generic parameters
> + * until Java 6 or jdk 1.6, so this doesn't compile with jdk1.5 however it
> + * will run on Java 5 if compiled with jdk1.6
> + *
> + * @param T - Generic Type Parameter of contained object.
> + * @author Peter Firmstone
> + */
> +public class Convert<T> {
> + @SuppressWarnings("unchecked")
> + private java.rmi.MarshalledObject<T>
> + toRmiMarshalledObject(net.jini.io.MarshalledObject<T> privateMO){
> + // To create a java.rmi.MarshalledObject with previously
> + // serialized data we first create a private
> + // net.jini.io.MarshalledObject with the
> + // data and then convert it to the final object by changing
> + // the class during readObject(). (See resolveClass() in
> + // ToMOInputStream)
> + //
> + java.rmi.MarshalledObject<T> mo = null;
> + try {
> + ByteArrayOutputStream baos = new ByteArrayOutputStream();
> + ObjectOutputStream oos = new ObjectOutputStream(baos);
> + oos.writeObject(privateMO);
> + oos.flush();
> + byte[] bytes = baos.toByteArray();
> + ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
> + ObjectInputStream ois = new ToMOInputStream(bais);
> + mo = (java.rmi.MarshalledObject<T>)ois.readObject();
> + } catch (IOException ioe) {
> + throw new AssertionError(ioe);
> + } catch (ClassNotFoundException cnfe) {
> + throw new AssertionError(cnfe);
> + }
> + return mo;
> + }
> +
> + private net.jini.io.MarshalledObject<T> toJiniMarshalledObject(
> + java.rmi.MarshalledObject<T> instance){
> + net.jini.io.MarshalledObject<T> privateMO = null;
> + try {
> + ByteArrayOutputStream baos = new ByteArrayOutputStream();
> + ObjectOutputStream oos = new ObjectOutputStream(baos);
> + oos.writeObject(instance);
> + oos.flush();
> + byte[] bytes = baos.toByteArray();
> + ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
> + ObjectInputStream ois = new FromMOInputStream(bais);
> + privateMO = (net.jini.io.MarshalledObject<T>) ois.readObject();
> + } catch (IOException ioe) {
> + throw new AssertionError(ioe);
> + } catch (ClassNotFoundException cnfe) {
> + throw new AssertionError(cnfe);
> + }
> + return privateMO;
> + }
> +
> + public java.rmi.MarshalledObject<T>
> + toRmiMarshalledObject(CDCMarshalledObject<T> instance){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + return toRmiMarshalledObject(instance.asMarshalledObject());
> + }
> +
> + public java.rmi.MarshalledObject<T>
> + toRmiMarshalledObject(MarshalledInstance<T> instance){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + return toRmiMarshalledObject(instance.asMarshalledObject());
> + }
> +
> + public MarshalledInstance<T>
> + toMarshalledInstance(java.rmi.MarshalledObject<T> instance){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + net.jini.io.MarshalledObject obj = toJiniMarshalledObject(instance);
> + if ( obj == null ) throw new NullPointerException("null reference");
> + return new MarshalledInstance<T>(obj);
> + }
> +
> + public MarshalledInstance<T>
> + toMarshalledInstance(CDCMarshalledObject<T> instance){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + return new MarshalledInstance<T>(instance.asMarshalledObject());
> + }
> +
> + public CDCMarshalledObject<T>
> + toCDCMarshalledObject(java.rmi.MarshalledObject<T> instance){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + return toCDCMarshalledObject(instance, null);
> + }
> +
> + public CDCMarshalledObject<T>
> + toCDCMarshalledObject(
> + java.rmi.MarshalledObject<T> instance, PackageVersion version){
> + if ( instance == null ) throw new NullPointerException("null reference");
> + return new CDCMarshalledObject<T>(toJiniMarshalledObject(instance),
> + version);
> + }
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/io/Convert.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added: incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,38 @@
> +/*
> + * 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 net.jini.io;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.io.ObjectInputStream;
> +import java.io.ObjectStreamClass;
> +
> +class FromMOInputStream extends ObjectInputStream {
> +
> + public FromMOInputStream(InputStream in) throws IOException {
> + super(in);
> + }
> +
> + @Override
> + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
> + if (desc.getName().equals("java.rmi.MarshalledObject")) {
> + return net.jini.io.MarshalledObject.class;
> + }
> + return super.resolveClass(desc);
> + }
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/io/FromMOInputStream.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Modified: incubator/river/jtsk/trunk/src/net/jini/io/MarshalInputStream.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/MarshalInputStream.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/MarshalInputStream.java (original)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/MarshalInputStream.java Thu Apr 15 01:11:12 2010
> @@ -23,19 +23,18 @@ import java.io.InputStream;
> import java.io.InvalidObjectException;
> import java.io.ObjectInputStream;
> import java.io.ObjectStreamClass;
> -import java.net.MalformedURLException;
> -import java.rmi.server.RMIClassLoader;
> import java.util.Collection;
> import java.util.HashMap;
> import java.util.Map;
> import net.jini.loader.ClassLoading;
> +import net.jini.loader.CodebaseAccessClassLoader;
> import net.jini.security.Security;
>
> /**
> * An extension of <code>ObjectInputStream</code> that implements the
> * dynamic class loading semantics of Java(TM) Remote Method
> * Invocation (Java RMI) argument and result
> - * unmarshalling (using {@link RMIClassLoader}). A
> + * unmarshalling (using {@link CodebaseAccessClassLoader}). A
> * <code>MarshalInputStream</code> is intended to read data written by
> * a corresponding {@link MarshalOutputStream}.
> *
> @@ -46,10 +45,10 @@ import net.jini.security.Security;
> * class descriptors in the stream using {@link ClassLoading#loadClass
> * ClassLoading.loadClass} and {@link ClassLoading#loadProxyClass
> * ClassLoading.loadProxyClass} (which, in turn, use {@link
> - * RMIClassLoader#loadClass(String,String,ClassLoader)
> - * RMIClassLoader.loadClass} and {@link
> - * RMIClassLoader#loadProxyClass(String,String[],ClassLoader)
> - * RMIClassLoader.loadProxyClass}), optionally with codebase
> + * CodebaseAccessClassLoader#loadClass(String,String,ClassLoader)
> + * CodebaseAccessClassLoader.loadClass} and {@link
> + * CodebaseAccessClassLoader#loadProxyClass(String,String[],ClassLoader)
> + * CodebaseAccessClassLoader.loadProxyClass}), optionally with codebase
> * annotation strings written by a <code>MarshalOutputStream</code>.
> *
> * <p>By default, a <code>MarshalInputStream</code> ignores all
>
> Modified: incubator/river/jtsk/trunk/src/net/jini/io/MarshalOutputStream.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/MarshalOutputStream.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/MarshalOutputStream.java (original)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/MarshalOutputStream.java Thu Apr 15 01:11:12 2010
> @@ -21,14 +21,14 @@ package net.jini.io;
> import java.io.IOException;
> import java.io.ObjectOutputStream;
> import java.io.OutputStream;
> -import java.rmi.server.RMIClassLoader;
> import java.util.Collection;
> +import net.jini.loader.CodebaseAccessClassLoader;
>
> /**
> * An extension of <code>ObjectOutputStream</code> that implements the
> * dynamic class loading semantics of Java(TM) Remote Method Invocation
> * (Java RMI) argument and result
> - * marshalling (using {@link RMIClassLoader}). A
> + * marshalling (using {@link CodebaseAccessClassLoader}). A
> * <code>MarshalOutputStream</code> writes data that is intended to be
> * written by a corresponding {@link MarshalInputStream}.
> *
> @@ -37,8 +37,8 @@ import java.util.Collection;
> * ObjectOutputStream#annotateClass annotateClass} and {@link
> * ObjectOutputStream#annotateProxyClass annotateProxyClass} to
> * annotate class descriptors in the stream with codebase strings
> - * obtained using {@link RMIClassLoader#getClassAnnotation
> - * RMIClassLoader.getClassAnnotation}.
> + * obtained using {@link CodebaseAccessClassLoader#getClassAnnotation
> + * CodebaseAccessClassLoader.getClassAnnotation}.
> *
> * <p><code>MarshalOutputStream</code> writes class annotations to its
> * own stream; a subclass may override the {@link #writeAnnotation
> @@ -111,8 +111,8 @@ public class MarshalOutputStream
> * <p><code>MarshalOutputStream</code> implements this method as
> * follows:
> *
> - * <p>This method invokes {@link RMIClassLoader#getClassAnnotation
> - * RMIClassLoader.getClassAnnotation} with <code>cl</code> to get
> + * <p>This method invokes {@link CodebaseAccessClassLoader#getClassAnnotation
> + * CodebaseAccessClassLoader.getClassAnnotation} with <code>cl</code> to get
> * the appropriate class annotation string value (possibly
> * <code>null</code>), and then it invokes this stream's {@link
> * #writeAnnotation writeAnnotation} method with that string to
> @@ -127,7 +127,7 @@ public class MarshalOutputStream
> * <code>null</code>
> **/
> protected void annotateClass(Class cl) throws IOException {
> - writeAnnotation(RMIClassLoader.getClassAnnotation(cl));
> + writeAnnotation(CodebaseAccessClassLoader.getClassAnnotation(cl));
> }
>
> /**
> @@ -137,8 +137,8 @@ public class MarshalOutputStream
> * <p><code>MarshalOutputStream</code> implements this method as
> * follows:
> *
> - * <p>This method invokes {@link RMIClassLoader#getClassAnnotation
> - * RMIClassLoader.getClassAnnotation} with <code>cl</code> to get
> + * <p>This method invokes {@link CodebaseAccessClassLoader#getClassAnnotation
> + * CodebaseAccessClassLoader.getClassAnnotation} with <code>cl</code> to get
> * the appropriate class annotation string value (possibly
> * <code>null</code>), and then it invokes this stream's {@link
> * #writeAnnotation writeAnnotation} method with that string to
> @@ -153,7 +153,7 @@ public class MarshalOutputStream
> * <code>null</code>
> **/
> protected void annotateProxyClass(Class cl) throws IOException {
> - writeAnnotation(RMIClassLoader.getClassAnnotation(cl));
> + writeAnnotation(CodebaseAccessClassLoader.getClassAnnotation(cl));
> }
>
> /**
>
> Modified: incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstance.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstance.java?rev=934258&r1=934257&r2=934258&view=diff
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstance.java (original)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstance.java Thu Apr 15 01:11:12 2010
> @@ -20,13 +20,10 @@ package net.jini.io;
> import java.io.ByteArrayInputStream;
> import java.io.ByteArrayOutputStream;
> import java.io.IOException;
> -import java.io.InputStream;
> import java.io.InvalidObjectException;
> import java.io.ObjectInputStream;
> import java.io.ObjectOutputStream;
> -import java.io.ObjectStreamClass;
> import java.io.ObjectStreamException;
> -import java.io.OutputStream;
> import java.io.Serializable;
> import java.util.Arrays;
> import java.util.Collection;
> @@ -69,7 +66,7 @@ import net.jini.io.context.IntegrityEnfo
> * @author Sun Microsystems, Inc.
> * @since 2.0
> */
> -public class MarshalledInstance implements Serializable {
> +public class MarshalledInstance<T> implements Serializable {
>
> /**
> * @serial Bytes of serialized representation. If <code>objBytes</code> is
> @@ -94,6 +91,14 @@ public class MarshalledInstance implemen
>
> static final long serialVersionUID = -5187033771082433496L;
>
> + MarshalledInstance(net.jini.io.MarshalledObject<T> mo){
> + if ( mo == null) throw new NullPointerException("MarshalledObject was null");
> + // for some reason objBytes.clone() throws a null pointer exception.
> + objBytes = Arrays.copyOf(mo.objBytes, mo.objBytes.length);
> + locBytes = mo.locBytes;
> + hash = mo.hash;
> + }
> +
> /**
> * Creates a new <code>MarshalledInstance</code> that contains the
> * marshalled representation of the current state of the supplied
> @@ -107,7 +112,7 @@ public class MarshalledInstance implemen
> * <code>MarshalledInstance</code>
> * @throws IOException if the object cannot be serialized
> */
> - public MarshalledInstance(Object obj) throws IOException {
> + public MarshalledInstance(T obj) throws IOException {
> this(obj, Collections.EMPTY_SET);
> }
>
> @@ -126,7 +131,7 @@ public class MarshalledInstance implemen
> * @throws IOException if the object cannot be serialized
> * @throws NullPointerException if <code>context</code> is <code>null</code>
> */
> - public MarshalledInstance(Object obj, Collection context)
> + public MarshalledInstance(T obj, Collection context)
> throws IOException
> {
> if (context == null)
> @@ -176,8 +181,10 @@ public class MarshalledInstance implemen
> * the object the new <code>MarshalledInstance</code> should
> * contain
> * @throws NullPointerException if <code>mo</code> is <code>null</code>
> + * @deprecated As of Release 2.2.0 replaced by {@link Convert}
> */
> - public MarshalledInstance(java.rmi.MarshalledObject mo) {
> + @Deprecated
> + public MarshalledInstance(java.rmi.MarshalledObject<T> mo) {
>
> if (mo == null)
> throw new NullPointerException();
> @@ -216,11 +223,14 @@ public class MarshalledInstance implemen
> * <p>
> * The object contained in this <code>MarshalledInstance</code>
> * object will not be unmarshalled as part of this call.
> + * @deprecated As of Release 2.2.0 replaced by {@link Convert}
> * @return A new <code>MarshalledObject</code> which
> * contains an object equivalent to the object
> * contained in this <code>MarshalledInstance</code>
> */
> - public java.rmi.MarshalledObject convertToMarshalledObject() {
> + @SuppressWarnings("unchecked")
> + @Deprecated
> + public java.rmi.MarshalledObject<T> convertToMarshalledObject() {
>
> // To create a java.rmi.MarshalledObject with previously
> // serialized data we first create a private
> @@ -229,14 +239,14 @@ public class MarshalledInstance implemen
> // the class during readObject(). (See resolveClass() in
> // ToMOInputStream)
> //
> - net.jini.io.MarshalledObject privateMO =
> - new net.jini.io.MarshalledObject();
> + net.jini.io.MarshalledObject<T> privateMO =
> + new net.jini.io.MarshalledObject<T>();
>
> privateMO.objBytes = objBytes;
> privateMO.locBytes = locBytes;
> privateMO.hash = hash;
>
> - java.rmi.MarshalledObject mo = null;
> + java.rmi.MarshalledObject<T> mo = null;
> try {
> ByteArrayOutputStream baos = new ByteArrayOutputStream();
> ObjectOutputStream oos = new ObjectOutputStream(baos);
> @@ -245,7 +255,7 @@ public class MarshalledInstance implemen
> byte[] bytes = baos.toByteArray();
> ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
> ObjectInputStream ois = new ToMOInputStream(bais);
> - mo = (java.rmi.MarshalledObject)ois.readObject();
> + mo = (java.rmi.MarshalledObject<T>)ois.readObject();
> } catch (IOException ioe) {
> throw new AssertionError(ioe);
> } catch (ClassNotFoundException cnfe) {
> @@ -253,7 +263,16 @@ public class MarshalledInstance implemen
> }
> return mo;
> }
> -
> +
> + MarshalledObject<T> asMarshalledObject(){
> + MarshalledObject<T> mo = new MarshalledObject<T>();
> + // Don't worry about defensive copies, this is package private.
> + mo.objBytes = objBytes;
> + mo.locBytes = locBytes;
> + mo.hash = hash;
> + return mo;
> + }
> +
> /**
> * Returns a new copy of the contained object. Deserialization is
> * performed with the semantics defined by <code>MarshalInputStream</code>.
> @@ -281,7 +300,7 @@ public class MarshalledInstance implemen
> * is <code>true</code> and the integrity of the
> * contained object's codebase cannot be confirmed
> */
> - public Object get(final boolean verifyCodebaseIntegrity)
> + public T get(final boolean verifyCodebaseIntegrity)
> throws IOException, ClassNotFoundException
> {
> return get(null, verifyCodebaseIntegrity, null, null);
> @@ -327,7 +346,7 @@ public class MarshalledInstance implemen
> * is <code>true</code> and the integrity of the
> * contained object's codebase cannot be confirmed
> */
> - public Object get(ClassLoader defaultLoader,
> + public T get(ClassLoader defaultLoader,
> final boolean verifyCodebaseIntegrity,
> ClassLoader verifierLoader,
> Collection context)
> @@ -355,7 +374,8 @@ public class MarshalledInstance implemen
> verifierLoader,
> context);
> in.useCodebaseAnnotations();
> - Object obj = in.readObject();
> + @SuppressWarnings("unchecked")
> + T obj = (T) in.readObject();
> in.close();
> return obj;
> }
> @@ -439,166 +459,5 @@ public class MarshalledInstance implemen
> */
> private void readObjectNoData() throws ObjectStreamException {
> throw new InvalidObjectException("Bad class hierarchy");
> - }
> -
> - /**
> - * This class is used to marshal objects for
> - * <code>MarshalledInstance</code>. It places the location annotations
> - * to one side so that two <code>MarshalledInstance</code>s can be
> - * compared for equality if they differ only in location
> - * annotations. Objects written using this stream should be read back
> - * from a <code>MarshalledInstanceInputStream</code>.
> - *
> - * @see MarshalledInstanceInputStream
> - */
> - private static class MarshalledInstanceOutputStream
> - extends MarshalOutputStream
> - {
> - /** The stream on which location objects are written. */
> - private ObjectOutputStream locOut;
> -
> - /** <code>true</code> if non-<code>null</code> annotations are
> - * written.
> - */
> - private boolean hadAnnotations;
> -
> - /**
> - * Creates a new <code>MarshalledObjectOutputStream</code> whose
> - * non-location bytes will be written to <code>objOut</code> and whose
> - * location annotations (if any) will be written to
> - * <code>locOut</code>.
> - */
> - public MarshalledInstanceOutputStream(OutputStream objOut,
> - OutputStream locOut,
> - Collection context)
> - throws IOException
> - {
> - super(objOut, context);
> - this.locOut = new ObjectOutputStream(locOut);
> - hadAnnotations = false;
> - }
> -
> - /**
> - * Returns <code>true</code> if any non-<code>null</code> location
> - * annotations have been written to this stream.
> - */
> - public boolean hadAnnotations() {
> - return hadAnnotations;
> - }
> -
> - /**
> - * Overrides <code>MarshalOutputStream.writeAnnotation</code>
> - * implementation to write annotations to the location stream.
> - */
> - protected void writeAnnotation(String loc) throws IOException {
> - hadAnnotations |= (loc != null);
> - locOut.writeObject(loc);
> - }
> -
> - public void flush() throws IOException {
> - super.flush();
> - locOut.flush();
> - }
> - }
> -
> - /**
> - * The counterpart to <code>MarshalledInstanceOutputStream</code>.
> - *
> - * @see MarshalledInstanceOutputStream
> - */
> - private static class MarshalledInstanceInputStream
> - extends MarshalInputStream
> - {
> - /**
> - * The stream from which annotations will be read. If this is
> - * <code>null</code>, then all annotations were <code>null</code>.
> - */
> - private ObjectInputStream locIn;
> -
> - /**
> - * Creates a new <code>MarshalledObjectInputStream</code> that
> - * reads its objects from <code>objIn</code> and annotations
> - * from <code>locIn</code>. If <code>locIn</code> is
> - * <code>null</code>, then all annotations will be
> - * <code>null</code>.
> - */
> - MarshalledInstanceInputStream(InputStream objIn,
> - InputStream locIn,
> - ClassLoader defaultLoader,
> - boolean verifyCodebaseIntegrity,
> - ClassLoader verifierLoader,
> - Collection context)
> - throws IOException
> - {
> - super(objIn,
> - defaultLoader,
> - verifyCodebaseIntegrity,
> - verifierLoader,
> - context);
> - this.locIn = (locIn == null ? null : new ObjectInputStream(locIn));
> - }
> -
> - /**
> - * Overrides <code>MarshalInputStream.readAnnotation</code> to
> - * return locations from the stream we were given, or <code>null</code>
> - * if we were given a <code>null</code> location stream.
> - */
> - protected String readAnnotation()
> - throws IOException, ClassNotFoundException
> - {
> - return (locIn == null ? null : (String)locIn.readObject());
> - }
> }
> -
> - /**
> - * Input stream to convert <code>java.rmi.MarshalledObject</code>
> - * into <code>net.jini.io.MarshalledObject</code>.
> - */
> - private static class FromMOInputStream extends ObjectInputStream {
> -
> - public FromMOInputStream(InputStream in) throws IOException {
> - super(in);
> - }
> -
> - /**
> - * Overrides <code>ObjectInputStream.resolveClass</code> to change
> - * an occurence of class <code>java.rmi.MarshalledObject</code> to
> - * class <code>net.jini.io.MarshalledObject</code>.
> - */
> - protected Class resolveClass(ObjectStreamClass desc)
> - throws IOException, ClassNotFoundException
> - {
> - if (desc.getName().equals("java.rmi.MarshalledObject")) {
> - return net.jini.io.MarshalledObject.class;
> - }
> - return super.resolveClass(desc);
> - }
> - }
> -
> - /**
> - * Input stream to convert
> - * <code>net.jini.io.MarshalledObject</code> into
> - * <code>java.rmi.MarshalledObject</code>.
> - */
> - private static class ToMOInputStream extends ObjectInputStream {
> -
> - public ToMOInputStream(InputStream in) throws IOException {
> - super(in);
> - }
> -
> - /**
> - * Overrides <code>ObjectInputStream.resolveClass</code>
> - * to change an occurence of class
> - * <code>net.jini.io.MarshalledObject</code>
> - * to class <code>java.rmi.MarshalledObject</code>.
> - */
> - protected Class resolveClass(ObjectStreamClass desc)
> - throws IOException, ClassNotFoundException
> - {
> - if (desc.getName().equals("net.jini.io.MarshalledObject")) {
> - return java.rmi.MarshalledObject.class;
> - }
> - return super.resolveClass(desc);
> - }
> - }
> }
>
> Added: incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,38 @@
> +/*
> + * 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 net.jini.io;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.io.ObjectInputStream;
> +import java.util.Collection;
> +
> +class MarshalledInstanceInputStream extends MarshalInputStream {
> +
> + private ObjectInputStream locIn;
> +
> + MarshalledInstanceInputStream(InputStream objIn, InputStream locIn, ClassLoader defaultLoader, boolean verifyCodebaseIntegrity, ClassLoader verifierLoader, Collection context) throws IOException {
> + super(objIn, defaultLoader, verifyCodebaseIntegrity, verifierLoader, context);
> + this.locIn = (locIn == null ? null : new ObjectInputStream(locIn));
> + }
> +
> + @Override
> + protected String readAnnotation() throws IOException, ClassNotFoundException {
> + return locIn == null ? null : (String) locIn.readObject();
> + }
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceInputStream.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added: incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java
> URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java?rev=934258&view=auto
> ==============================================================================
> --- incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java (added)
> +++ incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java Thu Apr 15 01:11:12 2010
> @@ -0,0 +1,58 @@
> +/*
> + * 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 net.jini.io;
> +
> +import java.io.IOException;
> +import java.io.ObjectOutputStream;
> +import java.io.OutputStream;
> +import java.util.Collection;
> +
> +class MarshalledInstanceOutputStream extends MarshalOutputStream {
> +
> + private ObjectOutputStream locOut;
> + /** <code>true</code> if non-<code>null</code> annotations are
> + * written.
> + */
> + private boolean hadAnnotations;
> +
> + public MarshalledInstanceOutputStream(OutputStream objOut, OutputStream locOut, Collection context) throws IOException {
> + super(objOut, context);
> + this.locOut = new ObjectOutputStream(locOut);
> + hadAnnotations = false;
> + }
> +
> + /**
> + * Returns <code>true</code> if any non-<code>null</code> location
> + * annotations have been written to this stream.
> + */
> + public boolean hadAnnotations() {
> + return hadAnnotations;
> + }
> +
> + @Override
> + protected void writeAnnotation(String loc) throws IOException {
> + hadAnnotations |= (loc != null);
> + locOut.writeObject(loc);
> + }
> +
> + @Override
> + public void flush() throws IOException {
> + super.flush();
> + locOut.flush();
> + }
> +}
>
> Propchange: incubator/river/jtsk/trunk/src/net/jini/io/MarshalledInstanceOutputStream.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
>
>
>