callgraph/src/main/java/org/netbeans/lib/callgraph/util/EightBitStrings.java
changeset 18374 04a79821e760
parent 18373 3527a32a19f0
child 18400 c87c223efe6a
     1.1 --- a/callgraph/src/main/java/org/netbeans/lib/callgraph/util/EightBitStrings.java	Mon Aug 29 13:00:53 2016 -0400
     1.2 +++ b/callgraph/src/main/java/org/netbeans/lib/callgraph/util/EightBitStrings.java	Sat Sep 03 02:41:36 2016 -0400
     1.3 @@ -70,14 +70,22 @@
     1.4      private final InternTable INTERN_TABLE = new InternTable();
     1.5      public final CharSequence DOT = create(".");
     1.6      public final CharSequence QUOTE = create("\"");
     1.7 +    public final CharSequence SPACE = create(" ");
     1.8 +    public final CharSequence QUOTE_SPACE = create("\" ");
     1.9      public final CharSequence CLOSE_OPEN_QUOTE = create("\" \"");
    1.10  
    1.11 -    private boolean disabled;
    1.12 +    private final boolean disabled;
    1.13 +    private final boolean aggressive;
    1.14  
    1.15      public EightBitStrings(boolean disabled) {
    1.16 -        this.disabled = disabled;
    1.17 +        this (disabled, false);
    1.18      }
    1.19  
    1.20 +    public EightBitStrings(boolean disabled, boolean aggressive) {
    1.21 +        this.disabled = disabled;
    1.22 +        this.aggressive = aggressive;
    1.23 +    }
    1.24 +    
    1.25      public void clear() {
    1.26          INTERN_TABLE.dispose();
    1.27      }
    1.28 @@ -87,6 +95,9 @@
    1.29              return string instanceof ComparableCharSequence ? (ComparableCharSequence) string
    1.30                      : new StringWrapper(string.toString());
    1.31          }
    1.32 +        if (aggressive) {
    1.33 +            return concat(string);
    1.34 +        }
    1.35          return INTERN_TABLE.intern(string);
    1.36      }
    1.37  
    1.38 @@ -100,32 +111,66 @@
    1.39                  sb.append(c);
    1.40              }
    1.41              return new StringWrapper(sb.toString());
    1.42 +        } else if (aggressive) {
    1.43 +            List<CharSequence> nue = new ArrayList<>(seqs.length + (seqs.length / 2));
    1.44 +            for (CharSequence seq : seqs) {
    1.45 +                int ln = seq.length();
    1.46 +                StringBuilder sb = new StringBuilder();
    1.47 +                for(int i=0; i < ln; i++) {
    1.48 +                    char c = seq.charAt(i);
    1.49 +                    if (Character.isLetter(c) || Character.isDigit(c)) {
    1.50 +                        sb.append(c);
    1.51 +                    } else {
    1.52 +                        nue.add(sb.toString());
    1.53 +                        sb = new StringBuilder();
    1.54 +                        nue.add(new String(new char[] { c }));
    1.55 +                    }
    1.56 +                }
    1.57 +                if (sb.length() > 0) {
    1.58 +                    nue.add(sb.toString());
    1.59 +                }
    1.60 +            }
    1.61 +            if (nue.size() != seqs.length) {
    1.62 +                seqs = nue.toArray(new CharSequence[nue.size()]);
    1.63 +            }
    1.64          }
    1.65          return new Concatenation(seqs);
    1.66      }
    1.67  
    1.68 -    public ComparableCharSequence concatQuoted(Collection<CharSequence> seqs) {
    1.69 +    public ComparableCharSequence concatQuoted(Collection<Object> seqs) {
    1.70          if (disabled) {
    1.71              StringBuilder sb = new StringBuilder("\"");
    1.72 -            for (Iterator<CharSequence> it = seqs.iterator(); it.hasNext();) {
    1.73 -                CharSequence c = it.next();
    1.74 +            boolean first = true;
    1.75 +            for (Iterator<Object> it = seqs.iterator(); it.hasNext();) {
    1.76 +                Object c = it.next();
    1.77 +                if (!first) {
    1.78 +                    sb.append(SPACE);
    1.79 +                }
    1.80 +                if (c instanceof CharSequence) {
    1.81 +                    sb.append(QUOTE);
    1.82 +                }
    1.83                  sb.append(c);
    1.84 -                if (it.hasNext()) {
    1.85 -                    sb.append("\" \"");
    1.86 -                } else {
    1.87 -                    sb.append("\"");
    1.88 +                if (c instanceof CharSequence) {
    1.89 +                    sb.append(QUOTE);
    1.90                  }
    1.91 +                first = false;
    1.92              }
    1.93              return new StringWrapper(sb.toString());
    1.94          } else {
    1.95 -            List<CharSequence> quoted = new ArrayList<>((seqs.size() * 2) + 1);
    1.96 -            quoted.add(this.QUOTE);
    1.97 -            for (Iterator<CharSequence> it = seqs.iterator(); it.hasNext();) {
    1.98 -                quoted.add(it.next());
    1.99 -                if (it.hasNext()) {
   1.100 -                    quoted.add(CLOSE_OPEN_QUOTE);
   1.101 +            List<CharSequence> quoted = new ArrayList<>((seqs.size() * 3) + 1);
   1.102 +            for (Iterator<Object> it = seqs.iterator(); it.hasNext();) {
   1.103 +                Object c = it.next();
   1.104 +                if (c instanceof CharSequence) {
   1.105 +                    quoted.add(QUOTE);
   1.106 +                    quoted.add((CharSequence)c);
   1.107 +                    if (it.hasNext()) {
   1.108 +                        quoted.add(QUOTE_SPACE);
   1.109 +                    } else {
   1.110 +                        quoted.add(QUOTE);
   1.111 +                    }
   1.112                  } else {
   1.113 -                    quoted.add(QUOTE);
   1.114 +                    quoted.add(create(c.toString()));
   1.115 +                    quoted.add(SPACE);
   1.116                  }
   1.117              }
   1.118              return new Concatenation(quoted.toArray(new CharSequence[quoted.size()]));
   1.119 @@ -153,6 +198,10 @@
   1.120      int internTableSize() {
   1.121          return INTERN_TABLE.last + 1;
   1.122      }
   1.123 +    
   1.124 +    List<CharSequence> dumpInternTable() {
   1.125 +        return INTERN_TABLE.dumpInternTable();
   1.126 +    }
   1.127  
   1.128      static class InternTable {
   1.129  
   1.130 @@ -187,6 +236,10 @@
   1.131              Arrays.sort(entries, 0, last + 1);
   1.132              return entry;
   1.133          }
   1.134 +        
   1.135 +        List<CharSequence> dumpInternTable() {
   1.136 +            return Arrays.asList(entries);
   1.137 +        }
   1.138  
   1.139          private static final class Entry implements ComparableCharSequence {
   1.140  
   1.141 @@ -316,10 +369,16 @@
   1.142          private final InternTable.Entry[] entries;
   1.143  
   1.144          Concatenation(CharSequence... entries) {
   1.145 -            this.entries = new InternTable.Entry[entries.length];
   1.146 -            for (int i = 0; i < entries.length; i++) {
   1.147 -                this.entries[i] = INTERN_TABLE.intern(entries[i]);
   1.148 +            List<InternTable.Entry> l = new ArrayList<>(entries.length);
   1.149 +            for (CharSequence cs : entries) {
   1.150 +                if (cs instanceof Concatenation) {
   1.151 +                    Concatenation c1 = (Concatenation) cs;
   1.152 +                    l.addAll(Arrays.asList(c1.entries));
   1.153 +                } else {
   1.154 +                    l.add(INTERN_TABLE.intern(cs));
   1.155 +                }
   1.156              }
   1.157 +            this.entries = l.toArray(new InternTable.Entry[l.size()]);
   1.158          }
   1.159  
   1.160          @Override
   1.161 @@ -358,7 +417,7 @@
   1.162                  sb.append(e);
   1.163              }
   1.164              if (debug) {
   1.165 -                sb.append (" - " + Arrays.asList(entries));
   1.166 +                sb.append(" - ").append (Arrays.asList(entries));
   1.167              }
   1.168              return sb.toString();
   1.169          }