org.jboss.tools.maven.seam.configurators.SeamProjectConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.maven.seam.configurators.SeamProjectConfigurator.java

Source

/*************************************************************************************
 * Copyright (c) 2008-2011 Red Hat, Inc. and others.
 * All rights reserved. This program and the accompanying materials 
 * are 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:
 *     JBoss by Red Hat - Initial implementation.
 ************************************************************************************/
package org.jboss.tools.maven.seam.configurators;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jst.j2ee.application.internal.operations.RemoveComponentFromEnterpriseApplicationOperation;
import org.eclipse.jst.j2ee.project.EarUtilities;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
import org.eclipse.m2e.core.internal.project.registry.MavenProjectManager;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectChangedEvent;
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.jboss.tools.maven.core.IJBossMavenConstants;
import org.jboss.tools.maven.core.MavenUtil;
import org.jboss.tools.maven.core.internal.project.facet.MavenFacetInstallDataModelProvider;
import org.jboss.tools.maven.jsf.MavenJSFActivator;
import org.jboss.tools.maven.seam.MavenSeamActivator;
import org.jboss.tools.maven.ui.Activator;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.SeamUtil;
import org.jboss.tools.seam.core.project.facet.SeamRuntime;
import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager;
import org.jboss.tools.seam.core.project.facet.SeamVersion;
import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties;
import org.jboss.tools.seam.internal.core.project.facet.SeamFacetInstallDataModelProvider;
import org.jboss.tools.seam.ui.wizard.SeamWizardUtils;
import org.osgi.service.prefs.BackingStoreException;

/**
 * 
 * @author snjeza
 *
 */
public class SeamProjectConfigurator extends AbstractProjectConfigurator {

    private static final String JBOSS_SEAM_ARTIFACT_PREFIX = "jboss-seam"; //$NON-NLS-1$
    private static final String ORG_JBOSS_SEAM_GROUP_ID = "org.jboss.seam"; //$NON-NLS-1$
    private static final String JBOSS_SEAM_ARTIFACT_ID = "jboss-seam"; //$NON-NLS-1$

    protected static final IProjectFacet dynamicWebFacet;
    protected static final IProjectFacet javaFacet;
    protected static final IProjectFacet jsfFacet;
    protected static final IProjectFacet earFacet;
    protected static final IProjectFacet ejbFacet;
    protected static final IProjectFacet m2Facet;
    protected static final IProjectFacetVersion m2Version;
    private static final IProjectFacet seamFacet;
    private static final IProjectFacet portletFacet;
    private static final IProjectFacet jsfportletFacet;
    private static final IProjectFacet seamPortletFacet;
    private static final IProjectFacetVersion seamPortletVersion;

    static {
        seamFacet = ProjectFacetsManager.getProjectFacet("jst.seam"); //$NON-NLS-1$
        javaFacet = ProjectFacetsManager.getProjectFacet("jst.java"); //$NON-NLS-1$
        dynamicWebFacet = ProjectFacetsManager.getProjectFacet("jst.web"); //$NON-NLS-1$
        jsfFacet = ProjectFacetsManager.getProjectFacet("jst.jsf"); //$NON-NLS-1$
        earFacet = ProjectFacetsManager.getProjectFacet("jst.ear"); //$NON-NLS-1$
        m2Facet = ProjectFacetsManager.getProjectFacet("jboss.m2"); //$NON-NLS-1$
        m2Version = m2Facet.getVersion("1.0"); //$NON-NLS-1$
        ejbFacet = ProjectFacetsManager.getProjectFacet("jst.ejb"); //$NON-NLS-1$
        portletFacet = ProjectFacetsManager.getProjectFacet("jboss.portlet"); //$NON-NLS-1$
        jsfportletFacet = ProjectFacetsManager.getProjectFacet("jboss.jsfportlet"); //$NON-NLS-1$
        seamPortletFacet = ProjectFacetsManager.getProjectFacet("jboss.seamportlet"); //$NON-NLS-1$
        seamPortletVersion = seamPortletFacet.getVersion("1.0"); //$NON-NLS-1$
    }

