/* * 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:/* * 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.eclipse.launch; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.osgi.util.NLS; import org.hibernate.console.HibernateConsoleRuntimeException; import org.hibernate.eclipse.HibernatePlugin; import org.hibernate.eclipse.console.ExtensionManager; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.model.impl.ExporterDefinition; import org.hibernate.eclipse.console.model.impl.ExporterFactory; // This class was created to centralize launch configuration attribute loading/saving // (and also to clean up CodeGenerationLaunchDelegate considerably) public class ExporterAttributes { private boolean reverseEngineer, useOwnTemplates, enableJDK5, enableEJB3, preferBasicCompositeIds; private boolean useExternalProcess; private String consoleConfigurationName; private String revengSettings; private String revengStrategy; private String packageName; private String outputPath; private String templatePath; private List<ExporterFactory> exporterFactories; private boolean autoManyToManyDetection; private boolean autoOneToOneDetection; private boolean autoVersioning; public ExporterAttributes () { } public ExporterAttributes (ILaunchConfiguration configuration) throws CoreException { initialize(configuration); } public void initialize (ILaunchConfiguration configuration) throws CoreException { try { consoleConfigurationName = configuration.getAttribute(HibernateLaunchConstants.ATTR_CONSOLE_CONFIGURATION_NAME,""); //$NON-NLS-1$ outputPath = configuration.getAttribute(HibernateLaunchConstants.ATTR_OUTPUT_DIR,""); //$NON-NLS-1$ reverseEngineer = configuration.getAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER, false); revengSettings = configuration.getAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_SETTINGS, ""); //$NON-NLS-1$ revengStrategy = configuration.getAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_STRATEGY, ""); //$NON-NLS-1$ useOwnTemplates = configuration.getAttribute(HibernateLaunchConstants.ATTR_USE_OWN_TEMPLATES,false); useExternalProcess = configuration.getAttribute(HibernateLaunchConstants.ATTR_USE_EXTERNAL_PROCESS, false); enableJDK5 = configuration.getAttribute(HibernateLaunchConstants.ATTR_ENABLE_JDK5,false); enableEJB3 = configuration.getAttribute(HibernateLaunchConstants.ATTR_ENABLE_EJB3_ANNOTATIONS,false); packageName = configuration.getAttribute(HibernateLaunchConstants.ATTR_PACKAGE_NAME,""); //$NON-NLS-1$ templatePath = configuration.getAttribute(HibernateLaunchConstants.ATTR_TEMPLATE_DIR,""); //$NON-NLS-1$ preferBasicCompositeIds = configuration.getAttribute(HibernateLaunchConstants.ATTR_PREFER_BASIC_COMPOSITE_IDS, true); autoManyToManyDetection = configuration.getAttribute( HibernateLaunchConstants.ATTR_AUTOMATIC_MANY_TO_MANY, true); autoOneToOneDetection = configuration.getAttribute( HibernateLaunchConstants.ATTR_AUTOMATIC_ONE_TO_ONE, true); autoVersioning = configuration.getAttribute( HibernateLaunchConstants.ATTR_AUTOMATIC_VERSIONING, true); if (!useOwnTemplates) { templatePath = null; } exporterFactories = readExporterFactories(configuration); } catch (CoreException e) { throw new CoreException(HibernatePlugin.throwableToStatus(e, 666)); } } public static String getLaunchAttributePrefix(String exporterId) { return HibernateLaunchConstants.ATTR_EXPORTERS + "." + exporterId; //$NON-NLS-1$ } private List<ExporterFactory> readExporterFactories(ILaunchConfiguration configuration) throws CoreException { List<String> exporterNames = configuration.getAttribute(HibernateLaunchConstants.ATTR_EXPORTERS, (List<String>)null); if(exporterNames!=null) { Map<String, ExporterDefinition> exDefinitions = ExtensionManager.findExporterDefinitionsAsMap(); List<ExporterFactory> factories = new ArrayList<ExporterFactory>(); for (String exporterId : exporterNames) { String extensionId = configuration.getAttribute(getLaunchAttributePrefix(exporterId) + ".extension_id", (String)null); //$NON-NLS-1$ ExporterDefinition expDef = exDefinitions.get(extensionId); if(expDef==null) { String out = NLS.bind(HibernateConsoleMessages.ExporterAttributes_could_not_locate_exporter_for_in, extensionId, configuration.getName()); throw new HibernateConsoleRuntimeException(out); } else { ExporterFactory exporterFactory = new ExporterFactory( expDef, exporterId ); exporterFactory.isEnabled( configuration ); factories.add( exporterFactory ); Map<String, String> props = configuration.getAttribute( getLaunchAttributePrefix(exporterFactory.getId()) + ".properties", new HashMap<String, String>() ); //$NON-NLS-1$ exporterFactory.setProperties( props ); } } return factories; } else { // fall back to old way of reading if list of exporters does not exist. ExporterDefinition[] exDefinitions = ExtensionManager.findExporterDefinitions(); List<ExporterFactory> factories = new ArrayList<ExporterFactory>(); for (int i = 0; i < exDefinitions.length; i++) { ExporterDefinition expDef = exDefinitions[i]; ExporterFactory exporterFactory = new ExporterFactory( expDef, expDef.getId() ); exporterFactory.isEnabled( configuration ); factories.add( exporterFactory ); Map<String, String> props = configuration.getAttribute( getLaunchAttributePrefix(exporterFactory.getId()) + ".properties", new HashMap<String, String>() ); //$NON-NLS-1$ exporterFactory.setProperties( props ); } return factories; } } public static void saveExporterFactories( ILaunchConfigurationWorkingCopy configuration, List<ExporterFactory> exporterFactories, Set<ExporterFactory> enabledExporters, Set<String> deletedExporterIds) { List<String> names = new ArrayList<String>(); for (ExporterFactory ef : exporterFactories) { configuration.setAttribute(getLaunchAttributePrefix(ef.getId()) + ".extension_id", ef.getExporterDefinition().getId()); //$NON-NLS-1$ boolean enabled = enabledExporters.contains( ef ); String propertiesId = getLaunchAttributePrefix(ef.getId()) + ".properties"; //$NON-NLS-1$ names.add(ef.getId()); ef.setEnabled( configuration, enabled, false ); HashMap<String, String> map = new HashMap<String, String>(ef.getProperties()); if(map.isEmpty()) { configuration.setAttribute( propertiesId, (Map<String, String>)null ); } else { configuration.setAttribute( propertiesId, map ); } } deletedExporterIds.removeAll(names); for (String deleted : deletedExporterIds) { configuration.setAttribute( getLaunchAttributePrefix( deleted ), (String)null); configuration.setAttribute(getLaunchAttributePrefix(deleted ) + ".extension_id", (String)null); //$NON-NLS-1$ configuration.setAttribute(getLaunchAttributePrefix(deleted) + ".properties", (String)null); //$NON-NLS-1$ } configuration.setAttribute(HibernateLaunchConstants.ATTR_EXPORTERS, names); } public static void oldSaveExporterFactories( ILaunchConfigurationWorkingCopy configuration, List<ExporterFactory> exporterFactories, List<ExporterFactory> enabledExporters) { for (ExporterFactory ef : exporterFactories) { boolean enabled = enabledExporters.contains( ef ); String propertiesId = ef.getId() + ".properties"; //$NON-NLS-1$ ef.setEnabled( configuration, enabled, true ); HashMap<String, String> map = new HashMap<String, String>(ef.getProperties()); if(map.isEmpty()) { configuration.setAttribute( propertiesId, (Map<String, String>)null ); } else { configuration.setAttribute( propertiesId, map ); } } } public String getOutputPath() { return outputPath; } public void setOutputPath(String outputPath) { this.outputPath = outputPath; } public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getRevengSettings() { return revengSettings; } public void setRevengSettings(String revengSettings) { this.revengSettings = revengSettings; } public String getRevengStrategy() { return revengStrategy; } public void setRevengStrategy(String revengStrategy) { this.revengStrategy = revengStrategy; } public String getTemplatePath() { return templatePath; } public void setTemplatePath(String templatePath) { this.templatePath = templatePath; } public String getConsoleConfigurationName() { return consoleConfigurationName; } public void setConsoleConfigurationName(String consoleConfigurationName) { this.consoleConfigurationName = consoleConfigurationName; } public boolean isEJB3Enabled() { return enableEJB3; } public void setEnableEJB3(boolean enableEJB3) { this.enableEJB3 = enableEJB3; } public boolean isJDK5Enabled() { return enableJDK5; } public void setEnableJDK5(boolean enableJDK5) { this.enableJDK5 = enableJDK5; } public boolean isPreferBasicCompositeIds() { return preferBasicCompositeIds; } public void setPreferBasicCompositeIds(boolean preferBasicCompositeIds) { this.preferBasicCompositeIds = preferBasicCompositeIds; } public boolean isReverseEngineer() { return reverseEngineer; } public void setReverseEngineer(boolean reverseEngineer) { this.reverseEngineer = reverseEngineer; } public boolean isUseOwnTemplates() { return useOwnTemplates; } public void setUseOwnTemplates(boolean useOwnTemplates) { this.useOwnTemplates = useOwnTemplates; } public boolean isUseExternalProcess() { return useExternalProcess; } public void setUseExternalProcess(boolean useExternalProcess) { this.useExternalProcess = useExternalProcess; } public List<ExporterFactory> getExporterFactories() { return exporterFactories; } public boolean detectManyToMany() { return autoManyToManyDetection; } public boolean detectOptimisticLock() { return autoVersioning; } public boolean detectOneToOne() { return autoOneToOneDetection; } /** * Check exporter attributes and return message with description what is wrong with attributes. * * @return message */ public String checkExporterAttributes() { String msg = null; boolean notSelected = consoleConfigurationName == null || consoleConfigurationName.length() <= 0; if (notSelected) { msg = HibernateConsoleMessages.CodeGenerationSettingsTab_console_cfg_must_be_specified; } if (msg == null) { msg = PathHelper.checkDirectory(outputPath, HibernateConsoleMessages.CodeGenerationSettingsTab_output_directory, true); } if (msg == null) { if (reverseEngineer && packageName.length() > 0) { IStatus val= JavaConventions.validatePackageName(packageName, "1.3", "1.3"); //$NON-NLS-1$ //$NON-NLS-2$ if (val.getSeverity() == IStatus.ERROR || val.getSeverity() == IStatus.WARNING) { msg = val.getMessage(); } } } if (msg == null) { if (reverseEngineer && revengSettings.trim().length() > 0) { msg = PathHelper.checkFile(revengSettings, HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_xml_3, true); } } if (msg == null) { if (useOwnTemplates) { msg = PathHelper.checkDirectory(templatePath, HibernateConsoleMessages.CodeGenerationSettingsTab_template_dir, true); } } if (msg == null) { if (reverseEngineer && !preferBasicCompositeIds) { msg = HibernateConsoleMessages.CodeGenerationSettingsTab_script_can_not_be_generated_correctly_without; } } return msg; } }