Return-Path: Delivered-To: apmail-db-torque-dev-archive@www.apache.org Received: (qmail 38686 invoked from network); 16 Feb 2010 17:16:50 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 Feb 2010 17:16:50 -0000 Received: (qmail 97721 invoked by uid 500); 16 Feb 2010 17:16:50 -0000 Delivered-To: apmail-db-torque-dev-archive@db.apache.org Received: (qmail 97697 invoked by uid 500); 16 Feb 2010 17:16:50 -0000 Mailing-List: contact torque-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Apache Torque Developers List" Reply-To: "Apache Torque Developers List" Delivered-To: mailing list torque-dev@db.apache.org Received: (qmail 97687 invoked by uid 500); 16 Feb 2010 17:16:50 -0000 Received: (qmail 97684 invoked by uid 99); 16 Feb 2010 17:16:50 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Feb 2010 17:16:50 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Feb 2010 17:16:35 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4B5B62388A44; Tue, 16 Feb 2010 17:16:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r910600 [5/29] - in /db/torque/torque4/trunk: maven-torque-gf-plugin/ maven-torque-gf-plugin/src/ maven-torque-gf-plugin/src/main/ maven-torque-gf-plugin/src/main/java/ maven-torque-gf-plugin/src/main/java/org/ maven-torque-gf-plugin/src/ma... Date: Tue, 16 Feb 2010 17:16:02 -0000 To: torque-commits@db.apache.org From: tfischer@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100216171612.4B5B62388A44@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationSaxHandler.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationSaxHandler.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationSaxHandler.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationSaxHandler.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,354 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.generator.GeneratorConfigurationTags.GENERATORS_TAG; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_TAG; +import static org.apache.torque.gf.configuration.mergepoint.MergepointConfigurationTags.MERGEPOINT_TAG; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationEntityResolver; +import org.apache.torque.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.SaxHelper; +import org.apache.torque.gf.configuration.XMLConstants; +import org.apache.torque.gf.configuration.mergepoint.MergepointMapping; +import org.apache.torque.gf.configuration.mergepoint.MergepointSaxHandler; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.generator.Generator; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * A SAX handler which parses Generator configuration files. + * Relies on delegate handlers for parsing the configuration for + * the different generator types. + */ +public class GeneratorConfigurationSaxHandler extends DefaultHandler +{ + /** The access object for the configuration files, not null. */ + private ConfigurationProvider configurationProvider; + + /** The paths of the surrounding project, not null. */ + private ProjectPaths projectPaths; + + /** The list of generators which configuration was already parsed. */ + private List generators = new ArrayList(); + + /** + * The list of separate mergepoint mappings (outside the generators) + * which configuration was already parsed. + */ + private List mergepointMappings + = new ArrayList(); + + /** The available configuration handlers. */ + private ConfigurationHandlers configurationHandlers; + + /** + * The current delegate handler for parsing the current generator's + * configuration. Is null if no generator is currently parsed. + */ + private GeneratorSaxHandler generatorHandler; + + /** + * The current delegate handler for parsing the current mergepoint's + * configuration. Is null if no mergepoint is currently parsed. + */ + private MergepointSaxHandler mergepointHandler; + + /** The log. */ + private static Log log = LogFactory.getLog(GeneratorSaxHandler.class); + + /** + * Constructor. + * + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers The available configuration handlers, + * not null. + * + * @throws NullPointerException if an argument is null. + */ + public GeneratorConfigurationSaxHandler( + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + { + if (configurationProvider == null) + { + log.error("GeneratorConfigurationSaxHandler: " + + " configurationProvider is null"); + throw new NullPointerException("configurationProvider is null"); + } + if (projectPaths == null) + { + log.error("GeneratorConfigurationSaxHandler: " + + " projectPaths is null"); + throw new NullPointerException("projectPaths is null"); + } + if (configurationHandlers == null) + { + log.error("GeneratorConfigurationSaxHandler: " + + " configurationHandlers is null"); + throw new NullPointerException("configurationHandlers is null"); + } + this.configurationProvider = configurationProvider; + this.projectPaths = projectPaths; + this.configurationHandlers = configurationHandlers; + } + + /** + * Returns all generators which were configured in the parsed generator + * configuration file. + * + * @return all created generators, not null. + */ + public List getGenerators() + { + return generators; + } + + /** + * Returns all mergepoint mappings which were configured + * outside the generators in the parsed generator configuration file. + * + * @return all created mergepoint mappings, not null. + */ + public List getMergepointMappings() + { + return mergepointMappings; + } + + /** + * {@inheritDoc} + */ + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) + throws SAXException + { + String unqualifiedName = SaxHelper.getUnqualifiedName(localName, qName); + if (generatorHandler != null) + { + generatorHandler.startElement( + uri, localName, qName, attributes); + } + else if (mergepointHandler != null) + { + mergepointHandler.startElement( + uri, localName, qName, attributes); + } + else if (GENERATOR_TAG.equals(unqualifiedName)) + { + String generatorType = getGeneratorType(attributes); + generatorHandler = getGeneratorHandler( + null, + generatorType); + generatorHandler.startElement( + uri, localName, qName, attributes); + } + else if (MERGEPOINT_TAG.equals(unqualifiedName)) + { + mergepointHandler = new MergepointSaxHandler( + configurationProvider, + projectPaths, + configurationHandlers); + mergepointHandler.startElement( + uri, localName, qName, attributes); + } + else if (!GENERATORS_TAG.equals(unqualifiedName)) + { + throw new SAXException( + "Unknown element : " + unqualifiedName + + ". First element must be " + + GENERATORS_TAG + + " or " + + GENERATOR_TAG); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void endElement(String uri, String localName, String rawName) + throws SAXException + { + if (generatorHandler != null) + { + generatorHandler.endElement(uri, localName, rawName); + if (generatorHandler.isFinished()) + { + Generator generator = generatorHandler.getGenerator(); + generators.add(generator); + if (log.isDebugEnabled()) + { + log.debug("Parsed configuration for the generator " + + generator.getName()); + } + generatorHandler = null; + } + } + else if (mergepointHandler != null) + { + mergepointHandler.endElement(uri, localName, rawName); + if (mergepointHandler.isFinished()) + { + MergepointMapping mergepointMapping + = mergepointHandler.getMergepointMapping(); + mergepointMappings.add(mergepointMapping); + if (log.isDebugEnabled()) + { + log.debug("Parsed configuration for the mergepoint " + + mergepointMapping.getName()); + } + mergepointHandler = null; + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public void characters (char[] ch, int start, int length) + throws SAXException + { + if (generatorHandler != null) + { + generatorHandler.characters(ch, start, length); + } + } + + /** + * Returns the correct handler for a generator tag. + * The method uses the type attribute to determine which handler is needed. + * I.e. it looks up the handler factory type in the generator types, + * and asks the factory for a handler. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed XML. + * @param generatorType the type of the generator, not null. + * + * @return the handler for the tag, not null. + * + * @throws SAXException if no matching handler can be identified, + * or if an error occurs while creating the handler. + */ + public GeneratorSaxHandler getGeneratorHandler( + QualifiedName generatorName, + String generatorType) + throws SAXException + { + GeneratorSaxHandlerFactory delegateHandlerFactory + = configurationHandlers.getGeneratorTypes() + .getGeneratorHandlerFactories() + .get(generatorType); + if (delegateHandlerFactory == null) + { + throw new SAXException( + "Unknown generator type: " + + generatorType); + } + GeneratorSaxHandler generatorSaxHandler + = delegateHandlerFactory.getGeneratorSaxHandler( + generatorName, + configurationProvider, + projectPaths, + configurationHandlers); + return generatorSaxHandler; + } + + /** + * Reads the generator type from the attributes of the generator XML tag. + * + * @param attributes the attributes of the XML tag, not null. + * + * @return the generator type, not null. + * + * @throws SAXException if the xsi:type attribute is not set. + */ + public static String getGeneratorType(Attributes attributes) + throws SAXException + { + String generatorType + = attributes.getValue( + XMLConstants.XSI_NAMESPACE, + XMLConstants.XSI_TYPE_ATTRBUTE_NAME); + if (generatorType == null) + { + throw new SAXException("The tag " + GENERATOR_TAG + + " requires the attribute " + + XMLConstants.XSI_NAMESPACE + + ":" + + XMLConstants.XSI_TYPE_ATTRBUTE_NAME); + } + return generatorType; + } + + /** + * EntityResolver implementation. Called by the XML parser + * + * @param publicId The public identifier of the external entity. + * @param systemId The system identifier of the external entity. + * + * @return an InputSource for the entity, or null if the URI is not known. + * + * @see ConfigurationEntityResolver#resolveEntity(String, String) + */ + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException + { + return new ConfigurationEntityResolver().resolveEntity( + publicId, systemId); + } + + @Override + public void error(SAXParseException exception) throws SAXParseException + { + throw exception; + } + + @Override + public void fatalError(SAXParseException exception) + throws SAXParseException + { + throw exception; + } + + @Override + public void warning(SAXParseException exception) throws SAXParseException + { + throw exception; + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationTags.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationTags.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationTags.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationTags.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,82 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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. + */ + +/** + * Tag names for the generator configuration files. + */ +public final class GeneratorConfigurationTags +{ + /** + * private constructor for utility class. + */ + private GeneratorConfigurationTags() + { + } + + /** Tag name for the "generators" tag. */ + public static final String GENERATORS_TAG = "generators"; + + /** Tag name for the "generator" tag. */ + public static final String GENERATOR_TAG = "generator"; + + /** Attribute name for the attribute "name" of the "generator" tag. */ + public static final String GENERATOR_NAME_ATTRIBUTE = "name"; + + /** Attribute name for the attribute "type" of the "generator" tag. */ + public static final String GENERATOR_TYPE_ATTRIBUTE = "type"; + + /** Attribute name for the attribute "path" of the "generator" tag. */ + public static final String GENERATOR_PATH_ATTRIBUTE = "path"; + + /** Attribute name for the attribute "encoding" of the "generator" tag. */ + public static final String GENERATOR_ENCODING_ATTRIBUTE = "encoding"; + + /** Attribute name for the attribute "class" of the "generator" tag. */ + public static final String GENERATOR_CLASS_ATTRIBUTE = "class"; + + /** + * Attribute name for the attribute "optionsInContext" + * of the "generator" tag. + */ + public static final String GENERATOR_OPTIONS_IN_CONTEXT_ATTRIBUTE + = "optionsInContext"; + + /** + * Attribute name for the attribute "sourceAttributesInContext" + * of the "generator" tag. + */ + public static final String + GENERATOR_SOURCE_ATTRIBUTES_IN_CONTEXT_ATTRIBUTE + = "sourceAttributesInContext"; + + /** + * Attribute name for the attribute "variablesInContext" + * of the "generator" tag. + */ + public static final String GENERATOR_VARIABLES_IN_CONTEXT_ATTRIBUTE + = "variablesInContext"; + + /** Tag name for the "input" tag. */ + public static final String INPUT_TAG = "input"; + + /** Attribute name for the attribute "elementName" of the "input" tag. */ + public static final String INPUT_ELEMENT_NAME_ATTRIBUTE = "elementName"; +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationXmlParser.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationXmlParser.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationXmlParser.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorConfigurationXmlParser.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,285 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationException; +import org.apache.torque.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.mergepoint.MergepointMapping; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.generator.Generator; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.SAXParseException; + +/** + * Parses generator configuration files and creates a GeneratorConfiguration. + */ +public class GeneratorConfigurationXmlParser +{ + /** + * The SaxParserFactory to create the sax parsers for reading in the + * generator configuration files. + */ + private static SAXParserFactory saxFactory; + + /** The logger. */ + private static Log log + = LogFactory.getLog(GeneratorConfigurationXmlParser.class); + + static + { + saxFactory = SAXParserFactory.newInstance(); + saxFactory.setNamespaceAware(true); + try + { + saxFactory.setFeature( + "http://xml.org/sax/features/validation", + true); + saxFactory.setFeature( + "http://apache.org/xml/features/validation/schema", true); + } + catch (SAXNotSupportedException e) + { + throw new RuntimeException(e); + } + catch (SAXNotRecognizedException e) + { + throw new RuntimeException(e); + } + catch (ParserConfigurationException e) + { + throw new RuntimeException(e); + } + } + + /** + * Reads all generator configuration files creates the generator + * configuration from them. + * All the generator configuration files known to the provide are parsed. + * These are typically all XML files in the generator configuration + * directory and its subdirectories. + * + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param generatorTypes the configured types of generators, not null. + * + * @return the generator configuration. + * + * @throws ConfigurationException if the Configuration cannot be read + * or errors exists in the generator configuration files. + */ + public GeneratorConfiguration readGeneratorConfiguration( + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws ConfigurationException + { + if (configurationHandlers == null) + { + log.error("GeneratorConfiguration: " + + " configurationHandlers is null"); + throw new NullPointerException("generatorTypes is null"); + } + if (configurationProvider == null) + { + log.error("GeneratorConfiguration: " + + " configurationProvider is null"); + throw new NullPointerException("configurationProvider is null"); + } + if (projectPaths == null) + { + log.error("GeneratorConfiguration: " + + " projectPaths is null"); + throw new NullPointerException("projectPaths is null"); + } + + List allGenerators = new ArrayList(); + List allMergepointMappings + = new ArrayList(); + + // Generators from all files + Collection generatorConfigNames + = configurationProvider.getGeneratorConfigurationNames(); + + for (String generatorConfigName : generatorConfigNames) + { + InputStream inputStream = null; + try + { + inputStream + = configurationProvider.getGeneratorConfigurationInputStream( + generatorConfigName); + GeneratorConfigFileContent fileContent + = readGeneratorConfig( + inputStream, + configurationProvider, + projectPaths, + configurationHandlers); + allGenerators.addAll(fileContent.getGenerators()); + allMergepointMappings.addAll( + fileContent.getMergepointMappings()); + } + catch (SAXParseException e) + { + throw new ConfigurationException( + "Error parsing generator configuration " + + generatorConfigName + + " at line " + + e.getLineNumber() + + " column " + + e.getColumnNumber() + + " : " + + e.getMessage(), + e); + + } + catch (Exception e) + { + throw new ConfigurationException( + "Error parsing generator configuration " + + generatorConfigName, + e); + } + finally + { + if (inputStream != null) + { + try + { + inputStream.close(); + } + catch (IOException e) + { + log.warn("Could not close " + + "generatorConfigurationInputStream " + + generatorConfigName, + e); + } + } + } + } + return new GeneratorConfiguration(allGenerators, allMergepointMappings); + } + + + /** + * Reads a generator configuration file and returns the generators + * and isolated mergepoint mappings which are configured in this file. + * + * @param generatorConfigurationInputStream the stream containing the + * generator configuration. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param generatorTypes the configured types of generators, not null. + * + * @return All the generators and isolated mergepoint mappings + * configured in the file. + * @throws SAXException if an error occurs while parsing the configuration + * file. + * @throws IOException if the file cannot be read. + * @throws ParserConfigurationException if a serious parser configuration + * error occurs.. + */ + private GeneratorConfigFileContent readGeneratorConfig( + InputStream generatorConfigurationInputStream, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException, IOException, ParserConfigurationException + { + SAXParser parser = saxFactory.newSAXParser(); + GeneratorConfigurationSaxHandler saxHandler + = new GeneratorConfigurationSaxHandler( + configurationProvider, + projectPaths, + configurationHandlers); + InputSource is = new InputSource(generatorConfigurationInputStream); + parser.parse(is, saxHandler); + + return new GeneratorConfigFileContent( + saxHandler.getGenerators(), + saxHandler.getMergepointMappings()); + } + + /** + * The parsed content of a generator definition file. + * Contains the parsed generators and the isolated + * (i.e. outside generator context) mergepoints. + */ + private static final class GeneratorConfigFileContent + { + /** The parsed generators. */ + private List generators; + + /** The parsed isolated mergepoint mappings. */ + private List mergepointMappings; + + /** + * Constructor. + * + * @param generators the parsed generators. + * @param mergepointMappings the isolated mergepoint mappings. + */ + public GeneratorConfigFileContent( + List generators, + List mergepointMappings) + { + this.generators = generators; + this.mergepointMappings = mergepointMappings; + } + + /** + * Returns the parsed generators. + * + * @return the parsed generators. + */ + public List getGenerators() + { + return generators; + } + + /** + * Returns the parsed isolated mergepoint mappings. + * + * @return the isolated mergepoint mappings. + */ + public List getMergepointMappings() + { + return mergepointMappings; + } + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandler.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandler.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandler.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandler.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,299 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.generator.GeneratorConfigurationTags.INPUT_ELEMENT_NAME_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.INPUT_TAG; +import static org.apache.torque.gf.configuration.mergepoint.MergepointConfigurationTags.MERGEPOINT_TAG; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationException; +import org.apache.torque.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.mergepoint.MergepointSaxHandler; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.generator.Generator; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Handles a generator declaration within the generator configuration. + * Base class for more specific handlers. + */ +public abstract class GeneratorSaxHandler extends DefaultHandler +{ + /** the logger for the class. */ + private static Log log = LogFactory.getLog(GeneratorSaxHandler.class); + + /** + * the name for the generator which configuration will be read in + * by the generated SaxHandlerFactory, or null if the name + * of the generator should be determined from the parsed XML. + */ + private QualifiedName generatorName; + + /** the generator to be configured. */ + private Generator generator; + + /** The access object for the configuration files, not null. */ + private ConfigurationProvider configurationProvider; + + /** The paths of the surrounding project, not null. */ + private ProjectPaths projectPaths; + + /** The available configuration handlers. */ + private ConfigurationHandlers configurationHandlers; + + /** + * The SAX handler for processing mergepoint declarations. + * Not null only if a mergepoint declaration is currently processed. + */ + private MergepointSaxHandler mergepointSaxHandler; + + /** whether we are past the end of the generator declaration. */ + private boolean finished = false; + + /** + * The raw name of the XML element which started the generator definition. + */ + private String startTagRawName = null; + + /** + * Creates a GeneratorSaxHandler. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed XML. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @throws NullPointerException if an argument is null. + */ + public GeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + { + if (configurationProvider == null) + { + log.error("GeneratorSaxHandler: " + + " configurationProvider is null"); + throw new NullPointerException("configurationProvider is null"); + } + if (projectPaths == null) + { + log.error("GeneratorSaxHandler: " + + " projectPaths is null"); + throw new NullPointerException("projectPaths is null"); + } + if (configurationHandlers == null) + { + log.error("GeneratorSaxHandler: " + + " configurationHandlers is null"); + throw new NullPointerException("configurationHandlers is null"); + } + this.generatorName = generatorName; + this.configurationProvider = configurationProvider; + this.projectPaths = projectPaths; + this.configurationHandlers = configurationHandlers; + } + + /** + * {@inheritDoc} + */ + @Override + public void startElement( + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException + { + if (startTagRawName == null) + { + startTagRawName = rawName; + generator = createGenerator( + generatorName, + uri, + localName, + rawName, + attributes); + } + else if (INPUT_TAG.equals(rawName)) + { + String element = attributes.getValue(INPUT_ELEMENT_NAME_ATTRIBUTE); + if (element == null) + { + throw new SAXException("The attribute " + + INPUT_ELEMENT_NAME_ATTRIBUTE + + " must be set for the tag " + + INPUT_TAG); + } + generator.setInputElementName(element); + } + else if (MERGEPOINT_TAG.equals(rawName)) + { + mergepointSaxHandler = new MergepointSaxHandler( + configurationProvider, + projectPaths, + configurationHandlers); + mergepointSaxHandler.startElement(uri, localName, rawName, attributes); + } + else if (mergepointSaxHandler != null) + { + mergepointSaxHandler.startElement(uri, localName, rawName, attributes); + } + else + { + throw new SAXException("unknown Element " + rawName); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void endElement(String uri, String localName, String rawName) + throws SAXException + { + if (mergepointSaxHandler != null) + { + mergepointSaxHandler.endElement(uri, localName, rawName); + if (mergepointSaxHandler.isFinished()) + { + try + { + generator.addMergepointMapping( + mergepointSaxHandler.getMergepointMapping()); + } + catch (ConfigurationException e) + { + throw new SAXException( + "Could not get mergepoint mapping from the " + + "mergepoint Sax handler", + e); + } + mergepointSaxHandler = null; + } + } + else if (startTagRawName.equals(rawName)) + { + finished = true; + } + } + + /** + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator 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 generator, not null. + * + * @throws SAXException if the generator cannot be created. + */ + protected abstract Generator createGenerator( + QualifiedName generatorName, + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException; + + /** + * Returns the generator being configured. + * + * @return the generator, not null. + */ + public Generator getGenerator() + { + return generator; + } + + /** + * Returns whether we are currently processing a mergepoint tag. + * + * @return true if we are currently processing a mergepoint tag, + * false otherwise. + */ + protected boolean isProcessingMergepointTag() + { + return (mergepointSaxHandler != null); + } + + /** + * Returns whether we are past the end of the generator configuration XML + * snippet which we are parsing. + * + * @return true if the whole snippet has been processed, false otherwise. + */ + public boolean isFinished() + { + return finished; + } + + /** + * Returns the ConfigurationProvider. + * + * @return the ConfigurationProvider, not null. + */ + public ConfigurationProvider getConfigurationProvider() + { + return configurationProvider; + } + + /** + * Returns the paths of the surrounding project. + * + * @return the paths of the surrounding project, not null. + */ + public ProjectPaths getProjectPaths() + { + return projectPaths; + } + + /** + * Returns the configuration handlers. + * + * @return the configuration handlers, not null. + */ + public ConfigurationHandlers getConfigurationHandlers() + { + return configurationHandlers; + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandlerFactory.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandlerFactory.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandlerFactory.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/GeneratorSaxHandlerFactory.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,69 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.SAXException; + +/** + * Classes implementing this interface are responsible for creating + * GeneratorSaxHandlers for a specific generator type. + */ +public abstract interface GeneratorSaxHandlerFactory +{ + /** + * Returns the generator type handled by the GeneratorSaxHandlers which are + * created by this factory. + * + * @return the type of the generators, not null. + */ + String getType(); + + /** + * Returns a GeneratorSaxHandler for reading in the configuration of + * a generator. The SAX Handler is used as a delegate handler + * whenever a generator element with the matching type + * is encountered in a generator configuration file. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed xml. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @return a SAX delegate handler for parsing the configuration with the + * given type. + * @throws SAXException if the SAX Handler for the generator can + * not be created from the given XML element. + */ + GeneratorSaxHandler getGeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException; +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandler.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandler.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandler.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandler.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,345 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_CLASS_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_NAME_ATTRIBUTE; +import static org.apache.torque.gf.configuration.mergepoint.MergepointConfigurationTags.MERGEPOINT_TAG; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.INPUT_TAG; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.generator.Generator; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * Handles a declaration of a java generator within a generator configuration + * file. + */ +class JavaGeneratorSaxHandler extends GeneratorSaxHandler +{ + /** The logger of the class. */ + private static Log log = LogFactory.getLog(JavaGeneratorSaxHandler.class); + + /** the name of the property which is currently processed. */ + private String propertyName; + + /** The value of the property which is currently processed. */ + private StringBuffer propertyValue; + + /** The current nesting level inside the processed element. */ + private int level = 0; + + /** + * Constructor. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed xml. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @throws SAXException if an error occurs during creation of the generator. + */ + public JavaGeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException + { + super(generatorName, + configurationProvider, + projectPaths, + configurationHandlers); + } + + /** + * Instantiates a java generator. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator 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 generator, not null. + * + * @throws SAXException if an error occurs during creation. + */ + protected Generator createGenerator( + QualifiedName generatorName, + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException + { + if (generatorName == null) + { + String nameAttribute + = attributes.getValue(GENERATOR_NAME_ATTRIBUTE); + if (nameAttribute == null) + { + throw new SAXException("The attribute " + + GENERATOR_NAME_ATTRIBUTE + + " must be set on the element " + + rawName + + " for Java Generators"); + } + generatorName = new QualifiedName(nameAttribute); + } + + + String className; + { + className = attributes.getValue(GENERATOR_CLASS_ATTRIBUTE); + if (className == null) + { + throw new SAXException("The attribute " + + GENERATOR_CLASS_ATTRIBUTE + + " must be set on the element " + + rawName + + " for java Generators"); + } + } + + Class generatorClass; + try + { + generatorClass = Class.forName(className); + } + catch (ClassNotFoundException e) + { + throw new SAXException( + "Error while initializing the java generator " + + generatorName + + " : Could not load class " + className, e); + } + catch (ExceptionInInitializerError e) + { + log.error( + "Error while initializing the java generator " + + generatorName + + " : Could not initialize class " + className + + " : " + e.getMessage()); + throw e; + } + catch (LinkageError e) + { + log.error( + "Error while initializing the java generator " + + generatorName + + " : Could not link class " + className + + " : " + e.getMessage()); + throw e; + } + + Generator result; + try + { + Constructor constructor + = generatorClass.getConstructor(QualifiedName.class); + result = (Generator) constructor.newInstance(generatorName); + } + catch (NoSuchMethodException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The class " + className + + " has no constructor which takes a qualified name", + e); + } + catch (ClassCastException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The class " + className + + " is not an instance of " + + Generator.class.getName(), + e); + } + catch (IllegalAccessException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The constructor of class " + + className + " could not be accessed", + e); + } + catch (InvocationTargetException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The constructor of class " + + className + " could not be called", + e); + } + catch (InstantiationException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The class " + className + + " represents an abstract class, " + + "an interface, an array class, a primitive type, " + + "or void, or the class has no parameterless constructor, " + + "or the instantiation fails for some other reason.", + e); + } + catch (SecurityException e) + { + throw new SAXException( + "Error while instantiating the java generator " + + generatorName + + " : The security manager denies instantiation", + e); + } + + return result; + } + + /** + * {@inheritDoc} + */ + @Override + public void startElement( + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException + { + level++; + if ((level == 2 && MERGEPOINT_TAG.equals(rawName)) + || super.isProcessingMergepointTag()) + { + super.startElement(uri, localName, rawName, attributes); + } + else if (level == 2 && INPUT_TAG.equals(rawName)) + { + super.startElement(uri, localName, rawName, attributes); + } + else if (level > 1) + { + propertyName = rawName; + propertyValue = new StringBuffer(); + } + else + { + super.startElement(uri, localName, rawName, attributes); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void endElement(String uri, String localName, String rawName) + throws SAXException + { + level--; + if (propertyName != null) + { + if (!PropertyUtils.isWriteable(getGenerator(), propertyName)) + { + throw new SAXException("No setter found for property " + + propertyName + + " in class " + + getGenerator().getClass().getName()); + } + try + { + BeanUtils.copyProperty( + getGenerator(), propertyName, propertyValue.toString()); + } + catch (InvocationTargetException e) + { + throw new SAXException("error while setting Property " + + propertyName + + " for java generator " + + getGenerator().getName() + + " with value " + + propertyValue.toString(), + e); + } + catch (IllegalAccessException e) + { + throw new SAXException("error while setting Property " + + propertyName + + " for java generator " + + getGenerator().getName() + + " with value " + + propertyValue.toString(), + e); + } + propertyName = null; + propertyValue = null; + } + else + { + super.endElement(uri, localName, rawName); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void characters(char[] ch, int start, int length) + throws SAXException + { + if (propertyName == null) + { + return; + } + for (int i = start; i < start + length; ++i) + { + propertyValue.append(ch[i]); + } + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandlerFactory.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandlerFactory.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandlerFactory.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/JavaGeneratorSaxHandlerFactory.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,80 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.SAXException; + +/** + * Creates Java generator SAX handlers. + */ +public class JavaGeneratorSaxHandlerFactory + implements GeneratorSaxHandlerFactory +{ + /** + * The type of the generators which can be processed by the + * GeneratorSaxHandlers created by this factory. + */ + private static final String GENERATOR_TYPE = "javaGenerator"; + + /** + * Returns the generator type which can be handled by the + * GeneratorSaxHandlers created by this factory. + * @return "javaGenerator". + */ + public String getType() + { + return GENERATOR_TYPE; + } + + /** + * Returns a JavaGeneratorSaxHandler for reading the configuration of + * Java generators. This implementation uses the provided name + * as generator name. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed XML. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @return a new JavaGeneratorSaxHandler. + */ + public final GeneratorSaxHandler getGeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException + { + return new JavaGeneratorSaxHandler( + generatorName, + configurationProvider, + projectPaths, + configurationHandlers); + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandler.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandler.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandler.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandler.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,162 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_ENCODING_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_NAME_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_OPTIONS_IN_CONTEXT_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_PATH_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_SOURCE_ATTRIBUTES_IN_CONTEXT_ATTRIBUTE; +import static org.apache.torque.gf.configuration.generator.GeneratorConfigurationTags.GENERATOR_VARIABLES_IN_CONTEXT_ATTRIBUTE; + +import org.apache.torque.gf.configuration.ConfigurationException; +import org.apache.torque.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.SaxHelper; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.qname.QualifiedName; +import org.apache.torque.gf.template.velocity.VelocityGenerator; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * Handles a declaration of a velocity generator within a generator + * configuration file. + */ +class VelocityGeneratorSaxHandler extends GeneratorSaxHandler +{ + /** + * Constructor. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed XML. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @throws SAXException if an error occurs during creation of the generator. + */ + public VelocityGeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException + { + super(generatorName, + configurationProvider, + projectPaths, + configurationHandlers); + } + + /** + * Instantiates and configures a velocity generator. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator 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 generator, not null. + * + * @throws SAXException if an error occurs during creation. + */ + protected VelocityGenerator createGenerator( + QualifiedName generatorName, + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException + { + if (generatorName == null) + { + String nameAttribute + = attributes.getValue(GENERATOR_NAME_ATTRIBUTE); + if (nameAttribute == null) + { + throw new SAXException("The attribute " + + GENERATOR_NAME_ATTRIBUTE + + " must be set on the element " + + rawName + + " for Velocity Generators"); + } + generatorName = new QualifiedName(nameAttribute); + } + + String encoding = attributes.getValue(GENERATOR_ENCODING_ATTRIBUTE); + String path = attributes.getValue(GENERATOR_PATH_ATTRIBUTE); + + try + { + VelocityGenerator result + = new VelocityGenerator( + generatorName, + getConfigurationProvider(), + path, + encoding); + Boolean optionsInContext = SaxHelper.getBooleanAttribute( + GENERATOR_OPTIONS_IN_CONTEXT_ATTRIBUTE, + attributes, + "the velocityGenerator" + generatorName); + if (optionsInContext != null) + { + result.setOptionsInContext(optionsInContext); + } + Boolean sourceElementAttributesInContext + = SaxHelper.getBooleanAttribute( + GENERATOR_SOURCE_ATTRIBUTES_IN_CONTEXT_ATTRIBUTE, + attributes, + "the velocityGenerator" + generatorName); + if (sourceElementAttributesInContext != null) + { + result.setSourceAttributesInContext( + sourceElementAttributesInContext); + } + Boolean variablesInContext = SaxHelper.getBooleanAttribute( + GENERATOR_VARIABLES_IN_CONTEXT_ATTRIBUTE, + attributes, + "the velocityGenerator" + generatorName); + 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/gf/configuration/generator/VelocityGeneratorSaxHandlerFactory.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandlerFactory.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandlerFactory.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/VelocityGeneratorSaxHandlerFactory.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,80 @@ +package org.apache.torque.gf.configuration.generator; + +/* + * 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.gf.configuration.ConfigurationHandlers; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.qname.QualifiedName; +import org.xml.sax.SAXException; + +/** + * Creates Velocity generator SAX handlers. + */ +public class VelocityGeneratorSaxHandlerFactory + implements GeneratorSaxHandlerFactory +{ + /** + * The type of the generators which can be processed by the + * GeneratorSaxHandlers created by this factory. + */ + private static final String GENERATOR_TYPE = "velocityGenerator"; + + /** + * Returns the generator type which can be handled by the + * GeneratorSaxHandlers created by this factory. + * @return "velocityGenerator". + */ + public String getType() + { + return GENERATOR_TYPE; + } + + /** + * Returns a VelocityGeneratorSaxHandler for reading the configuration of + * Velocity generators. This implementation uses the provided name + * as generator name. + * + * @param generatorName the name for the generator which configuration + * will be read in by the generated SaxHandlerFactory, + * or null if the name of the generator should be determined from + * the parsed xml. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * @param configurationHandlers the available configuration handlers, + * not null. + * + * @return a new VelocityGeneratorSaxHandler. + */ + public final GeneratorSaxHandler getGeneratorSaxHandler( + QualifiedName generatorName, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths, + ConfigurationHandlers configurationHandlers) + throws SAXException + { + return new VelocityGeneratorSaxHandler( + generatorName, + configurationProvider, + projectPaths, + configurationHandlers); + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/package.html URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/package.html?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/package.html (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/generator/package.html Tue Feb 16 17:15:43 2010 @@ -0,0 +1,26 @@ + + + + Configuring Torque-gf generators + + +

