Skip to content

Commit 3239440

Browse files
committed
#58 specify static codegen output dir
1 parent 69d9f2e commit 3239440

File tree

9 files changed

+73
-57
lines changed

9 files changed

+73
-57
lines changed

demo/pom.xml

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<groupId>com.jsoniter</groupId>
55
<version>0.9.8-SNAPSHOT</version>
66
<artifactId>jsoniter-demo</artifactId>
7-
<name>json iterator</name>
7+
<name>json iterator demo</name>
88
<description>jsoniter (json-iterator) is fast and flexible JSON parser available in Java and Go</description>
99
<url>http://jsoniter.com</url>
1010
<packaging>jar</packaging>
@@ -49,7 +49,7 @@
4949
<dependency>
5050
<groupId>com.jsoniter</groupId>
5151
<artifactId>jsoniter</artifactId>
52-
<version>0.9.10</version>
52+
<version>0.9.11</version>
5353
</dependency>
5454
<dependency>
5555
<groupId>org.openjdk.jmh</groupId>
@@ -86,11 +86,11 @@
8686
<artifactId>slf4j-api</artifactId>
8787
<version>1.7.22</version>
8888
</dependency>
89-
<dependency>
90-
<groupId>com.dslplatform</groupId>
91-
<artifactId>dsl-json-processor</artifactId>
92-
<version>1.4.1</version>
93-
</dependency>
89+
<!--<dependency>-->
90+
<!--<groupId>com.dslplatform</groupId>-->
91+
<!--<artifactId>dsl-json-processor</artifactId>-->
92+
<!--<version>1.4.1</version>-->
93+
<!--</dependency>-->
9494
<dependency>
9595
<groupId>com.alibaba</groupId>
9696
<artifactId>fastjson</artifactId>
@@ -115,8 +115,8 @@
115115
<artifactId>maven-compiler-plugin</artifactId>
116116
<version>3.6.0</version>
117117
<configuration>
118-
<source>1.8</source>
119-
<target>1.8</target>
118+
<source>1.6</source>
119+
<target>1.6</target>
120120
<encoding>UTF-8</encoding>
121121
</configuration>
122122
</plugin>

demo/src/main/java/com/jsoniter/demo/DemoCodegenConfig.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public TypeLiteral[] whatToCodegen() {
4545
}
4646

4747
public static void main(String[] args) throws Exception {
48-
StaticCodeGenerator.main(new String[]{DemoCodegenConfig.class.getCanonicalName()});
48+
StaticCodeGenerator.main(new String[]{
49+
DemoCodegenConfig.class.getCanonicalName()
50+
,"/tmp"
51+
});
4952
}
5053
}

