/*******************************************************************************
* 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;
}
}