/******************************************************************************* * Copyright (c) 2008 Oracle Corporation. * 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: * Cameron Bateman - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facelet.core.internal.facet; 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.jsf.facelet.core.internal.FaceletCoreTraceOptions; import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType; import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType; import org.eclipse.ui.PlatformUI; import org.eclipse.wst.common.project.facet.core.IDelegate; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; /** * The super-class of all Facelet facet change delegates. The only expected * delegates at this time are install and uninstall. Each super-class must * decide the meaning of "change" and implement the abstract members * appropriately. * * @author cbateman * */ public abstract class FaceletChangeDelegate implements IDelegate { /** * The default name of the Facelet runtime view handler */ protected static final String RUNTIME_VIEWHANDLER_CLASS_NAME = "com.sun.facelets.FaceletViewHandler"; //$NON-NLS-1$ public void execute(final IProject project, final IProjectFacetVersion fv, final Object config, final IProgressMonitor monitor) throws CoreException { PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { final FacetChangeModel model = (FacetChangeModel) config; // XXX: look at glassfish changes handleDesignTimeViewHandler(project); if (model.isChgViewHandler()) { maybeChangeFaceletViewHandler(project, monitor); } final WebAppConfigurator configurator = WebAppConfigurator .getConfigurator(project); if (configurator != null) { maybeChangeDefaultSuffix(model, configurator); maybeChangeConfigureListener(model, configurator); maybeChangeWebLifecycleListener(model, configurator); } else if (FaceletCoreTraceOptions.TRACE_FACETCHANGEDELEGATE) { FaceletCoreTraceOptions .log("FaceletChangeDelegate: No web configurator"); //$NON-NLS-1$ } } }); } /** * Performs the change to the web lifecycle listener configuration of of the * web.xml model using configurator, if applicable. * * @param model * @param configurator */ protected abstract void maybeChangeWebLifecycleListener( FacetChangeModel model, WebAppConfigurator configurator); /** * Performs the change to the configure listener configuration of the * web.xml model using configurator, if applicable. * * @param model * @param configurator */ protected abstract void maybeChangeConfigureListener( FacetChangeModel model, WebAppConfigurator configurator); /** * Performs the change to the DEFAULT_SUFFIX configuration of the web.xml * model using configurator, if applicable. * * @param model * @param configurator */ protected abstract void maybeChangeDefaultSuffix(FacetChangeModel model, WebAppConfigurator configurator); /** * Changes the runtime view handler settings on project if applicable. * * @param project * @param monitor * */ protected abstract void maybeChangeFaceletViewHandler(IProject project, IProgressMonitor monitor); /** * Change the designtime view handler if applicable. * * @param project */ protected abstract void handleDesignTimeViewHandler(final IProject project); /** * @return a user displayable name of the sub-classing change delegate. */ protected abstract String getDisplayName(); /** * @param root * @return true if the Facelet view handler is already present in the * WEB-INF/faces-config.xml file. */ protected final boolean isViewHandlerPresent(final FacesConfigType root) { final EList<?> applications = root.getApplication(); for (final Object name : applications) { final ApplicationType app = (ApplicationType) name; if (app != null) { for (final Iterator<?> viewIt = app.getViewHandler().iterator(); viewIt .hasNext();) { final ViewHandlerType viewHandler = (ViewHandlerType) viewIt .next(); if (viewHandler != null && viewHandler.getTextContent() != null && RUNTIME_VIEWHANDLER_CLASS_NAME .equals(viewHandler.getTextContent().trim())) { return true; } } } } return false; } }