/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.hibernate.console.preferences; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import org.hibernate.console.ConsoleMessages; import org.hibernate.console.HibernateConsoleRuntimeException; import org.hibernate.util.xpl.StringHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author max * */ public abstract class AbstractConsoleConfigurationPreferences implements ConsoleConfigurationPreferences { static final String PROJECT_ATTRIB = "project"; //$NON-NLS-1$ static final String USE_PROJECT_CLASSPATH_ATTRIB = "use-project-classpath"; //$NON-NLS-1$ private String projectName; private String name = ConsoleMessages.AbstractConsoleConfigurationPreferences_unknown; protected String entityResolverName = null; private boolean useProjectClasspath; private ConfigurationMode configurationMode; private String persistenceUnitName; private String namingStrategy; private String connectionProfile; private String dialectName; private String hibernateVersion; public AbstractConsoleConfigurationPreferences(String name, ConfigurationMode configurationMode, String hibernateVersion, String projectName, boolean useProjectclassPath, String entityResolver, String persistenceUnitName, String namingStrategy, String connectionProfile, String dialectName) { setName(name); this.persistenceUnitName = persistenceUnitName; this.namingStrategy = namingStrategy; this.configurationMode = configurationMode; entityResolverName = entityResolver; this.projectName = projectName; this.useProjectClasspath = useProjectclassPath; this.connectionProfile = connectionProfile; this.dialectName = dialectName; this.hibernateVersion = hibernateVersion; } protected AbstractConsoleConfigurationPreferences() { } public ConfigurationMode getConfigurationMode() { return configurationMode; } public String getPersistenceUnitName() { return persistenceUnitName; } public String getNamingStrategy() { return namingStrategy; } public String getConnectionProfileName() { return connectionProfile; } public String getDialectName() { return dialectName; } public void setName(String name) { if(name==null || name.trim().length()==0) { throw new IllegalArgumentException(ConsoleMessages.AbstractConsoleConfigurationPreferences_name_not_null_or_empty); } this.name = name; } public final String getName() { return name; } public final Properties getProperties() { File propFile = getPropertyFile(); if(propFile==null) return null; FileInputStream inStream = null; try { Properties p = new Properties(); inStream = new FileInputStream(propFile); p.load(inStream ); return p; } catch(IOException io) { throw new HibernateConsoleRuntimeException(ConsoleMessages.AbstractConsoleConfigurationPreferences_could_not_load_prop_file + propFile, io); } finally { if(inStream!=null) try { inStream.close(); } catch (IOException e) { //ignore } } } /** generic xml dumper that just dumps the toString representation of the paramters * @param useAnnotations */ protected static void writeStateTo(Node node, String name, String entityResolver, ConfigurationMode configurationMode, String projectName, boolean useProjectClasspath, Object cfgFile, Object propertyFilename, Object[] mappings, Object[] customClasspath) { Document doc = node.getOwnerDocument(); Element n = createElementWithAttribute(doc, CONFIGURATION_TAG, NAME_ATTRIB, name); /*if(useAnnotations) { n.setAttribute(ANNOTATIONS_ATTRIB, "true"); }*/ n.setAttribute(CONFIGURATION_MODE_ATTRIB, configurationMode.toString()); if(StringHelper.isNotEmpty(entityResolver)) { n.setAttribute(ENTITYRESOLVER_ATTRIB, entityResolver); } if(useProjectClasspath) { n.setAttribute( USE_PROJECT_CLASSPATH_ATTRIB, "true" ); //$NON-NLS-1$ } if(StringHelper.isNotEmpty(projectName)) { n.setAttribute(PROJECT_ATTRIB, projectName); } node.appendChild(n); if(cfgFile!=null) { n.appendChild(createElementWithAttribute(doc, HIBERNATE_CONFIG_XML_TAG, LOCATION_ATTRIB, cfgFile.toString() ) ); } if(propertyFilename!=null) { n.appendChild(createElementWithAttribute(doc, HIBERNATE_PROPERTIES_TAG, LOCATION_ATTRIB, propertyFilename.toString() ) ); } if(mappings.length>0) { Element cc = createElementWithAttribute(doc, MAPPINGS_TAG, null, null); n.appendChild(cc); for (int i = 0; i < mappings.length; i++) { Object path = mappings[i]; cc.appendChild(createElementWithAttribute(doc, MAPPING_TAG, LOCATION_ATTRIB, path.toString() ) ); } } if(customClasspath.length>0) { Element cc = createElementWithAttribute(doc, CLASSPATH_TAG, null, null); n.appendChild(cc); for (int i = 0; i < customClasspath.length; i++) { Object path = customClasspath[i]; cc.appendChild(createElementWithAttribute(doc, PATH_TAG, LOCATION_ATTRIB, path.toString() ) ); } } } public boolean useProjectClasspath() { return useProjectClasspath; } protected void setUseProjectClasspath(boolean useProjectClasspath) { this.useProjectClasspath = useProjectClasspath; } public void setProjectName(String projectName) { this.projectName = projectName; } public String getProjectName() { return projectName; } public void readStateFrom(Element node) { String entityResolver = null; String cfgName = null; String cfgFile = null; String propFile = null; String[] mappings = new String[0]; String[] classpath = new String[0]; if (node.hasAttribute(NAME_ATTRIB)) { cfgName = node.getAttribute(NAME_ATTRIB); } String attribute = node.getAttribute(ANNOTATIONS_ATTRIB); if(StringHelper.isNotEmpty( attribute )) { boolean oldAnnotationFlag = ((attribute != null) && attribute.equalsIgnoreCase("true")); //$NON-NLS-1$ if(oldAnnotationFlag) { configurationMode = ConfigurationMode.ANNOTATIONS; } else { configurationMode = ConfigurationMode.CORE; } } else { attribute = node.getAttribute(CONFIGURATION_MODE_ATTRIB); configurationMode = ConfigurationMode.parse( attribute ); } attribute = node.getAttribute( PROJECT_ATTRIB ); setProjectName( attribute ); attribute = node.getAttribute( USE_PROJECT_CLASSPATH_ATTRIB ); setUseProjectClasspath("true".equalsIgnoreCase(attribute)); //$NON-NLS-1$ attribute = node.getAttribute(ENTITYRESOLVER_ATTRIB); if(attribute!=null && attribute.trim().length()>0) { entityResolver = attribute; } NodeList elements = node.getElementsByTagName(HIBERNATE_CONFIG_XML_TAG); if(elements.getLength()==1) { final Element el = (Element)elements.item(0); if (el.hasAttribute(LOCATION_ATTRIB)) { cfgFile = el.getAttribute(LOCATION_ATTRIB); } } elements = node.getElementsByTagName(HIBERNATE_PROPERTIES_TAG); if(elements.getLength()==1) { final Element el = (Element)elements.item(0); if (el.hasAttribute(LOCATION_ATTRIB)) { propFile = el.getAttribute(LOCATION_ATTRIB); } } mappings = parseListOfLocations(node, MAPPINGS_TAG, MAPPING_TAG); classpath = parseListOfLocations(node, CLASSPATH_TAG, PATH_TAG); setName(cfgName); setEntityResolverName(entityResolver); setConfigFile(cfgFile); setPropertyFile(propFile); setMappings(mappings); setCustomClassPath(classpath); } private void setEntityResolverName(String entityResolver) { this.entityResolverName = entityResolver; } private String[] parseListOfLocations(Element node, String parenttag, String elementag) { String[] result = new String[0]; NodeList elements; elements = node.getElementsByTagName(parenttag); if(elements.getLength()==1) { NodeList maps = ( (Element) elements.item(0) ).getElementsByTagName(elementag); result = new String[maps.getLength()]; for (int j = 0; j < maps.getLength(); j++) { Element child = (Element) maps.item(j); result[j] = child.hasAttribute(LOCATION_ATTRIB) ? child.getAttribute(LOCATION_ATTRIB) : null; } } return result; } /** * generic XML handling. Ugly like hell - but done to reduce jar requirements and code duplication. * TODO: make better ;) **/ public String getEntityResolverName() { return entityResolverName; }; protected abstract void setConfigFile(String cfgFile); protected abstract void setPropertyFile(String cfgFile); protected abstract void setMappings(String[] mappings); protected abstract void setCustomClassPath(String[] mappings); protected static Element createElementWithAttribute(Document doc, String tagName, String attribName, String attributValue) { Element n; n = doc.createElement(tagName); if(attribName!=null) { n.setAttribute(attribName, attributValue); } return n; } /** * @return the hibernateVersion */ public String getHibernateVersion() { return hibernateVersion; } /** * @param hibernateVersion the hibernateVersion to set */ public void setHibernateVersion(String hibernateVersion) { this.hibernateVersion = hibernateVersion; } }