001: /*
002: * Copyright 2006 Day Management AG, Switzerland. All rights reserved.
003: */
004: package javax.jcr;
005:
006: import java.util.HashMap;
007:
008: /**
009: * <code>SimpleCredentials</code> implements the <code>Credentials</code>
010: * interface and represents simple user ID/password credentials.
011: */
012: public final class SimpleCredentials implements Credentials {
013:
014: private final String userID;
015: private final char[] password;
016: private final HashMap attributes = new HashMap();
017:
018: /**
019: * The constructor creates a new <code>SimpleCredentials</code> object,
020: * given a user ID and password.
021: * <p/>
022: * Note that the given password is cloned before it is stored
023: * in the new <code>SimpleCredentials</code> object. This should
024: * avoid the risk of having unnecessary references to password data
025: * lying around in memory.
026: * <p/>
027: *
028: * @param userID the user ID
029: * @param password the user's password
030: */
031: public SimpleCredentials(String userID, char[] password) {
032: this .userID = userID;
033: this .password = (char[]) password.clone();
034: }
035:
036: /**
037: * Returns the user password.
038: * <p/>
039: * Note that this method returns a reference to the password.
040: * It is the caller's responsibility to zero out the password information
041: * after it is no longer needed.
042: *
043: * @return the password
044: */
045: public char[] getPassword() {
046: return password;
047: }
048:
049: /**
050: * Returns the user ID.
051: *
052: * @return the user ID.
053: */
054: public String getUserID() {
055: return userID;
056: }
057:
058: /**
059: * Stores an attribute in this credentials instance.
060: *
061: * @param name a <code>String</code> specifying the name of the attribute
062: * @param value the <code>Object</code> to be stored
063: */
064: public void setAttribute(String name, Object value) {
065: // name cannot be null
066: if (name == null) {
067: throw new IllegalArgumentException("name cannot be null");
068: }
069:
070: // null value is the same as removeAttribute()
071: if (value == null) {
072: removeAttribute(name);
073: return;
074: }
075:
076: synchronized (attributes) {
077: attributes.put(name, value);
078: }
079: }
080:
081: /**
082: * Returns the value of the named attribute as an <code>Object</code>,
083: * or <code>null</code> if no attribute of the given name exists.
084: *
085: * @param name a <code>String</code> specifying the name of the attribute
086: * @return an <code>Object</code> containing the value of the attribute,
087: * or <code>null</code> if the attribute does not exist
088: */
089: public Object getAttribute(String name) {
090: synchronized (attributes) {
091: return (attributes.get(name));
092: }
093: }
094:
095: /**
096: * Removes an attribute from this credentials instance.
097: *
098: * @param name a <code>String</code> specifying the name of the attribute
099: * to remove
100: */
101: public void removeAttribute(String name) {
102: synchronized (attributes) {
103: attributes.remove(name);
104: }
105: }
106:
107: /**
108: * Returns the names of the attributes available to this
109: * credentials instance. This method returns an empty array
110: * if the credentials instance has no attributes available to it.
111: *
112: * @return a string array containing the names of the stored attributes
113: */
114: public String[] getAttributeNames() {
115: synchronized (attributes) {
116: return (String[]) attributes.keySet().toArray(
117: new String[attributes.keySet().size()]);
118: }
119: }
120: }
|