Skip to content

Commit c4da2c2

Browse files
committed
JSON Full Support & Protocol Switching
1 parent 88d419a commit c4da2c2

14 files changed

+916
-58
lines changed

io/github/javaherobrine/TrieNode.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.github.javaherobrine;
2+
3+
import java.io.*;
4+
public class TrieNode {
5+
private TrieNode[] linkto=new TrieNode[256];
6+
private Object obj=null;
7+
public static final TrieNode REGISTRY=new TrieNode();
8+
public Object access(String str) {
9+
char[] ch=str.toCharArray();
10+
TrieNode current=this;
11+
for(int i=0;i<ch.length;i++) {
12+
if(current.linkto[ch[i]]==null) {
13+
return null;
14+
}
15+
current=current.linkto[ch[i]];
16+
}
17+
return current.obj;
18+
}
19+
public void put(String str,Object o) {
20+
char[] ch=str.toCharArray();
21+
TrieNode current=this;
22+
for(int i=0;i<ch.length;i++) {
23+
if(current.linkto[ch[i]]==null) {
24+
current.linkto[ch[i]]=new TrieNode();
25+
}
26+
current=current.linkto[ch[i]];
27+
}
28+
current.obj=o;
29+
}
30+
public Object access(InputStream in,int split) throws IOException{
31+
boolean end=true;
32+
TrieNode node=this;
33+
Object res=null;
34+
int ch=in.read();
35+
while(ch!=split) {
36+
node=node.linkto[ch];
37+
if(node==null) {
38+
end=false;
39+
break;
40+
}
41+
ch=in.read();
42+
}
43+
if(end) {
44+
res=node.obj;
45+
}
46+
while(ch!=split) {
47+
ch=in.read();
48+
}
49+
return res;
50+
}
51+
}
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
package io.github.javaherobrine.format;
2+
import java.util.AbstractMap;
3+
import java.util.Collection;
4+
import java.util.Map;
5+
public final class JSONFormatter {
6+
private JSONFormatter() {}
7+
public static String format(String raw) {
8+
final StringBuilder sb=new StringBuilder(raw.length()<<1+2);
9+
sb.append('\"');
10+
raw.chars().forEach(ch->{
11+
switch(ch) {
12+
case '\n':
13+
sb.append("\\n");
14+
break;
15+
case '\r':
16+
sb.append("\\r");
17+
break;
18+
case ' ':
19+
sb.append("\\s");
20+
break;
21+
case '\t':
22+
sb.append("\\t");
23+
break;
24+
case '\\':
25+
sb.append("\\\\");
26+
break;
27+
case '\'':
28+
sb.append("\\\'");
29+
break;
30+
case '\"':
31+
sb.append("\\\"");
32+
break;
33+
case '\b':
34+
sb.append("\\b");
35+
break;
36+
case '\f':
37+
sb.append("\\f");
38+
break;
39+
default:
40+
sb.append((char)ch);
41+
}
42+
});
43+
return sb.append('\"').toString();
44+
}
45+
public static String format(Number num) {
46+
return num.toString();
47+
}
48+
public static String format(boolean b) {
49+
return Boolean.toString(b);
50+
}
51+
public static String format(byte b) {
52+
return Byte.toString(b);
53+
}
54+
public static String format(short s) {
55+
return Short.toString(s);
56+
}
57+
public static String format(int i) {
58+
return Integer.toString(i);
59+
}
60+
public static String format(long l) {
61+
return Long.toString(l);
62+
}
63+
public static String format(float f) {
64+
return Float.toString(f);
65+
}
66+
public static String format(double d) {
67+
return Double.toString(d);
68+
}
69+
public static String format(char d) {
70+
return Character.toString(d);
71+
}
72+
public static String format(boolean[] obj) {
73+
if(obj.length==0) {
74+
return "[]";
75+
}
76+
StringBuilder sb=new StringBuilder("[");
77+
for(int i=0;i<obj.length;++i) {
78+
sb.append(obj[i]);
79+
sb.append(',');
80+
}
81+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
82+
}
83+
public static String format(byte[] obj) {
84+
if(obj.length==0) {
85+
return "[]";
86+
}
87+
StringBuilder sb=new StringBuilder("[");
88+
for(int i=0;i<obj.length;++i) {
89+
sb.append(obj[i]);
90+
sb.append(',');
91+
}
92+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
93+
}
94+
public static String format(short[] obj) {
95+
if(obj.length==0) {
96+
return "[]";
97+
}
98+
StringBuilder sb=new StringBuilder("[");
99+
for(int i=0;i<obj.length;++i) {
100+
sb.append(obj[i]);
101+
sb.append(',');
102+
}
103+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
104+
}
105+
public static String format(int[] obj) {
106+
StringBuilder sb=new StringBuilder("[");
107+
for(int i=0;i<obj.length;++i) {
108+
sb.append(obj[i]);
109+
sb.append(',');
110+
}
111+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
112+
}
113+
public static String format(long[] obj) {
114+
if(obj.length==0) {
115+
return "[]";
116+
}
117+
StringBuilder sb=new StringBuilder("[");
118+
for(int i=0;i<obj.length;++i) {
119+
sb.append(obj[i]);
120+
sb.append(',');
121+
}
122+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
123+
}
124+
public static String format(float[] obj) {
125+
if(obj.length==0) {
126+
return "[]";
127+
}
128+
StringBuilder sb=new StringBuilder("[");
129+
for(int i=0;i<obj.length;++i) {
130+
sb.append(obj[i]);
131+
sb.append(',');
132+
}
133+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
134+
}
135+
public static String format(double[] obj) {
136+
if(obj.length==0) {
137+
return "[]";
138+
}
139+
StringBuilder sb=new StringBuilder("[");
140+
for(int i=0;i<obj.length;++i) {
141+
sb.append(obj[i]);
142+
sb.append(',');
143+
}
144+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
145+
}
146+
public static String format(char[] obj) {
147+
if(obj.length==0) {
148+
return "[]";
149+
}
150+
StringBuilder sb=new StringBuilder("[");
151+
for(int i=0;i<obj.length;++i) {
152+
sb.append(obj[i]);
153+
sb.append(',');
154+
}
155+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
156+
}
157+
public static String format(Object[] obj) {
158+
if(obj.length==0) {
159+
return "[]";
160+
}
161+
StringBuilder sb=new StringBuilder("[");
162+
for(int i=0;i<obj.length;++i) {
163+
sb.append(format(obj[i]));
164+
sb.append(',');
165+
}
166+
return sb.deleteCharAt(sb.length()-1).append(']').toString();
167+
}
168+
static String format(Object obj) {
169+
if(obj instanceof JSONSerializable) {
170+
return format((JSONSerializable) obj);
171+
}else if(obj instanceof Number) {
172+
return format((Number) obj);
173+
}else if(obj instanceof String) {
174+
return format((String) obj);
175+
}else if(obj instanceof boolean[]) {
176+
return format((boolean[]) obj);
177+
}else if(obj instanceof short[]) {
178+
return format((short[]) obj);
179+
}else if(obj instanceof int[]) {
180+
return format((int[]) obj);
181+
}else if(obj instanceof long[]) {
182+
return format((long[]) obj);
183+
}else if(obj instanceof float[]) {
184+
return format((float[]) obj);
185+
}else if(obj instanceof double[]) {
186+
return format((double[]) obj);
187+
}else if(obj instanceof char[]) {
188+
return format((char[]) obj);
189+
}else if(obj instanceof Object[]) {
190+
return format((Object[]) obj);
191+
}else if(obj instanceof Map) {
192+
return format((Map<?,?>)obj);
193+
}else if(obj instanceof Collection) {
194+
return format((Collection<?>) obj);
195+
}else {
196+
throw new IllegalArgumentException("Can't serialize this object"+obj);
197+
}
198+
}
199+
public static String format(JSONSerializable obj) {
200+
StringBuilder sb=new StringBuilder("{");
201+
AbstractMap.SimpleEntry<String,Object>[] values=obj.values();
202+
if(values.length==0) {
203+
return "{}";
204+
}
205+
for(int i=0;i<values.length;i++) {
206+
AbstractMap.SimpleEntry<String,Object> current=values[i];
207+
sb.append(format(current.getKey())).append(':').append(format(current.getValue())).append(',');
208+
}
209+
return sb.deleteCharAt(sb.length()-1).append('}').toString();
210+
}
211+
public static String format(Collection<? extends Object> obj) {
212+
if(obj.isEmpty()) {
213+
return "[]";
214+
}
215+
return format(obj.toArray());
216+
}
217+
public static String format(Map<String,? extends Object> pair) {
218+
if(pair.isEmpty()) {
219+
return "{}";
220+
}
221+
StringBuilder sb=new StringBuilder("{");
222+
pair.entrySet().stream().forEach(n->{
223+
sb.append(format(n.getKey()));
224+
sb.append(':');
225+
sb.append(format(n.getValue()));
226+
sb.append(',');
227+
});
228+
return sb.deleteCharAt(sb.length()-1).append('}').toString();
229+
}
230+
}

0 commit comments

Comments
 (0)