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