blob: 6a1effc07b75c9440baab11100293a536441aea5 [file] [log] [blame]
#!/usr/bin/env python
#
# 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.
#
import os, sys, mllib
from templating import Parser
from genutil import *
out_dir = sys.argv[1]
spec_file = sys.argv[2]
tpl_dir = sys.argv[3]
pkg_dir = os.path.join(out_dir, "org/apache/qpid/transport")
if not os.path.exists(pkg_dir):
os.makedirs(pkg_dir)
spec = mllib.xml_parse(spec_file)
def excludes(nd):
if (nd.parent is not None and
nd.parent.name == "class" and
nd.parent["@name"] in ("file", "stream")):
return False
else:
return True
def execute(output, template, **kwargs):
f = open(os.path.join(tpl_dir, template))
input = f.read()
f.close()
p = Parser(**kwargs)
p.parse(input)
fname = os.path.join(pkg_dir, output)
f = open(fname, "w")
f.write(p.output)
f.close()
execute("Type.java", "Type.tpl", spec = spec)
execute("Constant.java", "Constant.tpl", spec = spec)
structs = spec.query["amqp/struct"] + \
spec.query["amqp/class/struct", excludes] + \
spec.query["amqp/class/command/result/struct", excludes]
controls = spec.query["amqp/class/control", excludes]
commands = spec.query["amqp/class/command", excludes]
composites = structs + controls + commands
actions = controls + commands
connection = [c for c in actions if c.parent["@name"] == "connection"]
session = [c for c in actions if c.parent["@name"] != "connection"]
for c in composites:
name = cname(c)
execute("%s.java" % name, "Composite.tpl", type = c, name = name)
execute("MethodDelegate.java", "MethodDelegate.tpl", composites = actions)
execute("Option.java", "Option.tpl", composites = composites)
execute("ConnectionInvoker.java", "Invoker.tpl", invoker = "ConnectionInvoker",
composites = connection)
execute("SessionInvoker.java", "Invoker.tpl", invoker = "SessionInvoker",
composites = session)
execute("StructFactory.java", "StructFactory.tpl", composites = composites)
def is_enum(nd):
return nd["enum"] is not None
enums = spec.query["amqp/domain", is_enum] + \
spec.query["amqp/class/domain", is_enum]
for e in enums:
name = cname(e)
execute("%s.java" % name, "Enum.tpl", name = name, type = e)