Repository: thrift Updated Branches: refs/heads/master 23d674607 -> 6dde7f192
THRIFT-2869 run JSON schema validator from test Client: JSON Patch: Stig Bakken modified by Nobuaki Sukegawa Modification: Do not move key/elem properties, add i8, failure return code, make dist fix This closes #299 and closes #749 Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/ae3775a6 Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/ae3775a6 Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/ae3775a6 Branch: refs/heads/master Commit: ae3775a6a5d7f2aeb192ade30d157aa54aa4e77f Parents: 23d6746 Author: Stig Bakken <[email protected]> Authored: Tue Dec 2 09:21:24 2014 +0100 Committer: Nobuaki Sukegawa <[email protected]> Committed: Thu Dec 24 02:11:13 2015 +0900 ---------------------------------------------------------------------- Makefile.am | 1 - configure.ac | 2 + json-schema.json | 310 --------------------------------- lib/Makefile.am | 2 +- lib/json/Makefile.am | 29 ++++ lib/json/schema.json | 330 ++++++++++++++++++++++++++++++++++++ lib/json/test/Makefile.am | 26 +++ lib/json/test/build.properties | 10 ++ lib/json/test/build.xml | 144 ++++++++++++++++ 9 files changed, 542 insertions(+), 312 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/Makefile.am ---------------------------------------------------------------------- diff --git a/Makefile.am b/Makefile.am index 796aa99..8eb2d95 100755 --- a/Makefile.am +++ b/Makefile.am @@ -100,7 +100,6 @@ EXTRA_DIST = \ debian \ doc \ doap.rdf \ - json-schema.json \ package.json \ sonar-project.properties \ LICENSE \ http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/configure.ac ---------------------------------------------------------------------- diff --git a/configure.ac b/configure.ac index ddbf24f..27299b4 100755 --- a/configure.ac +++ b/configure.ac @@ -742,6 +742,8 @@ AC_CONFIG_FILES([ lib/hs/Makefile lib/java/Makefile lib/js/test/Makefile + lib/json/Makefile + lib/json/test/Makefile lib/nodejs/Makefile lib/perl/Makefile lib/perl/test/Makefile http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/json-schema.json ---------------------------------------------------------------------- diff --git a/json-schema.json b/json-schema.json deleted file mode 100644 index d61216a..0000000 --- a/json-schema.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - - "id": "http://thrift.apache.org/program-schema#", - "description": "Schema for Apache Thrift protocol descriptors", - - "definitions": { - "type-id": { - "enum": [ - "void", - "string", - "bool", - "byte", - "i16", - "i32", - "i64", - "double", - "list", - "set", - "map", - "union", - "struct", - "exception", - "binary" - ] - }, - "base-type": { - "title": "Base types", - "type": "object", - "properties": { - "typeId": { - "enum": [ "void", "string", "bool", "byte", "i16", "i32", "i64", "double", "binary" ] - } - }, - "required": [ "typeId" ] - }, - "list-type": { - "title": "List and set types", - "type": "object", - "properties": { - "typeId": { "enum": [ "list", "set" ] }, - "elemTypeId": { "$ref": "#/definitions/type-id" }, - "elemType": { "$ref": "#/definitions/type-spec" } - }, - "required": [ "typeId", "elemTypeId", "elemType" ] - }, - "map-type": { - "title": "Map type", - "type": "object", - "properties": { - "typeId": { "enum": [ "map" ] }, - "keyTypeId": { "$ref": "#/definitions/type-id" }, - "keyType": { "$ref": "#/definitions/type-spec" }, - "valueTypeId": { "$ref": "#/definitions/type-id" }, - "valueType": { "$ref": "#/definitions/type-spec" } - }, - "required": [ "typeId", "keyTypeId", "valueTypeId" ] - }, - "struct-spec": { - "title": "Struct and union types", - "type": "object", - "properties": { - "typeId": { "enum": [ "union", "struct" ] }, - "class": { "type": "string" } - }, - "required": [ "typeId", "class" ] - }, - "type-spec": { - "allOf": [ - { "type": "object" }, - { - "oneOf": - [ - { "$ref": "#/definitions/base-type" }, - { "$ref": "#/definitions/list-type" }, - { "$ref": "#/definitions/map-type" }, - { "$ref": "#/definitions/struct-spec" } - ] - } - ] - }, - "name-and-doc": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "doc": { "type": "string" } - }, - "required": [ "name" ] - }, - "enum": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { - "required": [ "members" ], - "properties": { - "members": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "value": { "type": "integer" } - }, - "required": [ "name", "value" ] - } - } - } - } - ] - }, - "typedef": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { - "properties": { - "typeId": { "$ref": "#/definitions/type-id" }, - "type": { "$ref": "#/definitions/type-spec" } - }, - "required": [ "typeId" ] - } - ] - }, - "constant": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { "$ref": "#/definitions/type-spec" }, - { - "properties": { - "value": { - "oneOf": [ - { "type": "string" }, - { "type": "number" }, - { "type": "array" }, - { "type": "object" } - ] - } - }, - "required": [ "value" ] - } - ] - }, - "field": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { "$ref": "#/definitions/type-spec" }, - { - "properties": { - "key": { - "type": "integer", - "minimum": 1, - "maximum": 65535 - }, - "required": { - "enum": [ "required", "optional", "req_out" ] - }, - "default": { - "oneOf": [ - { "type": "string" }, - { "type": "number" }, - { "type": "array" }, - { "type": "object" } - ] - } - }, - "required": [ "key", "required" ] - } - ] - }, - "struct": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { - "properties": { - "isException": { "type": "boolean" }, - "isUnion": { "type": "boolean" }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/field" - } - } - }, - "required": [ "isException", "isUnion", "fields" ] - } - ] - }, - "union": { - "$ref": "#/definitions/struct" - }, - "exception": { - "$ref": "#/definitions/struct" - }, - "function": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { - "oneOf": [ - { - "properties": { "oneway": { "type": "boolean" } }, - "required": [ "oneway" ] - }, - { - "properties": { "returnType": { "$ref": "#/definitions/type-spec" } }, - "required": [ "returnType" ] - } - ] - }, - { - "properties": { - "arguments": { - "type": "array", - "items": { - "allOf": [ - { "$ref": "#/definitions/field" }, - { - "properties": { } - } - ] - } - }, - "exceptions": { - "type": "array", - "items": { - "$ref": "#/definitions/exception" - } - } - }, - "required": [ "oneway", "arguments", "exceptions" ] - } - ] - }, - "service": { - "type": "object", - "allOf": [ - { "$ref": "#/definitions/name-and-doc" }, - { - "properties": { - "functions": { - "type": "array", - "items": { - "$ref": "#/definitions/function" - } - } - }, - "required": [ "functions" ] - } - ] - } - }, - - "type": "object", - "required": [ - "name", - "namespaces", - "includes", - "enums", - "typedefs", - "structs", - "constants", - "services" - ], - "properties": { - "name": { - "type": "string" - }, - "includes": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "enums": { - "type": "array", - "items": { - "$ref": "#/definitions/enum" - } - }, - "typedefs": { - "type": "array", - "items": { - "$ref": "#/definitions/typedef" - } - }, - "structs": { - "type": "array", - "items": { - "$ref": "#/definitions/struct" - } - }, - "constants": { - "type": "array", - "items": { - "$ref": "#/definitions/constant" - } - }, - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/service" - } - } - } -} http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/Makefile.am b/lib/Makefile.am index 44bb9ff..650f382 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -17,7 +17,7 @@ # under the License. # -SUBDIRS = +SUBDIRS = json PRECROSS_TARGET = if WITH_CPP http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/json/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/json/Makefile.am b/lib/json/Makefile.am new file mode 100644 index 0000000..1051b9b --- /dev/null +++ b/lib/json/Makefile.am @@ -0,0 +1,29 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +SUBDIRS = + +if WITH_JAVA +# Schema validation test depends on java +SUBDIRS += test +endif + +EXTRA_DIST = \ + schema.json \ + test http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/json/schema.json ---------------------------------------------------------------------- diff --git a/lib/json/schema.json b/lib/json/schema.json new file mode 100644 index 0000000..011b4d3 --- /dev/null +++ b/lib/json/schema.json @@ -0,0 +1,330 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + + "id": "http://thrift.apache.org/schema.json#", + "description": "Schema for Apache Thrift protocol descriptors", + + "definitions": { + "type-id": { + "title": "Any type id (name)", + "enum": [ + "void", + "string", + "bool", + "byte", + "i8", + "i16", + "i32", + "i64", + "double", + "list", + "set", + "map", + "union", + "struct", + "binary" + ] + }, + "base-type": { + "title": "Base type schema", + "type": "object", + "properties": { + "typeId": { + "enum": ["void", "string", "bool", "byte", "i8", "i16", "i32", "i64", "double", "binary" ] + } + }, + "required": [ "typeId" ] + }, + "list-type": { + "title": "List and set schema", + "type": "object", + "properties": { + "typeId": { + "enum": [ "list", "set" ] + }, + "elemTypeId": { "$ref": "#/definitions/type-id" }, + "elemType": { "$ref": "#/definitions/type-desc" } + }, + "required": [ "typeId", "elemTypeId" ] + }, + "map-type": { + "title": "Map schema", + "type": "object", + "properties": { + "typeId": { + "enum": [ "map" ] + }, + "keyTypeId": { "$ref": "#/definitions/type-id" }, + "keyType": { "$ref": "#/definitions/type-desc" }, + "valueTypeId": { "$ref": "#/definitions/type-id" }, + "valueType": { "$ref": "#/definitions/type-desc" } + }, + "required": [ "typeId", "keyTypeId", "valueTypeId" ] + }, + "struct-type": { + "title": "Struct, union and exception schema", + "type": "object", + "properties": { + "typeId": { + "enum": [ "union", "struct", "exception" ] + } + }, + "required": [ "typeId", "class" ] + }, + "type-desc": { + "title": "Type descriptor schema", + "allOf": [ + { + "type": "object", + "properties": { + "typeId": { "type": "string" }, + "class": { "type": "string" } + } + }, + { + "oneOf": + [ + { "$ref": "#/definitions/base-type" }, + { "$ref": "#/definitions/list-type" }, + { "$ref": "#/definitions/map-type" }, + { "$ref": "#/definitions/struct-type" } + ] + } + ] + }, + "name-and-doc": { + "title": "Name and documentation sub-schema", + "type": "object", + "properties": { + "name": { "type": "string" }, + "doc": { "type": "string" } + }, + "required": [ "name" ] + }, + "enum": { + "title": "Thrift 'enum' definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "required": [ "members" ], + "properties": { + "members": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "value": { "type": "integer" } + }, + "required": [ "name", "value" ] + } + } + } + } + ] + }, + "typedef": { + "title": "Thrift typedef definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "properties": { + "typeId": { "$ref": "#/definitions/type-id" }, + "type": { "$ref": "#/definitions/type-desc" } + }, + "required": [ "typeId" ] + } + ] + }, + "constant": { + "title": "Thrift constant definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { "$ref": "#/definitions/type-desc" }, + { + "properties": { + "value": { + "oneOf": [ + { "type": "string" }, + { "type": "number" }, + { "type": "array" }, + { "type": "object" } + ] + } + }, + "required": [ "value" ] + } + ] + }, + "field": { + "title": "Thrift struct field definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "properties": { + "key": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "required": { + "enum": [ "required", "optional", "req_out" ] + }, + "typeId": { "$ref": "#/definitions/type-id" }, + "type": { "$ref": "#/definitions/type-desc" }, + "default": { + "oneOf": [ + { "type": "string" }, + { "type": "number" }, + { "type": "array" }, + { "type": "object" } + ] + } + }, + "required": [ "key", "required" ] + } + ] + }, + "struct": { + "title": "Thrift struct definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "properties": { + "isException": { "type": "boolean" }, + "isUnion": { "type": "boolean" }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/field" + } + } + }, + "required": [ "isException", "isUnion", "fields" ] + } + ] + }, + "union": { + "title": "Thrift union definition schema", + "$ref": "#/definitions/struct" + }, + "exception": { + "title": "Thrift exception definition schema", + "type": "object", + "properties": { + "key": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "name": { "type": "string" }, + "typeId": { "enum": [ "exception" ] }, + "type": { "$ref": "#/definitions/struct-type" } + }, + "required": [ "key", "name", "typeId" ] + }, + "function": { + "title": "Thrift service function definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "properties": { + "oneway": { + "type": "boolean" + }, + "returnType": { + "$ref": "#/definitions/type-desc" + }, + "arguments": { + "type": "array", + "items": { + "$ref": "#/definitions/field" + } + }, + "exceptions": { + "type": "array", + "items": { "$ref": "#/definitions/exception" } + } + }, + "required": [ "oneway", "arguments", "exceptions" ] + } + ] + }, + "service": { + "title": "Thrift service definition schema", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/name-and-doc" }, + { + "properties": { + "functions": { + "type": "array", + "items": { + "$ref": "#/definitions/function" + } + } + }, + "required": [ "functions" ] + } + ] + } + }, + + "type": "object", + "required": [ + "name", + "enums", + "typedefs", + "structs", + "constants", + "services" + ], + "properties": { + "name": { + "type": "string" + }, + "includes": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "enums": { + "type": "array", + "items": { + "$ref": "#/definitions/enum" + } + }, + "typedefs": { + "type": "array", + "items": { + "$ref": "#/definitions/typedef" + } + }, + "structs": { + "type": "array", + "items": { + "$ref": "#/definitions/struct" + } + }, + "constants": { + "type": "array", + "items": { + "$ref": "#/definitions/constant" + } + }, + "services": { + "type": "array", + "items": { + "$ref": "#/definitions/service" + } + } + } +} http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/json/test/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/json/test/Makefile.am b/lib/json/test/Makefile.am new file mode 100644 index 0000000..bb87a52 --- /dev/null +++ b/lib/json/test/Makefile.am @@ -0,0 +1,26 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +check: + $(ANT) $(ANT_FLAGS) test + +# Make sure this doesn't fail if ant is not configured. +clean-local: + ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \ + $$ANT $(ANT_FLAGS) clean http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/json/test/build.properties ---------------------------------------------------------------------- diff --git a/lib/json/test/build.properties b/lib/json/test/build.properties new file mode 100644 index 0000000..075f640 --- /dev/null +++ b/lib/json/test/build.properties @@ -0,0 +1,10 @@ +# Jar versions +mvn.ant.task.version=2.1.3 + +# Dependency versions +json-schema-validator.version=2.2.6 + +# Maven dependency download locations +mvn.repo=http://repo1.maven.org/maven2 +mvn.ant.task.url=${mvn.repo}/org/apache/maven/maven-ant-tasks/${mvn.ant.task.version} +mvn.ant.task.jar=maven-ant-tasks-${mvn.ant.task.version}.jar http://git-wip-us.apache.org/repos/asf/thrift/blob/ae3775a6/lib/json/test/build.xml ---------------------------------------------------------------------- diff --git a/lib/json/test/build.xml b/lib/json/test/build.xml new file mode 100644 index 0000000..956a238 --- /dev/null +++ b/lib/json/test/build.xml @@ -0,0 +1,144 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<project name="JSON Schema Test" default="test" basedir="." + xmlns:artifact="antlib:org.apache.maven.artifact.ant"> + + <description>JSON Schema Validation Test</description> + + <property name="build.dir" location="${basedir}/build" /> + <property name="json.dir" location="${basedir}/.." /> + <property name="gen.json.dir" location="${build.dir}/gen-json" /> + <property name="json.schema" location="${json.dir}/schema.json" /> + <property name="build.tools.dir" location="${build.dir}/tools"/> + <property name="build.lib.dir" location="${build.dir}/lib"/> + + <!-- the root directory, where you unpack thrift distibution (e.g. thrift-0.x.x.tar.gz) --> + <property name="thrift.dir" location="../../../" /> + <property name="thrift.test.dir" location="${thrift.dir}/test" /> + <property name="thrift.compiler" location="${thrift.dir}/compiler/cpp/thrift" /> + + <!-- Get maven dependency versions from here --> + <property file="${basedir}/build.properties" /> + + <path id="test.classpath"> + <fileset dir="${build.lib.dir}"> + <include name="*.jar" /> + </fileset> + </path> + + <target name="compiler.check"> + <fail> + <condition> + <not> + <resourcecount count="1"> + <fileset id="fs" file="${thrift.compiler}"/> + </resourcecount> + </not> + </condition> + Thrift compiler is missing ! + </fail> + </target> + + <target name="init" depends="compiler.check, mkdirs, mvn.init"> + <tstamp /> + </target> + + <target name="mkdirs"> + <mkdir dir="${build.dir}"/> + <mkdir dir="${build.lib.dir}"/> + <mkdir dir="${build.tools.dir}"/> + <mkdir dir="${gen.json.dir}"/> + </target> + + <target name="generate" depends="init"> + <exec executable="${thrift.compiler}" failonerror="true"> + <arg line="--gen json"/> + <arg line="-out ${gen.json.dir}"/> + <arg line="${thrift.test.dir}/ThriftTest.thrift"/> + </exec> + <exec executable="${thrift.compiler}" failonerror="true"> + <arg line="--gen json:merge"/> + <arg line="-out ${gen.json.dir}"/> + <arg line="${thrift.test.dir}/Include.thrift"/> + </exec> + </target> + + <target name="test" description="run schema validation" + depends="validate-schema, validate-generated-json"/> + + <target name="validate-schema" depends="init"> + <java classname="com.github.fge.jsonschema.main.cli.Main" + classpathref="test.classpath" failonerror="true"> + <arg value="--syntax"/> + <arg value="${json.schema}"/> + </java> + </target> + + <target name="validate-generated-json" depends="init, generate"> + <validate-json file="${gen.json.dir}/ThriftTest.json"/> + <validate-json file="${gen.json.dir}/Include.json"/> + </target> + + <target name="clean"> + <delete dir="${build.dir}" /> + <delete dir="${gen.json.dir}" /> + </target> + + <target name="mvn.ant.tasks.download" depends="mkdirs,mvn.ant.tasks.check" unless="mvn.ant.tasks.found"> + <get src="${mvn.ant.task.url}/${mvn.ant.task.jar}" dest="${build.tools.dir}/${mvn.ant.task.jar}" usetimestamp="true"/> + </target> + + <target name="mvn.ant.tasks.check"> + <condition property="mvn.ant.tasks.found"> + <typefound uri="antlib:org.apache.maven.artifact.ant" name="artifact"/> + </condition> + </target> + + <target name="mvn.init" depends="mvn.ant.tasks.download" unless="mvn.finished"> + <typedef uri="antlib:org.apache.maven.artifact.ant" classpath="${build.tools.dir}/${mvn.ant.task.jar}"/> + + <artifact:dependencies filesetId="test.dependency.jars"> + <dependency groupId="com.github.fge" artifactId="json-schema-validator" version="${json-schema-validator.version}"/> + </artifact:dependencies> + + <!-- Copy the dependencies to the build/lib dir --> + <copy todir="${build.lib.dir}"> + <fileset refid="test.dependency.jars"/> + <mapper type="flatten"/> + </copy> + + <property name="mvn.finished" value="true"/> + </target> + + <macrodef name="validate-json"> + <attribute name="file" default=""/> + <sequential> + <java failonerror="true" + fork="true" + dir="${json.dir}" + classname="com.github.fge.jsonschema.main.cli.Main" + classpathref="test.classpath"> + <arg line="--fakeroot http://thrift.apache.org/"/> + <arg value="${json.schema}"/> + <arg value="@{file}"/> + </java> + </sequential> + </macrodef> + +</project>
