You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2010/08/18 23:24:19 UTC
svn commit: r986950 - in /avro/trunk: ./ doc/src/content/xdocs/
lang/java/src/java/org/apache/avro/idl/
lang/java/src/java/org/apache/avro/tool/ lang/java/src/test/idl/input/
lang/java/src/test/idl/output/ lang/java/src/test/java/org/apache/avro/idl/
Author: cutting
Date: Wed Aug 18 21:24:18 2010
New Revision: 986950
URL: http://svn.apache.org/viewvc?rev=986950&view=rev
Log:
AVRO-495. IDL: Add support for file includes.
Added:
avro/trunk/lang/java/src/test/idl/input/bar.avpr
avro/trunk/lang/java/src/test/idl/input/foo.avsc
avro/trunk/lang/java/src/test/idl/input/import.avdl
avro/trunk/lang/java/src/test/idl/output/import.avpr
Modified:
avro/trunk/CHANGES.txt
avro/trunk/doc/src/content/xdocs/idl.xml
avro/trunk/lang/java/src/java/org/apache/avro/idl/idl.jj
avro/trunk/lang/java/src/java/org/apache/avro/tool/IdlTool.java
avro/trunk/lang/java/src/test/java/org/apache/avro/idl/TestIdl.java
Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=986950&r1=986949&r2=986950&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Aug 18 21:24:18 2010
@@ -53,6 +53,8 @@ Avro 1.4.0 (unreleased)
AVRO-600. Add support for type and field name aliases,
facilitating schema migration. (cutting)
+ AVRO-495. IDL: Add support for file includes. (cutting)
+
IMPROVEMENTS
AVRO-587. Add Charts and Templating to Stats View
Modified: avro/trunk/doc/src/content/xdocs/idl.xml
URL: http://svn.apache.org/viewvc/avro/trunk/doc/src/content/xdocs/idl.xml?rev=986950&r1=986949&r2=986950&view=diff
==============================================================================
--- avro/trunk/doc/src/content/xdocs/idl.xml (original)
+++ avro/trunk/doc/src/content/xdocs/idl.xml Wed Aug 18 21:24:18 2010
@@ -105,17 +105,36 @@ protocol MyProtocol {
}
</source>
<p>
-3 This notation is used throughout Avro IDL as a way of specifying properties for the annotated element,
+ This notation is used throughout Avro IDL as a way of specifying properties for the annotated element,
as will be described later in this document.
</p>
<p>
Protocols in Avro IDL can contain the following items:
</p>
<ul>
+ <li>Imports of external protocol and schema files.</li>
<li>Definitions of named schemata, including <em>record</em>s, <em>error</em>s, <em>enum</em>s, and <em>fixed</em>s.</li>
<li>Definitions of RPC messages</li>
</ul>
</section>
+ <section id="imports">
+ <title>Imports</title>
+ <p>Files may be imported in one of three formats: </p>
+ <ul>
+ <li>An IDL file may be imported with a statement like:
+ <source>import idl "foo.avdl";</source>
+ </li>
+ <li>A JSON protocol file may be imported with a statement like:
+ <source>import protocol "foo.avpr";</source>
+ </li>
+ <li>A JSON schema file may be imported with a statement like:
+ <source>import schema "foo.avsc";</source>
+ </li>
+ </ul>
+ <p>Messages and types in the imported file are added to this
+ file's protocol.</p>
+ <p>Imported file names are resolved relative to the current IDL file.</p>
+ </section>
<section id="format_enums">
<title>Defining an Enumeration</title>
<p>
Modified: avro/trunk/lang/java/src/java/org/apache/avro/idl/idl.jj
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/idl/idl.jj?rev=986950&r1=986949&r2=986950&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/idl/idl.jj (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/idl/idl.jj Wed Aug 18 21:24:18 2010
@@ -87,8 +87,15 @@ public class Idl
{
static JsonNodeFactory FACTORY = JsonNodeFactory.instance;
+ File inputDir = new File(".");
String namespace;
Map<String,Schema> names = new LinkedHashMap<String,Schema>();
+
+ public Idl(File inputFile) throws IOException {
+ this(new FileInputStream(inputFile), "UTF-8");
+ this.inputDir = inputFile.getParentFile();
+ }
+
}
PARSER_END(Idl)
@@ -148,10 +155,13 @@ TOKEN :
| < FALSE: "false" >
| < FIXED: "fixed" >
| < FLOAT: "float" >
+| < IDL: "idl" >
+| < IMPORT: "import" >
| < INT: "int" >
| < LONG: "long" >
| < MAP: "map" >
| < BYTES: "bytes" >
+| < SCHEMA: "schema" >
| < STRING: "string" >
| < NULL: "null" >
| < PROTOCOL: "protocol" >
@@ -1042,30 +1052,78 @@ void ProtocolBody(Protocol p):
{
Schema schema;
Message message;
- List<Schema> schemata = new ArrayList<Schema>();
+ Protocol importProtocol;
}
{
- "{"
- (
- schema = NamedSchemaDeclaration()
- {
- schemata.add(schema);
- }
-
- | message = MessageDeclaration(p)
- {
- // TODO this is kind of sketch!!
- p.getMessages().put(message.getName(), message);
- }
+ "{"
+ (
+ schema = NamedSchemaDeclaration()
+
+ | <IMPORT>
+ ((( importProtocol = ImportIdl() | importProtocol = ImportProtocol()) {
+ for (Schema s : importProtocol.getTypes())
+ names.put(s.getFullName(), s);
+ p.getMessages().putAll(importProtocol.getMessages());
+ })
+ | schema = ImportSchema() {
+ names.put(schema.getFullName(), schema);
+ })
+
+ | message = MessageDeclaration(p) {
+ p.getMessages().put(message.getName(), message);
+ }
) *
"}"
{
- p.setTypes(schemata);
+ p.setTypes(names.values());
}
}
+Protocol ImportIdl() : {
+ String importFile;
+}
+{
+ <IDL> importFile = JsonString() ";"
+ {
+ try {
+ return new Idl(new File(inputDir, importFile)).CompilationUnit();
+ } catch (IOException e) {
+ throw new ParseException("Error importing "+importFile+": "+e);
+ }
+ }
+}
+
+Protocol ImportProtocol() : {
+ String importFile;
+}
+{
+ <PROTOCOL> importFile = JsonString() ";"
+ {
+
+ try {
+ return Protocol.parse(new File(inputDir, importFile));
+ } catch (IOException e) {
+ throw new ParseException("Error importing "+importFile+": "+e);
+ }
+ }
+}
+
+Schema ImportSchema() : {
+ String importFile;
+}
+{
+ <SCHEMA> importFile = JsonString() ";"
+ {
+ try {
+ return Schema.parse(new File(inputDir, importFile));
+ } catch (IOException e) {
+ throw new ParseException("Error importing "+importFile+": "+e);
+ }
+ }
+}
+
Schema FixedDeclaration():
{
String name;
Modified: avro/trunk/lang/java/src/java/org/apache/avro/tool/IdlTool.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/tool/IdlTool.java?rev=986950&r1=986949&r2=986950&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/tool/IdlTool.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/tool/IdlTool.java Wed Aug 18 21:24:18 2010
@@ -21,7 +21,7 @@ package org.apache.avro.tool;
import org.apache.avro.Protocol;
import org.apache.avro.idl.Idl;
-import java.io.FileInputStream;
+import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
@@ -36,7 +36,6 @@ public class IdlTool implements Tool {
public int run(InputStream in, PrintStream out, PrintStream err,
List<String> args) throws Exception {
- InputStream parseIn = in;
PrintStream parseOut = out;
if (args.size() > 2 ||
@@ -52,15 +51,17 @@ public class IdlTool implements Tool {
return -1;
}
+ Idl parser;
if (args.size() >= 1 && ! "-".equals(args.get(0))) {
- parseIn = new FileInputStream(args.get(0));
+ parser = new Idl(new File(args.get(0)));
+ } else {
+ parser = new Idl(in);
}
+
if (args.size() == 2 && ! "-".equals(args.get(1))) {
parseOut = new PrintStream(new FileOutputStream(args.get(1)));
}
-
- Idl parser = new Idl(parseIn);
Protocol p = parser.CompilationUnit();
parseOut.print(p.toString(true));
return 0;
Added: avro/trunk/lang/java/src/test/idl/input/bar.avpr
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/idl/input/bar.avpr?rev=986950&view=auto
==============================================================================
--- avro/trunk/lang/java/src/test/idl/input/bar.avpr (added)
+++ avro/trunk/lang/java/src/test/idl/input/bar.avpr Wed Aug 18 21:24:18 2010
@@ -0,0 +1,2 @@
+{"protocol": "org.foo.Bar",
+ "messages": { "bar": {"request": [], "response": "null"}}}
Added: avro/trunk/lang/java/src/test/idl/input/foo.avsc
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/idl/input/foo.avsc?rev=986950&view=auto
==============================================================================
--- avro/trunk/lang/java/src/test/idl/input/foo.avsc (added)
+++ avro/trunk/lang/java/src/test/idl/input/foo.avsc Wed Aug 18 21:24:18 2010
@@ -0,0 +1,3 @@
+{"type": "record", "name": "org.foo.Foo",
+ "fields": [ {"name": "x", "type": "int"} ]
+}
Added: avro/trunk/lang/java/src/test/idl/input/import.avdl
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/idl/input/import.avdl?rev=986950&view=auto
==============================================================================
--- avro/trunk/lang/java/src/test/idl/input/import.avdl (added)
+++ avro/trunk/lang/java/src/test/idl/input/import.avdl Wed Aug 18 21:24:18 2010
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+@namespace("org.foo")
+protocol Import {
+ import idl "reservedwords.avdl";
+ import schema "foo.avsc";
+ import protocol "bar.avpr";
+
+ record Bar {
+ Foo foo;
+ }
+
+ Bar barf(Foo foo);
+}
Added: avro/trunk/lang/java/src/test/idl/output/import.avpr
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/idl/output/import.avpr?rev=986950&view=auto
==============================================================================
--- avro/trunk/lang/java/src/test/idl/output/import.avpr (added)
+++ avro/trunk/lang/java/src/test/idl/output/import.avpr Wed Aug 18 21:24:18 2010
@@ -0,0 +1,40 @@
+{
+ "protocol" : "Import",
+ "namespace" : "org.foo",
+ "types" : [ {
+ "type" : "record",
+ "name" : "Foo",
+ "fields" : [ {
+ "name" : "x",
+ "type" : "int"
+ } ]
+ }, {
+ "type" : "record",
+ "name" : "Bar",
+ "fields" : [ {
+ "name" : "foo",
+ "type" : "Foo"
+ } ]
+ } ],
+ "messages" : {
+ "error" : {
+ "request" : [ ],
+ "response" : "null"
+ },
+ "void" : {
+ "request" : [ ],
+ "response" : "null"
+ },
+ "bar" : {
+ "request" : [ ],
+ "response" : "null"
+ },
+ "barf" : {
+ "request" : [ {
+ "name" : "foo",
+ "type" : "Foo"
+ } ],
+ "response" : "Bar"
+ }
+ }
+}
\ No newline at end of file
Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/idl/TestIdl.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/idl/TestIdl.java?rev=986950&r1=986949&r2=986950&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/idl/TestIdl.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/idl/TestIdl.java Wed Aug 18 21:24:18 2010
@@ -121,7 +121,7 @@ public class TestIdl {
}
private String generate() throws Exception {
- Idl parser = new Idl(new FileInputStream(in), "UTF-8");
+ Idl parser = new Idl(in);
Protocol p = parser.CompilationUnit();
return p.toString(true);
}