Java tutorial
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.mergepoint.MergepointConfigurationTags.MERGEPOINT_TAG; import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.INPUT_ELEMENT_NAME_ATTRIBUTE; import static org.apache.torque.generator.configuration.outlet.OutletConfigurationTags.INPUT_TAG; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.mergepoint.MergepointSaxHandler; import org.apache.torque.generator.configuration.paths.ProjectPaths; import org.apache.torque.generator.outlet.Outlet; import org.apache.torque.generator.qname.QualifiedName; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Handles a outlet declaration within the outlet configuration. * Base class for more specific handlers. */ public abstract class OutletSaxHandler extends DefaultHandler { /** the logger for the class. */ private static Log log = LogFactory.getLog(OutletSaxHandler.class); /** * 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. */ private QualifiedName outletName; /** the outlet to be configured. */ private Outlet outlet; /** 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 outlet declaration. */ private boolean finished = false; /** * The raw name of the XML element which started the outlet definition. */ private String startTagRawName = null; /** * Creates a OutletSaxHandler. * * @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 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 OutletSaxHandler(QualifiedName outletName, ConfigurationProvider configurationProvider, ProjectPaths projectPaths, ConfigurationHandlers configurationHandlers) { if (configurationProvider == null) { log.error("OutletSaxHandler: " + " configurationProvider is null"); throw new NullPointerException("configurationProvider is null"); } if (projectPaths == null) { log.error("OutletSaxHandler: " + " projectPaths is null"); throw new NullPointerException("projectPaths is null"); } if (configurationHandlers == null) { log.error("OutletSaxHandler: " + " configurationHandlers is null"); throw new NullPointerException("configurationHandlers is null"); } this.outletName = outletName; 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; outlet = createOutlet(outletName, 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); } outlet.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 { outlet.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 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 outlet, not null. * * @throws SAXException if the outlet cannot be created. */ protected abstract Outlet createOutlet(QualifiedName outletName, String uri, String localName, String rawName, Attributes attributes) throws SAXException; /** * Returns the outlet being configured. * * @return the outlet, not null. */ public Outlet getOutlet() { return outlet; } /** * 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 outlet 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; } }