/*******************************************************************************
* 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.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
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.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.ui.IValidator;
import org.jboss.tools.common.ui.widget.editor.CompositeEditor;
import org.jboss.tools.common.ui.widget.editor.IFieldEditor;
import org.jboss.tools.common.ui.widget.editor.LabelFieldEditor;
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;
import org.jboss.tools.seam.ui.SeamGuiPlugin;
/**
* @author eskimo
*
*/
public abstract class SeamBaseWizardPage extends WizardPage implements IAdaptable, PropertyChangeListener {
protected final IStructuredSelection initialSelection;
protected IProject rootSeamProject;
/**
*
* @param pageName
* @param title
* @param titleImage
*/
public SeamBaseWizardPage(String pageName, String title,
ImageDescriptor titleImage, IStructuredSelection initialSelection) {
super(pageName, title, titleImage);
this.initialSelection = initialSelection;
createEditors();
}
/**
* @param pageName
*/
protected SeamBaseWizardPage(String pageName, IStructuredSelection initSelection) {
super(pageName);
this.initialSelection = initSelection;
createEditors();
}
protected void createEditors() {
addEditors(SeamWizardFactory.createBaseFormFieldEditors(SeamWizardUtils.getRootSeamProjectName(initialSelection)));
rootSeamProject = SeamWizardUtils.getRootSeamProject(initialSelection);
String selectedProject = (rootSeamProject == null) ? "" : rootSeamProject.getName();
String packageName = getDefaultPackageName(selectedProject);
addEditor(SeamWizardFactory.createSeamJavaPackageSelectionFieldEditor(packageName));
setSeamProjectNameData(selectedProject);
}
Map<String,IFieldEditor> editorRegistry = new HashMap<String,IFieldEditor>();
List<IFieldEditor> editorOrder = new ArrayList<IFieldEditor>();
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
setControl(new GridLayoutComposite(parent));
if (!"".equals(editorRegistry.get(ISeamParameter.SEAM_PROJECT_NAME).getValue())){ //$NON-NLS-1$
Map<String, IStatus> errors = SeamValidatorFactory.SEAM_PROJECT_NAME_VALIDATOR.validate(
getEditor(ISeamParameter.SEAM_PROJECT_NAME).getValue(), null);
if(!errors.isEmpty()) {
setErrorMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage());
getEditor(ISeamParameter.SEAM_BEAN_NAME).setEnabled(false);
} else if(isWar()) {
getEditor(ISeamParameter.SEAM_BEAN_NAME).setEnabled(false);
LabelFieldEditor label = (LabelFieldEditor)((CompositeEditor)getEditor(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME)).getEditors().get(0);
label.getLabelControl().setText(SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_POJO_CLASS_NAME);
} else {
getEditor(ISeamParameter.SEAM_BEAN_NAME).setEnabled(true);
}
} else {
getEditor(ISeamParameter.SEAM_BEAN_NAME).setEnabled(false);
if(getEditor(ISeamParameter.SEAM_PACKAGE_NAME)!=null) {
getEditor(ISeamParameter.SEAM_PACKAGE_NAME).setEnabled(false);
}
}
String selectdProject = getEditor(ISeamParameter.SEAM_PROJECT_NAME).getValueAsString();
if(selectdProject!=null && !"".equals(selectdProject) && isValidProjectSelected()) {
isValidRuntimeConfigured(getSelectedProject());
}
setPageComplete(false);
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if(adapter == Map.class)
return editorRegistry;
return null;
}
/**
*
* @param id
* @param editor
*/
public void addEditor(IFieldEditor editor) {
editorRegistry.put(editor.getName(), editor);
editorOrder.add(editor);
editor.addPropertyChangeListener(this);
}
/**
*
* @param id
* @param editor
*/
public void addEditors(IFieldEditor[] editors) {
for (IFieldEditor fieldEditor : editors) {
addEditor(fieldEditor);
}
}
/**
*
* @param name
* @return
*/
public IFieldEditor getEditor(String name) {
return editorRegistry.get(name);
}
public void setDefaultValue(String name, Object value) {
IFieldEditor editor = getEditor(name);
editor.removePropertyChangeListener(this);
editor.setValue(value);
editor.addPropertyChangeListener(this);
}
/**
* @author eskimo
*/
public class GridLayoutComposite extends Composite {
public GridLayoutComposite(Composite parent, int style) {
super(parent, style);
int columnNumber = 1;
for (IFieldEditor fieldEditor : editorOrder) {
if(fieldEditor.getNumberOfControls()>columnNumber)
columnNumber=fieldEditor.getNumberOfControls();
}
GridLayout gl = new GridLayout(columnNumber,false);
gl.verticalSpacing = 5;
gl.marginTop = 3;
gl.marginLeft = 3;
gl.marginRight = 3;
setLayout(gl);
for (IFieldEditor fieldEditor2 : editorOrder) {
fieldEditor2.doFillIntoGrid(this);
}
}
public GridLayoutComposite(Composite parent) {
this(parent, SWT.NONE);
}
}
/* (non-Javadoc)
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
if(ISeamParameter.SEAM_PROJECT_NAME.equals(event.getPropertyName())) {
rootSeamProject = SeamWizardUtils.getRootSeamProject(getSelectedProject());
}
doFillDefaults(event);
doValidate(event);
}
/**
*
*/
protected void doValidate(PropertyChangeEvent event) {
if(!isValidProjectSelected()) return;
IProject project = getSelectedProject();
boolean isWar = isWar();
getEditor(ISeamParameter.SEAM_BEAN_NAME).setEnabled(!isWar);
IFieldEditor packageEditor = getEditor(ISeamParameter.SEAM_PACKAGE_NAME);
if(packageEditor!=null) {
packageEditor.setEnabled(true);
}
if(!isValidRuntimeConfigured(project)) return;
LabelFieldEditor label = (LabelFieldEditor)((CompositeEditor)getEditor(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME)).getEditors().get(0);
label.getLabelControl().setText(isWar?SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_POJO_CLASS_NAME: SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_LOCAL_CLASS_NAME);
Map<String, IStatus> errors = SeamValidatorFactory.SEAM_COMPONENT_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_COMPONENT_NAME).getValue(), null);
if(!errors.isEmpty()) {
setErrorMessage(NLS.bind(errors.get(IValidator.DEFAULT_ERROR).getMessage(),SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_SEAM_COMPONENTS));
setPageComplete(false);
return;
}
errors = SeamValidatorFactory.SEAM_COMPONENT_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME).getValue(), null);
if(!errors.isEmpty()) {
setErrorMessage(NLS.bind(errors.get(IValidator.DEFAULT_ERROR).getMessage(),SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_LOCAL_INTERFACE));
setPageComplete(false);
return;
}
if(!isWar) {
errors = SeamValidatorFactory.SEAM_COMPONENT_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_BEAN_NAME).getValue(), null);
if(!errors.isEmpty()) {
setErrorMessage(NLS.bind(errors.get(IValidator.DEFAULT_ERROR).getMessage(),"Bean")); //$NON-NLS-1$
setPageComplete(false);
return;
}
}
IFieldEditor editor = editorRegistry.get(ISeamParameter.SEAM_PACKAGE_NAME);
if(editor!=null) {
errors = SeamValidatorFactory.PACKAGE_NAME_VALIDATOR.validate(editor.getValue(), null);
if(!errors.isEmpty()) {
setErrorMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage()); //$NON-NLS-1$
setPageComplete(false);
return;
}
}
errors = SeamValidatorFactory.SEAM_METHOD_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_METHOD_NAME).getValue(), new Object[]{"Method",project}); //$NON-NLS-1$
if(!errors.isEmpty()) {
setErrorMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage());
setPageComplete(false);
return;
}
errors = SeamValidatorFactory.FILE_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_PAGE_NAME).getValue(), new Object[]{"Page",project}); //$NON-NLS-1$
if(!errors.isEmpty()) {
setErrorMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage());
setPageComplete(false);
return;
}
errors = SeamValidatorFactory.SEAM_JAVA_INTEFACE_NAME_CONVENTION_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME).getValue(), new Object[]{SeamCoreMessages.SEAM_BASE_WIZARD_PAGE_LOCAL_INTERFACE,project});
if(!errors.isEmpty()) {
setErrorMessage(null);
setMessage(errors.get(IValidator.DEFAULT_ERROR).getMessage(),IMessageProvider.WARNING);
setPageComplete(true);
return;
}
IJavaProject javaProject = EclipseResourceUtil.getJavaProject(project);
if(javaProject != null){
try{
IType component = javaProject.findType((String)editorRegistry.get(ISeamParameter.SEAM_PACKAGE_NAME).getValue()+"."+editorRegistry.get(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME).getValue());
if(component != null){
setErrorMessage(null);
setMessage(SeamCoreMessages.POJO_CLASS_ALREADY_EXISTS, IMessageProvider.WARNING);
setPageComplete(true);
return;
}
}catch(JavaModelException ex){
SeamGuiPlugin.getPluginLog().logError(ex);
}
}
SeamProjectsSet seamPrjSet = new SeamProjectsSet(project);
IPath webContent = seamPrjSet.getViewsFolder().getFullPath();
IPath page = webContent.append(editorRegistry.get(ISeamParameter.SEAM_PAGE_NAME).getValue()+".xhtml");
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(page);
if(file.exists()){
setErrorMessage(null);
setMessage(SeamCoreMessages.PAGE_ALREADY_EXISTS, IMessageProvider.WARNING);
setPageComplete(true);
return;
}
setErrorMessage(null);
setMessage(getDefaultMessageText());
setPageComplete(true);
}
protected boolean isProjectSettingsOk() {
if(rootSeamProject!=null) {
IEclipsePreferences prefs = SeamCorePlugin.getSeamPreferences(rootSeamProject);
return SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, ""), false) &&
SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, ""), false) &&
("false".equals(prefs.get(ISeamFacetDataModelProperties.TEST_CREATING, "false").trim()) || (SeamProjectPropertyValidator.isFolderPathValid(prefs.get(ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER, ""), false) && SeamProjectPropertyValidator.isProjectNameValid(prefs.get(ISeamFacetDataModelProperties.SEAM_TEST_PROJECT, ""), 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;
}
protected boolean isValidProjectSelected() {
Map<String, IStatus> errors = SeamValidatorFactory.SEAM_PROJECT_NAME_VALIDATOR.validate(
editorRegistry.get(ISeamParameter.SEAM_PROJECT_NAME).getValue(), null);
if(!errors.isEmpty() || !isProjectSettingsOk()) {
IStatus errorStatus = errors.get(IValidator.DEFAULT_ERROR);
String errorMessage = SeamCoreMessages.VALIDATOR_INVALID_SETTINGS;
if(errorStatus!=null) {
errorMessage = errorStatus.getMessage();
}
setErrorMessage(errorMessage);
setPageComplete(false);
IFieldEditor beanEditor = getEditor(ISeamParameter.SEAM_BEAN_NAME);
if(beanEditor!=null) {
beanEditor.setEnabled(false);
}
IFieldEditor packageEditor = getEditor(ISeamParameter.SEAM_PACKAGE_NAME);
if(packageEditor!=null) {
packageEditor.setEnabled(false);
}
return false;
}
return true;
}
/**
*
*/
protected void doFillDefaults(PropertyChangeEvent event) {
if(event.getPropertyName().equals(ISeamParameter.SEAM_COMPONENT_NAME) || event.getPropertyName().equals(ISeamParameter.SEAM_PROJECT_NAME)) {
String value = getEditor(ISeamParameter.SEAM_COMPONENT_NAME).getValueAsString();
if(value==null||"".equals(value)) { //$NON-NLS-1$
setDefaultValue(ISeamParameter.SEAM_COMPONENT_NAME, ""); //$NON-NLS-1$
setDefaultValue(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME, ""); //$NON-NLS-1$
setDefaultValue(ISeamParameter.SEAM_BEAN_NAME, ""); //$NON-NLS-1$
setDefaultValue(ISeamParameter.SEAM_METHOD_NAME, ""); //$NON-NLS-1$
setDefaultValue(ISeamParameter.SEAM_PAGE_NAME, ""); //$NON-NLS-1$
} else {
String valueU = value.substring(0,1).toUpperCase() + value.substring(1);
setDefaultValue(ISeamParameter.SEAM_LOCAL_INTERFACE_NAME, valueU);
setDefaultValue(ISeamParameter.SEAM_BEAN_NAME, valueU+"Bean"); //$NON-NLS-1$
String valueL = value.substring(0,1).toLowerCase() + value.substring(1);
setDefaultValue(ISeamParameter.SEAM_METHOD_NAME, valueL);
setDefaultValue(ISeamParameter.SEAM_PAGE_NAME, valueL);
}
}
if(event.getPropertyName().equals(ISeamParameter.SEAM_PROJECT_NAME)&& getEditor(ISeamParameter.SEAM_PACKAGE_NAME)!=null) {
String selectedProject = event.getNewValue().toString();
setSeamProjectNameData(selectedProject);
setDefaultValue(ISeamParameter.SEAM_PACKAGE_NAME, getDefaultPackageName(selectedProject));
}
}
protected String getDefaultPackageName(String selectedProject) {
String packageName = "";
if(selectedProject!=null && selectedProject.length()>0) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(selectedProject);
if(project!=null) {
IEclipsePreferences seamFacetPrefs = SeamCorePlugin.getSeamPreferences(project);
packageName = getDefaultPackageName(seamFacetPrefs);
}
}
return packageName;
}
protected String getDefaultPackageName(IEclipsePreferences seamFacetPrefs) {
return seamFacetPrefs.get(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME, "");
}
protected void setSeamProjectNameData(String projectName) {
IFieldEditor editor = getEditor(ISeamParameter.SEAM_PACKAGE_NAME);
if(editor!=null) {
editor.setData(ISeamParameter.SEAM_PROJECT_NAME, projectName);
}
}
/**
* @return
*/
public IProject getSelectedProject() {
String projectName = editorRegistry.get(ISeamParameter.SEAM_PROJECT_NAME).getValueAsString();
if(projectName!=null && projectName.trim().length()>0) {
IResource project = ResourcesPlugin.getWorkspace().getRoot().findMember(projectName);
if(project!=null && project instanceof IProject) {
return (IProject)project;
}
}
return null;
}
public boolean isWar() {
if(getSelectedProject()==null ||
SeamCorePlugin.getSeamPreferences(getSelectedProject().getProject())==null) return true;
return "war".equals(SeamCorePlugin.getSeamPreferences(getSelectedProject().getProject()).get(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS,"war")); //$NON-NLS-1$ //$NON-NLS-2$
}
public String getRootSeamProject() {
return rootSeamProject!=null?rootSeamProject.getName():null;
}
public abstract String getDefaultMessageText();
}