/******************************************************************************* * Copyright (c) 2007 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.ui.wizard; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.jdt.core.IJavaProject; 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.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; 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.Group; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.KnownConfigurations; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.utils.DialogSelectionHelper; import org.hibernate.eclipse.console.utils.ProjectUtils; import org.hibernate.eclipse.launch.HibernateLaunchConstants; import org.hibernate.eclipse.launch.PathHelper; import org.jboss.tools.common.ui.IValidator; import org.jboss.tools.common.ui.widget.editor.IFieldEditor; import org.jboss.tools.common.ui.widget.editor.INamedElement; import org.jboss.tools.common.ui.widget.field.RadioField; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.SeamProjectsSet; import org.jboss.tools.seam.core.SeamCoreMessages; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; import org.jboss.tools.seam.internal.core.project.facet.SeamValidatorFactory; import org.jboss.tools.seam.internal.core.validation.SeamProjectPropertyValidator; /** * @author Alexey Kazakov */ @SuppressWarnings("restriction") public class SeamGenerateEntitiesWizardPage extends WizardPage implements PropertyChangeListener, IAdaptable { private IFieldEditor projectEditor; private IFieldEditor configEditor; private SelectionButtonDialogField existingReveng; private StringButtonDialogField reverseEngineeringSettings; private RadioField radios; IProject rootSeamProject; public SeamGenerateEntitiesWizardPage() { super("seam.generate.entities.page", SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_TITLE, null); //$NON-NLS-1$ setMessage(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_PAGE_MESSAGE); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { rootSeamProject = SeamWizardUtils.getCurrentSelectedRootSeamProject(); String projectName = rootSeamProject==null?"":rootSeamProject.getName(); projectEditor = SeamWizardFactory.createSeamProjectSelectionFieldEditor(projectName); projectEditor.addPropertyChangeListener(this); if(projectName!=null && projectName.length()>0) { Map<String, IStatus> errors = SeamValidatorFactory.SEAM_PROJECT_NAME_VALIDATOR.validate(projectEditor.getValue(), null); if(!errors.isEmpty()) { IStatus message = errors.get(IValidator.DEFAULT_ERROR); if(message.getSeverity()==IStatus.ERROR) { setErrorMessage(message.getMessage()); setPageComplete(false); } else { setMessage(message.getMessage()); } } else { setMessage(null); } } else { setMessage(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_PAGE_MESSAGE); setPageComplete(false); } Composite top = new GridLayoutComposite(parent); Composite projectComposite = new GridLayoutComposite(top, SWT.NONE, 4); projectEditor.doFillIntoGrid(projectComposite); configEditor = SeamWizardFactory.createHibernateConsoleConfigurationSelectionFieldEditor(getConsoleConfigurationName(projectName)); configEditor.addPropertyChangeListener(this); configEditor.doFillIntoGrid(projectComposite); configEditor.setEditable(false); configEditor.addPropertyChangeListener(this); String config = (String)configEditor.getValue(); if(config==null || config.length()==0) { setMessage(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_HIBERNATE_CONFIGURATION_MESSAGE); setPageComplete(false); } Composite groupComposite = new GridLayoutComposite(top); Group group = new Group(groupComposite, SWT.NONE); group.setText(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_GROUP_LABEL); group.setLayout(new GridLayout(1, false)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite radioComposite = new GridLayoutComposite(group, SWT.NONE, 2); ArrayList<Object> values = new ArrayList<Object>(); values.add("existing"); //$NON-NLS-1$ values.add("reverse"); //$NON-NLS-1$ ArrayList<String> labels = new ArrayList<String>(); labels.add(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_EXISTING_ENTITIES_LABEL); labels.add(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_REVERSE_ENGINEER_LABEL); radios = new RadioField(radioComposite, labels, values, null, true); radios.addPropertyChangeListener(this); IDialogFieldListener fieldlistener = new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { wizardChanged(); } }; Composite revengComposite = new GridLayoutComposite(group, SWT.NONE, 3); existingReveng = new SelectionButtonDialogField(SWT.CHECK); existingReveng.setLabelText("Use existing reveng"); existingReveng.setDialogFieldListener(fieldlistener); existingReveng.doFillIntoGrid(revengComposite, 3); existingReveng.setEnabled(false); reverseEngineeringSettings= new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { IPath reverseEngineeringSettingsFile = getReverseEngineeringSettingsFile(); 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("Browse..."); Control[] controls = reverseEngineeringSettings.doFillIntoGrid(revengComposite, 3); reverseEngineeringSettings.setEnabled(false); ( (GridData)controls[1].getLayoutData() ).grabExcessHorizontalSpace=true; setControl(top); validate(); } protected IPath getReverseEngineeringSettingsFile() { return PathHelper.pathOrNull(reverseEngineeringSettings.getText() ); } /** * @return the projectEditor */ public IFieldEditor getProjectEditor() { return projectEditor; } /** * @return the rootSeamProject */ public IProject getRootSeamProject() { return rootSeamProject; } private static String getConsoleConfigurationName(String seamWebProjectName) { if(seamWebProjectName==null || seamWebProjectName.trim().length()==0) { return null; } String seamProjectName = seamWebProjectName; IProject webProject = ResourcesPlugin.getWorkspace().getRoot().getProject(seamWebProjectName); if(webProject==null) { return null; } SeamProjectsSet projectSet = SeamProjectsSet.create(webProject); if(!projectSet.isWarConfiguration()) { IProject ejbProject = projectSet.getEjbProject(); if(ejbProject==null) { return null; } seamProjectName = ejbProject.getName(); } ConsoleConfiguration[] configs = KnownConfigurations.getInstance().getConfigurations(); for (int i = 0; i < configs.length; i++) { IJavaProject javaProject = ProjectUtils.findJavaProject(configs[i]); if(javaProject!=null && javaProject.getProject().getName().equals(seamProjectName)) { return configs[i].getName(); } } return null; } public static class GridLayoutComposite extends Composite { public GridLayoutComposite(Composite parent, int style, int columnNumber) { super(parent, style); GridLayout gl = new GridLayout(columnNumber, false); setLayout(gl); setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } public GridLayoutComposite(Composite parent) { this(parent, SWT.NONE, 1); } } /* (non-Javadoc) * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent event) { if(ISeamParameter.SEAM_PROJECT_NAME.equals(event.getPropertyName()) && event.getNewValue()!=null && !event.getNewValue().equals(event.getOldValue())) { rootSeamProject = SeamWizardUtils.getRootSeamProject(getSelectedProject()); String consoleConfigName = getConsoleConfigurationName(event.getNewValue().toString()); if(consoleConfigName!=null) { configEditor.setValue(consoleConfigName); } } wizardChanged(); } public IProject getSelectedProject() { String projectName = projectEditor.getValueAsString(); if(projectName!=null && projectName.trim().length()>0) { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); if(project.exists()) { return (IProject)project; } } return null; } public void wizardChanged(){ existingReveng.setEnabled("reverse".equals(radios.getValue())); reverseEngineeringSettings.setEnabled(existingReveng.isEnabled() && existingReveng.isSelected()); validate(); } protected boolean isProjectSettingsOk() { if(rootSeamProject!=null) { if(!isValidRuntimeConfigured(rootSeamProject)) { return false; } IEclipsePreferences prefs = SeamCorePlugin.getSeamPreferences(rootSeamProject); return SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, ""), false) && SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, ""), false) && SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, ""), false) && (ISeamFacetDataModelProperties.DEPLOY_AS_WAR.equals(prefs.get(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, ISeamFacetDataModelProperties.DEPLOY_AS_WAR).trim()) || SeamProjectPropertyValidator.isProjectNameValid(prefs.get(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, ""), false)); } return true; } /** * @param project */ protected boolean isValidRuntimeConfigured(IProject project) { Map<String, IStatus> errors; String seamRt = SeamCorePlugin.getSeamPreferences(project).get(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME,""); //$NON-NLS-1$ errors = SeamValidatorFactory.SEAM_RUNTIME_VALIDATOR.validate(seamRt, null); if(!errors.isEmpty()) { setErrorMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage()); setPageComplete(false); return false; } return true; } private void validate() { String projectName = projectEditor.getValue().toString(); Map<String, IStatus> errors = SeamValidatorFactory.SEAM_PROJECT_NAME_VALIDATOR.validate(projectName, null); if(!errors.isEmpty() || !isProjectSettingsOk()) { IStatus errorMessage = errors.get(IValidator.DEFAULT_ERROR); if(errorMessage==null) { setErrorMessage(SeamCoreMessages.VALIDATOR_INVALID_SETTINGS); setPageComplete(false); } else { if(errorMessage.getSeverity()==IStatus.ERROR) { setErrorMessage(errorMessage.getMessage()); setPageComplete(false); } else { setMessage(errorMessage.getMessage()); } } return; } String config = (String)configEditor.getValue(); if(config==null || config.length()==0) { setErrorMessage(SeamCoreMessages.GENERATE_SEAM_ENTITIES_WIZARD_HIBERNATE_CONFIGURATION_ERROR); setPageComplete(false); return; } if ("reverse".equals(radios.getValue()) && existingReveng.isSelected() && reverseEngineeringSettings.getText().trim().length() == 0){ setErrorMessage("Select reveng.xml file");//$NON-NLS-1$ setPageComplete(false); return; } if("reverse".equals(radios.getValue()) && existingReveng.isSelected()) { String msg = PathHelper.checkFile(reverseEngineeringSettings.getText(), HibernateConsoleMessages.CodeGenerationSettingsTab_reveng_xml_3, true); if(msg!=null) { setErrorMessage(msg);//$NON-NLS-1$ setPageComplete(false); return; } } setErrorMessage(null); setMessage(null); setPageComplete(true); } @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { if(adapter == Map.class) { Map<String, INamedElement> values = new HashMap<String, INamedElement>(); values.put(projectEditor.getName(), new NamedElementImpl(projectEditor.getName(), projectEditor.getValueAsString())); values.put(configEditor.getName(), new NamedElementImpl(configEditor.getName(), configEditor.getValueAsString())); String mode = radios.getValue().toString(); String value = "reverse".equals(mode) ? "true" : "false"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ values.put(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER, new NamedElementImpl("reverse", value)); //$NON-NLS-1$ if(reverseEngineeringSettings.isEnabled()){ values.put(HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_SETTINGS, new NamedElementImpl("reveng_file", reverseEngineeringSettings.getText())); } else { IWizardPage page2 = getWizard().getPage(SeamGenerateEntitiesTablesWizardPage.pageName); if (page2 instanceof SeamGenerateEntitiesTablesWizardPage){ SeamGenerateEntitiesTablesWizardPage page = (SeamGenerateEntitiesTablesWizardPage)page2; String filters = page.getFilters(); if (filters.length() > 0) values.put(HibernateLaunchConstants.ATTR_REVENG_TABLES, new NamedElementImpl("filters", filters)); //$NON-NLS-1$ } } return values; } return null; } class NamedElementImpl implements INamedElement { private String name; private Object value; public NamedElementImpl(String name, Object value) { this.name = name; this.value = value; } public String getName() { return name; } public Object getValue() { return value; } public String getValueAsString() { return value.toString(); } public void setValue(Object newValue) { this.value = newValue; } public void setValueAsString(String value) { this.value = value; } @Override public String toString() { return getValueAsString(); } } @Override public boolean canFlipToNextPage() { return "reverse".equals(radios.getValue()) && (getErrorMessage() == null && !existingReveng.isSelected()); //$NON-NLS-1$ } public String getConsoleCongigurationName(){ return configEditor.getValueAsString(); } }