    @Override
    public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
        // adds Seam capabilities if there are Seam dependencies
        MavenProject mavenProject = request.getMavenProject();
        IProject project = request.getProject();
        configureInternal(mavenProject, project, monitor);

    }

    private boolean isSeamSettingChangedByUser(IProject project) {
        IEclipsePreferences projectPreferences = SeamCorePlugin.getSeamPreferences(project);
        boolean seamSettingsChangedByUser = projectPreferences
                .getBoolean(ISeamFacetDataModelProperties.SEAM_SETTINGS_CHANGED_BY_USER, false);
        return seamSettingsChangedByUser;
    }

    private void configureInternal(MavenProject mavenProject, IProject project, IProgressMonitor monitor)
            throws CoreException {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        boolean configureSeam = store.getBoolean(Activator.CONFIGURE_SEAM);
        if (!configureSeam) {
            return;
        }
        if (isSeamSettingChangedByUser(project)) {
            return;
        }
        IProject rootSeamProject = SeamWizardUtils.getRootSeamProject(project);
        if (rootSeamProject != null && isSeamSettingChangedByUser(rootSeamProject)) {
            return;
        }
        clearMarkers(project);
        String packaging = mavenProject.getPackaging();
        String seamVersion = getSeamVersion(mavenProject);
        if (seamVersion != null) {
            IProject[] earProjects = EarUtilities.getReferencingEARProjects(project);
            String deploying = packaging;
            if (earProjects.length > 0) {
                deploying = "ear"; //$NON-NLS-1$
            }
            final IFacetedProject fproj = ProjectFacetsManager.create(project);
            if (fproj == null) {
                return;
            }
            IProjectFacetVersion seamFacetVersion = getSeamFacetVersion(seamVersion);
            if ("war".equals(packaging)) { //$NON-NLS-1$
                IDataModel model = createSeamDataModel(deploying, seamVersion, project);
                //JBIDE-10785 : refresh parent to prevent 
                // org.osgi.service.prefs.BackingStoreException: Resource '/parent/web/.settings' does not exist.
                if (!fproj.hasProjectFacet(jsfFacet)) {
                    MavenUtil.refreshParent(mavenProject);
                }

                installWarFacets(fproj, model, seamFacetVersion, monitor);
            } else if ("ear".equals(packaging)) { //$NON-NLS-1$
                installEarFacets(fproj, seamFacetVersion, monitor);
                installM2Facet(fproj, monitor);
                IProject webProject = getReferencingSeamWebProject(project);
                if (webProject != null) {
                    IEclipsePreferences prefs = SeamCorePlugin.getSeamPreferences(webProject);
                    String deployingType = prefs.get(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, null);
                    if (deployingType == null
                            || deployingType.equals(ISeamFacetDataModelProperties.DEPLOY_AS_WAR)) {
                        prefs.put(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS,
                                ISeamFacetDataModelProperties.DEPLOY_AS_EAR);
                        storeSettings(webProject);
                    }
                    IProject ejbProject = getReferencingSeamEJBProject(project);
                    if (ejbProject != null) {
                        prefs.put(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, ejbProject.getName());
                        IJavaProject javaProject = JavaCore.create(ejbProject);
                        boolean configureSeamArtifacts = store.getBoolean(Activator.CONFIGURE_SEAM_ARTIFACTS);
                        if (configureSeamArtifacts) {
                            if (javaProject != null && javaProject.isOpen()) {
                                try {
                                    IClasspathEntry[] entries = javaProject.getRawClasspath();
                                    for (int i = 0; i < entries.length; i++) {
                                        IClasspathEntry entry = entries[i];
                                        if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                                            String sourceFolder = entry.getPath().toString();
                                            prefs.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER,
                                                    sourceFolder);
                                            prefs.put(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER,
                                                    sourceFolder);
                                            break;
                                        }
                                    }
                                } catch (JavaModelException e) {
                                    MavenSeamActivator.log(e);
                                }
                            }
                            IPackageFragment[] packageFragments = javaProject.getPackageFragments();
                            for (int i = 0; i < packageFragments.length; i++) {
                                IPackageFragment pf = packageFragments[i];
                                if (pf != null && pf.getKind() == IPackageFragmentRoot.K_SOURCE
                                        && !pf.isDefaultPackage()) {
                                    if (pf.hasSubpackages() && !pf.hasChildren()) {
                                        continue;
                                    }
                                    String packageName = pf.getElementName();
                                    prefs.put(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME, packageName);
                                    prefs.put(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME, packageName);
                                }
                            }
                        }
                    }
                    storeSettings(webProject);
                }

            } else if ("ejb".equals(packaging)) { //$NON-NLS-1$
                installM2Facet(fproj, monitor);
                installEjbFacets(fproj, seamFacetVersion, monitor);
                addSeamSupport(project, earProjects);
                storeSettings(project);

            }
            //          addSeamSupport(project);
            //          
            //          storeSettings(project);
        }
    }

    private String getViewFolder(IProject project) {
        IVirtualComponent com = ComponentCore.createComponent(project);
        String viewFolder = null;
        if (com != null) {
            IVirtualFolder webRootFolder = com.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$
            if (webRootFolder != null) {
                viewFolder = webRootFolder.getUnderlyingFolder().getFullPath().toString();
            }
        }
        return viewFolder;
    }

    @Override
    public void mavenProjectChanged(MavenProjectChangedEvent event, IProgressMonitor monitor) throws CoreException {
        IMavenProjectFacade facade = event.getMavenProject();
        if (facade != null) {
            IProject project = facade.getProject();
            if (isWTPProject(project)) {
                MavenProject mavenProject = facade.getMavenProject(monitor);
                configureInternal(mavenProject, project, monitor);
            }
        }
        super.mavenProjectChanged(event, monitor);
    }

    private boolean isWTPProject(IProject project) {
        return ModuleCoreNature.getModuleCoreNature(project) != null;
    }

    private void installM2Facet(IFacetedProject fproj, IProgressMonitor monitor) throws CoreException {
        if (!fproj.hasProjectFacet(m2Facet)) {
            IDataModel config = (IDataModel) new MavenFacetInstallDataModelProvider().create();
            config.setBooleanProperty(IJBossMavenConstants.MAVEN_PROJECT_EXISTS, true);
            fproj.installProjectFacet(m2Version, config, monitor);
        }
    }

    private IProjectFacetVersion getSeamFacetVersion(String seamVersion) throws CoreException {
        String version = seamVersion.substring(0, 3);
        IProjectFacetVersion facetVersion = null;
        try {
            facetVersion = seamFacet.getVersion(version);
        } catch (Exception e) {
            MavenSeamActivator.log(e,
                    "Seam version " + version + " is not supported, using latest supported facet version instead");
            facetVersion = seamFacet.getLatestVersion();
        }
        return facetVersion;
    }

    private void installEarFacets(IFacetedProject fproj, IProjectFacetVersion seamFv, IProgressMonitor monitor)
            throws CoreException {
        if (!fproj.hasProjectFacet(earFacet)) {
            IProjectFacetVersion earVersion = findTargetFacetVersion(seamFv, earFacet);
            fproj.installProjectFacet(earVersion, null, monitor);
        }

    }

    private void installEjbFacets(IFacetedProject fproj, IProjectFacetVersion seamFv, IProgressMonitor monitor)
            throws CoreException {
        if (!fproj.hasProjectFacet(javaFacet)) {
            IProjectFacetVersion javaVersion = findTargetFacetVersion(seamFv, javaFacet);
            fproj.installProjectFacet(javaVersion, null, monitor);
        }
        if (!fproj.hasProjectFacet(ejbFacet)) {
            IProjectFacetVersion ejbVersion = findTargetFacetVersion(seamFv, ejbFacet);
            fproj.installProjectFacet(ejbVersion, null, monitor);
        }
    }

    private void installWarFacets(IFacetedProject fproj, IDataModel model, IProjectFacetVersion seamFacetVersion,
            IProgressMonitor monitor) throws CoreException {
        //Seam requires the JSF facet (!!!)
        boolean hasConflicts = false;
        for (IProjectFacetVersion fv : fproj.getProjectFacets()) {
            if (seamFacetVersion.conflictsWith(fv)) {
                addErrorMarker(fproj.getProject(),
                        seamFacetVersion + " can not be installed as it conflicts with " + fv);
                hasConflicts = true;
            }
        }

        if (hasConflicts) {
            return;
        }

        if (!fproj.hasProjectFacet(javaFacet)) {
            IProjectFacetVersion javaVersion = findTargetFacetVersion(seamFacetVersion, javaFacet);
            fproj.installProjectFacet(javaVersion, null, monitor);
        }
        if (!fproj.hasProjectFacet(dynamicWebFacet)) {
            IProjectFacetVersion dynamicWebVersion = findTargetFacetVersion(seamFacetVersion, dynamicWebFacet);
            fproj.installProjectFacet(dynamicWebVersion, null, monitor);
        }
        IProjectFacetVersion jsfVersion = findTargetFacetVersion(seamFacetVersion, jsfFacet);
        installJSFFacet(fproj, jsfVersion, monitor);
        installM2Facet(fproj, monitor);

        if (!fproj.hasProjectFacet(seamFacet)) {
            fproj.installProjectFacet(seamFacetVersion, model, monitor);
        } else {
            String deploying = model.getStringProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS);
            if (deploying != null && deploying.equals(ISeamFacetDataModelProperties.DEPLOY_AS_WAR)) {
                IPreferenceStore store = MavenSeamActivator.getDefault().getPreferenceStore();
                boolean configureSeamArtifacts = store.getBoolean(Activator.CONFIGURE_SEAM_ARTIFACTS);
                if (!configureSeamArtifacts) {
                    return;
                }
                IEclipsePreferences prefs = SeamCorePlugin.getSeamPreferences(fproj.getProject());
                setModelProperty(model, prefs, ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER);
                setModelProperty(model, prefs, ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER);
                setModelProperty(model, prefs, ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME);
                setModelProperty(model, prefs, ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME);
                setModelProperty(model, prefs, ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER);
            }
        }
        IPreferenceStore store = MavenSeamActivator.getDefault().getPreferenceStore();
        boolean configureSeamPortlet = store.getBoolean(Activator.CONFIGURE_SEAMPORTLET);
        if (!configureSeamPortlet) {
            return;
        }
        if (fproj.hasProjectFacet(seamFacet) && fproj.hasProjectFacet(portletFacet)
                && fproj.hasProjectFacet(jsfportletFacet)) {
            if (!fproj.hasProjectFacet(seamPortletFacet)) {
                fproj.installProjectFacet(seamPortletVersion, null, monitor);
            }
        }
    }

    private void clearMarkers(IProject project) throws CoreException {
        markerManager.deleteMarkers(project, MavenSeamConstants.SEAM_CONFIGURATION_ERROR_MARKER_ID);
    }

    private IProjectFacetVersion findTargetFacetVersion(IProjectFacetVersion seamFv, IProjectFacet targetFacet)
            throws CoreException {
        // Super simplified way to find the target Facet version : 
        // we take the first one that doesn't conflict with the target Seam Facet Version
        if (seamFv != null) {
            for (IProjectFacetVersion jsfFv : targetFacet.getSortedVersions(true)) {
                if (!seamFv.conflictsWith(jsfFv)) {
                    return jsfFv;
                }
            }
        }
        return null;
    }

    private void setModelProperty(IDataModel model, IEclipsePreferences prefs, String property) {
        String value = model.getStringProperty(property);
        if (value != null && value.trim().length() > 0) {
            prefs.put(property, value);
        }
    }

    private void installJSFFacet(IFacetedProject fproj, IProjectFacetVersion jsfVersion, IProgressMonitor monitor)
            throws CoreException {
        if (jsfFacet != null && !fproj.hasProjectFacet(jsfFacet)) {
            IDataModel model = MavenJSFActivator.getDefault().createJSFDataModel(fproj, jsfVersion);
            //Fix for JBIDE-9454, to prevent complete overwrite of web.xml 
            model.setBooleanProperty(IJSFFacetInstallDataModelProperties.CONFIGURE_SERVLET, false);
            fproj.installProjectFacet(jsfVersion, model, monitor);
        }
    }

    private void storeSettings(IProject project) {
        IScopeContext projectScope = new ProjectScope(project);
        IEclipsePreferences prefs = projectScope.getNode(SeamCorePlugin.PLUGIN_ID);
        String version = prefs.get(ISeamFacetDataModelProperties.SEAM_SETTINGS_VERSION, null);
        if (version == null) {
            prefs.put(ISeamFacetDataModelProperties.SEAM_SETTINGS_VERSION,
                    ISeamFacetDataModelProperties.SEAM_SETTINGS_VERSION_1_1);
        }
        try {
            prefs.flush();
        } catch (BackingStoreException e) {
            MavenSeamActivator.log(e);
        }
    }

    private void addSeamSupport(IProject project, IProject[] earProjects) {
        if (project == null) {
            return;
        }
        try {
            SeamUtil.enableSeamSupport(project);
            for (int i = 0; i < earProjects.length; i++) {
                IEclipsePreferences prefs = SeamCorePlugin.getSeamPreferences(project);
                String seamParentProject = prefs.get(ISeamFacetDataModelProperties.SEAM_PARENT_PROJECT, null);
                if (seamParentProject == null) {
                    IProject earProject = earProjects[i];
                    IProject webProject = getReferencingSeamWebProject(earProject);
                    if (webProject != null) {
                        prefs.put(ISeamFacetDataModelProperties.SEAM_PARENT_PROJECT, webProject.getName());
                        break;
                    }
                }
            }

        } catch (CoreException e) {
            MavenSeamActivator.log(e);
        }

    }

    private IProject getReferencingSeamWebProject(IProject earProject) throws CoreException {
        Criteria criteria = new Criteria() {
            public boolean applies(IProject project) {
                return project != null && JavaEEProjectUtilities.isDynamicWebProject(project);
            }
        };
        return getReferencingSeamProject(earProject, criteria);
    }

    private IProject getReferencingSeamEJBProject(IProject earProject) throws CoreException {
        Criteria criteria = new Criteria() {
            public boolean applies(IProject project) {
                return project != null && JavaEEProjectUtilities.isEJBProject(project);
            }
        };
        return getReferencingSeamProject(earProject, criteria);
    }

    private IProject getReferencingSeamProject(IProject earProject, Criteria criteria) throws CoreException {
        IVirtualComponent component = ComponentCore.createComponent(earProject);
        if (component != null) {
            IVirtualReference[] references = component.getReferences();
            for (int i = 0; i < references.length; i++) {
                IVirtualComponent refComponent = references[i].getReferencedComponent();
                IProject refProject = refComponent.getProject();
                if (criteria.applies(refProject)) {
                    if (refProject.hasNature(IMavenConstants.NATURE_ID)) {
                        IFile pom = refProject.getFile(IMavenConstants.POM_FILE_NAME);
                        if (pom.exists()) {
                            MavenProjectManager projectManager = MavenPluginActivator.getDefault()
                                    .getMavenProjectManager();
                            IMavenProjectFacade facade = projectManager.create(pom, true, null);
                            if (facade != null) {
                                MavenProject mavenProject = facade.getMavenProject(null);
                                if (mavenProject != null) {
                                    String version = getSeamVersion(mavenProject);
                                    if (version != null) {
                                        return refProject;
                                    }
                                }
                            }
                        }

                    }
                }
            }
        }
        return null;
    }

    private String getSeamVersion(MavenProject mavenProject) {
        List<Artifact> artifacts = new ArrayList<Artifact>();
        ArtifactFilter filter = new ScopeArtifactFilter(Artifact.SCOPE_TEST);
        for (Artifact artifact : mavenProject.getArtifacts()) {
            if (filter.include(artifact) && artifact.isResolved()) {
                artifacts.add(artifact);
            }
        }
        Artifact seamArtifact = null;
        for (Artifact artifact : artifacts) {
            String groupId = artifact.getGroupId();
            if (ORG_JBOSS_SEAM_GROUP_ID.equals(groupId)) {
                String artifactId = artifact.getArtifactId();
                if (artifactId != null && JBOSS_SEAM_ARTIFACT_ID.equals(artifactId)) {
                    return artifact.getVersion();
                } else if (artifactId != null && artifactId.startsWith(JBOSS_SEAM_ARTIFACT_PREFIX)) {
                    seamArtifact = artifact;
                }
            }
        }
        if (seamArtifact != null) {
            return seamArtifact.getVersion();
        }
        return null;
    }

    private IDataModel createSeamDataModel(String deployType, String seamVersion, IProject project) {
        IDataModel config = (IDataModel) new SeamFacetInstallDataModelProvider().create();
        String seamRuntimeName = getSeamRuntimeName(seamVersion);
        if (seamRuntimeName != null) {
            config.setStringProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, seamRuntimeName);
        }
        config.setBooleanProperty(ISeamFacetDataModelProperties.DB_ALREADY_EXISTS, true);
        config.setBooleanProperty(ISeamFacetDataModelProperties.RECREATE_TABLES_AND_DATA_ON_DEPLOY, false);
        config.setStringProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, deployType);
        config.setBooleanProperty(ISeamFacetDataModelProperties.CONFIGURE_DEFAULT_SEAM_RUNTIME, false);
        config.setBooleanProperty(ISeamFacetDataModelProperties.CONFIGURE_WAR_PROJECT, false);
        config.setBooleanProperty(ISeamFacetDataModelProperties.PROJECT_ALREADY_EXISTS, true);
        IPreferenceStore store = MavenSeamActivator.getDefault().getPreferenceStore();
        boolean configureSeamArtifacts = store.getBoolean(Activator.CONFIGURE_SEAM_ARTIFACTS);
        if (!configureSeamArtifacts) {
            return config;
        }
        String viewFolder = getViewFolder(project);
        if (viewFolder != null) {
            config.setStringProperty(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, viewFolder);
        }
        IJavaProject javaProject = JavaCore.create(project);
        List<IPath> sourcePaths = new ArrayList<IPath>();
        if (javaProject != null && javaProject.isOpen()) {
            try {
                IClasspathEntry[] entries = javaProject.getRawClasspath();
                for (int i = 0; i < entries.length; i++) {
                    IClasspathEntry entry = entries[i];
                    if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                        sourcePaths.add(entry.getPath());
                    }
                }
            } catch (JavaModelException e) {
                MavenSeamActivator.log(e);
            }
            if (sourcePaths.size() > 0) {
                IPath actionSourceFolder = null;
                IPath modelSourceFolder = null;
                for (IPath sourcePath : sourcePaths) {
                    if (sourcePath.toString().contains("hot")) { //$NON-NLS-1$
                        actionSourceFolder = sourcePath;
                    } else {
                        modelSourceFolder = sourcePath;
                    }
                }
                if (actionSourceFolder == null) {
                    actionSourceFolder = modelSourceFolder;
                }
                if (modelSourceFolder == null) {
                    modelSourceFolder = actionSourceFolder;
                }
                String modelSourceFolderStr = modelSourceFolder.toString();
                config.setStringProperty(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER,
                        modelSourceFolderStr);
                String actionSourceFolderStr = actionSourceFolder.toString();
                config.setStringProperty(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER,
                        actionSourceFolderStr);
            }
            try {
                IPackageFragment[] packageFragments = javaProject.getPackageFragments();
                for (int i = 0; i < packageFragments.length; i++) {
                    IPackageFragment pf = packageFragments[i];
                    if (pf != null && pf.getKind() == IPackageFragmentRoot.K_SOURCE && !pf.isDefaultPackage()) {
                        String packageName = pf.getElementName();
                        config.setStringProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME,
                                packageName);
                        config.setStringProperty(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME,
                                packageName);
                    }
                }
            } catch (JavaModelException e) {
                MavenSeamActivator.log(e);
            }
        }
        //config.setStringProperty(ISeamFacetDataModelProperties.TEST_CASES_PACKAGE_NAME, "org.test.beans");
        //config.setStringProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, "noop-connection");
        //config.setProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATH, new String[] { "noop-driver.jar" });
        return config;
    }

    private String getSeamRuntimeName(String seamVersionStr) {
        if (seamVersionStr == null) {
            return null;
        }
        IPreferenceStore store = MavenSeamActivator.getDefault().getPreferenceStore();
        boolean configureSeamRuntime = store.getBoolean(Activator.CONFIGURE_SEAM_RUNTIME);
        if (!configureSeamRuntime) {
            return null;
        }
        String seamRuntime5 = null;
        String seamRuntime3 = null;
        SeamRuntime[] seamRuntimes = SeamRuntimeManager.getInstance().getRuntimes();
        for (int i = 0; i < seamRuntimes.length; i++) {
            SeamRuntime seamRuntime = seamRuntimes[i];
            String seamHomeDir = seamRuntime.getHomeDir();
            if (seamHomeDir == null) {
                continue;
            }
            if (!(new File(seamHomeDir).exists())) {
                continue;
            }
            String fullVersion = SeamUtil.getSeamVersionFromManifest(seamRuntime.getHomeDir());
            if (fullVersion == null) {
                continue;
            }
            if (fullVersion == seamVersionStr) {
                return seamRuntime.getName();
            }
            if (seamRuntime5 == null) {
                String fullVersion5 = fullVersion.substring(0, 5);
                String seamVersion5 = seamVersionStr.substring(0, 5);
                if (seamVersion5.equals(fullVersion5)) {
                    seamRuntime5 = seamRuntime.getName();
                }
            }
            if (seamRuntime5 == null && seamRuntime3 == null) {
                String fullVersion3 = fullVersion.substring(0, 3);
                String seamVersion3 = seamVersionStr.substring(0, 3);
                if (seamVersion3.equals(fullVersion3)) {
                    seamRuntime3 = seamRuntime.getName();
                }
            }
        }
        if (seamRuntime5 != null) {
            return seamRuntime5;
        }
        SeamVersion seamVersion = SeamVersion.parseFromString(seamVersionStr.substring(0, 3));
        SeamRuntime defaultRuntime = SeamRuntimeManager.getInstance().getDefaultRuntime(seamVersion);
        if (defaultRuntime != null) {
            return defaultRuntime.getName();
        }
        return seamRuntime3;
    }

    private static class RemoveComponentFromEnterpriseApplicationOperationEx
            extends RemoveComponentFromEnterpriseApplicationOperation {

        public RemoveComponentFromEnterpriseApplicationOperationEx(IDataModel model) {
            super(model);
        }

        @Override
        protected void updateEARDD(IProgressMonitor monitor) {
            //super.updateEARDD(monitor);
        }
    }

    private static interface Criteria {
        boolean applies(IProject project);
    }

    @SuppressWarnings("restriction")
    private void addErrorMarker(IProject project, String message) {
        markerManager.addMarker(project, MavenSeamConstants.SEAM_CONFIGURATION_ERROR_MARKER_ID, message, -1,
                IMarker.SEVERITY_ERROR);

    }
}