[jboss-svn-commits] JBL Code SVN: r26665 - in labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools: xml and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu May 21 22:33:13 EDT 2009
Author: dsotty
Date: 2009-05-21 22:33:13 -0400 (Thu, 21 May 2009)
New Revision: 26665
Added:
labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/ImpliesDescr.java
labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/DroolsDescrVisitor.java
labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/RuleMLDumper.java
Log:
Major update
Added: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/ImpliesDescr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/ImpliesDescr.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/lang/descr/ImpliesDescr.java 2009-05-22 02:33:13 UTC (rev 26665)
@@ -0,0 +1,76 @@
+package org.drools.lang.descr;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed 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 java.util.ArrayList;
+import java.util.List;
+
+public class ImpliesDescr extends BaseDescr
+ implements
+ ConditionalElementDescr {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 400L;
+ private List descrs = new ArrayList();
+
+ public ImpliesDescr() {
+ }
+
+ public void addDescr(final BaseDescr baseDescr) {
+ this.descrs.add( baseDescr );
+ }
+
+ public void insertDescr(int index,
+ final BaseDescr baseDescr) {
+ this.descrs.add( index,
+ baseDescr );
+ }
+
+ public void insertBeforeLast(final Class clazz,
+ final BaseDescr baseDescr) {
+ if ( this.descrs.isEmpty() ) {
+ addDescr( baseDescr );
+ return;
+ }
+
+ for ( int i = this.descrs.size() - 1; i >= 0; i-- ) {
+ if ( clazz.isInstance( this.descrs.get( i ) ) ) {
+ insertDescr( i,
+ baseDescr );
+ return;
+ }
+ }
+
+ addDescr( baseDescr );
+ }
+
+ public List getDescrs() {
+ return this.descrs;
+ }
+
+ public void addOrMerge(BaseDescr baseDescr) {
+ if( baseDescr instanceof ImpliesDescr ) {
+ this.descrs.addAll( ((ImpliesDescr)baseDescr).getDescrs() );
+ } else {
+ this.descrs.add( baseDescr );
+ }
+ }
+
+
+
+}
\ No newline at end of file
Added: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/DroolsDescrVisitor.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/DroolsDescrVisitor.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/DroolsDescrVisitor.java 2009-05-22 02:33:13 UTC (rev 26665)
@@ -0,0 +1,159 @@
+package org.drools.xml;
+
+import org.codehaus.janino.Java.FunctionDeclarator;
+import org.drools.compiler.ReturnValueDescr;
+import org.drools.lang.descr.AccessorDescr;
+import org.drools.lang.descr.AccumulateDescr;
+import org.drools.lang.descr.ActionDescr;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.BehaviorDescr;
+import org.drools.lang.descr.CollectDescr;
+import org.drools.lang.descr.CutDescr;
+import org.drools.lang.descr.DeclarativeInvokerDescr;
+import org.drools.lang.descr.EntryPointDescr;
+import org.drools.lang.descr.EqvDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.EvaluatorBasedRestrictionDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldAccessDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.ForAnyDescr;
+import org.drools.lang.descr.ForallDescr;
+import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.FunctionCallDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.HedgeDescr;
+import org.drools.lang.descr.ImpliesDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.MethodAccessDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.PatternSourceDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.ProcessDescr;
+import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.Restriction;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.SlidingWindowDescr;
+import org.drools.lang.descr.TypeDeclarationDescr;
+import org.drools.lang.descr.TypeFieldDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.drools.lang.descr.XorDescr;
+
+public interface DroolsDescrVisitor {
+
+ public void visitActionDescr(ActionDescr descr);
+
+ public void visitAndDescr(AndDescr descr);
+
+ public void visitAttributeDescr(AttributeDescr descr);
+
+ public void visitBehaviorDescr(BehaviorDescr descr);
+
+ public void visitSlidingWindowDescr(SlidingWindowDescr descr);
+
+ public void visitCutDescr(CutDescr descr);
+
+ public void visitDeclarativeInvokerDescr(DeclarativeInvokerDescr descr);
+
+ public void visitAccessorDescr(AccessorDescr descr);
+
+ public void visitFieldAccessDescr(FieldAccessDescr descr);
+
+ public void visitFunctionCallDescr(FunctionCallDescr descr);
+
+ public void visitMethodAccessDescr(MethodAccessDescr descr);
+
+ public void visitEqvDescr(EqvDescr descr);
+
+ public void visitEvalDescr(EvalDescr descr);
+
+ public void visitExistsDescr(ExistsDescr descr);
+
+ public void visitFactTemplateDescr(FactTemplateDescr descr);
+
+ public void visitFieldBindingDescr(FieldBindingDescr descr);
+
+ public void visitFieldConstraintDescr(FieldConstraintDescr descr);
+
+ public void visitForallDescr(ForallDescr descr);
+
+ public void visitForAnyDescr(ForAnyDescr descr);
+
+ public void visitFunctionDescr(FunctionDescr descr);
+
+ public void visitGlobalDescr(GlobalDescr descr);
+
+ public void visitHedgeDescr(HedgeDescr descr);
+
+ public void visitImpliesDescr(ImpliesDescr descr);
+
+ public void visitImportDescr(ImportDescr descr);
+
+ public void visitFunctionImportDescr(FunctionImportDescr descr);
+
+ public void visitNotDescr(NotDescr descr);
+
+ public void visitOrDescr(OrDescr descr);
+
+ public void visitPackageDescr(PackageDescr descr);
+
+ public void visitPatternDescr(PatternDescr descr);
+
+ public void visitPatternSourceDescr(PatternSourceDescr descr);
+
+ public void visitAccumulateDescr(AccumulateDescr descr);
+
+ public void visitCollectDescr(CollectDescr descr);
+
+ public void visitEntryPointDescr(EntryPointDescr descr);
+
+ public void visitFromDescr(FromDescr descr);
+
+ public void visitProcessDescr(ProcessDescr descr);
+
+ public void visitRestriction(Restriction descr);
+
+ public void visitEvaluatorBasedRestrictionDescr(EvaluatorBasedRestrictionDescr descr);
+
+ public void visitLiteralRestrictionDescr(LiteralRestrictionDescr descr);
+
+ public void visitQualifiedIdentifierRestrictionDescr(QualifiedIdentifierRestrictionDescr descr);
+
+ public void visitReturnValueRestrictionDescr(ReturnValueRestrictionDescr descr);
+
+ public void visitVariableRestrictionDescr(VariableRestrictionDescr descr);
+
+ public void visitPredicateDescr(PredicateDescr descr);
+
+ public void visitRestrictionConnectiveDescr(RestrictionConnectiveDescr descr);
+
+ public void visitReturnValueDescr(ReturnValueDescr descr);
+
+ public void visitRuleDescr(RuleDescr descr);
+
+ public void visitQueryDescr(QueryDescr descr);
+
+ public void visitTypeDeclarationDescr(TypeDeclarationDescr descr);
+
+ public void visitTypeFieldDescr(TypeFieldDescr descr);
+
+ public void visitXorDescr(XorDescr descr);
+
+
+
+
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/RuleMLDumper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/RuleMLDumper.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-compiler/src/main/java/org/drools/xml/RuleMLDumper.java 2009-05-22 02:33:13 UTC (rev 26665)
@@ -0,0 +1,1458 @@
+package org.drools.xml;
+
+/*
+ *
+ *
+ * Licensed 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 java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.ReturnValueDescr;
+import org.drools.definition.KnowledgePackage;
+import org.drools.io.ResourceFactory;
+import org.drools.io.impl.ClassPathResource;
+import org.drools.lang.DroolsSoftKeywords;
+import org.drools.lang.descr.AccessorDescr;
+import org.drools.lang.descr.AccumulateDescr;
+import org.drools.lang.descr.ActionDescr;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.BehaviorDescr;
+import org.drools.lang.descr.CollectDescr;
+import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.CutDescr;
+import org.drools.lang.descr.DeclarativeInvokerDescr;
+import org.drools.lang.descr.EntryPointDescr;
+import org.drools.lang.descr.EqvDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.EvaluatorBasedRestrictionDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldAccessDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.ForAnyDescr;
+import org.drools.lang.descr.ForallDescr;
+import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.FunctionCallDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.HedgeDescr;
+import org.drools.lang.descr.ImpliesDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.MethodAccessDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PackageDescrDumper;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.PatternSourceDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.ProcessDescr;
+import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.Restriction;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.SlidingWindowDescr;
+import org.drools.lang.descr.TypeDeclarationDescr;
+import org.drools.lang.descr.TypeFieldDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.drools.lang.descr.XorDescr;
+import org.drools.util.ReflectiveVisitor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+/**
+ * This utility will take a AST of a rule package, and emit XML.
+ * This can be used in porting from DRL to XML.
+ * @author <a href="mailto:jayaramcs at gmail.com">Author Jayaram C S</a>
+ */
+public class RuleMLDumper extends ReflectiveVisitor
+ implements
+ PackageDescrDumper,
+ DroolsDescrVisitor{
+
+
+
+ static final String JAXP_SCHEMA_LANGUAGE =
+ "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+
+ static final String W3C_XML_SCHEMA =
+ "http://www.w3.org/2001/XMLSchema";
+
+ static final String JAXP_SCHEMA_SOURCE =
+ "http://java.sun.com/xml/jaxp/properties/schemaSource";
+
+ static final String NAFFOLOGEQ = "naffologeq";
+
+
+
+ static final DocumentBuilderFactory naffologeqFactory = DocumentBuilderFactory.newInstance();
+
+
+ static final Map<String, DocumentBuilderFactory> validators = new HashMap<String, DocumentBuilderFactory>();
+
+ private DocumentBuilderFactory doxFactory = DocumentBuilderFactory.newInstance();
+
+ private Document dox;
+
+ private RuleMLContext context;
+
+//
+//
+// {
+// validators.put(NAFFOLOGEQ, naffologeqFactory);
+//
+// for (String lang : validators.keySet()) {
+// DocumentBuilderFactory factory = validators.get(lang);
+// factory.setNamespaceAware(true);
+// factory.setValidating(true);
+//
+// factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
+//
+// String resLoc = "org/ruleml/"+lang+".xsd";
+// URL res;
+// try {
+//
+// res = ((ClassPathResource) ResourceFactory.newClassPathResource(resLoc)).getURL();
+// File schemaFile = new File(res.getFile());
+//
+// factory.setAttribute(JAXP_SCHEMA_SOURCE, schemaFile.toString());
+//
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+//
+//
+//
+// }
+//
+// }
+//
+//
+//
+
+
+ public RuleMLDumper() {
+ try {
+
+ doxFactory.setNamespaceAware(true);
+ dox = doxFactory.newDocumentBuilder().newDocument();
+ context = new RuleMLContext();
+
+
+ } catch (ParserConfigurationException pce) {
+ pce.printStackTrace();
+ } catch (IllegalArgumentException x) {
+ x.printStackTrace();
+ }
+ }
+
+
+// public void test() {
+//
+// for (String lang : validators.keySet()) {
+//
+// DocumentBuilderFactory factory = validators.get(lang);
+//
+//
+// ByteArrayOutputStream bos = new ByteArrayOutputStream();
+// format(dox, bos);
+// ByteArrayInputStream bs = new ByteArrayInputStream(
+// bos.toByteArray()
+// );
+//
+// try {
+//
+// DocumentBuilder dob = factory.newDocumentBuilder();
+// dob.setErrorHandler(new ErrorHandler () {
+//
+// public void error(SAXParseException exception)
+// throws SAXException {
+// System.err.println("Error");
+// exception.printStackTrace();
+//
+// }
+//
+// public void fatalError(SAXParseException exception)
+// throws SAXException {
+// System.err.println("Fatal Error");
+// exception.printStackTrace();
+//
+// }
+//
+// public void warning(SAXParseException exception)
+// throws SAXException {
+// System.err.println("Warning");
+// exception.printStackTrace();
+// }
+//
+// });
+// dob.parse(bs);
+// System.out.println(lang.toUpperCase()+ "\t\t\t\t true\n");
+//
+// } catch (SAXException e) {
+//
+// System.out.println(lang.toUpperCase()+ "\t\t\t\t false\n");
+// System.out.println(e.toString());
+//
+// } catch (IOException e) {
+// //
+// System.out.println(e.toString());
+// } catch (ParserConfigurationException e) {
+// System.out.println(e.toString());
+//
+// }
+//
+//
+// }
+//
+// }
+
+
+
+
+
+// public void test2(String schemaId) {
+//
+//
+// String resLoc = "org/ruleml/"+schemaId+".xsd";
+// URL schemaURL = null;
+// try {
+//
+// schemaURL = ((ClassPathResource) ResourceFactory.newClassPathResource(resLoc)).getURL();
+//
+// } catch (IOException e) {
+// //
+// e.printStackTrace();
+// }
+//
+// ByteArrayOutputStream bos = new ByteArrayOutputStream();
+// format(dox, bos);
+// ByteArrayInputStream bs = new ByteArrayInputStream(
+// bos.toByteArray()
+// );
+//
+//
+// Schema schema = null;
+// try {
+// String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
+// SchemaFactory factory = SchemaFactory.newInstance(language);
+// schema = factory.newSchema(schemaURL);
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+//
+// try {
+// Validator validator = schema.newValidator();
+// SAXSource source = new SAXSource(
+// new InputSource(bs));
+//
+//
+// validator.validate(source);
+// System.out.println();
+// System.out.println("Validation passed.");
+//
+// } catch (Exception e) {
+// // catching all validation exceptions
+// System.out.println();
+// System.out.println(e.toString());
+// }
+//
+// }
+
+ public synchronized String dump(InputStream drl, InputStream config) {
+
+ try {
+
+ if (config != null) {
+ Properties props = new Properties();
+ props.load(config);
+ KnowledgeBuilderConfiguration conf = new PackageBuilderConfiguration(props);
+ }
+
+ DrlParser parser = new DrlParser();
+ PackageDescr pkD = parser.parse(drl);
+
+
+ return dump(pkD);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return e.toString();
+ }
+
+
+ }
+
+
+
+ public String dump(PackageDescr packageDescr) {
+ return dump(packageDescr, "out.ruleml");
+ }
+
+ public synchronized String dump(final PackageDescr packageDescr, String fileName) {
+ this.visitPackageDescr(packageDescr);
+
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ format(dox,bos);
+
+ FileOutputStream fos;
+ try {
+ fos = new FileOutputStream(fileName);
+ format(dox,fos);
+ fos.flush();
+ fos.close();
+ } catch (FileNotFoundException e) {
+ //
+ e.printStackTrace();
+ } catch (IOException e) {
+ //
+ e.printStackTrace();
+ }
+
+
+ String xml = bos.toString();
+
+ return xml;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ public void visitAndDescr(final AndDescr descr) {
+ Element and = dox.createElement("And");
+
+ if (descr.getLabel() != null && ! descr.getLabel().equals(""))
+ attachId(and,descr.getLabel(),false);
+
+ if (descr.getParams() != null && ! descr.getParams().equals("")) {
+ and.setAttribute("kind", descr.getParams());
+ }
+
+ //At pattern level, a field binding is always ALSO followed by its Restriction
+ //So we have to work around this...
+ visitChildrenExcludeDuplicates(and, descr.getDescrs());
+
+
+ context.getCurrentElement().appendChild(and);
+ }
+
+
+
+
+
+ public void visitAttributeDescr(final AttributeDescr attributeDescr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+
+ public void visitVariableRestrictionDescr(final VariableRestrictionDescr descr) {
+ Element prevElem = context.getCurrentElement();
+
+ visitEvaluatorBasedRestrictionDescr(descr);
+
+ Element atom = context.setCurrentElement(prevElem); // set by visitEBRD
+
+
+ buildAccessorPathExpression(atom,descr.getText());
+
+ if (descr.isNegated()) {
+ Element neg = dox.createElement("Neg");
+ neg.appendChild(atom);
+ context.getCurrentElement().appendChild(neg);
+ } else {
+ context.getCurrentElement().appendChild(atom);
+ }
+
+ }
+
+
+ public void visitPatternDescr(final PatternDescr descr) {
+
+ context.setClassType(descr.getObjectType());
+
+ String varName = "";
+ if (descr.getIdentifier() != null) {
+ varName = context.getRuleName()+"."+descr.getIdentifier();
+ } else {
+ varName = context.getRuleName()+"."+context.getClassType();
+ }
+
+ context.setCurrentObjectVariable(varName);
+
+ Element atom = dox.createElement("Atom");
+
+ if (descr.getLabel() != null)
+ attachId(atom, descr.getLabel(),false);
+
+ Element pattern = dox.createElement("Rel");
+ pattern.setTextContent(descr.getObjectType());
+ atom.appendChild(pattern);
+
+
+ BaseDescr mainArg = (BaseDescr) descr.getConstraint();
+
+ Element var = dox.createElement("Var");
+ var.setTextContent(context.getCurrentObjectVariable());
+
+ Element varDefinition = dox.createElement("Reify");
+ visitChild(varDefinition,mainArg);
+//
+ Element eq = buildEquality(context.getCurrentObjectVariable(),varDefinition,true);
+
+ atom.appendChild(eq);
+// context.addVariableDefinition(context.getCurrentObjectVariable(),
+// ;
+
+ context.getCurrentElement().appendChild(atom);
+ }
+
+ private Element buildEquality(String varName, Element expression, boolean oriented) {
+ Element equals = dox.createElement("Equals");
+ equals.setAttribute("oriented", oriented ? "yes" : "no" );
+
+ Element lhs = dox.createElement("lhs");
+ Element var = dox.createElement("Var");
+ var.setTextContent(varName);
+ lhs.appendChild(var);
+
+ Element rhs = dox.createElement("rhs");
+ if (expression.getNodeName().equals("Atom")) {
+
+ Element reify = dox.createElement("Reify");
+ reify.appendChild(expression);
+ rhs.appendChild(reify);
+
+ } else if (expression.getNodeName().equals("Expr")) {
+
+ rhs.appendChild(expression);
+
+ } else if (expression.getNodeName().equals("Reify")) {
+
+ rhs.appendChild(expression);
+
+ } else if (expression.getNodeName().equals("slot")) {
+
+ Element slot = expression;
+ Element field = (Element) slot.getChildNodes().item(0);
+ Element obj = (Element) slot.getChildNodes().item(1);
+
+ Element expr = buildGetterExpression(field.getTextContent() , obj.getTextContent());
+//
+ rhs.appendChild(expr);
+
+ } else {
+ throw new UnsupportedOperationException(expression.getNodeName());
+ }
+
+ equals.appendChild(lhs);
+ equals.appendChild(rhs);
+ return equals;
+ }
+
+
+
+ private Element buildGetterExpression(String fldName, String var) {
+ Element expr = dox.createElement("Expr");
+ expr.setAttribute("in", "yes");
+ Element functor = dox.createElement("Fun");
+ functor.setTextContent("get"+ fldName.substring(0,1).toUpperCase()+ fldName.substring(1));
+ attachAsOp(expr,functor);
+
+ Element varArg = dox.createElement("Var");
+ varArg.setTextContent(var);
+ expr.appendChild(varArg);
+
+ return expr;
+ }
+
+ private void attachAsOp(Element atom) {
+ Element op = dox.createElement("op");
+ op.appendChild(atom);
+ context.getCurrentElement().appendChild(op);
+ }
+
+ private void attachAsOp(Element atom, Element rel) {
+ Element op = dox.createElement("op");
+ op.appendChild(rel);
+ atom.appendChild(op);
+ }
+
+
+ public void visitFieldBindingDescr(final FieldBindingDescr descr) {
+
+ String varName = context.currentObjectVariable+"."+descr.getIdentifier();
+
+ context.setCurrentFieldVariable(varName);
+ context.setCurrentField(descr.getFieldConstraint().getFieldName());
+ //bypass the fieldConstraint as it would redefine the variable name
+ List<BaseDescr> list = descr.getFieldConstraint().getRestrictions();
+ if (list.size() > 0) {
+ visitChildren(context.getCurrentElement(), list);
+ } else {
+ Element atom = dox.createElement("Atom");
+ Element var = dox.createElement("Var");
+ var.setTextContent(context.getCurrentFieldVariable());
+ atom.appendChild(var);
+
+ context.getCurrentElement().appendChild(atom);
+
+ Element expr = buildGetterExpression(context.getCurrentField(),context.getCurrentObjectVariable());
+ context.addVariableDefinition(context.getCurrentFieldVariable(), buildEquality(varName, expr,true));
+ // Simple declaration binding
+ }
+
+ }
+
+ public void visitFieldConstraintDescr(FieldConstraintDescr descr) {
+ context.setCurrentField(descr.getFieldName());
+ context.setCurrentFieldVariable(null);
+
+ //visitChildren(context.getCurrentElement(),descr.getRestrictions());
+ List<BaseDescr> list = descr.getRestrictions();
+ if (list.size() > 0) {
+ visitChildren(context.getCurrentElement(), list);
+ } else {
+ // Empty field restriction, nothing to do
+ throw new RuntimeDroolsException("Error: impossible to find an useless field constraint " + descr.toString());
+ }
+
+ }
+
+//
+ public void visitCollectDescr(final CollectDescr descr) {
+ System.err.println("RuleML does not support COLLECT construct");
+ }
+//
+ public void visitAccumulateDescr(final AccumulateDescr descr) {
+ System.err.println("RuleML does not support ACCUMULATE construct");
+ }
+//
+ public void visitFromDescr(final FromDescr descr) {
+ System.err.println("RuleML does not support FROM construct");
+ }
+//
+ public void visitForallDescr(final ForallDescr descr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitEvalDescr(final EvalDescr descr) {
+ Element atom = dox.createElement("Atom");
+ Element eval = dox.createElement("Rel");
+ eval.setTextContent("eval");
+ attachAsOp(atom, eval);
+
+ Element expr = dox.createElement("Expr");
+ expr.setAttribute("in","yes");
+ Element fun = dox.createElement("Fun");
+ fun.setTextContent("eval");
+ Element data = dox.createElement("Data");
+ data.setTextContent(descr.getContent().toString());
+ expr.appendChild(fun);
+ expr.appendChild(data);
+ atom.appendChild(expr);
+ context.getCurrentElement().appendChild(atom);
+ }
+//
+ public void visitExistsDescr(final ExistsDescr descr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+//
+
+ public void visitFunctionDescr(final FunctionDescr functionDescr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+//
+
+
+
+
+
+
+ public void visitLiteralRestrictionDescr(final LiteralRestrictionDescr descr) {
+
+ Element prevElem = context.getCurrentElement();
+
+ visitEvaluatorBasedRestrictionDescr(descr);
+
+ Element atom = context.setCurrentElement(prevElem); // set by visitEBRD
+
+ if (descr.getValue() != null) {
+ Element data = dox.createElement("Data");
+ data.setTextContent(descr.getValue().toString());
+ data.setAttribute("xsi:type",mapType(descr.getType()));
+ atom.appendChild(data);
+ }
+
+
+ if (descr.isNegated()) {
+ Element neg = dox.createElement("Neg");
+ neg.appendChild(atom);
+ context.getCurrentElement().appendChild(neg);
+ } else {
+ context.getCurrentElement().appendChild(atom);
+ }
+ }
+
+
+ private String mapType(int type) {
+ switch (type) {
+ case LiteralRestrictionDescr.TYPE_BOOLEAN : return "xs:boolean";
+ case LiteralRestrictionDescr.TYPE_NUMBER : return "xs:decimal";
+ case LiteralRestrictionDescr.TYPE_STRING : return "xs:string";
+ case LiteralRestrictionDescr.TYPE_NULL : throw new RuntimeException("Found literal of type null");
+ default : throw new RuntimeException("Found literal of type unknown " + type);
+ }
+ }
+
+
+//
+ public void visitQualifiedIdentifierRestrictionDescr(final QualifiedIdentifierRestrictionDescr descr) {
+
+ Element prevElem = context.getCurrentElement();
+
+ visitEvaluatorBasedRestrictionDescr(descr);
+
+ Element atom = context.setCurrentElement(prevElem); // set by visitEBRD
+
+// Element atom = dox.createElement("Atom");
+//
+// Element rel = dox.createElement("Rel");
+// rel.setTextContent(descr.getEvaluator());
+// attachAsOp(atom,rel);
+//
+//
+// Element slot = dox.createElement("slot");
+// Element field = dox.createElement("Ind");
+// field.setTextContent(context.getCurrentField());
+// slot.appendChild(field);
+//
+// Element value = dox.createElement("Var");
+// value.setTextContent(context.getCurrentObjectVariable());
+// slot.appendChild(value);
+//
+// String varField = context.getCurrentFieldVariable();
+// if (varField == null) {
+//
+// atom.appendChild(slot);
+//
+// } else {
+// context.addVariableDefinition(varField, buildEquality(varField, slot));
+//
+// Element var = dox.createElement("Var");
+// var.setTextContent(varField);
+// atom.appendChild(var);
+// }
+
+ buildAccessorPathExpression(atom,descr.getText());
+
+ if (descr.isNegated()) {
+ Element neg = dox.createElement("Neg");
+ neg.appendChild(atom);
+ context.getCurrentElement().appendChild(neg);
+ } else {
+ context.getCurrentElement().appendChild(atom);
+ }
+ }
+
+
+ private void buildAccessorPathExpression(Element atom, String text) {
+
+ LinkedList<String> steps = new LinkedList<String>();
+ StringTokenizer tok = new StringTokenizer(text,".");
+ while (tok.hasMoreTokens())
+ steps.addFirst(tok.nextToken());
+
+ String root = steps.getLast();
+ String candidateVar = context.contextualizeVar(root);
+
+ if ( root.equals("this") ) {
+ //this is replaced by the current object variable
+ steps.removeLast();
+ steps.addLast(context.getCurrentObjectVariable());
+ } else if (! context.isVariable(candidateVar)) {
+ //supposed to be an implicit "this"
+ steps.addLast(context.getCurrentObjectVariable());
+ } else {
+ //must be a known variable
+ steps.removeLast();
+ steps.addLast(candidateVar);
+ }
+
+
+ Element expr = walkPath(steps);
+
+ atom.appendChild(expr);
+ }
+
+ private Element walkPath(LinkedList<String> steps) {
+ String source = steps.removeFirst();
+
+ Element ans = null;
+
+ if (steps.size() > 0) {
+ //there are more steps, so this is a getter
+ Element expr = dox.createElement("Expr");
+ Element fun = dox.createElement("Fun");
+ source = "get" + source.substring(0,1).toUpperCase() + source.substring(1);
+ fun.setTextContent(source);
+ expr.appendChild(fun);
+
+ expr.appendChild(walkPath(steps));
+
+ ans = expr;
+
+ } else {
+
+ ans = dox.createElement("Var");
+ ans.setTextContent(source);
+ //will do the normalization earlier
+
+ }
+
+ return ans;
+ }
+
+
+ //
+ public void visitNotDescr(final NotDescr descr) {
+
+ Element neg = dox.createElement("Neg");
+
+ visitChildren(neg,descr.getDescrs());
+
+ context.getCurrentElement().appendChild(neg);
+ }
+
+
+
+
+
+
+
+ public void visitOrDescr(final OrDescr descr) {
+ Element or = dox.createElement("Or");
+
+ if (descr.getLabel() != null && ! descr.getLabel().equals(""))
+ attachId(or,descr.getLabel(),false);
+
+ if (descr.getParams() != null && ! descr.getParams().equals("")) {
+ or.setAttribute("kind", descr.getParams());
+ }
+
+
+ visitChildren(or, descr.getDescrs());
+
+ context.getCurrentElement().appendChild(or);
+ }
+
+
+ private Element newLem(String name) {
+ return dox.createElement(name);
+ }
+
+ public void visitPackageDescr(final PackageDescr packageDescr) {
+
+ Element root = dox.createElement("RuleML");
+ root.setAttribute("xmlns","http://www.ruleml.org/0.91/xsd");
+ root.setAttribute("xmlns:xs","http://www.w3.org/2001/XMLSchema");
+ root.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
+ root.setAttribute("xsi:schemaLocation","http://www.ruleml.org/0.91/xsd http://www.ruleml.org/0.91/xsd/naffologeq.xsd");
+
+
+
+ //Assert rules in a package
+ Element elassert = newLem("Assert");
+ Element ruleBase = newLem("Rulebase");
+
+ attachId(ruleBase, packageDescr.getName(), false);
+
+// visitChildren(elassert,packageDescr.getAttributes());
+// visitChildren(elassert,packageDescr.getFactTemplates());
+// visitChildren(elassert,packageDescr.getFunctionImports());
+// visitChildren(elassert,packageDescr.getFunctions());
+// visitChildren(elassert,packageDescr.getGlobals());
+// visitChildren(elassert,packageDescr.getImports());
+// visitChildren(elassert,packageDescr.getTypeDeclarations());
+ visitChildren(ruleBase,packageDescr.getRules());
+
+//
+
+
+// for (String varId : context.getVariables())
+// rulebase.appendChild(context.getVariable(varId));
+
+ elassert.appendChild(ruleBase);
+ root.appendChild(elassert);
+ dox.appendChild(root);
+ }
+
+ public void visitPredicateDescr(final PredicateDescr descr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitRestrictionConnectiveDescr(final RestrictionConnectiveDescr descr) {
+ Element atom = dox.createElement("Atom");
+ Element reify = dox.createElement("Reify");
+ Element connective = null;
+ if (descr.getConnective() == RestrictionConnectiveDescr.AND)
+ connective = dox.createElement("And");
+ else if (descr.getConnective() == RestrictionConnectiveDescr.OR)
+ connective = dox.createElement("Or");
+ else throw new UnsupportedOperationException("Found unknown connective "+descr.getConnective());
+ visitChildren(connective, descr.getRestrictions());
+
+ reify.appendChild(connective);
+ atom.appendChild(reify);
+ context.getCurrentElement().appendChild(atom);
+ }
+
+ public void visitReturnValueRestrictionDescr(final ReturnValueRestrictionDescr descr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+
+ public void visitRuleDescr(final RuleDescr descr) {
+
+ context.setRuleName(descr.getName());
+
+ String priorS = null;
+ String modeS = null;
+ String kindS = null;
+
+ AttributeDescr prior = descr.getAttributes().get(DroolsSoftKeywords.PRIOR);
+ if (prior != null)
+ priorS = prior.getValue();
+
+ AttributeDescr mode = descr.getAttributes().get(DroolsSoftKeywords.ENTAIL);
+ if (mode != null)
+ modeS = mode.getValue();
+
+ AttributeDescr kind = descr.getAttributes().get(DroolsSoftKeywords.TYPE);
+ if (kind != null)
+ kindS = mode.getValue();
+
+ Element arrow = null;
+ if (modeS != null && modeS.equalsIgnoreCase("equivalence")) {
+ arrow = newLem("Equivalent");
+ } else {
+ arrow = newLem("Implies");
+ }
+//
+ arrow.setAttribute("direction", "forward");
+ if (kindS != null)
+ arrow.setAttribute("kind", kindS);
+//
+ attachId(arrow,descr.getName(),false);
+
+ if (priorS != null) {
+ Element degree = dox.createElement("Degree");
+ Element data = dox.createElement("Data");
+ data.setTextContent(priorS);
+ degree.appendChild(data);
+ arrow.appendChild(degree);
+ }
+//
+//
+//
+ Element body = dox.createElement("body");
+ visitChild(body,descr.getLhs());
+ arrow.appendChild(body);
+
+ Element head = dox.createElement("head");
+ Element atom = dox.createElement("Atom");
+ atom.appendChild(dox.createElement("Rel"));
+ Element cons = dox.createElement("Data");
+ cons.setTextContent(descr.getConsequence().toString());
+ atom.appendChild(cons);
+ head.appendChild(atom);
+ arrow.appendChild(head);
+//
+ context.getCurrentElement().appendChild(arrow);
+
+
+ }
+
+ public void visitQueryDescr(final QueryDescr descr) {
+ //TODO
+ throw new UnsupportedOperationException();
+ }
+
+
+
+ public void format(Document dox, OutputStream out) {
+
+ try {
+
+ // create DOMSource for source XML document
+ Source xmlSource = new DOMSource(dox);
+
+ Result result = new StreamResult(new OutputStreamWriter(out,"UTF-8"));
+
+ TransformerFactory transformerFactory = TransformerFactory
+ .newInstance();
+ transformerFactory.setAttribute("indent-number", 4);
+
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+
+ transformer.setOutputProperty("indent", "yes"); //Java XML Indent
+
+ // transform and deliver content to client
+ transformer.transform(xmlSource, result);
+ } catch (Exception e) {
+
+ }
+
+
+
+ }
+
+
+
+ private void attachId(Element element, String label, boolean isVar) {
+ Element oid = dox.createElement("oid");
+ Element holder = dox.createElement(isVar ? "Var" : "Data");
+ if (isVar)
+ holder.setAttribute("xsi:type","xs:ID");
+ holder.setTextContent(label);
+ oid.appendChild(holder);
+ element.appendChild(oid);
+ }
+
+
+ protected void visitChildren(Element curElem, List<? extends BaseDescr> children) {
+ Element prevEl = context.getCurrentElement();
+ for (BaseDescr child : children) {
+ context.setCurrentElement(curElem);
+ visit(child);
+ }
+ context.setCurrentElement(prevEl);
+ }
+
+
+ protected void visitChildrenExcludeDuplicates(Element curElem, List<? extends BaseDescr> children) {
+ Element prevEl = context.getCurrentElement();
+ BaseDescr previous = null;
+ for (BaseDescr child : children) {
+ context.setCurrentElement(curElem);
+
+ if (previous != null && previous instanceof FieldBindingDescr) {
+ if ( ((FieldBindingDescr) previous).getFieldConstraint() != child ) {
+ //VISIT THE CHILD ONLY IF IT IS HAS NOT YET BEEN...
+ visit(child);
+ }
+
+ } else {
+ visit(child);
+ }
+ previous = child;
+ }
+ context.setCurrentElement(prevEl);
+ }
+
+
+
+
+ protected void visitChild(Element curElem, BaseDescr child) {
+ Element popEl = context.getCurrentElement();
+ context.setCurrentElement(curElem);
+ visit(child);
+ context.setCurrentElement(popEl);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ public void visitAccessorDescr(AccessorDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitActionDescr(ActionDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitBehaviorDescr(BehaviorDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitCutDescr(CutDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitDeclarativeInvokerDescr(DeclarativeInvokerDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitEntryPointDescr(EntryPointDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitEqvDescr(EqvDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitEvaluatorBasedRestrictionDescr(
+ EvaluatorBasedRestrictionDescr descr) {
+
+ Element atom = dox.createElement("Atom");
+ context.setCurrentElement(atom);
+
+ Element rel = dox.createElement("Rel");
+ rel.setTextContent(descr.getEvaluator());
+ attachAsOp(atom,rel);
+
+
+ Element slot = dox.createElement("slot");
+ Element field = dox.createElement("Ind");
+ field.setTextContent(context.getCurrentField());
+ slot.appendChild(field);
+
+ Element value = dox.createElement("Var");
+ value.setTextContent(context.getCurrentObjectVariable());
+ slot.appendChild(value);
+
+ String varField = context.getCurrentFieldVariable();
+ if (varField == null) {
+
+ atom.appendChild(slot);
+
+ } else {
+ context.addVariableDefinition(varField, buildEquality(varField, slot,true));
+
+ Element var = dox.createElement("Var");
+ var.setTextContent(varField);
+ atom.appendChild(var);
+ }
+
+
+ }
+
+
+ public void visitFactTemplateDescr(FactTemplateDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitFieldAccessDescr(FieldAccessDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitForAnyDescr(ForAnyDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitFunctionCallDescr(FunctionCallDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitFunctionImportDescr(FunctionImportDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitGlobalDescr(GlobalDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitHedgeDescr(HedgeDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitImportDescr(ImportDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitMethodAccessDescr(MethodAccessDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitPatternSourceDescr(PatternSourceDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitProcessDescr(ProcessDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitRestriction(Restriction descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitReturnValueDescr(ReturnValueDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitSlidingWindowDescr(SlidingWindowDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitTypeDeclarationDescr(TypeDeclarationDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitTypeFieldDescr(TypeFieldDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitXorDescr(XorDescr descr) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException();
+ }
+
+
+ public void visitImpliesDescr(ImpliesDescr descr) {
+ //No body / head element wrappers to denote it is just an operator
+ Element imp = dox.createElement("Implies");
+
+ if (descr.getLabel() != null && ! descr.getLabel().equals(""))
+ attachId(imp,descr.getLabel(),false);
+
+ if (descr.getParams() != null && ! descr.getParams().equals("")) {
+ imp.setAttribute("kind", descr.getParams());
+ }
+
+ //At pattern level, a field binding is always ALSO followed by its Restriction
+ //So we have to work around this...
+ visitChildren(imp, descr.getDescrs());
+
+
+ context.getCurrentElement().appendChild(imp);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class RuleMLContext {
+
+ private Element currentElement;
+
+ private String ruleName;
+
+ private String classType;
+
+ private String currentObjectVariable;
+
+ private String currentField;
+
+ private String currentFieldVariable;
+
+ private Map<String, Element> variables = new HashMap<String, Element>();
+
+
+
+ public String validateVariable(String id) {
+ if (variables.containsKey(id)) {
+
+ int idx = id.lastIndexOf("_");
+ if (idx < 0) {
+ id = id+"_1";
+ } else {
+ String tail = id.substring(idx+1);
+ try {
+ int cod = Integer.valueOf(tail) + 1;
+ id = id.substring(0,idx)+"_"+cod;
+ } catch (NumberFormatException nfe) {
+ id = id+"_1";
+ }
+ }
+ return validateVariable(id);
+ }
+ return id;
+ }
+
+ public void addVariableDefinition(String id, Element element) {
+ variables.put(id,element);
+ }
+
+ public Element getVariable(String id) {
+ return variables.get(id);
+ }
+
+ public boolean isVariable(String id) {
+ return variables.containsKey(id);
+ }
+
+ public String contextualizeVar(String id) {
+ for (String varId : variables.keySet())
+ if (varId.startsWith(this.getRuleName()) && varId.endsWith(id))
+ return varId;
+ return "";
+ }
+
+ public Collection<String> getVariables() {
+ return variables.keySet();
+ }
+
+
+ /**
+ * @param currentElement the currentElement to set
+ */
+ public Element setCurrentElement(Element currentElement) {
+ Element ans = this.currentElement;
+ this.currentElement = currentElement;
+ return ans;
+ }
+
+ /**
+ * @return the currentElement
+ */
+ public Element getCurrentElement() {
+ return currentElement;
+ }
+
+ /**
+ * @param ruleName the ruleName to set
+ */
+ public void setRuleName(String ruleName) {
+ this.ruleName = ruleName;
+ }
+
+ /**
+ * @return the ruleName
+ */
+ public String getRuleName() {
+ return ruleName;
+ }
+
+ /**
+ * @param className the className to set
+ */
+ public void setClassType(String className) {
+ this.classType = className;
+ }
+
+ /**
+ * @return the className
+ */
+ public String getClassType() {
+ return classType;
+ }
+
+ /**
+ * @param currentObjectVariable the currentObjectVariable to set
+ */
+ public void setCurrentObjectVariable(String currentObjectVariable) {
+ this.currentObjectVariable = validateVariable(currentObjectVariable);
+ }
+
+ /**
+ * @return the currentObjectVariable
+ */
+ public String getCurrentObjectVariable() {
+ return currentObjectVariable;
+ }
+
+ /**
+ * @param currentField the currentField to set
+ */
+ public void setCurrentField(String currentField) {
+ this.currentField = currentField;
+ }
+
+ /**
+ * @return the currentField
+ */
+ public String getCurrentField() {
+ return currentField;
+ }
+
+ /**
+ * @param currentFieldVariable the currentFieldVariable to set
+ */
+ public void setCurrentFieldVariable(String currentFieldVariable) {
+ this.currentFieldVariable = validateVariable(currentFieldVariable);
+ }
+
+ /**
+ * @return the currentFieldVariable
+ */
+ public String getCurrentFieldVariable() {
+ return currentFieldVariable;
+ }
+
+
+ public Element appendChild(Element el) {
+ return (Element) this.getCurrentElement().appendChild(el);
+ }
+
+ }
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
More information about the jboss-svn-commits
mailing list