summaryrefslogtreecommitdiff
path: root/qpid/java/common/templating.py
diff options
context:
space:
mode:
authorRajith Muditha Attapattu <rajith@apache.org>2011-05-27 15:44:23 +0000
committerRajith Muditha Attapattu <rajith@apache.org>2011-05-27 15:44:23 +0000
commit66765100f4257159622cefe57bed50125a5ad017 (patch)
treea88ee23bb194eb91f0ebb2d9b23ff423e3ea8e37 /qpid/java/common/templating.py
parent1aeaa7b16e5ce54f10c901d75c4d40f9f88b9db6 (diff)
parent88b98b2f4152ef59a671fad55a0d08338b6b78ca (diff)
downloadqpid-python-66765100f4257159622cefe57bed50125a5ad017.tar.gz
Creating a branch for experimenting with some ideas for JMS client.rajith_jms_client
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/rajith_jms_client@1128369 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/common/templating.py')
-rw-r--r--qpid/java/common/templating.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/qpid/java/common/templating.py b/qpid/java/common/templating.py
new file mode 100644
index 0000000000..732e96fa60
--- /dev/null
+++ b/qpid/java/common/templating.py
@@ -0,0 +1,119 @@
+#
+# 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.
+#
+
+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