package javax.slee.profile; import java.io.Serializable; import javax.slee.Address; import javax.slee.AddressPlan; /** * The <code>ProfileID</code> class defines an identifier that can be used to * reference profiles. For example a profile specification's CMP interface * may contain attributes of the type <code>ProfileID</code>, allowing profile's of * that type to reference other profiles. */ public class ProfileID implements Serializable, Cloneable { /** * Create a <code>ProfileID</code> object using a profile table name and profile name. * @param profileTableName the name of the profile table. * @param profileName the name of the profile within the profile table. * @throws NullPointerException if either argument is <code>null</code>. * @throws IllegalArgumentException if <code>profileTableName</code> includes the '<tt>/</tt>' * character. This character is not permitted in profile table names. */ public ProfileID(String profileTableName, String profileName) throws NullPointerException, IllegalArgumentException { setProfileID(profileTableName, profileName); } /** * Create a <code>ProfileID</code> object from an address. The address must have the * address plan of {@link javax.slee.AddressPlan#SLEE_PROFILE}. * @param address the address of the profile. * @throws NullPointerException if <code>address</code> is <code>null</code>. * @throws IllegalArgumentException if the address plan of the address is not * <code>AddressPlan.SLEE_PROFILE</code>, or the address string does not * contain a profile identifier with the correct encoding: * <tt><profile-table-name>/<profile-name></tt>. */ public ProfileID(Address address) throws NullPointerException, IllegalArgumentException { if (address == null) throw new NullPointerException("address is null"); if (!address.getAddressPlan().equals(AddressPlan.SLEE_PROFILE)) throw new IllegalArgumentException("address must have the SLEE_PROFILE address plan"); String addressString = address.getAddressString(); int div = addressString.indexOf('/'); if (div < 0) throw new IllegalArgumentException("address string does not contain a '/' seperator character"); this.profileTableName = addressString.substring(0, div); this.profileName = addressString.substring(div + 1); this.address = address; } /** * Get the name of the profile table referenced by this identifier. * @return the profile table name. */ public final String getProfileTableName() { return profileTableName; } /** * Get the name of the profile referenced by this identifier. * @return the profile name. */ public final String getProfileName() { return profileName; } /** * Set the profile table and profile referenced by this profile identifier to new * values. * @param profileTableName the name of the profile table. * @param profileName the name of the profile within the profile table. * @throws NullPointerException if either argument is <code>null</code>. * @throws IllegalArgumentException if <code>profileTableName</code> includes the * '<tt>/</tt>' character. This character is not permitted in profile table names. */ public final void setProfileID(String profileTableName, String profileName) throws NullPointerException, IllegalArgumentException { if (profileTableName == null) throw new NullPointerException("profileTableName is null"); if (profileName == null) throw new NullPointerException("profileName is null"); if (profileTableName.indexOf('/') >= 0) throw new IllegalArgumentException("profileTableName cannot contain the '/' character"); this.profileTableName = profileTableName; this.profileName = profileName; this.address = null; } /** * Get an <code>Address</code> object containing the address form of the profile * identified by this profile identifier. * @return an <code>Address</code> object containing the address form of the profile * identified by this profile identifier. */ public Address toAddress() { if (address == null) { address = new Address(AddressPlan.SLEE_PROFILE, profileTableName + '/' + profileName); } return address; } /** * Create a copy of this profile identifier. * @return a copy of this profile identifier. * @see Object#clone() * @since SLEE 1.1. */ public Object clone(){ return new ProfileID(profileTableName, profileName); } /** * Compare this profile identifier for equality with another object. * @param obj the object to compare this with. * @return <code>true</code> if <code>obj</code> is an instance of this class and the * profile table name and profile name are equal. */ public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof ProfileID)) return false; ProfileID that = (ProfileID)obj; return this.profileTableName.equals(that.profileTableName) && this.profileName.equals(that.profileName); } /** * Get a hash code value for this profile identifier. The hash code is the logical * OR of the hashcodes of the profile table name and profile name. * @return a hash code for this profile identifier. */ public int hashCode() { return profileTableName.hashCode() | profileName.hashCode(); } /** * Get a string representation for this profile identifier. * @return a string representation for this profile identifier. */ public String toString() { StringBuffer buf = new StringBuffer(); buf.append("ProfileID[table=") .append(profileTableName) .append(",profile=") .append(profileName) .append("]"); return buf.toString(); } private String profileTableName; private String profileName; private transient Address address; }