Java tutorial
package org.apache.torque.engine.database.transform; /* * 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.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.torque.engine.database.model.Column; import org.apache.torque.engine.database.model.Database; import org.apache.torque.engine.database.model.Table; import org.xml.sax.Attributes; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * A Class that is used to parse an input xml schema file and creates and * AppData java structure. * * @author <a href="mailto:leon@opticode.co.za">Leon Messerschmidt</a> * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a> * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a> * @author <a href="mailto:fedor.karpelevitch@home.com">Fedor Karpelevitch</a> * @version $Id: XmlToData.java,v 1.1 2007-10-21 07:57:26 abyrne Exp $ */ public class XmlToData extends DefaultHandler implements EntityResolver { /** Logging class from commons.logging */ private static Log log = LogFactory.getLog(XmlToData.class); private Database database; private List data; private String dtdFileName; private File dtdFile; private InputSource dataDTD; private static SAXParserFactory saxFactory; static { saxFactory = SAXParserFactory.newInstance(); saxFactory.setValidating(true); } /** * Default custructor */ public XmlToData(Database database, String dtdFilePath) throws MalformedURLException, IOException { this.database = database; dtdFile = new File(dtdFilePath); this.dtdFileName = "file://" + dtdFile.getName(); dataDTD = new InputSource(dtdFile.toURL().openStream()); } /** * */ public List parseFile(String xmlFile) throws Exception { data = new ArrayList(); SAXParser parser = saxFactory.newSAXParser(); FileReader fr = new FileReader(xmlFile); BufferedReader br = new BufferedReader(fr); try { InputSource is = new InputSource(br); is.setSystemId(xmlFile); parser.parse(is, this); } finally { br.close(); } return data; } /** * Handles opening elements of the xml file. */ public void startElement(String uri, String localName, String rawName, Attributes attributes) throws SAXException { try { if (rawName.equals("dataset")) { //ignore <dataset> for now. } else { Table table = database.getTableByJavaName(rawName); if (table == null) { throw new SAXException("Table '" + rawName + "' unknown"); } List columnValues = new ArrayList(); for (int i = 0; i < attributes.getLength(); i++) { Column col = table.getColumnByJavaName(attributes.getQName(i)); if (col == null) { throw new SAXException( "Column " + attributes.getQName(i) + " in table " + rawName + " unknown."); } String value = attributes.getValue(i); columnValues.add(new ColumnValue(col, value)); } data.add(new DataRow(table, columnValues)); } } catch (Exception e) { throw new SAXException(e); } } /** * called by the XML parser * * @return an InputSource for the database.dtd file */ public InputSource resolveEntity(String publicId, String systemId) throws SAXException { try { if (dataDTD != null && dtdFileName.equals(systemId)) { log.info("Resolver: used " + dtdFile.getPath()); return dataDTD; } else { log.info("Resolver: used " + systemId); return getInputSource(systemId); } } catch (IOException e) { throw new SAXException(e); } } /** * get an InputSource for an URL String * * @param urlString * @return an InputSource for the URL String */ public InputSource getInputSource(String urlString) throws IOException { URL url = new URL(urlString); InputSource src = new InputSource(url.openStream()); return src; } /** * */ public class DataRow { private Table table; private List columnValues; public DataRow(Table table, List columnValues) { this.table = table; this.columnValues = columnValues; } public Table getTable() { return table; } public List getColumnValues() { return columnValues; } } /** * */ public class ColumnValue { private Column col; private String val; public ColumnValue(Column col, String val) { this.col = col; this.val = val; } public Column getColumn() { return col; } public String getValue() { return val; } public String getEscapedValue() { StringBuffer sb = new StringBuffer(); sb.append("'"); sb.append(StringUtils.replace(val, "'", "''")); sb.append("'"); return sb.toString(); } } }