summaryrefslogtreecommitdiff
path: root/java/common/templating.py
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2008-04-16 13:32:13 +0000
committerRafael H. Schloming <rhs@apache.org>2008-04-16 13:32:13 +0000
commitd054b41aaa1466b65c9dc2acf1b22ca98ec3128c (patch)
tree08055eba3020d3dcad5c9a9587d98b15d0b97c89 /java/common/templating.py
parentf375be1908ad22329fe9ed21a8c196475ade7e59 (diff)
downloadqpid-python-d054b41aaa1466b65c9dc2acf1b22ca98ec3128c.tar.gz
QPID-901: updates to the java client to use the 0-10 final spec instead of the 0-10 preview spec; this includes improvements to the codegen process as well as some modifications to the shared code path in the client to not lose per message state when consumers are closed.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@648692 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/common/templating.py')
-rw-r--r--java/common/templating.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/java/common/templating.py b/java/common/templating.py
new file mode 100644
index 0000000000..832b7ecb9c
--- /dev/null
+++ b/java/common/templating.py
@@ -0,0 +1,101 @@
+
+class Parser:
+
+ def __init__(self, **kwargs):
+ self.output = ""
+ self.environ = {"out": self.parse}
+ for k, v in kwargs.items():
+ self.environ[k] = v
+ self.text = ""
+ self.level = 0
+ self.line = None
+
+ def action(self, actor):
+ text = self.text
+ self.text = ""
+ actor(text)
+
+ def out(self, text):
+ self.output += text
+
+ def prefix_lines(self, text):
+ return "%s%s" % ("\n"*(self.line - 1 - text.count("\n")), text)
+
+ def evaluate(self, text):
+ self.out(str(eval(self.prefix_lines(text), self.environ, self.environ)))
+
+ def execute(self, text):
+ exec self.prefix_lines(text) in self.environ, self.environ
+
+ def parse(self, input):
+ old_line = self.line
+ try:
+ state = self.start
+ self.line = 1
+ for ch in input:
+ state = state(ch)
+ if ch == "\n":
+ self.line += 1
+ if state == self.start:
+ self.action(self.out)
+ elif state == self.alnum:
+ self.action(self.evaluate)
+ else:
+ raise ParseError()
+ finally:
+ self.line = old_line
+
+ def start(self, ch):
+ if ch == "$":
+ return self.dollar
+ else:
+ self.text += ch
+ return self.start
+
+ def dollar(self, ch):
+ if ch == "$":
+ self.text += "$"
+ return self.start
+ elif ch == "(":
+ self.action(self.out)
+ return self.expression
+ elif ch == "{":
+ self.action(self.out)
+ return self.block
+ else:
+ self.action(self.out)
+ self.text += ch
+ return self.alnum
+
+ def alnum(self, ch):
+ if ch.isalnum():
+ self.text += ch
+ return self.alnum
+ else:
+ self.action(self.evaluate)
+ self.text += ch
+ return self.start
+
+ def match(self, ch, start, end):
+ if ch == start:
+ self.level += 1
+ if ch == end:
+ self.level -= 1
+
+ def block(self, ch):
+ if not self.level and ch == "}":
+ self.action(self.execute)
+ return self.start
+ else:
+ self.match(ch, "{", "}")
+ self.text += ch
+ return self.block
+
+ def expression(self, ch):
+ if not self.level and ch == ")":
+ self.action(self.evaluate)
+ return self.start
+ else:
+ self.match(ch, "(", ")")
+ self.text += ch
+ return self.expression