demo/src/test/java/com/jsoniter/demo/SimpleObjectBinding.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,18 @@ public void withFastjson(Blackhole bh) throws IOException {
155155
private TestObject withIterator() throws IOException {
156156
iter.reset(input);
157157
TestObject obj = new TestObject();
158-
for (String field = iter.readObject(); field != null; field = iter.readObject()) {
159-
switch (field) {
160-
case "field1":
161-
obj.field1 = iter.readInt();
162-
continue;
163-
case "field2":
164-
obj.field2 = iter.readInt();
165-
continue;
166-
default:
167-
iter.skip();
168-
}
169-
}
158+
// for (String field = iter.readObject(); field != null; field = iter.readObject()) {
159+
// switch (field) {
160+
// case "field1":
161+
// obj.field1 = iter.readInt();
162+
// continue;
163+
// case "field2":
164+
// obj.field2 = iter.readInt();
165+
// continue;
166+
// default:
167+
// iter.skip();
168+
// }
169+
// }
170170
return obj;
171171
}
172172

src/main/java/com/jsoniter/Codegen.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Codegen {
1414

1515
// only read/write when generating code with synchronized protection
1616
private final static Set<String> generatedClassNames = new HashSet<String>();
17-
static boolean isDoingStaticCodegen = false;
17+
static StaticCodegenTarget isDoingStaticCodegen = null;
1818
static DecodingMode mode = DecodingMode.REFLECTION_MODE;
1919
static {
2020
String envMode = System.getenv("JSONITER_DECODING_MODE");
@@ -71,7 +71,7 @@ private synchronized static Decoder gen(String cacheKey, Type type) {
7171
JsoniterSpi.addNewDecoder(cacheKey, decoder);
7272
return decoder;
7373
}
74-
if (!isDoingStaticCodegen) {
74+
if (isDoingStaticCodegen == null) {
7575
try {
7676
decoder = (Decoder) Class.forName(cacheKey).newInstance();
7777
JsoniterSpi.addNewDecoder(cacheKey, decoder);
@@ -91,10 +91,10 @@ private synchronized static Decoder gen(String cacheKey, Type type) {
9191
}
9292
try {
9393
generatedClassNames.add(cacheKey);
94-
if (isDoingStaticCodegen) {
95-
staticGen(cacheKey, source);
96-
} else {
94+
if (isDoingStaticCodegen == null) {
9795
decoder = DynamicCodegen.gen(cacheKey, source);
96+
} else {
97+
staticGen(cacheKey, source);
9898
}
9999
JsoniterSpi.addNewDecoder(cacheKey, decoder);
100100
return decoder;
@@ -181,7 +181,7 @@ private static Type chooseImpl(Type type) {
181181
private static void staticGen(String cacheKey, String source) throws IOException {
182182
createDir(cacheKey);
183183
String fileName = cacheKey.replace('.', '/') + ".java";
184-
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
184+
FileOutputStream fileOutputStream = new FileOutputStream(new File(isDoingStaticCodegen.outputDir, fileName));
185185
try {
186186
OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream);
187187
try {
@@ -208,7 +208,7 @@ private static void staticGen(String cacheKey, OutputStreamWriter writer, String
208208

209209
private static void createDir(String cacheKey) {
210210
String[] parts = cacheKey.split("\\.");
211-
File parent = new File(".");
211+
File parent = new File(isDoingStaticCodegen.outputDir);
212212
for (int i = 0; i < parts.length - 1; i++) {
213213
String part = parts[i];
214214
File current = new File(parent, part);
@@ -259,8 +259,8 @@ private static boolean shouldUseStrictMode(ClassDescriptor desc) {
259259
return false;
260260
}
261261

262-
public static void staticGenDecoders(TypeLiteral[] typeLiterals) {
263-
isDoingStaticCodegen = true;
262+
public static void staticGenDecoders(TypeLiteral[] typeLiterals, StaticCodegenTarget staticCodegenTarget) {
263+
isDoingStaticCodegen = staticCodegenTarget;
264264
for (TypeLiteral typeLiteral : typeLiterals) {
265265
gen(typeLiteral.getDecoderCacheKey(), typeLiteral.getType());
266266
}

src/main/java/com/jsoniter/CodegenAccess.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.jsoniter;
22

3-
import com.jsoniter.spi.Decoder;
4-
import com.jsoniter.spi.JsonException;
5-
import com.jsoniter.spi.JsoniterSpi;
6-
import com.jsoniter.spi.TypeLiteral;
3+
import com.jsoniter.spi.*;
74

85
import java.io.IOException;
96
import java.util.Collection;
@@ -160,8 +157,8 @@ final static boolean skipWhitespacesWithoutLoadMore(JsonIterator iter) throws IO
160157
return true;
161158
}
162159

163-
public static void staticGenDecoders(TypeLiteral[] typeLiterals) {
164-
Codegen.staticGenDecoders(typeLiterals);
160+
public static void staticGenDecoders(TypeLiteral[] typeLiterals, StaticCodegenTarget staticCodegenTarget) {
161+
Codegen.staticGenDecoders(typeLiterals, staticCodegenTarget);
165162
}
166163

167164
public static int head(JsonIterator iter) {

src/main/java/com/jsoniter/StaticCodeGenerator.java

+18-4
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,36 @@
44
import com.jsoniter.output.JsonStream;
55
import com.jsoniter.spi.CodegenConfig;
66
import com.jsoniter.spi.JsonException;
7+
import com.jsoniter.spi.StaticCodegenTarget;
78

89
import java.io.File;
10+
import java.nio.file.Path;
911

1012
public class StaticCodeGenerator {
1113
public static void main(String[] args) throws Exception {
14+
if (args.length == 0) {
15+
System.out.println("StaticCodeGenerator configClassName [outputDir]");
16+
System.out.println("configClassName: like a.b.Config, a class defining what to codegen");
17+
System.out.println("outputDir: if not specified, will write to source directory of configClass");
18+
return;
19+
}
1220
String configClassName = args[0];
1321
String configJavaFile = configClassName.replace('.', '/') + ".java";
14-
if (!new File(configJavaFile).exists()) {
15-
throw new JsonException("must execute static code generator in the java source code directory which contains: " + configJavaFile);
22+
StaticCodegenTarget staticCodegenTarget = new StaticCodegenTarget();
23+
if (args.length > 1) {
24+
staticCodegenTarget.outputDir = args[1];
25+
} else {
26+
if (!new File(configJavaFile).exists()) {
27+
throw new JsonException("must execute static code generator in the java source code directory which contains: " + configJavaFile);
28+
}
29+
staticCodegenTarget.outputDir = new File(".").getAbsolutePath();
1630
}
1731
Class<?> clazz = Class.forName(configClassName);
1832
CodegenConfig config = (CodegenConfig) clazz.newInstance();
1933
JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH);
2034
JsonStream.setMode(EncodingMode.DYNAMIC_MODE);
2135
config.setup();
22-
CodegenAccess.staticGenDecoders(config.whatToCodegen());
23-
com.jsoniter.output.CodegenAccess.staticGenEncoders(config.whatToCodegen());
36+
CodegenAccess.staticGenDecoders(config.whatToCodegen(), staticCodegenTarget);
37+
com.jsoniter.output.CodegenAccess.staticGenEncoders(config.whatToCodegen(), staticCodegenTarget);
2438
}
2539
}

src/main/java/com/jsoniter/output/Codegen.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package com.jsoniter.output;
22

33
import com.jsoniter.any.Any;
4-
import com.jsoniter.spi.JsonException;
5-
import com.jsoniter.spi.Encoder;
6-
import com.jsoniter.spi.Extension;
7-
import com.jsoniter.spi.JsoniterSpi;
8-
import com.jsoniter.spi.TypeLiteral;
4+
import com.jsoniter.spi.*;
95

106
import java.io.File;
117
import java.io.FileOutputStream;
@@ -19,7 +15,7 @@
1915
class Codegen {
2016

2117
static EncodingMode mode = EncodingMode.REFLECTION_MODE;
22-
static boolean isDoingStaticCodegen;
18+
static StaticCodegenTarget isDoingStaticCodegen;
2319
// only read/write when generating code with synchronized protection
2420
private final static Map<String, CodegenResult> generatedSources = new HashMap<String, CodegenResult>();
2521
private volatile static Map<String, Encoder> reflectionEncoders = new HashMap<String, Encoder>();
@@ -108,7 +104,7 @@ private static synchronized Encoder gen(final String cacheKey, Type type) {
108104
JsoniterSpi.addNewEncoder(cacheKey, encoder);
109105
return encoder;
110106
}
111-
if (!isDoingStaticCodegen) {
107+
if (isDoingStaticCodegen == null) {
112108
try {
113109
encoder = (Encoder) Class.forName(cacheKey).newInstance();
114110
JsoniterSpi.addNewEncoder(cacheKey, encoder);
@@ -123,10 +119,10 @@ private static synchronized Encoder gen(final String cacheKey, Type type) {
123119
CodegenResult source = genSource(cacheKey, clazz, typeArgs);
124120
try {
125121
generatedSources.put(cacheKey, source);
126-
if (isDoingStaticCodegen) {
127-
staticGen(clazz, cacheKey, source);
128-
} else {
122+
if (isDoingStaticCodegen == null) {
129123
encoder = DynamicCodegen.gen(clazz, cacheKey, source);
124+
} else {
125+
staticGen(clazz, cacheKey, source);
130126
}
131127
JsoniterSpi.addNewEncoder(cacheKey, encoder);
132128
return encoder;
@@ -165,7 +161,7 @@ public static CodegenResult getGeneratedSource(String cacheKey) {
165161
private static void staticGen(Class clazz, String cacheKey, CodegenResult source) throws IOException {
166162
createDir(cacheKey);
167163
String fileName = cacheKey.replace('.', '/') + ".java";
168-
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
164+
FileOutputStream fileOutputStream = new FileOutputStream(new File(isDoingStaticCodegen.outputDir, fileName));
169165
try {
170166
OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream);
171167
try {
@@ -190,7 +186,7 @@ private static void staticGen(Class clazz, String cacheKey, OutputStreamWriter w
190186

191187
private static void createDir(String cacheKey) {
192188
String[] parts = cacheKey.split("\\.");
193-
File parent = new File(".");
189+
File parent = new File(isDoingStaticCodegen.outputDir);
194190
for (int i = 0; i < parts.length - 1; i++) {
195191
String part = parts[i];
196192
File current = new File(parent, part);
@@ -215,8 +211,8 @@ private static CodegenResult genSource(String cacheKey, Class clazz, Type[] type
215211
return CodegenImplObject.genObject(clazz);
216212
}
217213

218-
public static void staticGenEncoders(TypeLiteral[] typeLiterals) {
219-
isDoingStaticCodegen = true;
214+
public static void staticGenEncoders(TypeLiteral[] typeLiterals, StaticCodegenTarget staticCodegenTarget) {
215+
isDoingStaticCodegen = staticCodegenTarget;
220216
for (TypeLiteral typeLiteral : typeLiterals) {
221217
gen(typeLiteral.getEncoderCacheKey(), typeLiteral.getType());
222218
}

src/main/java/com/jsoniter/output/CodegenAccess.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.jsoniter.any.Any;
55
import com.jsoniter.spi.Encoder;
66
import com.jsoniter.spi.JsoniterSpi;
7+
import com.jsoniter.spi.StaticCodegenTarget;
78
import com.jsoniter.spi.TypeLiteral;
89

910
import java.io.IOException;
@@ -57,8 +58,8 @@ public static void writeStringWithoutQuote(String obj, JsonStream stream) throws
5758
StreamImplString.writeStringWithoutQuote(stream, obj);
5859
}
5960

60-
public static void staticGenEncoders(TypeLiteral[] typeLiterals) {
61-
Codegen.staticGenEncoders(typeLiterals);
61+
public static void staticGenEncoders(TypeLiteral[] typeLiterals, StaticCodegenTarget staticCodegenTarget) {
62+
Codegen.staticGenEncoders(typeLiterals, staticCodegenTarget);
6263
}
6364

6465
public static Any wrap(Object val) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.jsoniter.spi;
2+
3+
public class StaticCodegenTarget {
4+
public String outputDir;
5+
}

0 commit comments

Comments
 (0)