blob: 212bd70eec0064154266c866276605a4a0143568 [file] [log] [blame]
/***********************************************************************
* 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;
}
}