com.frameworkset.orm.engine.transform.XmlToData.java Source code

Java tutorial

Introduction

Here is the source code for com.frameworkset.orm.engine.transform.XmlToData.java

Source

/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.  
 */
package com.frameworkset.orm.engine.transform;

/*
     
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
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.log4j.Logger;
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;

import com.frameworkset.orm.engine.model.Column;
import com.frameworkset.orm.engine.model.Database;
import com.frameworkset.orm.engine.model.Table;

/**
 * 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.13 2005/03/04 06:37:02 tfischer Exp $
 */
public class XmlToData extends DefaultHandler implements EntityResolver, Serializable {
    /** Logging class from commons.logging */
    private static Logger log = Logger.getLogger(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);
            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();
        }
    }
}