📄 instantiator.java
字号:
/************************************************************************
*
* $Id: Instantiator.java,v 1.2 2002/03/04 21:42:58 echtcherbina Exp $
*
* Copyright (c) 2001 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Sun Microsystems, Inc. for Project JXTA."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
* nor may "JXTA" appear in their name, without prior written
* permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA. For more
* information on Project JXTA, please see
* <http://www.jxta.org/>.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*********************************************************************************/
package net.jxta.impl.id.UUID;
import java.net.URL;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.UnknownServiceException;
final class Instantiator implements net.jxta.id.IDFactory.Instantiator {
final static String UUIDEncoded = "uuid";
/**
* returns the ID encoding value associated with this ID encoding.
*
* @return String containing the ID encoding value for this encoding.
**/
public String getSupportedIDFormat() {
return UUIDEncoded;
}
/**
* Construct a new ID instance from a JXTA ID contained in a URI.
*
* @see net.jxta.id.ID
* @see java.net.URL
*
* @since JXTA 1.0
*
* @param source URI which will be decoded to create a new ID instance.
* @return ID containing the new ID instance initialized from the URI.
* @throws UnknownServiceException Is thrown if the URI provided is of a
* format unrecognized by this JXTA implementation.
* @throws MalformedURLException Is thrown if the URI provided is not
* a valid, recognized JXTA URI.
**/
public net.jxta.id.ID fromURL( URL source ) throws
MalformedURLException, UnknownServiceException {
net.jxta.id.ID result = null;
IDBytes id = new IDBytes();
// check the protocol
if ( !net.jxta.id.ID.URIEncodingName.equalsIgnoreCase(source.getProtocol()) )
throw new UnknownServiceException( "URI protocol type was not as expected." );
String encoded = source.getFile();
//PDA requirements 04.03.2002
//URL.getFile returns String with '/' character in JDK1.1.8.
//If there is a better idea can be fixed another way
if (encoded.startsWith("/")) encoded = encoded.substring(1);
//PDA requirements 04.03.2002
int colonAt = encoded.indexOf( ':' );
// There's a colon right?
if( -1 == colonAt )
throw new UnknownServiceException( "URN namespace was missing." );
// check the namespace
if ( !net.jxta.id.ID.URNNamespace.equalsIgnoreCase(encoded.substring( 0, colonAt )) )
throw new UnknownServiceException( "URN namespace was not as expected." );
// skip the namespace portion and the colon
encoded = encoded.substring( colonAt + 1 );
int dashAt = encoded.indexOf( '-' );
// there's a dash, right?
if( -1 == dashAt )
throw new UnknownServiceException( "URN Encodingtype was missing." );
if( !encoded.substring( 0, dashAt).equals( UUIDEncoded ) )
throw new UnknownServiceException( "JXTA id format was not as expected." );
// skip the dash
encoded = encoded.substring( dashAt + 1 );
// check that the length is even
if( 0 != (encoded.length() % 2) )
throw new MalformedURLException( "URN contains an odd number of chars" );
// check that the length is long enough
if( encoded.length() < 2 )
throw new MalformedURLException( "URN does not contain enough chars" );
// check that id is short enough
if( IDFormat.IdByteArraySize < (encoded.length() % 2) )
throw new MalformedURLException( "URN contains too many chars" );
try {
for( int eachByte = 0; eachByte < ((encoded.length() / 2) - 1); eachByte++ ) {
int index = eachByte * 2;
String twoChars = encoded.substring( index, index + 2 );
id.bytes[eachByte] = (byte) Integer.parseInt( twoChars, 16 );
}
id.bytes[IDFormat.flagsOffset + IDFormat.flagsIdTypeOffset] = (byte)
Integer.parseInt( encoded.substring( encoded.length() - 2 ), 16 );
} catch( NumberFormatException caught ) {
throw new MalformedURLException( "Invalid Character in jxta URI" );
}
switch( id.bytes[IDFormat.flagsOffset + IDFormat.flagsIdTypeOffset] ) {
case IDFormat.flagCodatID :
result = new CodatID(id);
break;
case IDFormat.flagPeerGroupID :
result = new PeerGroupID(id);
if( PeerGroupID.worldPeerGroupID.equals( result ) )
result = net.jxta.peergroup.PeerGroupID.worldPeerGroupID;
break;
case IDFormat.flagPeerID :
result = new PeerID(id);
break;
case IDFormat.flagPipeID :
result = new PipeID(id);
break;
case IDFormat.flagModuleClassID :
result = new ModuleClassID(id);
break;
case IDFormat.flagModuleSpecID :
result = new ModuleSpecID(id);
break;
default :
throw new MalformedURLException( "jxta ID type not recognized" );
}
return result;
};
/**
* Creates a new CodatID Instance. A new random Codata ID is created for
* the provided Peer Group. This type of CodatID can be used as a
* canonical reference for dynamic content.
*
* @since JXTA 1.0
* @see net.jxta.codat.CodatID
*
* @param groupID the group to which this content will belong.
* @return the newly created ID.
**/
public net.jxta.codat.CodatID newCodatID( final net.jxta.peergroup.PeerGroupID groupID ) {
PeerGroupID peerGroupID = (PeerGroupID) IDFormat.translateFromWellKnown( groupID );
return new CodatID( peerGroupID );
};
/**
* Creates a new CodatID Instance. A new random Codata ID is created for
* the provided Peer Group and contains a hash value for the Codat data.
* This type of Codat ID is most appropriate for static content. By
* including a hash value this form of Codat ID provides greater assurance
* of the canonical property of IDs. It also allows the document content
* returned when this ID is used to be verified to ensure it has not been
* altered.
*
* @param groupID The group to which this ID will belong.
* @param in The InputStream from which the content hash is calculated.
* The stream is read until EOF and then closed.
*
* @since JXTA 1.0
* @see net.jxta.codat.CodatID
*
* @return the newly created ID.
* @throws IOException I/O Error reading document
**/
public net.jxta.codat.CodatID newCodatID(final net.jxta.peergroup.PeerGroupID groupID, java.io.InputStream in) throws IOException {
PeerGroupID peerGroupID = (PeerGroupID) IDFormat.translateFromWellKnown( groupID );
return new CodatID( peerGroupID, in );
};
/**
* Creates a new PeerID Instance. A new random peer id will be generated.
* The PeerID will be a member of the provided group.
*
* @since JXTA 1.0
* @see net.jxta.peer.PeerID
*
* @param groupID the group to which this PeerID will belong.
* @return the newly created ID.
**/
public net.jxta.peer.PeerID newPeerID( final net.jxta.peergroup.PeerGroupID groupID ) {
PeerGroupID peerGroupID = (PeerGroupID) IDFormat.translateFromWellKnown( groupID );
return new PeerID( peerGroupID );
};
/**
* Creates a new PeerGroupID Instance. A new random peer group id will be
* generated.
*
* @since JXTA 1.0
* @see net.jxta.peergroup.PeerGroupID
*
* @return the newly created ID.
**/
public net.jxta.peergroup.PeerGroupID newPeerGroupID( ) {
return new PeerGroupID( );
};
/**
* Creates a new PeerGroupID Instance. A new random peer group id will be
* generated.
*
* @since JXTA 1.0
* @see net.jxta.peergroup.PeerGroupID
*
* @param groupID the group to which this Pipe ID will belong.
* @return the newly created ID.
**/
public net.jxta.pipe.PipeID newPipeID( final net.jxta.peergroup.PeerGroupID groupID ) {
PeerGroupID peerGroupID = (PeerGroupID) IDFormat.translateFromWellKnown( groupID );
return new PipeID( peerGroupID );
}
/**
* Creates a new PipeID Instance. A new pipe id will be generated with the
* provided seed information. The Pipe ID will be a member of the provided
* group. The seed information should be at least four bytes in length,
* though longer values are better. This varient of Pipe ID allows you to
* create "Well-known" pipes within the context of diverse groups. This can
* be useful for common services that need to do discovery without
* advertisements or for network organization services. Because of the
* potential for ID collisions and the difficulties with maintaining
* common service interfaces this form of Pipe ID should be used sparingly.
*
* @since JXTA 1.0
* @see net.jxta.pipe.PipeID
*
* @param groupID the group to which this Pipe ID will belong.
* @param seed The seed information which will be used in creating the
* pipeID.
* @return the newly created ID.
**/
public net.jxta.pipe.PipeID newPipeID(
final net.jxta.peergroup.PeerGroupID groupID,
byte [] seed ) {
PeerGroupID peerGroupID = (PeerGroupID) IDFormat.translateFromWellKnown( groupID );
return new PipeID( peerGroupID, seed );
}
/**
* Creates a new ModuleClassID Instance. A new random Module Class Id will
* be generated with a zero value role identifier. This form of Module
* Class Id is appropriate for cases where the module does not need to be
* distinguished from other instances of the same Module.
*
* @since JXTA 1.0
* @see net.jxta.platform.ModuleClassID
*
* @return the newly created ID.
**/
public net.jxta.platform.ModuleClassID newModuleClassID( ) {
return new ModuleClassID( );
}
/**
* Creates a new ModuleClassID Instance. A new random Module Class Id will
* be generated with a a random value role identifier and a base class of
* the provided Module Class ID. This form of Module Class Id is
* appropriate for cases where it is necessary to distinguish instances
* of the same service interface.
*
* @since JXTA 1.0
* @see net.jxta.platform.ModuleClassID
*
* @param baseClass The module class ID which will be used as a base
* class for this new role value instance.
* @return the newly created ID.
**/
public net.jxta.platform.ModuleClassID
newModuleClassID( final net.jxta.platform.ModuleClassID classID ) {
return new ModuleClassID( classID );
}
/**
* Creates a new ModuleClassID Instance. A new random Module Spec Id will
* be generated.
*
* @since JXTA 1.0
* @see net.jxta.platform.ModuleSpecID
*
* @param baseClass The module class ID which will be used as a base
* class for this new Spec ID.
* @return the newly created ID.
**/
public net.jxta.platform.ModuleSpecID
newModuleSpecID( final net.jxta.platform.ModuleClassID classID ) {
return new ModuleSpecID( classID );
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -