| /*********************************************************************** |
| * Copyright (c) 2008 by SAP AG, Walldorf. |
| * 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: |
| * SAP AG - initial API and implementation |
| ***********************************************************************/ |
| package org.eclipse.jst.jee.model.internal; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.jst.j2ee.model.IModelProvider; |
| import org.eclipse.jst.j2ee.model.IModelProviderEvent; |
| import org.eclipse.jst.javaee.web.WebApp; |
| import org.eclipse.jst.javaee.web.WebFactory; |
| import org.eclipse.jst.jee.model.internal.common.AbstractMergedModelProvider; |
| import org.eclipse.jst.jee.model.internal.mergers.ModelElementMerger; |
| import org.eclipse.jst.jee.model.internal.mergers.ModelException; |
| import org.eclipse.jst.jee.model.internal.mergers.WebAppMerger; |
| import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; |
| |
| /** |
| * @author Kiril Mitov k.mitov@sap.com |
| * |
| */ |
| public class Web25MergedModelProvider extends AbstractMergedModelProvider<WebApp> { |
| |
| public Web25MergedModelProvider(IProject project) { |
| super(project); |
| } |
| |
| /** |
| * (non-Javadoc) Synchronizing the loading of the model |
| * |
| * @see org.eclipse.jst.jee.model.internal.common.AbstractMergedModelProvider#loadModel() |
| */ |
| protected final synchronized WebApp loadModel() throws CoreException { |
| return super.loadModel(); |
| } |
| |
| @Override |
| protected IModelProvider loadAnnotationModel(WebApp ddModel) throws CoreException { |
| return new WebAnnotationReader(ProjectFacetsManager.create(project), ddModel); |
| } |
| |
| @Override |
| protected IModelProvider loadDeploymentDescriptorModel() throws CoreException { |
| return new Web25ModelProvider(project); |
| } |
| |
| private WebApp getAnnotationWebApp() { |
| return (WebApp) annotationModelProvider.getModelObject(); |
| } |
| |
| private WebApp getXmlWebApp() { |
| return (WebApp) ddProvider.getModelObject(); |
| } |
| |
| public Object getModelObject(IPath modelPath) { |
| return null; |
| } |
| |
| public void modify(Runnable runnable, IPath modelPath) { |
| /* |
| * Someone has called modify before loading the model. Try to load the |
| * model. |
| */ |
| getMergedModel(); |
| /* |
| * Still not supporting modifications of the merged model. During modify |
| * the model is becoming the ddModel. After modifying the model is |
| * unloaded. |
| */ |
| WebApp backup = mergedModel; |
| mergedModel = (WebApp) ddProvider.getModelObject(); |
| ddProvider.modify(runnable, modelPath); |
| if (isDisposed()) { |
| return; |
| } |
| mergedModel = backup; |
| clearModel(mergedModel); |
| try { |
| WebAppMerger merger = new WebAppMerger(mergedModel, (WebApp) ddProvider.getModelObject(), |
| ModelElementMerger.ADD); |
| merger.process(); |
| merger = new WebAppMerger(mergedModel, getAnnotationWebApp(), ModelElementMerger.ADD); |
| merger.process(); |
| } catch (ModelException e) { |
| e.printStackTrace(); |
| } |
| |
| } |
| |
| private void clearModel(WebApp app) { |
| if (app == null) { |
| return; |
| } |
| app.getContextParams().clear(); |
| app.getDescriptions().clear(); |
| app.getDisplayNames().clear(); |
| app.getDistributables().clear(); |
| app.getEjbLocalRefs().clear(); |
| app.getEjbRefs().clear(); |
| app.getEnvEntries().clear(); |
| app.getErrorPages().clear(); |
| app.getFilterMappings().clear(); |
| app.getFilters().clear(); |
| app.getIcons().clear(); |
| app.getJspConfigs().clear(); |
| app.getListeners().clear(); |
| app.getLocalEncodingMappingsLists().clear(); |
| app.getLoginConfigs().clear(); |
| app.getMessageDestinationRefs().clear(); |
| app.getMessageDestinations().clear(); |
| app.getMimeMappings().clear(); |
| app.getPersistenceContextRefs().clear(); |
| app.getPersistenceUnitRefs().clear(); |
| app.getPostConstructs().clear(); |
| app.getPreDestroys().clear(); |
| app.getResourceEnvRefs().clear(); |
| app.getResourceRefs().clear(); |
| app.getSecurityConstraints().clear(); |
| app.getSecurityRoles().clear(); |
| app.getServiceRefs().clear(); |
| app.getServletMappings().clear(); |
| app.getServlets().clear(); |
| app.getSessionConfigs().clear(); |
| app.getWelcomeFileLists().clear(); |
| } |
| |
| protected void annotationModelChanged(IModelProviderEvent event) { |
| internalModelChanged(event); |
| } |
| |
| protected void xmlModelChanged(IModelProviderEvent event) { |
| if (isDisposed()) |
| return; |
| if (shouldDispose(event)) { |
| dispose(); |
| notifyListeners(event); |
| return; |
| } |
| notifyListeners(event); |
| } |
| |
| /* |
| * Notifications from xml and annotation may come in different threads. This |
| * depends on the implementation of the model providers, but to make sure |
| * that no race conditions occurs I am synchronizing this method. |
| */ |
| private synchronized void internalModelChanged(IModelProviderEvent event) { |
| if (isDisposed()) |
| return; |
| if (shouldDispose(event)) { |
| dispose(); |
| notifyListeners(event); |
| return; |
| } |
| merge(getXmlWebApp(), getAnnotationWebApp()); |
| notifyListeners(event); |
| } |
| |
| @Override |
| protected WebApp merge(WebApp ddModel, WebApp annotationsModel) { |
| |
| try { |
| WebAppMerger merger; |
| if (mergedModel == null) { |
| mergedModel = (WebApp) WebFactory.eINSTANCE.createWebApp(); |
| initMergedModelResource((EObject) ddModel); |
| } else { |
| clearModel(mergedModel); |
| |
| } |
| merger = new WebAppMerger(mergedModel, ddModel, ModelElementMerger.ADD); |
| merger.process(); |
| |
| merger = new WebAppMerger(mergedModel, annotationsModel, ModelElementMerger.ADD); |
| merger.process(); |
| } catch (ModelException e) { |
| e.printStackTrace(); |
| } |
| return mergedModel; |
| } |
| } |