+ This package contains the classes for reading the generator mappings for + Torque-gf units of generation. +

+ + Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandler.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandler.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandler.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandler.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,130 @@ +package org.apache.torque.gf.configuration.mergepoint; + +/* + * 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.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.apache.torque.gf.control.action.MergepointAction; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * A SAX Handler which handles for the action element in mergepoints. + * + */ +public abstract class ActionSaxHandler extends DefaultHandler +{ + /** The logger of the class. */ + private static Log log = LogFactory.getLog(ActionSaxHandler.class); + + /** The action which configured by this handler, not null. */ + private MergepointAction action; + + /** The paths of the underlying project, not null. */ + private ProjectPaths projectPaths; + + /** The configuration provider for accessing the configuration, not null. */ + private ConfigurationProvider configurationProvider; + + /** + * Constructor. + * + * @param action paths of the underlying project, not null. + * @param configurationProvider The access object for the configuration + * files, not null. + * @param projectPaths The paths of the surrounding project, not null. + * + * @throws NullPointerException if an argument is null. + */ + public ActionSaxHandler( + MergepointAction action, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths) + { + if (action == null) + { + log.error("ActionSaxHandler: " + + " action is null"); + throw new NullPointerException("Action is null"); + } + if (configurationProvider == null) + { + log.error("ActionSaxHandler: " + + " configurationProvider is null"); + throw new NullPointerException("configurationProvider is null"); + } + if (projectPaths == null) + { + log.error("ActionSaxHandler: " + + " projectPaths is null"); + throw new NullPointerException("projectPaths is null"); + } + this.action = action; + this.configurationProvider = configurationProvider; + this.projectPaths = projectPaths; + } + + /** + * {@inheritDoc} + */ + @Override + public void startElement( + String uri, + String localName, + String rawName, + Attributes attributes) + throws SAXException + { + throw new SAXException("unknown Element " + rawName); + } + + /** + * Returns the action which was configured by this handler. + * + * @return the action configured by this handler, not null. + */ + public MergepointAction getAction() + { + return action; + } + + /** + * Returns the configuration provider used by this handler. + * + * @return the configuration provider, not null. + */ + protected ConfigurationProvider getConfigurationProvider() + { + return configurationProvider; + } + + /** + * Returns the project paths used by this handler. + * + * @return the project paths, not null. + */ + protected ProjectPaths getProjectPaths() + { + return projectPaths; + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactories.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactories.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactories.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactories.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,110 @@ +package org.apache.torque.gf.configuration.mergepoint; + +/* + * 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.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.torque.gf.configuration.ConfigurationException; + +/** + * A registry of ActionSaxHandlerFactories. + * + * $Id: $ + */ +public class ActionSaxHandlerFactories +{ + /** The class log. */ + private static Log log = LogFactory.getLog(ActionSaxHandlerFactories.class); + + /** + * A map containing all known ActionSaxHandlerFactories, + * keyed by the type of the action. + */ + private Map actionSaxHandlerFactories + = new HashMap(); + + /** + * Constructor. Registers the default Factories. + */ + public ActionSaxHandlerFactories() + { + try + { + register(new TraverseAllActionSaxHandlerFactory()); + register(new ApplyActionSaxHandlerFactory()); + register(new OptionActionSaxHandlerFactory()); + register(new SourceElementAttributeActionSaxHandlerFactory()); + register(new OutputActionSaxHandlerFactory()); + } + catch (ConfigurationException e) + { + // should not happen + log.error("caught ConfigurationException while registering " + + "the default Action Sax Handler Factories", e); + throw new RuntimeException(e); + } + } + + /** + * Registers a handler for a new action type. + * + * @param factory the factory which handles the action of the + * given type. + * + * @throws ConfigurationException if a factory already exists + * for the type of the action. + */ + public void register( + ActionSaxHandlerFactory factory) + throws ConfigurationException + { + ActionSaxHandlerFactory oldFactory + = actionSaxHandlerFactories.get(factory.getType()); + if (oldFactory != null) + { + throw new ConfigurationException( + "Attempted to register an ActionSaxHandlerFactory " + + "of type " + + factory.getType() + + " and class " + + factory.getClass().getName() + + " : A factory with this type already exists, " + + " it has the class " + + oldFactory.getClass().getName()); + } + actionSaxHandlerFactories.put(factory.getType(), factory); + } + + /** + * Returns the ActionSaxHandlerFactory associated with the given type. + * + * @param type the type top look for, not null. + * + * @return the ActionSaxHandlerFactory associated with the given type, + * or null if no ActionSaxHandlerFactory exists for the given type. + */ + public ActionSaxHandlerFactory getActionSaxHandlerFactory(String type) + { + return actionSaxHandlerFactories.get(type); + } +} Added: db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactory.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactory.java?rev=910600&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactory.java (added) +++ db/torque/torque4/trunk/torque-generator/src/main/java/org/apache/torque/gf/configuration/mergepoint/ActionSaxHandlerFactory.java Tue Feb 16 17:15:43 2010 @@ -0,0 +1,78 @@ +package org.apache.torque.gf.configuration.mergepoint; + +/* + * 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.gf.configuration.ConfigurationProvider; +import org.apache.torque.gf.configuration.paths.ProjectPaths; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * Classes implementing this interface are responsible for creating + * ActionSaxHandlers for a specific action type. + * + * When a action configuration needs to be parsed, a sax handler will read + * the type of the action and check it against the types of the registered + * ActionSaxHandlers. The first matching handler will then be used to parse + * the action configuration. + */ +public abstract interface ActionSaxHandlerFactory +{ + /** + * Returns the action type handled by the ActionSaxHandlers which are + * created by this factory. + * + * @return the type of the action, not null. + */ + String getType(); + + /** + * Returns a ActionSaxHandler for reading in the configuration of + * an action. The SAX Handler is used as a delegate handler + * whenever an action element with the matching type + * is encountered in a configuration file. + * + * @param uri The namespace URI of the action element, + * 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 qName The qualified name (with prefix, if present), + * or the empty string if qualified names are not available. + * @param attributes The attributes attached to the element. + * @param configurationProvider for accessing the configuration files, + * not null. + * @param projectPaths The organization of the surrounding project, + * not null. + * + * @return a SAX delegate handler for parsing the configuration with the + * given type. + * @throws SAXException if the SAX Handler for the generator can + * not be created from the given XML element. + */ + ActionSaxHandler getActionSaxHandler( + String uri, + String localName, + String qName, + Attributes attributes, + ConfigurationProvider configurationProvider, + ProjectPaths projectPaths) + throws SAXException; +} --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org For additional commands, e-mail: torque-dev-help@db.apache.org