/******************************************************************************* * 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.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.EList; 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.DefaultLocaleType; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType; import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType; import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType; import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType; 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.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.jboss.tools.seam.core.SeamCorePlugin; import org.w3c.dom.Element; // TODO: why not just *one* global filter set to avoid any missing names ? (assert for it in our unittests! public class Seam2FacetInstallDelegate extends SeamFacetAbstractInstallDelegate { public static final AntCopyUtils.FileSet JBOSS_EAR_CONTENT = new AntCopyUtils.FileSet() .include("jboss-seam.jar"); //$NON-NLS-1$ public static final AntCopyUtils.FileSet SEAM2_JBOSS_EAR_LIB = new AntCopyUtils.FileSet() .include("antlr-runtime.jar") //$NON-NLS-1$ .include("commons-beanutils.*\\.jar") //$NON-NLS-1$ .include("drools-compiler.*\\.jar") //$NON-NLS-1$ .include("drools-core.*\\.jar") //$NON-NLS-1$ .include("drools-api.*\\.jar") //$NON-NLS-1$ .include("jboss-el.*.jar") //$NON-NLS-1$ .include("jboss-seam-remoting\\.jar") //$NON-NLS-1$ .include("mvel.*\\.jar") //$NON-NLS-1$ .include("jbpm-jpdl.*\\.jar") //$NON-NLS-1$ .include("richfaces-api.*\\.jar"); //$NON-NLS-1$ public static final AntCopyUtils.FileSet SEAM2_JBOSS_WAR_LIB_FILESET_WAR_CONFIG = new AntCopyUtils.FileSet() .include("ajax4jsf.*\\.jar") //$NON-NLS-1$ .include("richfaces.*\\.jar") .include("antlr-runtime.*\\.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("drools-api.*\\.jar") //$NON-NLS-1$ .include("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-excel\\.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$ .include("mvel.*\\.jar") //$NON-NLS-1$ .include("jboss-el.jar") //$NON-NLS-1$ .include("jxl\\.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 SEAM2_JBOSS_WAR_LIB_FILESET_EAR_CONFIG = new AntCopyUtils.FileSet() .include("richfaces-impl\\.jar") //$NON-NLS-1$ .include("richfaces-ui\\.jar") //$NON-NLS-1$ .include("commons-digester\\.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("jboss-seam-excel\\.jar") //$NON-NLS-1$ .include("jxl\\.jar") //$NON-NLS-1$ .include("itext.*\\.jar") //$NON-NLS-1$ .include("jfreechart.*\\.jar") //$NON-NLS-1$ .include("jcommon.*\\.jar") //$NON-NLS-1$ .include("jsf-facelets\\.jar"); //$NON-NLS-1$ public static String DROOLS_LIB_SEAM_RELATED_PATH = "lib"; //$NON-NLS-1$ /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#getEarLibFileSet() */ @Override public AntCopyUtils.FileSet getEarLibFileSet() { return SEAM2_JBOSS_EAR_LIB; } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#getWarLibFileSet() */ @Override public AntCopyUtils.FileSet getWarLibFileSet() { return SEAM2_JBOSS_WAR_LIB_FILESET_WAR_CONFIG; } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#getWarLibFileSetForEar() */ @Override public AntCopyUtils.FileSet getWarLibFileSetForEar() { return SEAM2_JBOSS_WAR_LIB_FILESET_EAR_CONFIG; } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#doExecuteForEjb(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 doExecuteForEjb(final IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { super.doExecuteForEjb(project, fv, model, monitor); IResource src = getSrcFolder(project); if(src!=null && seamHomeFolder!=null && shouldCopyLibrariesAndTemplates(model)) { File srcFile = src.getLocation().toFile(); AntCopyUtils.copyFileToFolder(new File(seamGenResFolder, "security.drl"), srcFile, false); //$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(isWarConfiguration(model)) { if (!SeamCorePlugin.getDefault().hasM2Facet(project) && shouldCopyLibraries(model)) { AntCopyUtils.copyFiles(seamHomeFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSet()).dir(seamHomeFolder))); AntCopyUtils.copyFiles(seamLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSet()).dir(seamLibFolder))); } final IContainer source = warActionSrcRootFolder.getUnderlyingFolder(); File actionsSrc = new File(project.getLocation().toFile(), source.getFullPath().removeFirstSegments(1).toString()); AntCopyUtils.copyFileToFolder(new File(seamGenResFolder, "seam.properties"), actionsSrc, true); //$NON-NLS-1$ if (!SeamCorePlugin.getDefault().hasM2Facet(project) && shouldCopyLibraries(model)) { AntCopyUtils.copyFiles(droolsLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSet()).dir(droolsLibFolder))); } } else { if (!SeamCorePlugin.getDefault().hasM2Facet(project) && shouldCopyLibraries(model)) { AntCopyUtils.copyFiles(seamHomeFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSetForEar()).dir(seamHomeFolder))); AntCopyUtils.copyFiles(seamLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSetForEar()).dir(seamLibFolder))); AntCopyUtils.copyFiles(droolsLibFolder, webLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getWarLibFileSetForEar()).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; if (!SeamCorePlugin.getDefault().hasM2Facet(project)) { final File droolsLibFolder = new File(seamHomePath, DROOLS_LIB_SEAM_RELATED_PATH); AntCopyUtils.copyFiles(seamHomeFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(seamHomeFolder)), false); if(shouldCopyLibraries(model)){ AntCopyUtils.copyFiles(seamLibFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(JBOSS_EAR_CONTENT).dir(seamLibFolder)), false); AntCopyUtils.copyFiles(seamLibFolder, earLibFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getEarLibFileSet()).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 localeConfigExists = false; for (Iterator iterator = applications.iterator(); iterator.hasNext();) { ApplicationType application = (ApplicationType) iterator.next(); EList localeConfigs = application.getLocaleConfig(); if(!localeConfigs.isEmpty()) { localeConfigExists = true; break; } } if (!localeConfigExists) { LocaleConfigType locale = FacesConfigFactory.eINSTANCE.createLocaleConfigType(); DefaultLocaleType defaultLocale = FacesConfigFactory.eINSTANCE.createDefaultLocaleType(); defaultLocale.setTextContent("en"); locale.setDefaultLocale(defaultLocale); SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE.createSupportedLocaleType(); supportedLocale.setTextContent("bg"); locale.getSupportedLocale().add(supportedLocale); supportedLocale = FacesConfigFactory.eINSTANCE.createSupportedLocaleType(); supportedLocale.setTextContent("de"); locale.getSupportedLocale().add(supportedLocale); supportedLocale = FacesConfigFactory.eINSTANCE.createSupportedLocaleType(); supportedLocale.setTextContent("en"); locale.getSupportedLocale().add(supportedLocale); supportedLocale = FacesConfigFactory.eINSTANCE.createSupportedLocaleType(); supportedLocale.setTextContent("fr"); locale.getSupportedLocale().add(supportedLocale); supportedLocale = FacesConfigFactory.eINSTANCE.createSupportedLocaleType(); supportedLocale.setTextContent("tr"); locale.getSupportedLocale().add(supportedLocale); applicationType.getLocaleConfig().add(locale); } boolean viewHandlerExists = false; IDOMModel domModel = facesConfigEdit.getIDOMModel(); if(domModel!=null) { Element facesConfigElement = domModel.getDocument().getDocumentElement(); if(facesConfigElement!=null) { if(facesConfigElement.getAttribute("version").startsWith("1")) { for (Iterator iterator = applications.iterator(); iterator.hasNext();) { ApplicationType application = (ApplicationType) iterator.next(); EList viewHandlers = application.getViewHandler(); for (Iterator iterator2 = viewHandlers.iterator(); iterator2.hasNext();) { ViewHandlerType viewHandlerType = (ViewHandlerType)iterator2.next(); if ("com.sun.facelets.FaceletViewHandler".equals(viewHandlerType.getTextContent().trim())) { viewHandlerExists = true; break; } } } } else { // Don't add facelet view handler for JSF 2 viewHandlerExists = true; } } } if (!viewHandlerExists) { ViewHandlerType viewHandler = FacesConfigFactory.eINSTANCE.createViewHandlerType(); viewHandler.setTextContent("com.sun.facelets.FaceletViewHandler"); applicationType.getViewHandler().add(viewHandler); } if (!applicationExists) { facesConfig.getApplication().add(applicationType); } facesConfigEdit.save(monitor); } finally { if (facesConfigEdit != null) { facesConfigEdit.dispose(); } } } protected String getSkinParamName() { return ORG_RICHFACES_SKIN; } /* * (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) { JSFVersion jsfVersion = JSFVersion.valueOfProject(project); if (JSFVersion.V2_0.compareTo(jsfVersion) > 0) { createOrUpdateContextParam(webApp, ORG_JBOSS_JBOSSFACES_JSF_CONFIG_NAME, MOJARRA_1_2); } // Ajax4jsf createOrUpdateContextParam(webApp, getSkinParamName(), ORG_RICHFACES_SKIN_VALUE); // Seam createOrUpdateListener(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMLISTENER); createOrUpdateFilter(webApp, ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_NAME, ORG_JBOSS_SEAM_SERVLET_SEAMFILTER); 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_DEFAULT_SUFFIX, JAVAX_FACES_DEFAULT_SUFFIX_VALUE); // other JSF artifacts have been configured by the JSF facet // Security addSecurityConstraint(webApp); } @Override protected SeamProjectCreator getProjectCreator(IDataModel model, IProject project, SeamFacetAbstractInstallDelegate seamFacetInstallDelegate) { return new Seam2ProjectCreator(model,project, this); } }