/******************************************************************************* * 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.internal.core.project.facet; import java.io.File; import java.util.Iterator; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.EList; import org.eclipse.jst.javaee.core.DisplayName; import org.eclipse.jst.javaee.core.JavaeeFactory; import org.eclipse.jst.javaee.web.Filter; import org.eclipse.jst.javaee.web.WebApp; import org.eclipse.jst.jsf.core.JSFVersion; import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType; import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType; import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType; import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType; import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.jboss.tools.seam.internal.core.project.facet.AntCopyUtils.FileSet; /** * Install delegate for seam facet version 1.2 * * @author eskimo */ public class SeamFacetInstallDelegate extends SeamFacetAbstractInstallDelegate { private static final String JAVAX_FACES_STATE_SAVING_METHOD = "javax.faces.STATE_SAVING_METHOD"; private static final String CLIENT = "client"; private static final String ORG_JBOSS_SEAM_WEB_SEAM_FILTER = "org.jboss.seam.web.SeamFilter"; private static final String BLUE_SKY = "blueSky"; private static final String ORG_AJAX4JSF_SKIN = "org.ajax4jsf.SKIN"; public static final AntCopyUtils.FileSet JBOSS_EAR_CONTENT = new AntCopyUtils.FileSet() .include("antlr.*\\.jar") //$NON-NLS-1$ .include("commons-jci-core.*\\.jar") //$NON-NLS-1$ .include("commons-jci-janino.*\\.jar") //$NON-NLS-1$ .include("drools-compiler.*\\.jar") //$NON-NLS-1$ .include("drools-core.*\\.jar") //$NON-NLS-1$ .include("janino.*\\.jar") //$NON-NLS-1$ .include("jboss-seam.jar") //$NON-NLS-1$ .include("jboss-seam-remoting\\.jar") //$NON-NLS-1$ .include("jbpm.*\\.jar") //$NON-NLS-1$ .include("security\\.drl") //$NON-NLS-1$ .include("stringtemplate.*\\.jar") //$NON-NLS-1$ // el-ri needed for JBIDE-939 .include("el-ri.*\\.jar"); //$NON-NLS-1$ public static final AntCopyUtils.FileSet JBOSS_WAR_LIB_FILESET_WAR_CONFIG = new AntCopyUtils.FileSet() .include("ajax4jsf.*\\.jar") //$NON-NLS-1$ .include("richfaces.*\\.jar") //$NON-NLS-1$ .include("antlr.*\\.jar") //$NON-NLS-1$ .include("commons-beanutils.*\\.jar") //$NON-NLS-1$ .include("commons-collections.*\\.jar") //$NON-NLS-1$ .include("commons-digester.*\\.jar") //$NON-NLS-1$ .include("commons-jci-core.*\\.jar") //$NON-NLS-1$ .include("commons-jci-janino.*\\.jar") //$NON-NLS-1$ .include("drools-compiler.*\\.jar") //$NON-NLS-1$ .include("drools-core.*\\.jar") //$NON-NLS-1$ .include("janino.*\\.jar") //$NON-NLS-1$ .include("jboss-seam-debug\\.jar") //$NON-NLS-1$ .include("jboss-seam-ioc\\.jar") //$NON-NLS-1$ .include("jboss-seam-mail\\.jar") //$NON-NLS-1$ .include("jboss-seam-pdf\\.jar") //$NON-NLS-1$ .include("jboss-seam-remoting\\.jar") //$NON-NLS-1$ .include("jboss-seam-ui\\.jar") //$NON-NLS-1$ .include("jboss-seam\\.jar") //$NON-NLS-1$ .include("jbpm.*\\.jar") //$NON-NLS-1$ .include("jsf-facelets\\.jar") //$NON-NLS-1$ .include("oscache.*\\.jar") //$NON-NLS-1$ .include("stringtemplate.*\\.jar") //$NON-NLS-1$ // el-ri needed for JBIDE-939 .include("el-ri.*\\.jar") //$NON-NLS-1$ .include("itext.*\\.jar") //$NON-NLS-1$ .include("jfreechart.*\\.jar") //$NON-NLS-1$ .include("jcommon.*\\.jar"); //$NON-NLS-1$ public static final AntCopyUtils.FileSet JBOSS_WAR_LIB_FILESET_EAR_CONFIG = new AntCopyUtils.FileSet() .include("ajax4jsf.*\\.jar") //$NON-NLS-1$ .include("richfaces.*\\.jar") //$NON-NLS-1$ .include("commons-beanutils.*\\.jar") //$NON-NLS-1$ .include("commons-digester.*\\.jar") //$NON-NLS-1$ .include("commons-collections.*\\.jar") //$NON-NLS-1$ .include("jboss-seam-debug\\.jar") //$NON-NLS-1$ .include("jboss-seam-ioc\\.jar") //$NON-NLS-1$ .include("jboss-seam-mail\\.jar") //$NON-NLS-1$ .include("jboss-seam-pdf\\.jar") //$NON-NLS-1$ .include("jboss-seam-ui\\.jar") //$NON-NLS-1$ .include("jsf-facelets\\.jar") //$NON-NLS-1$ .include("oscache.*\\.jar") //$NON-NLS-1$ .include("itext.*\\.jar") //$NON-NLS-1$ .include("jfreechart.*\\.jar") //$NON-NLS-1$ .include("jcommon.*\\.jar"); //$NON-NLS-1$ private static final String ORG_AJAX4JSF_FILTER_NAME = "ajax4jsf"; private static final String ORG_AJAX4JSF_FILTER_CLASS = "org.ajax4jsf.Filter"; private static final String ORG_AJAX4JSF_FILTER_DISPLAY_NAME = "Ajax4jsf Filter"; private static final String ORG_AJAX4JSF_FILTER_MAPPING = "*.seam"; private static final String ORG_JBOSS_SEAM_UI_SEAMFACELETVIEWHANDLER = "org.jboss.seam.ui.facelet.SeamFaceletViewHandler"; private static final String ORG_AJAX4JSF_VIEW_HANDLERS = "org.ajax4jsf.VIEW_HANDLERS"; public static String DROOLS_LIB_SEAM_RELATED_PATH = "drools/lib"; //$NON-NLS-1$ /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#copyFilesToWarProject(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, org.eclipse.wst.common.frameworks.datamodel.IDataModel, org.eclipse.core.runtime.IProgressMonitor) */ @Override protected void copyFilesToWarProject(final IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { if(!shouldCopyLibrariesAndTemplates(model)) return; super.copyFilesToWarProject(project, fv, model, monitor); final File droolsLibFolder = new File(seamHomePath, DROOLS_LIB_SEAM_RELATED_PATH); if(shouldCopyLibraries(model)){ if (isWarConfiguration(model)) { AntCopyUtils.copyFiles(seamHomeFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_WAR_CONFIG).dir(seamHomeFolder))); AntCopyUtils.copyFiles(seamLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_WAR_CONFIG).dir(seamLibFolder))); AntCopyUtils.copyFiles(droolsLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_WAR_CONFIG).dir(droolsLibFolder))); } else { AntCopyUtils.copyFiles(seamHomeFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_EAR_CONFIG).dir(seamHomeFolder))); AntCopyUtils.copyFiles(seamLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_EAR_CONFIG).dir(seamLibFolder))); AntCopyUtils.copyFiles(droolsLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_WAR_LIB_FILESET_EAR_CONFIG).dir(droolsLibFolder))); } } } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#fillEarContents() */ @Override protected void fillEarContents(IProject project, IDataModel model) { if(!shouldCopyLibrariesAndTemplates(model)) return; final File droolsLibFolder = new File(seamHomePath, DROOLS_LIB_SEAM_RELATED_PATH); if(shouldCopyLibraries(model)){ AntCopyUtils.copyFiles(seamHomeFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(seamHomeFolder)), false); AntCopyUtils.copyFiles(seamLibFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(seamLibFolder)), false); AntCopyUtils.copyFiles(droolsLibFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(droolsLibFolder)), false); } AntCopyUtils.copyFiles(seamGenResFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(seamGenResFolder)), false); } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#configureFacesConfigXml(org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IProgressMonitor, java.lang.String) */ @Override protected void configureFacesConfigXml(final IProject project, IProgressMonitor monitor, String webConfigName) { FacesConfigArtifactEdit facesConfigEdit = null; try { facesConfigEdit = FacesConfigArtifactEdit.getFacesConfigArtifactEditForWrite(project, webConfigName); FacesConfigType facesConfig = facesConfigEdit.getFacesConfig(); EList applications = facesConfig.getApplication(); ApplicationType applicationType = null; boolean applicationExists = false; if (applications.size() <= 0) { applicationType = FacesConfigFactory.eINSTANCE.createApplicationType(); } else { applicationType = (ApplicationType) applications.get(0); applicationExists = true; } boolean messageBundleExists = false; for (Iterator iterator = applications.iterator(); iterator.hasNext();) { ApplicationType application = (ApplicationType) iterator.next(); EList messageBundles = application.getMessageBundle(); for (Iterator iterator2 = messageBundles.iterator(); iterator2.hasNext();) { MessageBundleType messageBundle = (MessageBundleType)iterator2.next(); if ("messages".equals(messageBundle.getTextContent().trim())) { messageBundleExists = true; break; } } } if (!messageBundleExists) { MessageBundleType messageBundle = FacesConfigFactory.eINSTANCE.createMessageBundleType(); messageBundle.setTextContent("messages"); applicationType.getMessageBundle().add(messageBundle); } if (!applicationExists) { facesConfig.getApplication().add(applicationType); } EList lifecycles = facesConfig.getLifecycle(); LifecycleType lifecycleType = null; boolean lifecycleExists = false; if (lifecycles.size() <= 0) { lifecycleType = FacesConfigFactory.eINSTANCE.createLifecycleType(); } else { lifecycleType = (LifecycleType)lifecycles.get(0); lifecycleExists = true; } boolean phaseListenerExists = false; for (Iterator iterator = lifecycles.iterator(); iterator.hasNext();) { LifecycleType lifecycle = (LifecycleType) iterator.next(); EList phaseListeners = lifecycle.getPhaseListener(); for (Iterator iterator2 = phaseListeners.iterator(); iterator2.hasNext();) { PhaseListenerType messageBundle = (PhaseListenerType)iterator2.next(); if ("org.jboss.seam.jsf.TransactionalSeamPhaseListener".equals(messageBundle.getTextContent().trim()) || "org.jboss.seam.jsf.SeamPhaseListener".equals(messageBundle.getTextContent().trim())) { phaseListenerExists = true; break; } } } if (!phaseListenerExists) { PhaseListenerType phaseListener = FacesConfigFactory.eINSTANCE.createPhaseListenerType(); phaseListener.setTextContent("org.jboss.seam.jsf.TransactionalSeamPhaseListener"); lifecycleType.getPhaseListener().add(phaseListener); } if (!lifecycleExists) { facesConfig.getLifecycle().add(lifecycleType); } facesConfigEdit.save(monitor); } finally { if (facesConfigEdit != null) { facesConfigEdit.dispose(); } } } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#configure(org.eclipse.jst.javaee.web.WebApp) */ @Override protected void configure(WebApp webApp, IProject project) { // Ajax4jsf (must come first!) // FIXME supposing that the Ajax4jsf filter must come before the Seam filter createOrUpdateFilter(webApp, ORG_AJAX4JSF_FILTER_NAME, ORG_AJAX4JSF_FILTER_CLASS, ORG_AJAX4JSF_FILTER_DISPLAY_NAME); // FIXME not sure if this filter has to have the same mapping as Faces Servlet createOrUpdateFilterMapping(webApp, ORG_AJAX4JSF_FILTER_NAME, ORG_AJAX4JSF_FILTER_MAPPING); JSFVersion jsfVersion = JSFVersion.valueOfProject(project); if (JSFVersion.V2_0.compareTo(jsfVersion) > 0) { createOrUpdateContextParam(webApp, ORG_JBOSS_JBOSSFACES_JSF_CONFIG_NAME, MOJARRA_1_2); } createOrUpdateContextParam(webApp, ORG_AJAX4JSF_VIEW_HANDLERS, ORG_JBOSS_SEAM_UI_SEAMFACELETVIEWHANDLER); createOrUpdateContextParam(webApp, ORG_AJAX4JSF_SKIN, BLUE_SKY); // Seam createOrUpdateListener(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMLISTENER); createOrUpdateFilter(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_NAME, ORG_JBOSS_SEAM_WEB_SEAM_FILTER); createOrUpdateFilterMapping(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_NAME, ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_MAPPING_VALUE); createOrUpdateServlet(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET, ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET_NAME); createOrUpdateServletMapping(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET_NAME, ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET_VALUE); // Facelets development mode (disable in production) createOrUpdateContextParam(webApp, FACELETS_DEVELOPMENT, "true"); // JSF createOrUpdateContextParam(webApp, JAVAX_FACES_STATE_SAVING_METHOD, CLIENT); createOrUpdateContextParam(webApp, JAVAX_FACES_DEFAULT_SUFFIX, JAVAX_FACES_DEFAULT_SUFFIX_VALUE); // other JSF artifacts have been configured by the JSF facet // Security addSecurityConstraint(webApp); } private void createOrUpdateFilter(WebApp webApp, String name, String className, String displayName) { createOrUpdateFilter(webApp,name,className); Filter filter = (Filter) getFilterByName(webApp,name); DisplayName displayNameObj = JavaeeFactory.eINSTANCE.createDisplayName(); displayNameObj.setValue(displayName); filter.getDisplayNames().add(displayNameObj); } @Override protected SeamProjectCreator getProjectCreator(IDataModel model, IProject project, SeamFacetAbstractInstallDelegate seamFacetInstallDelegate) { return new SeamProjectCreator(model, project, seamFacetInstallDelegate); } @Override public FileSet getEarLibFileSet() { return JBOSS_EAR_CONTENT; } @Override public FileSet getWarLibFileSet() { return JBOSS_WAR_LIB_FILESET_WAR_CONFIG; } @Override public FileSet getWarLibFileSetForEar() { return JBOSS_WAR_LIB_FILESET_EAR_CONFIG; } }