comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/server/PercentEncoding.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
comparison
equal deleted inserted replaced
67:0e9998148a16 68:5028fdace37b
1 package server;
2
3 import java.util.BitSet;
4 import java.util.HashMap;
5
6 import structures.ByteBuilder;
7
8 public class PercentEncoding {
9
10 public static boolean containsSpecialSymbol(String s){
11 if(s==null){return false;}
12 for(int i=0, max=s.length(); i<max; i++){
13 char c=s.charAt(i);
14 if(isSpecial.get(c)){
15 // System.err.print("b");
16 return true;}
17 }
18 // System.err.print("c");
19 return false;
20 }
21
22 public static boolean containsCommonSymbol(String s){
23 if(s==null){return false;}
24 for(int i=0, max=s.length(); i<max; i++){
25 char c=s.charAt(i);
26 if(isCommon.get(c)){return true;}
27 }
28 return false;
29 }
30
31 public static String symbolToCode(String s){
32 // System.err.print("a");
33 if(!containsSpecialSymbol(s)){return s;}
34 // System.err.print("d");
35 ByteBuilder bb=new ByteBuilder();
36 for(int i=0, max=s.length(); i<max; i++){
37 char c=s.charAt(i);
38 String code=symbolToCodeArray[c];
39 if(code!=null){
40 // System.err.print("e("+code+")");
41 bb.append(code);
42 }else{
43 // System.err.print("f");
44 bb.append(c);
45 }
46 }
47 // System.err.println("g");
48 // System.err.println(bb);
49 return bb.toString();
50 }
51
52 public static String commonSymbolToCode(String s){
53 if(!containsCommonSymbol(s)){return s;}
54 ByteBuilder bb=new ByteBuilder();
55 for(int i=0, max=s.length(); i<max; i++){
56 char c=s.charAt(i);
57 if(isCommon.get(c)){
58 String code=symbolToCodeArray[c];
59 assert(code!=null);
60 bb.append(code);
61 }else{
62 bb.append(c);
63 }
64 }
65 return bb.toString();
66 }
67
68 private static int parseCode(String s, int start){
69 if(s==null || start+2>=s.length()){return -1;}
70 assert(s.charAt(start)=='%');
71 int sum=0;
72 for(int i=start+1; i<=start+2; i++){
73 sum=sum<<4;
74 final char c=s.charAt(i);
75 if(c>='0' && c<='9'){
76 sum=sum+(c-'0');
77 }else if(c>='A' && c<'F'){
78 sum=sum+(10+c-'A');
79 }else{
80 return -1;
81 }
82 }
83 return sum;
84 }
85
86 public static String codeToSymbol(String s){
87 int idx=s.indexOf('%');
88 if(idx<0){return s;}
89
90 ByteBuilder bb=new ByteBuilder(s.length());
91 for(int i=0; i<s.length(); i++){
92 char c=s.charAt(i);
93 if(c=='%'){
94 int sym=parseCode(s, i);
95 if(sym<0){bb.append(c);}
96 else{
97 bb.append((char)sym);
98 i+=2;//Skip next 2 characters
99 }
100 }else{bb.append(c);}
101 }
102 return (bb.length()==s.length() ? s : bb.toString());
103 }
104
105 private static HashMap<String, String> makeCodeToSymbolMap() {
106 HashMap<String, String> map=new HashMap<String, String>(129);
107 assert(reservedSymbol.length==reservedCode.length);
108 assert(commonSymbol.length==commonCode.length);
109 for(int i=0; i<reservedSymbol.length; i++){
110 map.put(reservedCode[i], reservedSymbol[i]);
111 }
112 for(int i=0; i<commonSymbol.length; i++){
113 map.put(commonCode[i], commonSymbol[i]);
114 }
115 return map;
116 }
117
118 private static HashMap<String, String> makeSymbolToCodeMap() {
119 HashMap<String, String> map=new HashMap<String, String>(257);
120 assert(reservedSymbol.length==reservedCode.length);
121 assert(commonSymbol.length==commonCode.length);
122 for(int i=0; i<reservedSymbol.length; i++){
123 map.put(reservedSymbol[i], reservedCode[i]);
124 }
125 for(int i=0; i<commonSymbol.length; i++){
126 map.put(commonSymbol[i], commonCode[i]);
127 }
128 return map;
129 }
130
131 private static String[] makeSymbolToCodeArray() {
132 final String[] array=new String[128];
133 for(int i=0; i<reservedSymbol.length; i++){
134 String s=reservedSymbol[i];
135 String c=reservedCode[i];
136 array[s.charAt(0)]=c;
137 }
138 for(int i=0; i<commonSymbol.length; i++){
139 String s=commonSymbol[i];
140 String c=commonCode[i];
141 array[s.charAt(0)]=c;
142 }
143 return array;
144 }
145
146 private static final BitSet makeBitSet(String[]...matrix){
147 BitSet bs=new BitSet(128);
148 for(String[] array : matrix){
149 for(String s : array){
150 char c=s.charAt(0);
151 bs.set(c);
152 }
153 }
154 return bs;
155 }
156
157 //See https://en.wikipedia.org/wiki/Percent-encoding
158 public static final String[] reservedSymbol=new String[] {
159 "!", "#", "$", "&", "'", "(", ")", "*", "+", ",", "/", ":", ";", "=", "?", "@", "[", "]"
160 };
161
162 public static final String[] reservedCode=new String[] {
163 "%21", "%23", "%24", "%26", "%27", "%28", "%29", "%2A", "%2B", "%2C", "%2F", "%3A", "%3B", "%3D", "%3F", "%40", "%5B", "%5D"
164 };
165
166 public static final String[] commonSymbol=new String[] {
167 "\n", " ", "\"", "%", "<", ">", "\\", "|",
168 };
169
170 public static final String[] commonCode=new String[] {
171 "%0A", "%20", "%22", "%25", "%3C", "%3E", "%5C", "%7C"
172 };
173
174 private static final BitSet isSpecial=makeBitSet(reservedSymbol, commonSymbol);
175 private static final BitSet isCommon=makeBitSet(commonSymbol);
176
177 // public static final HashMap<String, String> codeToSymbolMap=makeCodeToSymbolMap();
178 // public static final HashMap<String, String> symbolToCodeMap=makeSymbolToCodeMap();
179 public static final String[] symbolToCodeArray=makeSymbolToCodeArray();
180
181 /** Don't print caught exceptions */
182 public static boolean suppressErrors=false;
183
184 }