summaryrefslogtreecommitdiffstats
path: root/pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java')
-rw-r--r--pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java883
1 files changed, 0 insertions, 883 deletions
diff --git a/pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java b/pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java
deleted file mode 100644
index 1d066f0ad..000000000
--- a/pki/base/common/src/com/netscape/cmscore/request/RequestRecord.java
+++ /dev/null
@@ -1,883 +0,0 @@
-// --- BEGIN COPYRIGHT BLOCK ---
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; version 2 of the License.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License along
-// with this program; if not, write to the Free Software Foundation, Inc.,
-// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-//
-// (C) 2007 Red Hat, Inc.
-// All rights reserved.
-// --- END COPYRIGHT BLOCK ---
-package com.netscape.cmscore.request;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamException;
-import java.math.BigInteger;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import netscape.ldap.LDAPAttribute;
-import netscape.ldap.LDAPAttributeSet;
-
-import com.netscape.certsrv.base.EBaseException;
-import com.netscape.certsrv.dbs.EDBException;
-import com.netscape.certsrv.dbs.IDBAttrMapper;
-import com.netscape.certsrv.dbs.IDBDynAttrMapper;
-import com.netscape.certsrv.dbs.IDBObj;
-import com.netscape.certsrv.dbs.IDBRegistry;
-import com.netscape.certsrv.dbs.IDBSubsystem;
-import com.netscape.certsrv.dbs.Modification;
-import com.netscape.certsrv.dbs.ModificationSet;
-import com.netscape.certsrv.request.IRequest;
-import com.netscape.certsrv.request.IRequestRecord;
-import com.netscape.certsrv.request.RequestId;
-import com.netscape.certsrv.request.RequestStatus;
-import com.netscape.certsrv.request.ldap.IRequestMod;
-import com.netscape.cmscore.dbs.BigIntegerMapper;
-import com.netscape.cmscore.dbs.DateMapper;
-import com.netscape.cmscore.dbs.StringMapper;
-import com.netscape.cmscore.util.Debug;
-
-//
-// A request record is the stored version of a request.
-// It has a set of attributes that are mapped into LDAP
-// attributes for actual directory operations.
-//
-public class RequestRecord
- extends ARequestRecord
- implements IRequestRecord, IDBObj {
- /**
- *
- */
- private static final long serialVersionUID = 8044665107558872084L;
-
- public RequestId getRequestId() {
- return mRequestId;
- }
-
- public Enumeration<String> getAttrNames() {
- return mAttrTable.keys();
- }
-
- // IDBObj.get
- public Object get(String name) {
- if (name.equals(IRequestRecord.ATTR_REQUEST_ID))
- return mRequestId;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_STATE))
- return mRequestState;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_TYPE))
- return mRequestType;
- else if (name.equals(IRequestRecord.ATTR_MODIFY_TIME))
- return mModifyTime;
- else if (name.equals(IRequestRecord.ATTR_CREATE_TIME))
- return mCreateTime;
- else if (name.equals(IRequestRecord.ATTR_SOURCE_ID))
- return mSourceId;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_OWNER))
- return mOwner;
- else if (name.equals(IRequestRecord.ATTR_EXT_DATA))
- return mExtData;
- else {
- RequestAttr ra = mAttrTable.get(name);
-
- if (ra != null)
- return ra.get(this);
- }
-
- return null;
- }
-
- // IDBObj.set
- @SuppressWarnings("unchecked")
- public void set(String name, Object o) {
- if (name.equals(IRequestRecord.ATTR_REQUEST_ID))
- mRequestId = (RequestId) o;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_STATE))
- mRequestState = (RequestStatus) o;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_TYPE))
- mRequestType = (String) o;
- else if (name.equals(IRequestRecord.ATTR_CREATE_TIME))
- mCreateTime = (Date) o;
- else if (name.equals(IRequestRecord.ATTR_MODIFY_TIME))
- mModifyTime = (Date) o;
- else if (name.equals(IRequestRecord.ATTR_SOURCE_ID))
- mSourceId = (String) o;
- else if (name.equals(IRequestRecord.ATTR_REQUEST_OWNER))
- mOwner = (String) o;
- else if (name.equals(IRequestRecord.ATTR_EXT_DATA))
- mExtData = (Hashtable<String, Object>) o;
- else {
- RequestAttr ra = mAttrTable.get(name);
-
- if (ra != null)
- ra.set(this, o);
- }
- }
-
- // IDBObj.delete
- public void delete(String name)
- throws EBaseException {
- throw new EBaseException("Invalid call to delete");
- }
-
- // IDBObj.getElements
- public Enumeration<String> getElements() {
- return mAttrs.elements();
- }
-
- // IDBObj.getSerializableAttrNames
- public Enumeration<String> getSerializableAttrNames() {
- return mAttrs.elements();
- }
-
- // copy values from r to the local record
- void add(IRequest r) throws EBaseException {
- // Collect the values for the record
- mRequestId = r.getRequestId();
- mRequestType = r.getRequestType();
- mRequestState = r.getRequestStatus();
- mSourceId = r.getSourceId();
- mOwner = r.getRequestOwner();
- mCreateTime = r.getCreationTime();
- mModifyTime = r.getModificationTime();
- mExtData = loadExtDataFromRequest(r);
-
- for (int i = 0; i < mRequestA.length; i++) {
- mRequestA[i].add(r, this);
- }
- }
-
- void read(IRequestMod a, IRequest r) throws EBaseException {
- a.modRequestStatus(r, mRequestState);
- r.setSourceId(mSourceId);
- r.setRequestOwner(mOwner);
- a.modModificationTime(r, mModifyTime);
- a.modCreationTime(r, mCreateTime);
- storeExtDataIntoRequest(r);
-
- for (int i = 0; i < mRequestA.length; i++) {
- mRequestA[i].read(a, r, this);
- }
- }
-
- static void mod(ModificationSet mods, IRequest r) throws EBaseException {
- //
- mods.add(IRequestRecord.ATTR_REQUEST_STATE,
- Modification.MOD_REPLACE, r.getRequestStatus());
-
- mods.add(IRequestRecord.ATTR_SOURCE_ID,
- Modification.MOD_REPLACE, r.getSourceId());
-
- mods.add(IRequestRecord.ATTR_REQUEST_OWNER,
- Modification.MOD_REPLACE, r.getRequestOwner());
-
- mods.add(IRequestRecord.ATTR_MODIFY_TIME,
- Modification.MOD_REPLACE, r.getModificationTime());
-
- mods.add(IRequestRecord.ATTR_EXT_DATA,
- Modification.MOD_REPLACE, loadExtDataFromRequest(r));
-
- for (int i = 0; i < mRequestA.length; i++) {
- mRequestA[i].mod(mods, r);
- }
- }
-
- static void register(IDBSubsystem db)
- throws EDBException {
- IDBRegistry reg = db.getRegistry();
-
- reg.registerObjectClass(RequestRecord.class.getName(), mOC);
-
- reg.registerAttribute(IRequestRecord.ATTR_REQUEST_ID, new RequestIdMapper());
- reg.registerAttribute(IRequestRecord.ATTR_REQUEST_STATE, new RequestStateMapper());
- reg.registerAttribute(IRequestRecord.ATTR_CREATE_TIME,
- new DateMapper(Schema.LDAP_ATTR_CREATE_TIME));
- reg.registerAttribute(IRequestRecord.ATTR_MODIFY_TIME,
- new DateMapper(Schema.LDAP_ATTR_MODIFY_TIME));
- reg.registerAttribute(IRequestRecord.ATTR_SOURCE_ID,
- new StringMapper(Schema.LDAP_ATTR_SOURCE_ID));
- reg.registerAttribute(IRequestRecord.ATTR_REQUEST_OWNER,
- new StringMapper(Schema.LDAP_ATTR_REQUEST_OWNER));
- ExtAttrDynMapper extAttrMapper = new ExtAttrDynMapper();
- reg.registerAttribute(IRequestRecord.ATTR_EXT_DATA, extAttrMapper);
- reg.registerDynamicMapper(extAttrMapper);
-
- for (int i = 0; i < mRequestA.length; i++) {
- RequestAttr ra = mRequestA[i];
-
- reg.registerAttribute(ra.mAttrName, ra.mMapper);
- }
- }
-
- protected static final String mOC[] =
- { Schema.LDAP_OC_TOP, Schema.LDAP_OC_REQUEST, Schema.LDAP_OC_EXTENSIBLE };
-
- protected static Hashtable<String, Object> loadExtDataFromRequest(IRequest r) throws EBaseException {
- Hashtable<String, Object> h = new Hashtable<String, Object>();
-
- Enumeration<String> e = r.getExtDataKeys();
- while (e.hasMoreElements()) {
- String key = e.nextElement();
- if (r.isSimpleExtDataValue(key)) {
- h.put(key, r.getExtDataInString(key));
- } else {
- h.put(key, r.getExtDataInHashtable(key));
- }
- }
-
- return h;
- }
-
- @SuppressWarnings("unchecked")
- protected void storeExtDataIntoRequest(IRequest r) throws EBaseException {
- Enumeration<String> e = mExtData.keys();
- while (e.hasMoreElements()) {
- String key = e.nextElement();
- Object value = mExtData.get(key);
- if (value instanceof String) {
- r.setExtData(key, (String) value);
- } else if (value instanceof Hashtable) {
- r.setExtData(key, (Hashtable<String, String>) value);
- } else {
- throw new EDBException("Illegal data value in RequestRecord: " +
- r.toString());
- }
- }
- }
-
- protected static Vector<String> mAttrs = new Vector<String>();
-
- static Hashtable<String, RequestAttr> mAttrTable = new Hashtable<String, RequestAttr>();
-
- /*
- * This table contains attribute handlers for attributes
- * of the request. These attributes are ones that are stored
- * apart from the generic name/value pairs supported by the get/set
- * interface plus the hashtable for the name/value pairs themselves.
- *
- * NOTE: Eventually, all attributes should be done here. Currently
- * only the last ones added are implemented this way.
- */
- static RequestAttr mRequestA[] = {
-
- new RequestAttr(IRequest.ATTR_REQUEST_TYPE,
- new StringMapper(Schema.LDAP_ATTR_REQUEST_TYPE)) {
- void set(ARequestRecord r, Object o) {
- r.mRequestType = (String) o;
- }
-
- Object get(ARequestRecord r) {
- return r.mRequestType;
- }
-
- void read(IRequestMod a, IRequest r, ARequestRecord rr) {
- r.setRequestType(rr.mRequestType);
- }
-
- void add(IRequest r, ARequestRecord rr) {
- rr.mRequestType = r.getRequestType();
- }
-
- void mod(ModificationSet mods, IRequest r) {
- addmod(mods, r.getRequestType());
- }
- }
-
- };
- static {
- mAttrs.add(IRequestRecord.ATTR_REQUEST_ID);
- mAttrs.add(IRequestRecord.ATTR_REQUEST_STATE);
- mAttrs.add(IRequestRecord.ATTR_CREATE_TIME);
- mAttrs.add(IRequestRecord.ATTR_MODIFY_TIME);
- mAttrs.add(IRequestRecord.ATTR_SOURCE_ID);
- mAttrs.add(IRequestRecord.ATTR_REQUEST_OWNER);
- mAttrs.add(IRequestRecord.ATTR_EXT_DATA);
-
- for (int i = 0; i < mRequestA.length; i++) {
- RequestAttr ra = mRequestA[i];
-
- mAttrs.add(ra.mAttrName);
- mAttrTable.put(ra.mAttrName, ra);
- }
- }
-
-}
-
-//
-// A mapper between an request state object and
-// its LDAP attribute representation
-// <P>
-//
-// @author thayes
-// @version $Revision$ $Date$
-//
-class RequestStateMapper
- implements IDBAttrMapper {
- // IDBAttrMapper methods
-
- //
- //
- public Enumeration<String> getSupportedLDAPAttributeNames() {
- return mAttrs.elements();
- }
-
- //
- public void mapObjectToLDAPAttributeSet(IDBObj parent,
- String name, Object obj, LDAPAttributeSet attrs) {
- RequestStatus rs = (RequestStatus) obj;
-
- attrs.add(new LDAPAttribute(Schema.LDAP_ATTR_REQUEST_STATE,
- rs.toString()));
- }
-
- public void mapLDAPAttributeSetToObject(LDAPAttributeSet attrs,
- String name, IDBObj parent)
- throws EBaseException {
- LDAPAttribute attr = attrs.getAttribute(Schema.LDAP_ATTR_REQUEST_STATE);
-
- if (attr == null)
- throw new EBaseException("schema violation");
-
- String value = (String) attr.getStringValues().nextElement();
-
- parent.set(name, RequestStatus.fromString(value));
- }
-
- public String mapSearchFilter(String name, String op, String value) {
- return Schema.LDAP_ATTR_REQUEST_STATE + op + value;
- }
-
- protected final static Vector<String> mAttrs = new Vector<String>();
-
- static {
- mAttrs.add(Schema.LDAP_ATTR_REQUEST_STATE);
- }
-}
-
-//
-// A mapper between an request id object and
-// its LDAP attribute representation
-// <P>
-//
-// @author thayes
-// @version $Revision$ $Date$
-//
-class RequestIdMapper
- implements IDBAttrMapper {
- // IDBAttrMapper methods
-
- //
- //
- public Enumeration<String> getSupportedLDAPAttributeNames() {
- return mAttrs.elements();
- }
-
- //
- public void mapObjectToLDAPAttributeSet(IDBObj parent,
- String name, Object obj, LDAPAttributeSet attrs) {
- RequestId rid = (RequestId) obj;
-
- String v = BigIntegerMapper.BigIntegerToDB(new BigInteger(rid.toString()));
-
- attrs.add(new LDAPAttribute(Schema.LDAP_ATTR_REQUEST_ID, v));
- }
-
- public void mapLDAPAttributeSetToObject(LDAPAttributeSet attrs,
- String name, IDBObj parent)
- throws EBaseException {
- LDAPAttribute attr = attrs.getAttribute(Schema.LDAP_ATTR_REQUEST_ID);
-
- if (attr == null)
- throw new EBaseException("schema violation");
-
- String value = (String) attr.getStringValues().nextElement();
-
- parent.set(name, new RequestId(
- BigIntegerMapper.BigIntegerFromDB(value).toString()));
- }
-
- public String mapSearchFilter(String name, String op, String value) {
- String v = null;
-
- try {
- v = BigIntegerMapper.BigIntegerToDB(new BigInteger(value));
- } catch (NumberFormatException e) {
- v = value;
- }
- return Schema.LDAP_ATTR_REQUEST_ID + op + v;
- }
-
- protected final static Vector<String> mAttrs = new Vector<String>();
-
- static {
- mAttrs.add(Schema.LDAP_ATTR_REQUEST_ID);
- }
-}
-
-/**
- * A mapper between an request attr set and its LDAP attribute representation.
- *
- * The attr attribute is no longer used. This class is kept for historical
- * and migration purposes.
- *
- * @author thayes
- * @version $Revision$ $Date$
- * @deprecated
- */
-class RequestAttrsMapper
- implements IDBAttrMapper {
- // IDBAttrMapper methods
-
- //
- //
- public Enumeration<String> getSupportedLDAPAttributeNames() {
- return mAttrs.elements();
- }
-
- //
- public void mapObjectToLDAPAttributeSet(IDBObj parent,
- String name, Object obj, LDAPAttributeSet attrs) {
- @SuppressWarnings("unchecked")
- Hashtable<String, Object> ht = (Hashtable<String, Object>) obj;
- Enumeration<String> e = ht.keys();
-
- try {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream os = new ObjectOutputStream(bos);
-
- String key = null;
- Object value = null;
-
- while (e.hasMoreElements()) {
- key = e.nextElement();
- value = ht.get(key);
- byte data[] = null;
-
- try {
- data = encode(value);
- os.writeObject(key);
- os.writeObject(data);
- } catch (NotSerializableException x) {
- if (Debug.ON) {
- System.err.println("Error: attribute '" + key + "' (" +
- x.getMessage() + ") is not serializable");
- x.printStackTrace();
- }
- } catch (Exception x) {
- if (Debug.ON) {
- System.err.println("Error: attribute '" + key +
- "' - error during serialization: " + x);
- x.printStackTrace();
- }
- }
- }
-
- os.writeObject(null);
- os.close();
-
- attrs.add(new LDAPAttribute(Schema.LDAP_ATTR_REQUEST_ATTRS,
- bos.toByteArray()));
- } catch (Exception x) {
- Debug.trace("Output Mapping Error in requeset ID " +
- ((RequestRecord) parent).getRequestId().toString() + " : " + x);
- //if (Debug.ON) {
- Debug.printStackTrace(x);
- //}
- }
- }
-
- private byte[] encode(Object value)
- throws NotSerializableException, IOException {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream os = new ObjectOutputStream(bos);
-
- os.writeObject(value);
- os.close();
-
- return bos.toByteArray();
- }
-
- private Object decode(byte[] data)
- throws ObjectStreamException, IOException, ClassNotFoundException {
- ByteArrayInputStream bis = new ByteArrayInputStream(data);
- ObjectInputStream is = new ObjectInputStream(bis);
-
- return is.readObject();
- }
-
- private Hashtable<String, Object> decodeHashtable(byte[] data)
- throws ObjectStreamException, IOException, ClassNotFoundException {
- Hashtable<String, Object> ht = new Hashtable<String, Object>();
- ByteArrayInputStream bis = new ByteArrayInputStream(data);
- ObjectInputStream is = new ObjectInputStream(bis);
-
- String key = null;
-
- try {
-
- while (true) {
- key = (String) is.readObject();
-
- // end of table is marked with null
- if (key == null)
- break;
-
- byte[] bytes = (byte[]) is.readObject();
-
- ht.put(key, decode(bytes));
- }
- } catch (ObjectStreamException e) {
- Debug.trace("Key " + key); // would be nice to know object type.
- throw e;
- } catch (IOException e) {
- Debug.trace("Key " + key); // would be nice to know object type.
- throw e;
- } catch (ClassNotFoundException e) {
- Debug.trace("Key " + key); // would be nice to know object type.
- throw e;
- }
-
- return ht;
- }
-
- /**
- * Implements IDBAttrMapper.mapLDAPAttributeSetToObject
- * <p>
- *
- * @see IDBAttrMapper#mapLDAPAttributeSetToObject
- */
- public void mapLDAPAttributeSetToObject(LDAPAttributeSet attrs,
- String name, IDBObj parent)
- throws EBaseException {
- Hashtable<String, Object> ht = null;
-
- //
- // Data is stored in a (single valued) binary attribute
- //
- byte[] value;
-
- LDAPAttribute attr = null;
-
- try {
- attr = attrs.getAttribute(Schema.LDAP_ATTR_REQUEST_ATTRS);
-
- if (attr != null) {
- @SuppressWarnings("unchecked")
- Enumeration<byte[]> values = attr.getByteValues();
-
- value = (byte[]) values.nextElement();
-
- ht = decodeHashtable(value);
- }
- } catch (Exception x) {
- Debug.trace("Mapping error in request Id " +
- ((RequestRecord) parent).getRequestId().toString() + " : " + x);
- Debug.trace("Attr " + attr.getName());
- //if (Debug.ON) {
- Debug.printStackTrace(x);
- //}
- }
-
- parent.set(name, ht);
- }
-
- public String mapSearchFilter(String name, String op, String value) {
- return Schema.LDAP_ATTR_REQUEST_ID + op + value;
- }
-
- protected final static Vector<String> mAttrs = new Vector<String>();
-
- static {
- mAttrs.add(Schema.LDAP_ATTR_REQUEST_ATTRS);
- }
-}
-
-/**
- * Maps dynamic data for the extData- prefix to and from the extData Hashtable
- * in RequestRecord.
- *
- * The data in RequestRecord is stored in a Hashtable. It comes in two forms:
- * 1. String key1 => String value1
- * String key2 => String value2
- * This is stored in LDAP as:
- * extData-key1 => value1
- * extData-key2 => value2
- *
- * 2. String key => Hashtable value
- * where value stores:
- * String key2 => String value2
- * String key3 => String value3
- * This is stored in LDAP as:
- * extData-key;key2 => value2
- * extData-key;key3 => value3
- *
- * These can be mixed, but each top-level key can only be associated with
- * a String value or a Hashtable value.
- *
- */
-class ExtAttrDynMapper implements IDBDynAttrMapper {
-
- public boolean supportsLDAPAttributeName(String attrName) {
- return (attrName != null) &&
- attrName.toLowerCase().startsWith(extAttrPrefix);
- }
-
- public Enumeration<String> getSupportedLDAPAttributeNames() {
- return mAttrs.elements();
- }
-
- /**
- * Decodes extdata encoded keys.
- * -- followed by a 4 digit hexadecimal string is decoded to the character
- * representing the hex string.
- *
- * The routine is written to be highly efficient. It only allocates
- * the StringBuffer if needed and copies the pieces in large chunks.
- *
- * @param key The key to decode
- * @return The decoded key.
- */
- public String decodeKey(String key) {
- StringBuffer output = null;
- char[] input = key.toCharArray();
- int startCopyIndex = 0;
-
- int index = 0;
- while (index < input.length) {
- if (input[index] == '-') {
- if (((index + 1) < input.length) &&
- (input[index + 1] == '-')) {
- if (output == null) {
- output = new StringBuffer(input.length);
- }
- output.append(input, startCopyIndex, index - startCopyIndex);
- index += 2;
- if ((index + 3) < input.length) {
- output.append(
- Character.toChars(
- Integer.parseInt(new String(input, index, 4),
- 16))
- );
- }
- index += 4;
- startCopyIndex = index;
- } else {
- index++;
- }
- } else {
- index++;
- }
- }
-
- if (output == null) {
- return key;
- } else {
- output.append(input, startCopyIndex, index - startCopyIndex);
- return output.toString();
- }
- }
-
- /**
- * Encoded extdata keys for storage in LDAP.
- *
- * The rules for encoding are trickier than decoding. We want to allow
- * '-' by itself to be stored in the database (for the common case of keys
- * like 'Foo-Bar'. Therefore we are using '--' as the encoding character.
- * The rules are:
- * 1) All characters [^-a-zA-Z0-9] are encoded as --XXXX where XXXX is the
- * hex representation of the digit.
- * 2) [a-zA-Z0-9] are always passed through unencoded
- * 3) [-] is passed through as long as it is preceded and followed
- * by [a-zA-Z0-9] (or if it's at the beginning/end of the string)
- * 4) If [-] is preceded or followed by [^a-zA-Z0-9] then
- * the - as well as all following [^a-zA-Z0-9] characters are encoded
- * as --XXXX.
- *
- * This routine tries to be as efficient as possible with StringBuffer and
- * large copies. However, the encoding unfortunately requires several
- * objects to be allocated.
- *
- * @param key The key to encode
- * @return The encoded key
- */
- public String encodeKey(String key) {
- StringBuffer output = null;
- char[] input = key.toCharArray();
- int startCopyIndex = 0;
-
- int index = 0;
- while (index < input.length) {
- if (!isAlphaNum(input[index])) {
- if ((input[index] == '-') &&
- ((index + 1) < input.length) &&
- (isAlphaNum(input[index + 1]))) {
- index += 2;
- } else if ((input[index] == '-') &&
- ((index + 1) == input.length)) {
- index += 1;
- } else {
- if (output == null) {
- output = new StringBuffer(input.length + 5);
- }
- output.append(input, startCopyIndex, index - startCopyIndex);
- while ((index < input.length) &&
- (!isAlphaNum(input[index]))) {
- output.append("--");
- String hexString = Integer.toHexString(input[index]);
- int padding = 4 - hexString.length();
- while (padding > 0) {
- output.append('0');
- padding--;
- }
- output.append(hexString);
- index++;
- }
- startCopyIndex = index;
- }
- } else {
- index++;
- }
- }
-
- if (output == null) {
- return key;
- } else {
- output.append(input, startCopyIndex, index - startCopyIndex);
- return output.toString();
- }
- }
-
- protected boolean isAlphaNum(char in) {
- if ((in >= 'a') && (in <= 'z')) {
- return true;
- }
- if ((in >= 'A') && (in <= 'Z')) {
- return true;
- }
- if ((in >= '0') && (in <= '9')) {
- return true;
- }
- return false;
- }
-
- public void mapObjectToLDAPAttributeSet(IDBObj parent, String name,
- Object obj, LDAPAttributeSet attrs)
- throws EBaseException {
- @SuppressWarnings("unchecked")
- Hashtable<String, Object> ht = (Hashtable<String, Object>) obj;
- Enumeration<String> e = ht.keys();
-
- try {
- while (e.hasMoreElements()) {
- String key = e.nextElement();
- Object value = ht.get(key);
- if (value instanceof String) {
- String stringValue = (String) value;
- attrs.add(new LDAPAttribute(
- extAttrPrefix + encodeKey(key),
- stringValue));
- } else if (value instanceof Hashtable) {
- @SuppressWarnings("unchecked")
- Hashtable<String, String> innerHash = (Hashtable<String, String>) value;
- Enumeration<String> innerHashEnum = innerHash.keys();
- while (innerHashEnum.hasMoreElements()) {
- String innerKey = innerHashEnum.nextElement();
- String innerValue = innerHash.get(innerKey);
- attrs.add(new LDAPAttribute(
- extAttrPrefix + encodeKey(key) + ";" + encodeKey(innerKey),
- innerValue));
- }
- }
- }
- } catch (Exception x) {
- Debug.trace("Output Mapping Error in requeset ID " +
- ((IRequestRecord) parent).getRequestId().toString() + " : " + x);
- //if (Debug.ON) {
- Debug.printStackTrace(x);
- //}
- }
- }
-
- @SuppressWarnings("unchecked")
- public void mapLDAPAttributeSetToObject(LDAPAttributeSet attrs, String name,
- IDBObj parent)
- throws EBaseException {
- Hashtable<String, Object> ht = new Hashtable<String, Object>();
- Hashtable<String, String> valueHashtable;
-
- Enumeration<LDAPAttribute> attrEnum = attrs.getAttributes();
- while (attrEnum.hasMoreElements()) {
- LDAPAttribute attr = attrEnum.nextElement();
- String baseName = attr.getBaseName();
- if (baseName.toLowerCase().startsWith(extAttrPrefix)) {
- String keyName = decodeKey(
- baseName.substring(extAttrPrefix.length()));
- String[] subTypes = attr.getSubtypes();
- String[] values = attr.getStringValueArray();
- if (values.length != 1) {
- String message = "Output Mapping Error in request ID " +
- ((IRequestRecord) parent).getRequestId().toString() + " : " +
- "more than one value returned for " +
- keyName;
- Debug.trace(message);
- throw new EBaseException(message);
- }
- if ((subTypes != null) && (subTypes.length > 0)) {
- if (subTypes.length != 1) {
- String message = "Output Mapping Error in request ID " +
- ((IRequestRecord) parent).getRequestId().toString() + " : " +
- "more than one subType returned for " +
- keyName;
- Debug.trace(message);
- throw new EBaseException(message);
- }
- Object value = ht.get(keyName);
- if ((value != null) && (!(value instanceof Hashtable))) {
- String message = "Output Mapping Error in request ID " +
- ((IRequestRecord) parent).getRequestId().toString() + " : " +
- "combined no-subtype and subtype data for key " +
- keyName;
- Debug.trace(message);
- throw new EBaseException(message);
- }
- valueHashtable = (Hashtable<String, String>) value;
- if (valueHashtable == null) {
- valueHashtable = new Hashtable<String, String>();
- ht.put(keyName, valueHashtable);
- }
- valueHashtable.put(decodeKey(subTypes[0]), values[0]);
- } else {
- ht.put(keyName, values[0]);
- }
- }
- }
-
- parent.set(name, ht);
- }
-
- public String mapSearchFilter(String name, String op, String value) throws EBaseException {
- return name + op + value;
- }
-
- protected final static String extAttrPrefix = "extdata-";
-
- protected final static Vector<String> mAttrs = new Vector<String>();
-
- static {
- mAttrs.add(Schema.LDAP_ATTR_EXT_ATTR);
- }
-}