blob: fecb83de27a3f650787e148e2ebae1697303d815 [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others. 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: IBM Corporation - initial API and implementation
**************************************************************************************************/
package org.eclipse.jst.j2ee.application.internal.operations;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.internal.J2EEVersionUtil;
import org.eclipse.jst.j2ee.internal.archive.operations.JavaComponentCreationDataModel;
import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
import org.eclipse.jst.j2ee.internal.earcreation.EARComponentCreationDataModel;
import org.eclipse.wst.common.componentcore.UnresolveableURIException;
import org.eclipse.wst.common.componentcore.internal.StructureEdit;
import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditOperationDataModel;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
/**
* This dataModel is a common super class used for to create Flexibile J2EE Components.
*
* This class (and all its fields and methods) is likely to change during the WTP 1.0 milestones as
* the new project structures are adopted. Use at your own risk.
*
* @since WTP 1.0
*/
public abstract class J2EEComponentCreationDataModel extends JavaComponentCreationDataModel implements IAnnotationsDataModel {
/**
* type Boolean, default false
*/
public static final String ADD_TO_EAR = "J2EEComponentCreationDataModel.ADD_TO_EAR"; //$NON-NLS-1$
/**
* type String
*/
public static final String EAR_MODULE_NAME = "J2EEComponentCreationDataModel.EAR_MODULE_NAME"; //$NON-NLS-1$
public static final String EAR_MODULE_DEPLOY_NAME = "J2EEComponentCreationDataModel.EAR_MODULE_DEPLOY_NAME"; //$NON-NLS-1$
/**
* type boolean
*/
private static final String NESTED_MODEL_ADD_TO_EAR = "J2EEComponentCreationDataModel.NESTED_MODEL_ADD_TO_EAR"; //$NON-NLS-1$
private static final String NESTED_MODEL_EAR_CREATION = "J2EEComponentCreationDataModel.NESTED_MODEL_EAR_CREATION"; //$NON-NLS-1$
/**
* type boolean
*/
private static final String NESTED_MODEL_JAR_DEPENDENCY = "J2EEComponentCreationDataModel.NESTED_MODEL_JAR_DEPENDENCY"; //$NON-NLS-1$
/**
* type Boolean; default true, UI only
*/
public static final String UI_SHOW_EAR_SECTION = "J2EEComponentCreationDataModel.UI_SHOW_EAR_SECTION"; //$NON-NLS-1$
/**
* type String
*/
public static final String DD_FOLDER = "J2EEComponentCreationDataModel.DD_FOLDER"; //$NON-NLS-1$
/**
* This corresponds to the J2EE versions of 1.2, 1.3, 1.4, etc. Each subclass will convert this
* version to its corresponding highest module version supported by the J2EE version and set the
* J2EE_MODULE_VERSION property.
*
* type Integer
*/
public static final String J2EE_VERSION = "J2EEComponentCreationDataModel.J2EE_VERSION"; //$NON-NLS-1$
public AddComponentToEnterpriseApplicationDataModel addComponentToEARDataModel;
protected EARComponentCreationDataModel earComponentCreationDataModel;
private UpdateManifestDataModel jarDependencyDataModel;
private ClassPathSelection cachedSelection;
/**
* This needs to be set up to ensure that other j2ee component is properly added as dependent
* component of ear
*/
private URI earComponentHandle;
protected void init() {
super.init();
}
protected void initValidBaseProperties() {
super.initValidBaseProperties();
addValidBaseProperty(EAR_MODULE_NAME);
addValidBaseProperty(EAR_MODULE_DEPLOY_NAME);
addValidBaseProperty(ADD_TO_EAR);
addValidBaseProperty(USE_ANNOTATIONS);
addValidBaseProperty(UI_SHOW_EAR_SECTION);
addValidBaseProperty(DD_FOLDER);
addValidBaseProperty(J2EE_VERSION);
addValidBaseProperty(NESTED_MODEL_VALIDATION_HOOK);
}
protected void initNestedModels() {
super.initNestedModels();
earComponentCreationDataModel = new EARComponentCreationDataModel();
if (earComponentCreationDataModel != null)
addNestedModel(NESTED_MODEL_EAR_CREATION, earComponentCreationDataModel);
addComponentToEARDataModel = createModuleNestedModel();
if (addComponentToEARDataModel != null)
addNestedModel(NESTED_MODEL_ADD_TO_EAR, addComponentToEARDataModel);
jarDependencyDataModel = new UpdateManifestDataModel();
addNestedModel(NESTED_MODEL_JAR_DEPENDENCY, jarDependencyDataModel);
}
protected AddComponentToEnterpriseApplicationDataModel createModuleNestedModel() {
return new AddComponentToEnterpriseApplicationDataModel();
}
protected Object getDefaultProperty(String propertyName) {
if (propertyName.equals(ADD_TO_EAR)) {
return Boolean.FALSE;
} else if (propertyName.equals(USE_ANNOTATIONS)) {
return Boolean.FALSE;
} else if (propertyName.equals(UI_SHOW_EAR_SECTION)) {
return Boolean.TRUE;
} else if (propertyName.equals(EAR_MODULE_NAME)) {
return getStringProperty(COMPONENT_NAME) + "EAR";
} else {
return super.getDefaultProperty(propertyName);
}
}
protected boolean doSetProperty(String propertyName, Object propertyValue) {
boolean returnValue = super.doSetProperty(propertyName, propertyValue);
if (propertyName.equals(EAR_MODULE_NAME)) {
earComponentHandle = computeEARHandle((String) propertyValue);
} else if (propertyName.equals(COMPONENT_NAME)) {
if (isProperty(EAR_MODULE_NAME) && !isSet(EAR_MODULE_NAME)) {
notifyDefaultChange(EAR_MODULE_NAME);
setEARDeployNameProperty(getStringProperty(EAR_MODULE_NAME));
}
} else if (propertyName.equals(PROJECT_NAME)) {
WorkbenchComponent workbenchComp = getTargetWorkbenchComponent();
setEARComponentIfJ2EEModuleCreationOnly(workbenchComp, propertyValue);
} else if (propertyName.equals(ADD_TO_EAR)) {
notifyEnablementChange(ADD_TO_EAR);
} else if (propertyName.equals(J2EE_VERSION)) {
Integer modVersion = convertJ2EEVersionToModuleVersion((Integer) propertyValue);
setProperty(COMPONENT_VERSION, modVersion);
return false;
}
return returnValue;
}
private URI computeEARHandle(String earHandle) {
if (earHandle == null || earHandle.equals(""))
return null;
URI uri = URI.createURI(earHandle);
if (uri != null) {
boolean isValidURI = false;
try {
isValidURI = ModuleURIUtil.ensureValidFullyQualifiedModuleURI(uri);
String deployeName = ModuleURIUtil.getDeployedName(uri);
setEARDeployNameProperty(deployeName);
} catch (UnresolveableURIException e) {
}
if (isValidURI) {
earComponentHandle = uri;
return earComponentHandle;
}
}
return null;
}
private void setEARDeployNameProperty(Object propertyValue) {
setProperty(EAR_MODULE_DEPLOY_NAME, propertyValue);
}
/**
* @param workbenchComp
*/
protected void setEARComponentIfJ2EEModuleCreationOnly(WorkbenchComponent workbenchComp, Object propertyValue) {
getAddModuleToApplicationDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.ARCHIVE_MODULE, workbenchComp);
getAddModuleToApplicationDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.PROJECT_NAME, getStringProperty(PROJECT_NAME));
getAddModuleToApplicationDataModel().setProperty(AddComponentToEnterpriseApplicationDataModel.EAR_MODULE_NAME, getStringProperty(EAR_MODULE_NAME));
if (!isSet(EAR_MODULE_NAME)) {
String earModuleName = getStringProperty(EAR_MODULE_NAME);
notifyListeners(EAR_MODULE_NAME);
}
jarDependencyDataModel.setProperty(UpdateManifestDataModel.PROJECT_NAME, propertyValue);
}
protected Boolean basicIsEnabled(String propertyName) {
Boolean enabled = super.basicIsEnabled(propertyName);
if (enabled.booleanValue()) {
if (propertyName.equals(EAR_MODULE_NAME)) {
enabled = (Boolean) getProperty(ADD_TO_EAR);
}
}
return enabled;
}
protected final AddComponentToEnterpriseApplicationDataModel getAddModuleToApplicationDataModel() {
return addComponentToEARDataModel;
}
protected WTPPropertyDescriptor[] doGetValidPropertyDescriptors(String propertyName) {
if (propertyName.equals(COMPONENT_VERSION)) {
return getValidComponentVersionDescriptors();
}
if (propertyName.equals(EAR_MODULE_NAME)) {
int j2eeVersion = getJ2EEVersion();
return getEARPropertyDescriptor(j2eeVersion);
}
return super.doGetValidPropertyDescriptors(propertyName);
}
private WTPPropertyDescriptor[] getEARPropertyDescriptor(int j2eeVersion) {
StructureEdit mc = null;
ArrayList earDescriptorList = new ArrayList();
IProject[] projs = ProjectUtilities.getAllProjects();
for (int index = 0; index < projs.length; index++) {
IProject flexProject = projs[index];
try {
if (flexProject != null) {
mc = StructureEdit.getStructureEditForRead(flexProject);
if (mc != null) {
WorkbenchComponent[] components = mc.getWorkbenchModules();
for (int i = 0; i < components.length; i++) {
EARArtifactEdit earArtifactEdit = null;
try {
WorkbenchComponent wc = components[i];
if (wc.getComponentType() != null && wc.getComponentType().getComponentTypeId().equals(IModuleConstants.JST_EAR_MODULE)) {
ComponentHandle handle = ComponentHandle.create(flexProject,wc.getName());
earArtifactEdit = EARArtifactEdit.getEARArtifactEditForRead(handle);
if (j2eeVersion <= earArtifactEdit.getJ2EEVersion()) {
WTPPropertyDescriptor desc = new WTPPropertyDescriptor(wc.getHandle().toString(), wc.getName());
earDescriptorList.add(desc);
}
}
} finally {
if (earArtifactEdit != null)
earArtifactEdit.dispose();
}
}
}
}
} finally {
if (mc != null)
mc.dispose();
}
}
WTPPropertyDescriptor[] descriptors = new WTPPropertyDescriptor[earDescriptorList.size()];
for (int i = 0; i < descriptors.length; i++) {
WTPPropertyDescriptor desc = (WTPPropertyDescriptor) earDescriptorList.get(i);
descriptors[i] = new WTPPropertyDescriptor(desc.getPropertyValue(), desc.getPropertyDescription());
}
return descriptors;
}
public IProject getProject() {
String projName = getStringProperty(J2EEComponentCreationDataModel.PROJECT_NAME);
if (projName != null && projName.length() > 0)
return ProjectUtilities.getProject(projName);
return null;
}
public WorkbenchComponent getTargetWorkbenchComponent() {
StructureEdit core = null;
try {
IProject flexProject = getProject();
if (flexProject != null) {
core = StructureEdit.getStructureEditForRead(getProject());
if (core != null) {
String componentName = getProperty(COMPONENT_NAME) != null ? getProperty(COMPONENT_NAME).toString() : null;
if (componentName != null)
return core.findComponentByName(componentName);
}
}
} finally {
if (core != null)
core.dispose();
}
return null;
}
protected IStatus doValidateProperty(String propertyName) {
if (EAR_MODULE_NAME.equals(propertyName) && getBooleanProperty(ADD_TO_EAR)) {
return validateEARModuleNameProperty();
} else if (NESTED_MODEL_VALIDATION_HOOK.equals(propertyName)) {
return OK_STATUS;
} else if (propertyName.equals(COMPONENT_VERSION)) {
int componentVersion = getIntProperty(COMPONENT_VERSION);
int j2eeVer = convertModuleVersionToJ2EEVersion(componentVersion);
String j2eeText = J2EEVersionUtil.getJ2EETextVersion(j2eeVer);
String[] validModuleVersions = (String[]) getProperty(VALID_MODULE_VERSIONS_FOR_PROJECT_RUNTIME);
if (validModuleVersions != null) {
boolean found = false;
for (int i = 0; i < validModuleVersions.length; i++) {
String text = validModuleVersions[i];
if (text.equals("*") || text.equals(j2eeText)) {
found = true;
break;
}
}
IStatus status = OK_STATUS;
if (!found) {
String errorMessage = J2EECommonMessages.getResourceString(J2EECommonMessages.ERR_VERSION_NOT_SUPPORTED);
status = WTPCommonPlugin.createErrorStatus(errorMessage);
}
return status;
} else {
String errorMessage = J2EECommonMessages.getResourceString(J2EECommonMessages.ERR_NOT_SUPPORTED);
IStatus status = WTPCommonPlugin.createErrorStatus(errorMessage);
return status;
}
}
return super.doValidateProperty(propertyName);
}
public EARComponentCreationDataModel getEarComponentCreationDataModel() {
return earComponentCreationDataModel;
}
private IStatus validateEARModuleNameProperty() {
IStatus status = OK_STATUS;
String earName = getStringProperty(EAR_MODULE_NAME);
if (status.isOK()) {
if (earName.indexOf("#") != -1) { //$NON-NLS-1$
String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_INVALID_CHARS); //$NON-NLS-1$
return WTPCommonPlugin.createErrorStatus(errorMessage);
} else if (earName == null || earName.equals("")) { //$NON-NLS-1$
String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_EMPTY_MODULE_NAME);
return WTPCommonPlugin.createErrorStatus(errorMessage);
}
} else
return status;
// IProject earProject = applicationCreationDataModel.getTargetProject();
// if (null != earProject && earProject.exists()) {
// if (earProject.isOpen()) {
// try {
// EARNatureRuntime earNature = (EARNatureRuntime)
// earProject.getNature(IEARNatureConstants.NATURE_ID);
// if (earNature == null) {
// return
// WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NOT_EAR,
// new Object[]{earProject.getName()}));
// } else if (earNature.getJ2EEVersion() < getJ2EEVersion()) {
// String earVersion =
// EnterpriseApplicationCreationDataModel.getVersionString(earNature.getJ2EEVersion());
// return
// WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.INCOMPATABLE_J2EE_VERSIONS,
// new Object[]{earProject.getName(), earVersion}));
// }
// return OK_STATUS;
// } catch (CoreException e) {
// return new Status(IStatus.ERROR, J2EEPlugin.PLUGIN_ID, -1, null, e);
// }
// }
// return
// WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_ClOSED,
// new Object[]{earProject.getName()}));
// } else if (null != earProject && null != getTargetProject()) {
// if (earProject.getName().equals(getTargetProject().getName())) {
// return
// WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.SAME_MODULE_AND_EAR_NAME,
// new Object[]{earProject.getName()}));
// } else if (!CoreFileSystemLibrary.isCaseSensitive()) {
// if
// (earProject.getName().toLowerCase().equals(getTargetProject().getName().toLowerCase())) {
// return
// WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.SAME_MODULE_AND_EAR_NAME,
// new Object[]{earProject.getName()}));
// }
// }
// }
// IStatus status =
// applicationCreationDataModel.validateProperty(EnterpriseApplicationCreationDataModel.PROJECT_NAME);
// if (status.isOK()) {
// status =
// applicationCreationDataModel.validateProperty(EnterpriseApplicationCreationDataModel.PROJECT_LOCATION);
// }
// return status;
return WTPCommonPlugin.OK_STATUS;
}
/**
* @return
*/
public final UpdateManifestDataModel getUpdateManifestDataModel() {
return jarDependencyDataModel;
}
public final ClassPathSelection getClassPathSelection() {
// boolean createNew = false;
// if (null == cachedSelection ||
// !getApplicationCreationDataModel().getTargetProject().getName().equals(cachedSelection.getEARFile().getURI()))
// {
// createNew = true;
// }
// // close an existing cachedSelection
// if (createNew && cachedSelection != null) {
// EARFile earFile = cachedSelection.getEARFile();
// if (earFile != null)
// earFile.close();
// }
//
// if (createNew && getTargetProject() != null) {
// cachedSelection = ClasspathSelectionHelper.createClasspathSelection(getTargetProject(),
// getModuleExtension(), getApplicationCreationDataModel().getTargetProject(),
// getModuleType());
// }
return cachedSelection;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#dispose()
*/
public void dispose() {
if (cachedSelection != null)
cachedSelection.getEARFile().close();
super.dispose();
}
public void propertyChanged(WTPOperationDataModelEvent event) {
super.propertyChanged(event);
if (event.getDataModel() == addComponentToEARDataModel && event.getFlag() == WTPOperationDataModelEvent.PROPERTY_CHG && event.getPropertyName().equals(ArtifactEditOperationDataModel.PROJECT_NAME)) {
earComponentCreationDataModel.setProperty(EARComponentCreationDataModel.COMPONENT_NAME, event.getProperty());
}
}
public String getModuleName() {
return getStringProperty(COMPONENT_NAME);
}
protected abstract WTPPropertyDescriptor[] getValidComponentVersionDescriptors();
public final int getJ2EEVersion() {
return convertModuleVersionToJ2EEVersion(getIntProperty(COMPONENT_VERSION));
}
/**
* Subclasses should override to convert the j2eeVersion to a module version id. By default we
* return the j2eeVersion which is fine if no conversion is necessary.
*
* @param integer
* @return
*/
protected Integer convertJ2EEVersionToModuleVersion(Integer j2eeVersion) {
return j2eeVersion;
}
protected abstract int convertModuleVersionToJ2EEVersion(int moduleVersion);
/**
* @return Returns the addComponentToEARDataModel.
*/
public AddComponentToEnterpriseApplicationDataModel getAddComponentToEARDataModel() {
return addComponentToEARDataModel;
}
/**
* @param addComponentToEARDataModel
* The addComponentToEARDataModel to set.
*/
public void setAddComponentToEARDataModel(AddComponentToEnterpriseApplicationDataModel addComponentToEARDataModel) {
this.addComponentToEARDataModel = addComponentToEARDataModel;
}
public URI getEarComponentHandle() {
return earComponentHandle;
}
public void setEarComponentHandle(URI earComponentHandle) {
this.earComponentHandle = earComponentHandle;
}
}