You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tf...@apache.org on 2013/03/23 21:32:39 UTC
svn commit: r1460227 - in /db/torque/torque4/trunk/torque-generator: ./
src/main/java/org/apache/torque/generator/configuration/outlet/
src/main/java/org/apache/torque/generator/template/groovy/
src/main/resources/org/apache/torque/generator/configurat...
Author: tfischer
Date: Sat Mar 23 20:32:39 2013
New Revision: 1460227
URL: http://svn.apache.org/r1460227
Log:
TORQUE-272 Support groovy templates out of the box
Added:
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandlerFactory.java
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/TorqueGenGroovy.java
db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/
- copied from r1456690, db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/
db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.gtl
- copied, changed from r1456690, db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/src/main/torque-gen/templates/template.groovy
db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyTemplateTest.java
- copied, changed from r1456690, db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/OtherTemplateLanguageTest.java
Removed:
db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/groovyOutlet.xsd
db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.groovy
db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java
db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/OtherTemplateLanguageTest.java
db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java
db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/
Modified:
db/torque/torque4/trunk/torque-generator/pom.xml
db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/OutletConfigurationTags.java
db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/outlet.xsd
db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/outlets/outlets.xml
Modified: db/torque/torque4/trunk/torque-generator/pom.xml
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/pom.xml?rev=1460227&r1=1460226&r2=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/pom.xml (original)
+++ db/torque/torque4/trunk/torque-generator/pom.xml Sat Mar 23 20:32:39 2013
@@ -39,11 +39,6 @@
<dependencies>
<dependency>
- <groupId>org.apache.velocity</groupId>
- <artifactId>velocity</artifactId>
- <version>1.7</version>
- </dependency>
- <dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>2.1.0.201209190230-r</version>
@@ -85,6 +80,17 @@
<version>1.4</version>
</dependency>
<dependency>
+ <groupId>org.apache.velocity</groupId>
+ <artifactId>velocity</artifactId>
+ <version>1.7</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy-all</artifactId>
+ <version>2.1.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<!--
We do not depend on any xerces features. However, the standard
xml parser packaged in java is sometimes buggy (e.g.1.6.0_20 on windows)
@@ -119,12 +125,6 @@
<version>10.5.3.0_1</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
- <version>1.6.0</version>
- <scope>test</scope>
- </dependency>
</dependencies>
<build>
Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java?rev=1460227&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandler.java Sat Mar 23 20:32:39 2013
@@ -0,0 +1,162 @@
+package org.apache.torque.generator.configuration.outlet;
+
+/*
+ * 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 static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_ENCODING_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_NAME_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_OPTIONS_IN_BINDING_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_PATH_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_SOURCE_ATTRIBUTES_IN_BINDING_ATTRIBUTE;
+import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.OUTLET_VARIABLES_IN_BINDING_ATTRIBUTE;
+
+import org.apache.torque.generator.configuration.ConfigurationException;
+import org.apache.torque.generator.configuration.ConfigurationHandlers;
+import org.apache.torque.generator.configuration.ConfigurationProvider;
+import org.apache.torque.generator.configuration.SaxHelper;
+import org.apache.torque.generator.configuration.UnitDescriptor;
+import org.apache.torque.generator.qname.QualifiedName;
+import org.apache.torque.generator.template.groovy.GroovyOutlet;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * Handles a declaration of a groovy outlet within a outlet
+ * configuration file.
+ */
+class GroovyOutletSaxHandler extends OutletSaxHandler
+{
+ /**
+ * Constructor.
+ *
+ * @param outletName the name for the outlet which configuration
+ * will be read in by the generated SaxHandlerFactory,
+ * or null if the name of the outlet should be determined from
+ * the parsed XML.
+ * @param configurationProvider The access object for the configuration
+ * files, not null.
+ * @param unitDescriptor The description of the generation unit, not null.
+ * @param configurationHandlers the available configuration handlers,
+ * not null.
+ *
+ * @throws SAXException if an error occurs during creation of the outlet.
+ */
+ public GroovyOutletSaxHandler(
+ QualifiedName outletName,
+ ConfigurationProvider configurationProvider,
+ UnitDescriptor unitDescriptor,
+ ConfigurationHandlers configurationHandlers)
+ throws SAXException
+ {
+ super(outletName,
+ configurationProvider,
+ unitDescriptor,
+ configurationHandlers);
+ }
+
+ /**
+ * Instantiates and configures a groovy outlet.
+ *
+ * @param outletName the name for the outlet which configuration
+ * will be read in by the generated SaxHandlerFactory,
+ * or null if the name of the outlet should be determined from
+ * the parsed xml.
+ * @param uri - The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace processing is not
+ * being performed.
+ * @param localName - The local name (without prefix), or
+ * the empty string if Namespace processing is not being performed.
+ * @param rawName - The qualified name (with prefix), or the empty string if
+ * qualified names are not available.
+ * @param attributes - The attributes attached to the element.
+ * If there are no attributes, it shall be an empty Attributes
+ * object.
+ *
+ * @return the created outlet, not null.
+ *
+ * @throws SAXException if an error occurs during creation.
+ */
+ protected GroovyOutlet createOutlet(
+ QualifiedName outletName,
+ String uri,
+ String localName,
+ String rawName,
+ Attributes attributes)
+ throws SAXException
+ {
+ if (outletName == null)
+ {
+ String nameAttribute
+ = attributes.getValue(OUTLET_NAME_ATTRIBUTE);
+ if (nameAttribute == null)
+ {
+ throw new SAXException("The attribute "
+ + OUTLET_NAME_ATTRIBUTE
+ + " must be set on the element "
+ + rawName
+ + " for Groovy Outlets");
+ }
+ outletName = new QualifiedName(nameAttribute);
+ }
+
+ String encoding = attributes.getValue(OUTLET_ENCODING_ATTRIBUTE);
+ String path = attributes.getValue(OUTLET_PATH_ATTRIBUTE);
+
+ try
+ {
+ GroovyOutlet result
+ = new GroovyOutlet(
+ outletName,
+ getConfigurationProvider(),
+ path,
+ encoding);
+ Boolean optionsInContext = SaxHelper.getBooleanAttribute(
+ OUTLET_OPTIONS_IN_BINDING_ATTRIBUTE,
+ attributes,
+ "the groovyOutlet" + outletName);
+ if (optionsInContext != null)
+ {
+ result.setOptionsInBinding(optionsInContext);
+ }
+ Boolean sourceElementAttributesInContext
+ = SaxHelper.getBooleanAttribute(
+ OUTLET_SOURCE_ATTRIBUTES_IN_BINDING_ATTRIBUTE,
+ attributes,
+ "the groovyOutlet" + outletName);
+ if (sourceElementAttributesInContext != null)
+ {
+ result.setSourceAttributesInBinding(
+ sourceElementAttributesInContext);
+ }
+ Boolean variablesInContext = SaxHelper.getBooleanAttribute(
+ OUTLET_VARIABLES_IN_BINDING_ATTRIBUTE,
+ attributes,
+ "the groovyOutlet" + outletName);
+ if (variablesInContext != null)
+ {
+ result.setVariablesInContext(variablesInContext);
+ }
+ return result;
+ }
+ catch (ConfigurationException e)
+ {
+ throw new SAXException(e);
+ }
+ }
+}
Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandlerFactory.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandlerFactory.java?rev=1460227&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandlerFactory.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/GroovyOutletSaxHandlerFactory.java Sat Mar 23 20:32:39 2013
@@ -0,0 +1,81 @@
+package org.apache.torque.generator.configuration.outlet;
+
+/*
+ * 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 org.apache.torque.generator.configuration.ConfigurationHandlers;
+import org.apache.torque.generator.configuration.ConfigurationProvider;
+import org.apache.torque.generator.configuration.UnitDescriptor;
+import org.apache.torque.generator.qname.QualifiedName;
+import org.xml.sax.SAXException;
+
+/**
+ * Creates Groovy outlet SAX handlers.
+ */
+public class GroovyOutletSaxHandlerFactory
+ implements TypedOutletSaxHandlerFactory
+{
+ /**
+ * The type of the outlets which can be processed by the
+ * OutletSaxHandlers created by this factory.
+ */
+ private static final String OUTLET_TYPE = "groovyOutlet";
+
+ /**
+ * Returns the outlet type which can be handled by the
+ * OutletSaxHandlers created by this factory.
+ *
+ * @return "groovyOutlet".
+ */
+ public String getType()
+ {
+ return OUTLET_TYPE;
+ }
+
+ /**
+ * Returns a GroovyOutletSaxHandler for reading the configuration of
+ * Groovy outlets. This implementation uses the provided name
+ * as outlet name.
+ *
+ * @param outletName the name for the outlet which configuration
+ * will be read in by the generated SaxHandlerFactory,
+ * or null if the name of the outlet should be determined from
+ * the parsed xml.
+ * @param configurationProvider The access object for the configuration
+ * files, not null.
+ * @param unitDescriptor The description of the generation unit, not null.
+ * @param configurationHandlers the available configuration handlers,
+ * not null.
+ *
+ * @return a new GroovyOutletSaxHandler.
+ */
+ public final OutletSaxHandler getOutletSaxHandler(
+ QualifiedName outletName,
+ ConfigurationProvider configurationProvider,
+ UnitDescriptor unitDescriptor,
+ ConfigurationHandlers configurationHandlers)
+ throws SAXException
+ {
+ return new GroovyOutletSaxHandler(
+ outletName,
+ configurationProvider,
+ unitDescriptor,
+ configurationHandlers);
+ }
+}
Modified: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/OutletConfigurationTags.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/OutletConfigurationTags.java?rev=1460227&r1=1460226&r2=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/OutletConfigurationTags.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/configuration/outlet/OutletConfigurationTags.java Sat Mar 23 20:32:39 2013
@@ -74,6 +74,28 @@ public final class OutletConfigurationTa
public static final String OUTLET_VARIABLES_IN_CONTEXT_ATTRIBUTE
= "variablesInContext";
+ /**
+ * Attribute name for the attribute "optionsInBinding"
+ * of the "outlet" tag.
+ */
+ public static final String OUTLET_OPTIONS_IN_BINDING_ATTRIBUTE
+ = "optionsInBinding";
+
+ /**
+ * Attribute name for the attribute "sourceAttributesInBinding"
+ * of the "outlet" tag.
+ */
+ public static final String
+ OUTLET_SOURCE_ATTRIBUTES_IN_BINDING_ATTRIBUTE
+ = "sourceAttributesInBinding";
+
+ /**
+ * Attribute name for the attribute "variablesInBinding"
+ * of the "outlet" tag.
+ */
+ public static final String OUTLET_VARIABLES_IN_BINDING_ATTRIBUTE
+ = "variablesInBinding";
+
/** Tag name for the "input" tag. */
public static final String INPUT_TAG = "input";
Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java?rev=1460227&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/GroovyOutlet.java Sat Mar 23 20:32:39 2013
@@ -0,0 +1,324 @@
+package org.apache.torque.generator.template.groovy;
+
+/*
+ * 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 groovy.lang.Writable;
+import groovy.text.GStringTemplateEngine;
+import groovy.text.Template;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.torque.generator.GeneratorException;
+import org.apache.torque.generator.configuration.ConfigurationException;
+import org.apache.torque.generator.configuration.ConfigurationProvider;
+import org.apache.torque.generator.control.ControllerState;
+import org.apache.torque.generator.option.Option;
+import org.apache.torque.generator.option.Options;
+import org.apache.torque.generator.outlet.OutletResult;
+import org.apache.torque.generator.qname.Namespace;
+import org.apache.torque.generator.qname.QualifiedName;
+import org.apache.torque.generator.qname.QualifiedNameMap;
+import org.apache.torque.generator.source.SourceElement;
+import org.apache.torque.generator.template.TemplateOutletImpl;
+import org.apache.torque.generator.variable.Variable;
+import org.apache.torque.generator.variable.VariableStore;
+
+
+/**
+ * A Outlet which uses a groovy script for generation.
+ */
+public class GroovyOutlet extends TemplateOutletImpl
+{
+ /**
+ * The name under which the Torque generator interface will be put
+ * into the binding.
+ */
+ public static final String TORQUE_GEN_BINDING_NAME = "torqueGen";
+
+ /**
+ * The key under which the null attribute of a source element is put
+ * into the binding.
+ */
+ public static final String NULL_KEY_BINDING_NAME = "value";
+
+ /** The log. */
+ private static Log log = LogFactory.getLog(GroovyOutlet.class);
+
+ /**
+ * Whether the options should be put into the context.
+ */
+ private boolean optionsInBinding = true;
+
+ /**
+ * Whether the variables should be put into the context.
+ */
+ private boolean variablesInBinding = true;
+
+ /**
+ * Whether the attributes of the current source element should be put
+ * into the context.
+ */
+ private boolean sourceAttributesInBinding = true;
+
+ /**
+ * Constructs a new GroovyOutlet.
+ *
+ * @param name the name of this outlet, not null.
+ * @param configurationProvider the provider for reading the templates,
+ * not null.
+ * @param path the path to the templates, not null.
+ * @param encoding the encoding of the file, or null if the system's
+ * default encoding should be used.
+ *
+ * @throws NullPointerException if name, path or directories are null.
+ * @throws ConfigurationException if an error occurs while reading the
+ * template.
+ */
+ public GroovyOutlet(
+ QualifiedName name,
+ ConfigurationProvider configurationProvider,
+ String path,
+ String encoding)
+ throws ConfigurationException
+ {
+ super(name,
+ configurationProvider,
+ path,
+ encoding,
+ null);
+ }
+
+ /**
+ * Executes the generation process; the result is returned.
+ *
+ * @param controllerState the current controller state.
+ *
+ * @return the result of the generation, not null.
+ *
+ * @see org.apache.torque.generator.outlet.Outlet#execute(ControllerState)
+ */
+ @Override
+ public OutletResult execute(ControllerState controllerState)
+ throws GeneratorException
+
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("Start executing GroovyOutlet " + getName());
+ }
+
+ SourceElement sourceElement = controllerState.getSourceElement();
+
+ String inputElementName = getInputElementName();
+ if (inputElementName != null
+ && !inputElementName.equals(sourceElement.getName()))
+ {
+ throw new GeneratorException("Input element name, "
+ + sourceElement.getName()
+ + ", is not the expected name, "
+ + getInputElementName()
+ + ", for outlet "
+ + getName());
+ }
+
+ try
+ {
+ Map<String, Object> binding = createBinding(controllerState);
+
+ GStringTemplateEngine templateEngine = new GStringTemplateEngine();
+ Template template = templateEngine.createTemplate(
+ getContent(controllerState));
+ Writable writable = template.make(binding);
+ String result = writable.toString();
+ return new OutletResult(result);
+ }
+ catch (Exception e)
+ {
+ throw new GeneratorException(e);
+ }
+ finally
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("End executing GroovyOutlet " + getName());
+ }
+ }
+ }
+
+
+ public Map<String, Object> createBinding(ControllerState controllerState)
+ {
+ Map<String, Object> binding = new HashMap<String, Object>();
+ binding.put(
+ TORQUE_GEN_BINDING_NAME,
+ new TorqueGenGroovy(this, controllerState));
+ if (optionsInBinding)
+ {
+ // Only consider options visible from the current namespace.
+ Options visibleOptions
+ = controllerState.getVisibleOptions();
+ for (Option option : visibleOptions.values())
+ {
+ QualifiedName qualifiedName = option.getQualifiedName();
+ binding.put(qualifiedName.getName(), option.getValue());
+ }
+ log.debug("Put options in context " + visibleOptions.keySet());
+ }
+ else
+ {
+ log.debug("options in binding are disabled");
+ }
+
+ SourceElement sourceElement = controllerState.getSourceElement();
+ if (sourceAttributesInBinding)
+ {
+ Set<String> attributes = sourceElement.getAttributeNames();
+ for (String key : attributes)
+ {
+ Object value = sourceElement.getAttribute(key);
+ if (key == null)
+ {
+ // The null key cannot be accessed in the binding.
+ // So if the attribute NULL_KEY_CONTEXT_NAME does not
+ // exist, use this as attribute name.
+ if (sourceElement.getAttributeNames().contains(
+ NULL_KEY_BINDING_NAME))
+ {
+ continue;
+ }
+ key = NULL_KEY_BINDING_NAME;
+ }
+ binding.put(key, value);
+ }
+ log.debug("Put attributes in binding " + attributes);
+ }
+ else
+ {
+ log.debug("source attributes in binding are disabled");
+ }
+
+ if (variablesInBinding)
+ {
+ // Only consider variables visible from the namespace
+ // of this outlet. If a name exists in different
+ // namespaces visible from this namespace,
+ // only consider the most significant name.
+ Namespace namespace = getName().getNamespace();
+ VariableStore variableStore
+ = controllerState.getVariableStore();
+ QualifiedNameMap<Variable> visibleVariables
+ = variableStore
+ .getContent()
+ .getInHierarchy(namespace);
+ for (Variable variable : visibleVariables.values())
+ {
+ QualifiedName qualifiedName = variable.getName();
+ binding.put(
+ qualifiedName.getName(),
+ variable.getValue());
+ }
+ log.debug("Put variables in binding "
+ + visibleVariables.keySet());
+ }
+ else
+ {
+ log.debug("variables in binding are disabled");
+ }
+ return binding;
+ }
+
+ /**
+ * Tells the outlet to put all options which name space is visible to
+ * the namespace of this outlet into the binding.
+ * Only the variable names are used as keys in the context, the namespaces
+ * are stripped.
+ *
+ * @param optionsInBinding whether to put the options into the context.
+ */
+ public void setOptionsInBinding(boolean optionsInBinding)
+ {
+ this.optionsInBinding = optionsInBinding;
+ }
+
+ /**
+ * Returns whether all options which namespaces are visible to
+ * the name space of this outlet are put into the binding.
+ *
+ * @return whether the outlet puts the options into the context.
+ */
+ public boolean isOptionsInBinding()
+ {
+ return optionsInBinding;
+ }
+
+ /**
+ * Tells the outlet to put all variables which are visible to this
+ * outlet into the binding.
+ * Only the variable names are used as keys in the binding, the namespaces
+ * are stripped.
+ *
+ * @param variablesInBinding whether to put the variables into the context.
+ */
+ public void setVariablesInContext(boolean variablesInBinding)
+ {
+ this.variablesInBinding = variablesInBinding;
+ }
+
+ /**
+ * Returns whether all variables which are visible to this
+ * outlet are put into the binding.
+ *
+ * @return whether the outlet puts the variables into the binding.
+ */
+ public boolean isVariablesInBinding()
+ {
+ return variablesInBinding;
+ }
+
+ /**
+ * Tells the outlet to put the attributes of the current source element
+ * into the binding or not.
+ *
+ * @param sourceAttributesInBinding whether to put the source attributes
+ * into the binding.
+ */
+ public void setSourceAttributesInBinding(
+ boolean sourceAttributesInBinding)
+ {
+ this.sourceAttributesInBinding = sourceAttributesInBinding;
+ }
+
+ /**
+ * Returns whether the attributes of the current source element
+ * are put into the binding.
+ *
+ * @return whether the outlet puts the attributes of the current source
+ * element into the binding.
+ */
+ public boolean isSourceAttributesInBinding()
+ {
+ return sourceAttributesInBinding;
+ }
+
+}
Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/TorqueGenGroovy.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/TorqueGenGroovy.java?rev=1460227&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/TorqueGenGroovy.java (added)
+++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/generator/template/groovy/TorqueGenGroovy.java Sat Mar 23 20:32:39 2013
@@ -0,0 +1,330 @@
+package org.apache.torque.generator.template.groovy;
+
+/*
+ * 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 java.io.File;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.torque.generator.GeneratorException;
+import org.apache.torque.generator.control.ControllerState;
+import org.apache.torque.generator.source.SourceElement;
+import org.apache.torque.generator.variable.Variable;
+
+/**
+ * This class acts as an interface to the Torque generator from the
+ * templates. It lets the user access Torque generator properties from the
+ * templates, and allows to execute certain action from within the templates.
+ */
+public class TorqueGenGroovy
+{
+ /**
+ * The state of the controller in which this generator interface is used.
+ */
+ private ControllerState controllerState;
+
+ /**
+ * The outlet in which context this class is used.
+ */
+ private GroovyOutlet outlet;
+
+ /**
+ * A counter which can be used in velocity templates.
+ */
+ private static int counter = 1;
+
+ /**
+ * Constructs a generator interface within the given controllerState.
+ *
+ * @param outlet the outlet in which this generator interface will be used,
+ * not null.
+ * @param controllerState the controller context.
+ *
+ * @throws NullPointerException if outlet or controllerState are null.
+ */
+ public TorqueGenGroovy(
+ GroovyOutlet outlet,
+ ControllerState controllerState)
+ {
+ if (controllerState == null)
+ {
+ throw new NullPointerException("controllerState may not be null");
+ }
+ if (outlet == null)
+ {
+ throw new NullPointerException("outlet may not be null");
+ }
+ this.controllerState = controllerState;
+ this.outlet = outlet;
+ }
+
+ /**
+ * Processes the mergepoint with the given name.
+ *
+ * @param mergepointName the name of the mergepoint.
+ * @return the output generated by the mergepoint.
+ * @throws GeneratorException if the mergepoint could not be processed
+ * completely.
+ */
+ public String mergepoint(String mergepointName)
+ throws GeneratorException
+ {
+ return outlet.mergepoint(mergepointName, controllerState);
+ }
+
+ /**
+ * Returns the current controller state.
+ *
+ * @return The current controller state, never null.
+ */
+ public ControllerState getControllerState()
+ {
+ return controllerState;
+ }
+
+ /**
+ * Returns the current source element. This method is shorthand for
+ * <code>getControllerState().getSourceElement()</code>
+ *
+ * @return the current source element, never null.
+ */
+ public SourceElement getSourceElement()
+ {
+ return controllerState.getSourceElement();
+ }
+
+ /**
+ * Returns all children of the current source element.
+ * This method is shorthand for
+ * <code>getSourceElement().getChildren()</code>
+ *
+ * @return the children of the current source element, never null.
+ */
+ public List<SourceElement> getChildren()
+ {
+ return getSourceElement().getChildren();
+ }
+
+ /**
+ * Returns the children of the current source element with a certain name.
+ * This method is shorthand for
+ * <code>getSourceElement().getChildren(name)</code>
+ *
+ * @param name the name of the children elements to select.
+ *
+ * @return the children of the current source element with the name name,
+ * never null.
+ */
+ public List<SourceElement> getChildren(String name)
+ {
+ return getSourceElement().getChildren(name);
+ }
+
+ /**
+ * Returns the first child of the current source element
+ * with the given name.
+ * This method is shorthand for
+ * <code>getSourceElement().getChild(name)</code>
+ *
+ * @param name the name of the child element to select.
+ *
+ * @return the first child with the given name, or null if no such child
+ * exists.
+ */
+ public SourceElement getChild(String name)
+ {
+ return getSourceElement().getChild(name);
+ }
+
+ /**
+ * Returns the parent of the current source element.
+ * <code>getSourceElement().getParent()</code>
+ *
+ * @return the parent of the current source element, or null if the current
+ * source element has no parent.
+ */
+ public SourceElement getParent()
+ {
+ return getSourceElement().getParent();
+ }
+
+ /**
+ * Returns the option with the given key. The key can either be a name
+ * prefixed with a namespace, or a name without namespace, in which case
+ * the namespace of the currently active outlet is used.
+ *
+ * In the case that the option is not set in this namespace, the parent
+ * namespaces are searched recursively. If the option is not set in any
+ * of the parent namespaces, null is returned.
+ *
+ * @param key the key for the option to retrieve.
+ * @return the option for the given key.
+ */
+ public Object option(String key)
+ {
+ Object result = controllerState.getOption(key);
+
+ return result;
+ }
+
+ /**
+ * Returns the option with the given key as boolean value.
+ * The key can either be a name prefixed with a namespace,
+ * or a name without namespace, in which case the namespace of the
+ * currently active outlet is used.
+ *
+ * In the case that the option is not set in this namespace, the parent
+ * namespaces are searched recursively. If the option is not set in any
+ * of the parent namespaces, false is returned.
+ *
+ * @param key the key for the option to retrieve.
+ * @return the option for the given key, converted to a boolean
+ */
+ public boolean booleanOption(String key)
+ {
+ boolean result = controllerState.getBooleanOption(key);
+
+ return result;
+ }
+
+ /**
+ * Returns the option with the given key as int value.
+ * The key can either be a name prefixed with a namespace,
+ * or a name without namespace, in which case the namespace of the
+ * currently active outlet is used.
+ *
+ * In the case that the option is not set in this namespace, the parent
+ * namespaces are searched recursively. If the option is not set in any
+ * of the parent namespaces or empty, 0 is returned.
+ *
+ * @param key the key for the option to retrieve.
+ * @return the option for the given key, converted to a boolean
+ */
+ public int intOption(String key)
+ {
+ Object optionValue = controllerState.getOption(key);
+ if (optionValue == null)
+ {
+ return 0;
+ }
+ String optionString = optionValue.toString();
+ if (StringUtils.isBlank(optionString))
+ {
+ return 0;
+ }
+
+ return Integer.parseInt(optionString);
+ }
+
+ /**
+ * Returns the variable with the given key. The key can either be a name
+ * prefixed with a namespace, or a name without namespace, in which case
+ * the namespace of the currently active outlet is used.
+ *
+ * In the case that the variable is not set in this namespace, the parent
+ * namespaces are searched recursively. If the variable is not set in any
+ * of the parent namespaces, null is returned.
+ *
+ * @param key the key for the variable to retrieve.
+ * @return the variable for the given key, or null if the variable is not
+ * set or explicitly set to null.
+ */
+ public Object getVariable(String key)
+ {
+ return outlet.getVariable(key, controllerState);
+ }
+
+ /**
+ * Sets a variable. The key can be given with or without namespace;
+ * in the latter case, the variable is set in the namespace of the
+ * currently active outlet.
+ * The Scope of the variable is this outlet and its children.
+ *
+ * @param key the name of the variable, not null
+ * @param value the value of the variable, may be null.
+ *
+ * @throws NullPointerException if key or scope is null.
+ * @throws IllegalArgumentException if the key is no valid QualifiedName.
+ */
+ public void setVariable(String key, Object value)
+ {
+ outlet.setVariable(key, value, controllerState);
+ }
+
+ /**
+ * Sets a variable. The key can be given with or without namespace;
+ * in the latter case, the variable is set in the namespace of the
+ * currently active outlet.
+ *
+ * @param key the name of the variable, not null.
+ * @param value the value of the variable, may be null.
+ * @param scope the scope of the variable, not null.
+ *
+ * @throws NullPointerException if key or scope is null.
+ * @throws IllegalArgumentException if the key is no valid QualifiedName.
+ */
+ public void setVariable(String key, Object value, String scope)
+ {
+ Variable.Scope scopeValue = Variable.Scope.valueOf(scope);
+ outlet.setVariable(key, value, scopeValue, controllerState);
+ }
+
+ /**
+ * Returns the currently processed source file.
+ *
+ * @return the source file which is currently processed.
+ */
+ public File getSourceFile()
+ {
+ return controllerState.getSourceFile();
+ }
+
+ /**
+ * Returns the current date.
+ *
+ * @return the current date, not null.
+ */
+ public Date now()
+ {
+ return new Date();
+ }
+
+ /**
+ * Returns a counter value which is increased each time this function is
+ * accessed. Start value is 1.
+ * If <code>resetCounter</code> is not called, the returned value is unique
+ * over the generation process.
+ *
+ * @return the counter value.
+ */
+ public static synchronized int getCounter()
+ {
+ return counter++;
+ }
+
+ /**
+ * Resets the counter accessible though <code>getCounter()</code> back to 1.
+ */
+ public static synchronized void resetCounter()
+ {
+ counter = 1;
+ }
+}
Modified: db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/outlet.xsd
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/outlet.xsd?rev=1460227&r1=1460226&r2=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/outlet.xsd (original)
+++ db/torque/torque4/trunk/torque-generator/src/main/resources/org/apache/torque/generator/configuration/outlet.xsd Sat Mar 23 20:32:39 2013
@@ -75,6 +75,18 @@
</complexContent>
</complexType>
+ <complexType name="groovyOutlet">
+ <complexContent>
+ <extension base="configuration:baseOutlet">
+ <attribute name="path" type="string" use="required"/>
+ <attribute name="optionsInBinding" type="string" use="optional"/>
+ <attribute name="sourceAttributesInBinding" type="string" use="optional"/>
+ <attribute name="variablesInBinding" type="string" use="optional"/>
+ <attribute name="encoding" type="string" use="optional"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
<complexType name="copyOutlet">
<complexContent>
<extension base="configuration:baseOutlet">
Modified: db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/outlets/outlets.xml
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/outlets/outlets.xml?rev=1460227&r1=1456690&r2=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/outlets/outlets.xml (original)
+++ db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/outlets/outlets.xml Sat Mar 23 20:32:39 2013
@@ -19,11 +19,11 @@
-->
<outlets xmlns="http://db.apache.org/torque/4.0/generator/configuration"
- xsi:schemaLocation="http://db.apache.org/torque/4.0/generator/configuration src/test/otherTemplateLanguages/groovyOutlet.xsd"
+ xsi:schemaLocation="http://db.apache.org/torque/4.0/generator/configuration http://db.apache.org/torque/4.0/generator/configuration.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<outlet name="testGroovyOutlet"
xsi:type="groovyOutlet"
- path="template.groovy">
+ path="template.gtl">
</outlet>
</outlets>
\ No newline at end of file
Copied: db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.gtl (from r1456690, db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/src/main/torque-gen/templates/template.groovy)
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.gtl?p2=db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.gtl&p1=db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/src/main/torque-gen/templates/template.groovy&r1=1456690&r2=1460227&rev=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/test/otherTemplateLanguages/src/main/torque-gen/templates/template.groovy (original)
+++ db/torque/torque4/trunk/torque-generator/src/test/groovyTemplates/src/main/torque-gen/templates/template.gtl Sat Mar 23 20:32:39 2013
@@ -1,4 +1,4 @@
-/*
+<% /*
* 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
@@ -15,5 +15,5 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- */
-return 'groovy test output'
\ No newline at end of file
+ */
+%>groovy template output: ${torqueGen.getSourceElement().getName()}
\ No newline at end of file
Copied: db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyTemplateTest.java (from r1456690, db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/OtherTemplateLanguageTest.java)
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyTemplateTest.java?p2=db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyTemplateTest.java&p1=db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/OtherTemplateLanguageTest.java&r1=1456690&r2=1460227&rev=1460227&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/configuration/outlet/OtherTemplateLanguageTest.java (original)
+++ db/torque/torque4/trunk/torque-generator/src/test/java/org/apache/torque/generator/template/groovy/GroovyTemplateTest.java Sat Mar 23 20:32:39 2013
@@ -1,4 +1,4 @@
-package org.apache.torque.generator.configuration.outlet;
+package org.apache.torque.generator.template.groovy;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -40,7 +40,7 @@ import org.junit.Test;
*
* @version $Id$
*/
-public class OtherTemplateLanguageTest
+public class GroovyTemplateTest
{
private static final File TARGET_DIR
= new File("target/test/otherTemplateLanguages");
@@ -60,13 +60,13 @@ public class OtherTemplateLanguageTest
* @throws Exception if an error occurs.
*/
@Test
- public void testOtherTemplateLanguages() throws Exception
+ public void testGroovyTemplate() throws Exception
{
Controller controller = new Controller();
List<UnitDescriptor> unitDescriptors = new ArrayList<UnitDescriptor>();
CustomProjectPaths projectPaths = new CustomProjectPaths(
new Maven2DirectoryProjectPaths(
- new File("src/test/otherTemplateLanguages")));
+ new File("src/test/groovyTemplates")));
projectPaths.setOutputDirectory(null, TARGET_DIR);
unitDescriptors.add(new UnitDescriptor(
UnitDescriptor.Packaging.DIRECTORY,
@@ -76,7 +76,7 @@ public class OtherTemplateLanguageTest
// TODO: check outcome against reference file
assertTrue(OUTPUT_FILE.exists());
assertEquals(
- "groovy test output",
+ "groovy template output: root",
FileUtils.readFileToString(OUTPUT_FILE));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org