001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file ../GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015: package org.griphyn.vdl.util;
016:
017: import java.util.HashMap;
018:
019: /**
020: * This class maps back and forth between a short identifier, and
021: * some unique, abstract identifier that is generated by a sequence.
022: * Instantiated with the default constructor, the generated
023: * identifiers will satisfy NMTOKEN.
024: *
025: * @author Jens-S. Vöckler
026: * @author Yong Zhao
027: * @version $Revision: 50 $
028: */
029: public class SequenceMapping {
030: /**
031: * The forward mapping between the external indentifier and
032: * the internally generated sequence for the identifier.
033: */
034: private HashMap m_forward;
035:
036: /**
037: * The reverse mapping between the sequence-generated identifier,
038: * and the external identifier. The reverse mapping is also
039: * employed to rule out duplicates.
040: */
041: private HashMap m_backward;
042:
043: /**
044: * The sequence counter employed by this generator. Please note
045: * that multiple instances of this class will produce the same
046: * sequences!
047: */
048: private SequenceGenerator m_sequence;
049:
050: /**
051: * A prefix string, initialized to "ID" for the default c'tor.
052: */
053: private String m_prefix;
054:
055: /**
056: * C'tor: This will generate an instance that generated IDxxxxx
057: * symbols. Please note that multiple instances of this class will
058: * produce the same sequences!
059: */
060: public SequenceMapping() {
061: this .m_prefix = "ID";
062: this .m_forward = new HashMap();
063: this .m_backward = new HashMap();
064: this .m_sequence = new SequenceGenerator();
065: }
066:
067: /**
068: * C'tor: Instances from this contructor will generate ${prefix}xxxxx.
069: * Please note that multiple instances of this class with the same
070: * prefix will produce the same sequences!
071: *
072: * @param prefix is a prefix to the generated sequence.
073: */
074: public SequenceMapping(String prefix) {
075: this .m_prefix = new String(prefix);
076: this .m_forward = new HashMap();
077: this .m_backward = new HashMap();
078: this .m_sequence = new SequenceGenerator();
079: }
080:
081: /**
082: * Creates and caches a unique id for a given short identifier.
083: * @param id is the external identifier which needs to be forward mapped.
084: * @return a sequence-generated identifier to use instead.
085: */
086: public String forward(String id) {
087: String result = (String) this .m_forward.get(id);
088: if (result == null) {
089: // need to create a new entry
090: do {
091: result = this .m_prefix + this .m_sequence.generate();
092: } while (this .m_backward.containsKey(result));
093: this .m_forward.put(id, result);
094: this .m_backward.put(result, id);
095: }
096:
097: Logging.instance().log("map", 5, id + " <=> " + result);
098: return result;
099: }
100:
101: /**
102: * Obtains existing mapping without producing a new one. May return
103: * <code>null</code> if no mapping exists.
104: *
105: * @param shortid is the external identifier to check fwd mapping for
106: * @return null, if no such mapping exists.
107: */
108: public String get(String shortid) {
109: return (String) this.m_forward.get(shortid);
110: }
111: }
|