/* * 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 org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.ui.wizards.dialogfields.ComboDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.ImageConstants; import org.hibernate.console.KnownConfigurations; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.HibernateConsolePlugin; import org.hibernate.eclipse.console.utils.DialogSelectionHelper; import org.hibernate.eclipse.console.utils.EclipseImages; import org.hibernate.eclipse.console.utils.LaunchHelper; import org.hibernate.eclipse.console.wizards.NewReverseEngineeringFileWizard; import org.jboss.tools.hibernate.runtime.spi.IService; @SuppressWarnings("restriction") public class CodeGenerationSettingsTab extends AbstractLaunchConfigurationTab { public static final String NULL_CONFIG = "<None>"; //$NON-NLS-1$ private ComboDialogField consoleConfigurationName; private IStructuredSelection selection; private SelectionButtonDialogField reverseengineer; private StringButtonDialogField outputdir; private StringButtonDialogField reverseEngineeringSettings; private StringButtonDialogField reverseEngineeringStrategy; private StringDialogField packageName; private SelectionButtonDialogField preferRawCompositeIds; private SelectionButtonDialogField autoVersioning; private SelectionButtonDialogField autoManyToMany; private SelectionButtonDialogField autoOneToOne; private SelectionButtonDialogField useOwnTemplates; private DirectoryBrowseField templatedir; private SelectionButtonDialogField useExternalProcess; public CodeGenerationSettingsTab() { super(); } public void createControl(Composite parent) { //initializeDialogUnits(parent); final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); sc.setExpandHorizontal(true); sc.setExpandVertical(true); Composite container = new Composite(sc, SWT.NULL); sc.setContent(container); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 4; layout.verticalSpacing = 10; IDialogFieldListener fieldlistener = new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { dialogChanged(); } }; useExternalProcess = new SelectionButtonDialogField(SWT.CHECK); useExternalProcess.setDialogFieldListener(fieldlistener); useExternalProcess.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_use_generation_in_external_process); consoleConfigurationName = new ComboDialogField(SWT.READ_ONLY); consoleConfigurationName.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_console_configuration); ConsoleConfiguration[] cfg = LaunchHelper.findFilteredSortedConsoleConfigs(); String[] names = new String[cfg.length + 1]; names[0] = NULL_CONFIG; for (int i = 0; i < cfg.length; i++) { ConsoleConfiguration configuration = cfg[i]; names[i + 1] = configuration.getName(); } consoleConfigurationName.setItems(names); consoleConfigurationName.setDialogFieldListener(fieldlistener); outputdir = new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { //IPath[] paths = DialogSelectionHelper.chooseFileEntries(getShell(), PathHelper.pathOrNull(outputdir.getText()), new IPath[0], "Select output directory", "Choose directory in which the generated files will be stored", new String[] {"cfg.xml"}, false, true, false); IPath[] paths = DialogSelectionHelper.chooseFolderEntries(getShell(), PathHelper.pathOrNull(outputdir.getText()), HibernateConsoleMessages.CodeGenerationSettingsTab_select_output_dir, HibernateConsoleMessages.CodeGenerationSettingsTab_choose_dir_for_generated_files, false); if(paths!=null && paths.length==1) { outputdir.setText( ( (paths[0]).toOSString() ) ); } } }); outputdir.setDialogFieldListener(fieldlistener); outputdir.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_output_dir); outputdir.setButtonLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_browse); templatedir = new DirectoryBrowseField(null, null, HibernateConsoleMessages.CodeGenerationSettingsTab_select_template_dir, HibernateConsoleMessages.CodeGenerationSettingsTab_choose_dir_custom_templates); templatedir.setDialogFieldListener(fieldlistener); templatedir.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_template_directory); templatedir.setFilesystemBrowseLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_filesystem); templatedir.setWorkspaceBrowseLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_workspace); packageName = new StringDialogField(); packageName.setDialogFieldListener(fieldlistener); packageName.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_package); reverseEngineeringStrategy = new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { IService service = getService(); String string = DialogSelectionHelper.chooseImplementation(service.getReverseEngineeringStrategyClassName(), reverseEngineeringStrategy.getText(), HibernateConsoleMessages.CodeGenerationSettingsTab_choose_reverse_engineering_strategy, getShell()); if(string!=null) { reverseEngineeringStrategy.setText(string); } } }); reverseEngineeringStrategy.setDialogFieldListener(fieldlistener); reverseEngineeringStrategy.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_strategy); reverseEngineeringStrategy.setButtonLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_browse); reverseEngineeringSettings= new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { int defaultChoice = 0; IPath reverseEngineeringSettingsFile = getReverseEngineeringSettingsFile(); if(reverseEngineeringSettingsFile==null) { defaultChoice = 0; } else { defaultChoice = 1; } MessageDialog dialog = new MessageDialog(getShell(), HibernateConsoleMessages.CodeGenerationSettingsTab_setup_reverse_engineering, null, HibernateConsoleMessages.CodeGenerationSettingsTab_do_you_want_create_reveng_xml, MessageDialog.QUESTION, new String[] { HibernateConsoleMessages.CodeGenerationSettingsTab_create_new, HibernateConsoleMessages.CodeGenerationSettingsTab_use_existing, IDialogConstants.CANCEL_LABEL}, defaultChoice); int answer = dialog.open(); if(answer==0) { // create new NewReverseEngineeringFileWizard wizard = new NewReverseEngineeringFileWizard(); wizard.init(PlatformUI.getWorkbench(), selection ); wizard.setSelectConfiguration(getConfigurationName()); IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); WizardDialog wdialog = new WizardDialog(win.getShell(), wizard); wdialog.open(); // This opens a dialog IPath createdFilePath = wizard.getCreatedFilePath(); if(createdFilePath!=null) { reverseEngineeringSettings.setText(createdFilePath.toOSString()); } } else if (answer==1) { // use existing IPath[] paths = DialogSelectionHelper.chooseFileEntries(getShell(), reverseEngineeringSettingsFile, new IPath[0], HibernateConsoleMessages.CodeGenerationSettingsTab_select_reverse_engineering_settings_file, HibernateConsoleMessages.CodeGenerationSettingsTab_choose_file_read_reverse_settings, new String[] {HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_xml_1}, false, false, true); if(paths!=null && paths.length==1) { reverseEngineeringSettings.setText( ( (paths[0]).toOSString() ) ); } } } }); reverseEngineeringSettings.setDialogFieldListener(fieldlistener); reverseEngineeringSettings.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_xml_2); reverseEngineeringSettings.setButtonLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_setup); reverseengineer = new SelectionButtonDialogField(SWT.CHECK); reverseengineer.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_reverse_engineer_from_jdbc_connection); reverseengineer.setDialogFieldListener(fieldlistener); useOwnTemplates = new SelectionButtonDialogField(SWT.CHECK); useOwnTemplates.setDialogFieldListener(fieldlistener); useOwnTemplates.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_use_custom_templates); preferRawCompositeIds = new SelectionButtonDialogField(SWT.CHECK); preferRawCompositeIds.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_generate_basic_typed_composite_ids); preferRawCompositeIds.setSelection(true); preferRawCompositeIds.setDialogFieldListener(fieldlistener); autoManyToMany = new SelectionButtonDialogField(SWT.CHECK); autoManyToMany.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_detect_many_to_many_tables); autoManyToMany.setSelection(true); autoManyToMany.setDialogFieldListener(fieldlistener); autoOneToOne = new SelectionButtonDialogField(SWT.CHECK); autoOneToOne.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_detect_one_to_one_associations); autoOneToOne.setSelection(true); autoOneToOne.setDialogFieldListener(fieldlistener); autoVersioning = new SelectionButtonDialogField(SWT.CHECK); autoVersioning.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_detect_optimistic_lock_columns); autoVersioning.setSelection(true); autoVersioning.setDialogFieldListener(fieldlistener); useOwnTemplates.attachDialogField(templatedir); reverseengineer.attachDialogFields(new DialogField[] { packageName, preferRawCompositeIds, reverseEngineeringSettings, reverseEngineeringStrategy, autoManyToMany, autoOneToOne, autoVersioning }); // do not show the option cause: JBIDE-8072 //useExternalProcess.doFillIntoGrid(container, 4); useExternalProcess.setSelection(false); consoleConfigurationName.doFillIntoGrid(container, 4); Control[] controls = outputdir.doFillIntoGrid(container, 4); // Hack to tell the text field to stretch! ( (GridData)controls[1].getLayoutData() ).grabExcessHorizontalSpace=true; reverseengineer.doFillIntoGrid(container, 4); packageName.doFillIntoGrid(container, 4); reverseEngineeringSettings.doFillIntoGrid(container, 4); reverseEngineeringStrategy.doFillIntoGrid(container, 4); fillLabel(container); preferRawCompositeIds.doFillIntoGrid(container, 3); fillLabel(container); autoVersioning.doFillIntoGrid(container, 3); fillLabel(container); autoManyToMany.doFillIntoGrid(container, 3); fillLabel(container); autoOneToOne.doFillIntoGrid(container, 3); useOwnTemplates.doFillIntoGrid(container, 4); controls = templatedir.doFillIntoGrid(container, 4); // Hack to tell the text field to stretch! ( (GridData)controls[1].getLayoutData() ).grabExcessHorizontalSpace=true; sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT)); dialogChanged(); setControl(sc); } private IService getService() { String ccn = consoleConfigurationName.getText(); if (ccn == null || "".equals(ccn)) return null; //$NON-NLS-1$ ConsoleConfiguration cc = KnownConfigurations.getInstance().find(ccn); if (cc == null) return null; return cc.getHibernateExtension().getHibernateService(); } private void fillLabel(Composite container) { new Label(container, SWT.NULL); } private void dialogChanged() { boolean configSelected = getConfigurationName().length()==0; outputdir.setEnabled(!configSelected); reverseengineer.setEnabled(!configSelected); useOwnTemplates.setEnabled(!configSelected); useExternalProcess.setEnabled(!configSelected); boolean useExternalProcessFlag = useExternalProcess.isSelected(); preferRawCompositeIds.setEnabled(reverseengineer.isSelected() && !configSelected && !useExternalProcessFlag); if (useExternalProcessFlag) { preferRawCompositeIds.setSelection(true); } if (configSelected) { updateStatus(HibernateConsoleMessages.CodeGenerationSettingsTab_console_cfg_must_be_specified); return; } String msg = PathHelper.checkDirectory(outputdir.getText(), HibernateConsoleMessages.CodeGenerationSettingsTab_output_directory, true); if (msg!=null) { updateStatus(msg); return; } String warning = null; if(packageName.isEnabled() && getOutputPackage().length()>0) { IStatus val= JavaConventions.validatePackageName(getOutputPackage() ); if (val.getSeverity() == IStatus.ERROR ) { updateStatus(val.getMessage() ); return; } else if (val.getSeverity() == IStatus.WARNING){ warning = val.getMessage(); } } if(reverseEngineeringSettings.isEnabled() && reverseEngineeringSettings.getText().trim().length()>0) { msg = PathHelper.checkFile(reverseEngineeringSettings.getText(), HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_xml_3, true); if(msg!=null) { updateStatus(msg); return; } } if(reverseEngineeringStrategy.isEnabled() && reverseEngineeringStrategy.getText().trim().length()>0) { IStatus val= JavaConventions.validateJavaTypeName(getReverseEngineeringStrategy(),JavaCore.VERSION_1_5, JavaCore.VERSION_1_5 ); if (val.getSeverity() == IStatus.ERROR ) { updateStatus(val.getMessage() ); return; } else if (val.getSeverity() == IStatus.WARNING){ warning = val.getMessage(); } } if(useOwnTemplates.isSelected() ) { msg = PathHelper.checkDirectory(templatedir.getText(), HibernateConsoleMessages.CodeGenerationSettingsTab_template_dir, true); if (msg!=null) { updateStatus(msg); return; } else { // imprecise and inefficient to check recursively all for .vm /*IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(getTemplateDirectory() ); IResource[] files = new IFile[0]; boolean found = false; if(resource.getType() == IResource.FOLDER) { try { found = ( (IFolder)resource).accept(new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) throws CoreException { return false; } }); } catch (CoreException e) { // noop } } if(!found) { setMessage("No templates (*.vm) found in template directory", IMessageProvider.WARNING); } else { setMessage(null); }*/ } } if (warning != null){ setMessage(warning); } else { setMessage(null); } updateStatus(null); } protected String checkFile(IPath path, String name) { IResource res= ResourcesPlugin.getWorkspace().getRoot().findMember(path); if (res != null) { int resType= res.getType(); if (resType == IResource.FILE) { return null; } else { return NLS.bind(HibernateConsoleMessages.CodeGenerationSettingsTab_must_be_file, name); } } else { return NLS.bind(HibernateConsoleMessages.CodeGenerationSettingsTab_does_not_exist, name); } } public boolean isValid(ILaunchConfiguration launchConfig) { if (getErrorMessage() == null) { return true; } return false; } private void updateStatus(String message) { setErrorMessage(message); updateLaunchConfigurationDialog(); } public String getConfigurationName() { String text = consoleConfigurationName.getText(); return NULL_CONFIG.equals(text) ? "" : text; //$NON-NLS-1$ } /** * @return */ public boolean isReverseEngineerEnabled() { return reverseengineer.isSelected(); } private String resolve(String expression) { if(expression==null) return null; IStringVariableManager variableManager = VariablesPlugin.getDefault().getStringVariableManager(); try { return variableManager.performStringSubstitution(expression, false); } catch (CoreException e) { // ignore possible errors during substitution and just return the orginal expression return expression; } } String getOutputPackage() { return packageName.getText(); } private IPath getReverseEngineeringSettingsFile() { return PathHelper.pathOrNull(reverseEngineeringSettings.getText() ); } private String getReverseEngineeringStrategy() { return reverseEngineeringStrategy.getText(); } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { // try { // attributes = new ExporterAttributes(configuration); // } catch (CoreException ce) { // HibernateConsolePlugin.getDefault().logErrorMessage("Problem when setting up defaults for launch configuration", ce); // } } public void initializeFrom(ILaunchConfiguration configuration) { ExporterAttributes attributes = null; try { attributes = new ExporterAttributes(configuration); } catch (CoreException ce) { HibernateConsolePlugin.getDefault().logErrorMessage( HibernateConsoleMessages.CodeGenerationSettingsTab_problems_when_reading, ce); } if (attributes == null) { return; } if (attributes.getConsoleConfigurationName() == null || !KnownConfigurations.getInstance().isKnownConfiguration(attributes.getConsoleConfigurationName())){ consoleConfigurationName.setText(NULL_CONFIG); } else { consoleConfigurationName.setText(attributes.getConsoleConfigurationName()); } preferRawCompositeIds.setSelection(attributes.isPreferBasicCompositeIds()); autoManyToMany.setSelection( attributes.detectManyToMany() ); autoVersioning.setSelection( attributes.detectOptimisticLock() ); autoOneToOne.setSelection( attributes.detectOneToOne()); outputdir.setText(safeText(attributes.getOutputPath())); reverseengineer.setSelection(attributes.isReverseEngineer()); reverseEngineeringSettings.setText(safeText(attributes.getRevengSettings())); reverseEngineeringStrategy.setText(safeText(attributes.getRevengStrategy())); useOwnTemplates.setSelection(attributes.isUseOwnTemplates()); packageName.setText(safeText(attributes.getPackageName())); templatedir.setText(safeText(attributes.getTemplatePath())); //useExternalProcess.setSelection(attributes.isUseExternalProcess()); useExternalProcess.setSelection(false); } private String safeText(String text) { return text==null?"":text; //$NON-NLS-1$ } private String strOrNull(String text) { if(text==null || text.trim().length()==0) { text = null; } return text; } public void performApply(ILaunchConfigurationWorkingCopy config) { config.setAttribute(HibernateLaunchConstants.ATTR_OUTPUT_DIR, strOrNull(outputdir.getText())); config.setAttribute(HibernateLaunchConstants.ATTR_PREFER_BASIC_COMPOSITE_IDS, preferRawCompositeIds.isSelected()); config.setAttribute(HibernateLaunchConstants.ATTR_AUTOMATIC_MANY_TO_MANY, autoManyToMany.isSelected()); config.setAttribute(HibernateLaunchConstants.ATTR_AUTOMATIC_ONE_TO_ONE, autoOneToOne.isSelected()); config.setAttribute(HibernateLaunchConstants.ATTR_AUTOMATIC_VERSIONING, autoVersioning.isSelected()); config.setAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER, isReverseEngineerEnabled()); config.setAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_STRATEGY, strOrNull(reverseEngineeringStrategy.getText())); config.setAttribute(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_SETTINGS, strOrNull(reverseEngineeringSettings.getText())); config.setAttribute(HibernateLaunchConstants.ATTR_USE_OWN_TEMPLATES, useOwnTemplates.isSelected()); config.setAttribute(HibernateLaunchConstants.ATTR_TEMPLATE_DIR, strOrNull(templatedir.getText())); config.setAttribute(HibernateLaunchConstants.ATTR_CONSOLE_CONFIGURATION_NAME, getConfigurationName()); config.setAttribute(HibernateLaunchConstants.ATTR_PACKAGE_NAME, getOutputPackage()); config.setAttribute(HibernateLaunchConstants.ATTR_USE_EXTERNAL_PROCESS, useExternalProcess.isSelected()); } public String getName() { return HibernateConsoleMessages.CodeGenerationSettingsTab_main; } public Image getImage() { return EclipseImages.getImage(ImageConstants.MINI_HIBERNATE); } }