| #!/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) |