org.hibernate.console.ConfigurationXMLFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.console.ConfigurationXMLFactory.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.hibernate.console;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;

import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences.ConfigurationMode;
import org.hibernate.util.xpl.StringHelper;

/**
 * XML document part creation factory,
 * responsible for creation Hibernate Configuration part for
 * Hibernate Tools core Ant code generation.
 * 
 * @author Vitali Yemialyanchyk
 */
public class ConfigurationXMLFactory {

    protected ConsoleConfigurationPreferences prefs;
    protected Properties additional;
    /**
     * place to generate Ant script file (all paths in script should be
     * relative to this place)
     */
    protected IPath pathPlace2Generate = null;
    /**
     * workspace path
     */
    protected IPath pathWorkspacePath = null;

    public ConfigurationXMLFactory(ConsoleConfigurationPreferences prefs, Properties additional) {
        this.prefs = prefs;
        this.additional = additional;
    }

    public Document createXML() {
        Document res = DocumentFactory.getInstance().createDocument();
        Element root = createRoot();
        res.setRootElement(root);
        return res;
    }

    public Element createRoot() {
        if (prefs == null) {
            return null;
        }
        @SuppressWarnings("unused")
        Properties properties = prefs.getProperties();
        String rootName = "undef"; //$NON-NLS-1$
        Boolean jdbcConfig = Boolean.valueOf(additional.getProperty(ConfigurationXMLStrings.ISREVENG, "false")); //$NON-NLS-1$
        if (jdbcConfig) {
            rootName = ConfigurationXMLStrings.JDBCCONFIGURATION;
        } else if (prefs.getConfigurationMode().equals(ConfigurationMode.ANNOTATIONS)) {
            rootName = ConfigurationXMLStrings.ANNOTATIONCONFIGURATION;
        } else if (prefs.getConfigurationMode().equals(ConfigurationMode.JPA)) {
            rootName = ConfigurationXMLStrings.JPACONFIGURATION;
        } else if (prefs.getConfigurationMode().equals(ConfigurationMode.CORE)) {
            rootName = ConfigurationXMLStrings.CONFIGURATION;
        }
        Element root = DocumentFactory.getInstance().createElement(rootName);
        final ConsoleConfiguration cc2ExtractConfigXMLFile = new ConsoleConfiguration(prefs);
        final File configXMLFile = cc2ExtractConfigXMLFile.getConfigXMLFile();
        String tmp = file2Str(configXMLFile);
        tmp = makePathRelative(tmp, pathPlace2Generate, pathWorkspacePath);
        updateAttr(root, tmp, ConfigurationXMLStrings.CONFIGURATIONFILE);
        tmp = file2Str(prefs.getPropertyFile());
        tmp = makePathRelative(tmp, pathPlace2Generate, pathWorkspacePath);
        updateAttr(root, tmp, ConfigurationXMLStrings.PROPERTYFILE);
        updateAttr(root, prefs.getEntityResolverName(), ConfigurationXMLStrings.ENTITYRESOLVER);
        updateAttr(root, prefs.getNamingStrategy(), ConfigurationXMLStrings.NAMINGSTRATEGY);
        updateAttr(root, prefs.getPersistenceUnitName(), ConfigurationXMLStrings.PERSISTENCEUNIT);
        // very specific property, for more information -> JBIDE-6997 
        //updateAttr(root, additional, ConfigurationXMLStrings.PREFERBASICCOMPOSITEIDS);
        updateAttr(root, additional, ConfigurationXMLStrings.DETECTMANYTOMANY);
        updateAttr(root, additional, ConfigurationXMLStrings.DETECTONTTOONE);
        updateAttr(root, additional, ConfigurationXMLStrings.DETECTOPTIMISTICLOCK);
        updateAttr(root, additional, ConfigurationXMLStrings.PACKAGENAME);
        updateAttr(root, additional, ConfigurationXMLStrings.REVENGFILE);
        updateAttr(root, additional, ConfigurationXMLStrings.REVERSESTRATEGY);
        // includeMappings
        File[] mappingFiles = prefs.getMappingFiles();
        if (mappingFiles.length > 0) {
            Element fileset = root.addElement("fileset"); //$NON-NLS-1$
            fileset.addAttribute("dir", "."); //$NON-NLS-1$ //$NON-NLS-2$
            fileset.addAttribute("id", "id"); //$NON-NLS-1$ //$NON-NLS-2$
            for (int i = 0; i < mappingFiles.length; i++) {
                Element include = fileset.addElement("include"); //$NON-NLS-1$
                tmp = mappingFiles[i].getAbsolutePath();
                tmp = new Path(tmp).toString();
                tmp = makePathRelative(tmp, pathPlace2Generate, pathWorkspacePath);
                include.addAttribute("name", tmp); //$NON-NLS-1$
            }
        }
        return root;
    }

    public static String file2Str(File file) {
        String res = file == null ? null : file.getPath();
        if (res != null) {
            res = new Path(res).toString();
        }
        return res;
    }

    public static void updateAttr(Element el, String val, String prName) {
        if (!StringHelper.isEmpty(val)) {
            el.addAttribute(prName, val);
        }
    }

    public static void updateAttr(Element el, Properties prs, String prName) {
        final String val = prs.getProperty(prName, ""); //$NON-NLS-1$
        if (!StringHelper.isEmpty(val)) {
            el.addAttribute(prName, val);
        }
    }

    public String createConfigurationXML() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Element element = createRoot();
        dump(baos, element);
        return baos.toString();
    }

    public static void dump(OutputStream os, Element element) {
        // try to "pretty print" it
        OutputFormat outformat = OutputFormat.createPrettyPrint();
        try {
            XMLWriter writer = new XMLWriter(os, outformat);
            writer.write(element);
            writer.flush();
        } catch (IOException e1) {
            // otherwise, just dump it
            try {
                os.write(element.asXML().getBytes());
            } catch (IOException e) {
                // ignore
            }
        }
    }

    public static String makePathRelative(String strPathItem, final IPath pathPlace2Generate,
            final IPath pathWorkspacePath) {
        if (strPathItem != null && pathPlace2Generate != null && pathWorkspacePath != null) {
            IPath tmpPath = new Path(strPathItem);
            if (pathWorkspacePath.isPrefixOf(tmpPath)) {
                tmpPath = tmpPath.makeRelativeTo(pathPlace2Generate);
                strPathItem = pathPlace2Generate.toString();
                String tmp = tmpPath.toString();
                if (tmp.length() > 0) {
                    strPathItem += IPath.SEPARATOR + tmp;
                }
            }
        }
        return strPathItem;
    }

    public void setPlace2Generate(IPath pathPlace2Generate) {
        this.pathPlace2Generate = pathPlace2Generate;
    }

    public IPath getPlace2Generate() {
        return pathPlace2Generate;
    }

    public void setWorkspacePath(IPath pathWorkspacePath) {
        this.pathWorkspacePath = pathWorkspacePath;
    }

    public IPath getWorkspacePath() {
        return pathWorkspacePath;
    }
}