01: /**
02: * JavaGuard -- an obfuscation package for Java classfiles.
03: *
04: * Copyright (c) 1999 Mark Welsh (markw@retrologic.com)
05: * Copyright (c) 2002 Thorsten Heit (theit@gmx.de)
06: *
07: * This library is free software; you can redistribute it and/or
08: * modify it under the terms of the GNU Lesser General Public
09: * License as published by the Free Software Foundation; either
10: * version 2 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public
18: * License along with this library; if not, write to the Free Software
19: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20: *
21: * The author may be contacted at theit@gmx.de.
22: *
23: *
24: * $Id: NameMaker.java,v 1.1.1.1 2002/04/03 13:49:44 glurk Exp $
25: */package net.sf.javaguard;
26:
27: import java.util.Enumeration;
28: import java.util.Hashtable;
29:
30: /** Base class for name generators for a given namespace.
31: * The base class gathers statistics for name mappings.
32: *
33: * @author <a href="mailto:markw@retrologic.com">Mark Welsh</a>
34: * @author <a href="mailto:theit@gmx.de">Thorsten Heit</a>
35: */
36: abstract public class NameMaker {
37: /** Used for logging frequency of generated names. */
38: protected static Hashtable frequency = new Hashtable();
39:
40: /** Get an enumeration of distinct obfuscated names for all namespaces.
41: */
42: public static Enumeration getNames() {
43: return frequency.keys();
44: }
45:
46: /** Get an enumeration of use count for distinct obfuscated names for all
47: * namespaces.
48: */
49: public static Enumeration getUseCounts() {
50: return frequency.elements();
51: }
52:
53: /** Return the next unique name for this namespace, differing only for
54: * identical arg-lists.
55: */
56: public String nextName(String descriptor) {
57: // Log the name usage globally across all namespaces
58: String name = getNextName(descriptor);
59: Integer intCount = (Integer) frequency.get(name);
60: if (intCount == null) {
61: frequency.put(name, new Integer(0));
62: } else {
63: frequency.remove(name);
64: frequency.put(name, new Integer(intCount.intValue() + 1));
65: }
66: return name;
67: }
68:
69: /** Return the next unique name for this namespace, differing only for
70: * identical arg-lists.
71: */
72: abstract protected String getNextName(String descriptor);
73: }
|