blob: 0c808979ed4b3d072122c8a698aa2156e03a061e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 BEA Systems, Inc
* 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:
* rfrost@bea.com - initial API and impl
*******************************************************************************/
package org.eclipse.jst.j2ee.application.internal.operations;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.j2ee.application.Application;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.application.WebModule;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
/**
* <code>AbstractDataModelOperation</code> subclass that updates the context-root for a given
* module within the application.xml files of all containing EARs.
*/
public class UpdateModuleContextRootInEAROp extends AbstractDataModelOperation implements IUpdateModuleContextRootProperties {
public UpdateModuleContextRootInEAROp() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
*/
@Override
public IStatus execute(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
if(monitor != null) {
monitor.beginTask("", 1); //$NON-NLS-1$
}
try {
final String newContextRoot = model.getStringProperty(CONTEXT_ROOT);
final IProject project = (IProject) model.getProperty(PROJECT);
final IDataModel nestedModel = model.getNestedModel(NESTED_MODEL_ID);
if (nestedModel != null) {
List earsToUpdate= (List) nestedModel.getProperty(EARS_TO_UPDATE);
if (newContextRoot != null && earsToUpdate != null && project != null) {
// update each specified EAR
for (int i = 0; i < earsToUpdate.size(); i++) {
updateEARContextRoot((IProject) earsToUpdate.get(i), project, newContextRoot, monitor);
}
}
}
} catch (Exception e) {
J2EEPlugin.logError(e);
} finally {
if (monitor != null) {
monitor.done();
}
}
return OK_STATUS;
}
/*
* Updates the context-root element int the application.xml of the specified EAR for the specified
* module project to the new value.
*/
private void updateEARContextRoot(final IProject ear, final IProject project, final String newContextRoot,
final IProgressMonitor monitor) {
EARArtifactEdit earEdit = null;
try {
earEdit = EARArtifactEdit.getEARArtifactEditForWrite(ear);
if (earEdit != null) {
final Application application = earEdit.getApplication();
final IVirtualComponent comp = ComponentCore.createComponent(project);
if (comp == null) {
return;
}
final String moduleURI = earEdit.getModuleURI(comp);
final Module module = application.getFirstModule(moduleURI);
if (module != null && module instanceof WebModule) {
((WebModule) module).setContextRoot(newContextRoot);
}
earEdit.saveIfNecessary(monitor);
}
} finally {
if (earEdit != null) {
earEdit.dispose();
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
*/
@Override
public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// no-op
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
*/
@Override
public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// no-op
return null;
}
}