/******************************************************************************* * Copyright (c) 2005, 2008 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 * David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences * Stefan Dimov, stefan.dimov@sap.com - bug 207826 *******************************************************************************/ package org.eclipse.jst.j2ee.internal; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.jar.Manifest; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jem.util.logger.proxy.Logger; import org.eclipse.jem.workbench.utility.JemProjectUtilities; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider; import org.eclipse.jst.j2ee.application.internal.operations.ClassPathSelection; import org.eclipse.jst.j2ee.application.internal.operations.ClasspathElement; import org.eclipse.jst.j2ee.application.internal.operations.RemoveComponentFromEnterpriseApplicationDataModelProvider; import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties; import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider; import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil; import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants; import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil; import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants.DependencyAttributeType; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifestImpl; import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualArchiveComponent; import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyEnablement; import org.eclipse.jst.j2ee.internal.common.ClasspathModel; import org.eclipse.jst.j2ee.internal.common.ClasspathModelEvent; import org.eclipse.jst.j2ee.internal.common.ClasspathModelListener; import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater; import org.eclipse.jst.j2ee.internal.listeners.IValidateEditListener; import org.eclipse.jst.j2ee.internal.listeners.ValidateEditListener; import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.model.ModelProviderManager; import org.eclipse.jst.j2ee.project.EarUtilities; import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; import org.eclipse.jst.javaee.application.Application; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; import org.eclipse.wst.common.componentcore.UnresolveableURIException; import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties; import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph; import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil; import org.eclipse.wst.common.componentcore.internal.operation.RemoveReferenceComponentsDataModelProvider; import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities; import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFile; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation; import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider; import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin; import org.eclipse.wst.common.frameworks.internal.ui.WorkspaceModifyComposedOperation; /** * @author jialin * @deprecated wtp 3.2 */ public class JARDependencyPropertiesPage implements IJ2EEDependenciesControl, IClasspathTableOwner, Listener, ClasspathModelListener, IElementChangedListener { protected final IProject project; protected final J2EEDependenciesPage propPage; protected IOException caughtManifestException; protected boolean isDirty; protected Text classPathText; protected Text componentNameText; protected ClasspathModel model; protected CCombo availableAppsCombo; protected ClasspathTableManager tableManager; protected IValidateEditListener validateEditListener; protected Label manifestLabel; protected Label enterpriseApplicationLabel; protected Label availableDependentJars; private final Display display; private boolean isDisposed = false; /** * Constructor for JARDependencyPropertiesControl */ public JARDependencyPropertiesPage(final IProject project, final J2EEDependenciesPage page) { super(); J2EEComponentClasspathUpdater.getInstance().pauseUpdates(); this.project = project; this.propPage = page; this.display = propPage.getShell().getDisplay(); } /** * Returns false if page should not be displayed for the project. */ protected void initialize() { model = createClasspathModel(); model.setProject(project); if (model.getComponent() != null) { model.addListener(this); updateModelManifest(); initializeValidateEditListener(); } } protected ClasspathModel createClasspathModel(){ return new ClasspathModel(J2EEProjectUtilities.readManifest(project), false); } public void dispose() { isDisposed = true; JavaCore.removeElementChangedListener(this); J2EEComponentClasspathUpdater.getInstance().resumeUpdates(); } private void updateModelManifest() { if (JemProjectUtilities.isBinaryProject(project) || model.getAvailableEARComponents().length == 0) return; IVirtualComponent component = ComponentCore.createComponent(project); if(component != null){ IVirtualFile vManifest = component.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI)); if(vManifest.exists()){ IFile iManifest = vManifest.getUnderlyingFile(); if(iManifest != null && iManifest.exists()){ InputStream in = null; try { in = iManifest.getContents(); ArchiveManifest mf = new ArchiveManifestImpl(new Manifest(in)); model.primSetManifest(mf); } catch (CoreException e) { Logger.getLogger().logError(e); model.primSetManifest(new ArchiveManifestImpl()); } catch (IOException iox) { Logger.getLogger().logError(iox); model.primSetManifest(new ArchiveManifestImpl()); caughtManifestException = iox; } finally { if (in != null) { try { in.close(); } catch (IOException weTried) { // Ignore } } } } } } } protected void initializeValidateEditListener() { validateEditListener = new ValidateEditListener(null, model); validateEditListener.setShell(propPage.getShell()); } public void setVisible(boolean visible) { if (visible) { if (caughtManifestException != null && !model.isDirty()) { ManifestErrorPrompter.showManifestException(propPage.getShell(), ERROR_READING_MANIFEST_DIALOG_MESSAGE_PROP_PAGE, false, caughtManifestException); } } } /** * Refreshes the ClasspathModel if the project classpath is changed. */ public void elementChanged(final ElementChangedEvent event) { if (event.getType() == ElementChangedEvent.POST_CHANGE && classpathChanged(event.getDelta())) { // trigger a recomputation and refresh for the currently selected EAR if (!isDisposed) { display.asyncExec (new Runnable () { public void run () { if (!isDisposed) { handleClasspathChange(); } } }); } } } /** * Called to refresh the UI when the classpath changes */ protected void handleClasspathChange() { model.resetClassPathSelection(); refresh(); } private boolean classpathChanged(final IJavaElementDelta delta) { final int kind = delta.getKind(); if (kind == IJavaElementDelta.CHANGED) { final int flags = delta.getFlags(); final IJavaElement element = delta.getElement(); if (element instanceof IJavaModel) { if ((flags & IJavaElementDelta.F_CHILDREN) == IJavaElementDelta.F_CHILDREN) { final IJavaElementDelta[] children = delta.getChangedChildren(); for (int i = 0; i < children.length; i++) { // check all of the IJavaProject children if (classpathChanged(children[i])) { return true; } } } } else if (element instanceof IJavaProject) { // check if we either have a direct indication of a classpath change or a delta on the // .classpath file (changes to classpath entry attributes only give us this...) final IJavaProject jproject = (IJavaProject) element; final IProject eventProject = jproject.getProject(); if (eventProject.equals(project)) { if ((flags & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0) { return true; } final IResourceDelta[] deltas = delta.getResourceDeltas(); if (deltas != null) { for (int i = 0; i < deltas.length; i++) { if (deltas[i].getProjectRelativePath().toString().equals(".classpath")) { //$NON-NLS-1$ return true; } } } } } } return false; } public Composite createContents(Composite parent) { initialize(); Composite composite = createBasicComposite(parent); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginWidth = 0; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); if (model.getComponent() != null) { if (!isValidComponent()) return composite; J2EEDependenciesPage.createDescriptionComposite(composite, ManifestUIResourceHandler.J2EE_Modules_Desc); createProjectLabelsGroup(composite); createListGroup(composite); createTextGroup(composite); refresh(); } Dialog.applyDialogFont(parent); postCreateContents(); return composite; } /** * Called at the end of createContents(). */ protected void postCreateContents() { // register this object as an IElementChangedListener so that it will react to user changes to the Java build path JavaCore.addElementChangedListener(this); } /** * @param comp * @return */ protected Composite createBasicComposite(Composite comp) { Composite composite = new Composite(comp, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginWidth = 0; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); return composite; } protected boolean isValidComponent() { if (JavaEEProjectUtilities.isEARProject(project)) { propPage.setErrorMessage(ManifestUIResourceHandler.EAR_Module_Dep_Error); return false; } else if (EarUtilities.isStandaloneProject(model.getComponent().getProject())) { propPage.setErrorMessage(ClasspathModel.NO_EAR_MESSAGE); return false; } return true; } protected void createProjectLabelsGroup(Composite parent) { Composite labelsGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; labelsGroup.setLayout(layout); labelsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); /* * Label label = new Label(labelsGroup, SWT.NONE); * label.setText(ManifestUIResourceHandler.Project_name__UI_); * * componentNameText = new Text(labelsGroup, SWT.BORDER); GridData data = new * GridData(GridData.FILL_HORIZONTAL); componentNameText.setEditable(false); * componentNameText.setLayoutData(data); componentNameText.setText(project.getName()); */ createEnterpriseAppsControls(labelsGroup); } private void createEnterpriseAppsControls(Composite labelsGroup) { enterpriseApplicationLabel = new Label(labelsGroup, SWT.NONE); enterpriseApplicationLabel.setText(ManifestUIResourceHandler.EAR_Project_Name__UI__UI_); availableAppsCombo = new CCombo(labelsGroup, SWT.READ_ONLY | SWT.BORDER); GridData gd = new GridData(GridData.FILL_HORIZONTAL); availableAppsCombo.setLayoutData(gd); availableAppsCombo.addListener(SWT.Selection, this); } protected void createListGroup(Composite parent) { Composite listGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginWidth = 0; layout.marginHeight = 0; listGroup.setLayout(layout); GridData gData = new GridData(GridData.FILL_BOTH); gData.horizontalIndent = 5; listGroup.setLayoutData(gData); availableDependentJars = new Label(listGroup, SWT.NONE); gData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL); availableDependentJars.setText(ManifestUIResourceHandler.Available_dependent_JARs__UI_); availableDependentJars.setLayoutData(gData); createTableComposite(listGroup); } /* * (non-Javadoc) * * @see com.ibm.etools.j2ee.common.ui.classpath.IClasspathTableOwner#createGroup(org.eclipse.swt.widgets.Composite) */ public Group createGroup(Composite parent) { return new Group(parent, SWT.NULL); } protected void createTextGroup(Composite parent) { Composite textGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; textGroup.setLayout(layout); textGroup.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL)); createClassPathText(textGroup); } protected void createClassPathText(Composite textGroup) { manifestLabel = new Label(textGroup, SWT.NONE); manifestLabel.setText(ManifestUIResourceHandler.Manifest_Class_Path__UI_); classPathText = new Text(textGroup, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); GridData gData = new GridData(GridData.FILL_BOTH); gData.widthHint = 400; gData.heightHint = 100; classPathText.setLayoutData(gData); classPathText.setEditable(false); } protected void createTableComposite(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridData gData = new GridData(GridData.FILL_BOTH); composite.setLayoutData(gData); tableManager = new ClasspathTableManager(this, model, validateEditListener); tableManager.fillComposite(composite); } /** * @see IClasspathTableOwner#createAvailableJARsViewer(Composite) */ public CheckboxTableViewer createAvailableJARsViewer(Composite parent) { int flags = SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI; Table table = new Table(parent, flags); CheckboxTableViewer availableJARsViewer = new CheckboxTableViewer(table); // set up table layout TableLayout tableLayout = new org.eclipse.jface.viewers.TableLayout(); tableLayout.addColumnData(new ColumnWeightData(200, true)); tableLayout.addColumnData(new ColumnWeightData(200, true)); table.setLayout(tableLayout); table.setHeaderVisible(true); table.setLinesVisible(true); // do not create sorter otherwise order will go wrong //availableJARsViewer.setSorter(new ViewerSorter()); // table columns TableColumn fileNameColumn = new TableColumn(table, SWT.NONE, 0); fileNameColumn.setText(ManifestUIResourceHandler.JAR_Module_UI_); fileNameColumn.setResizable(true); TableColumn projectColumn = new TableColumn(table, SWT.NONE, 1); projectColumn.setText(ManifestUIResourceHandler.Project_UI_); projectColumn.setResizable(true); tableLayout.layout(table, true); return availableJARsViewer; } /** * @see IClasspathTableOwner#createButtonColumnComposite(Composite) */ public Composite createButtonColumnComposite(Composite parent) { Composite buttonColumn = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginHeight = 0; layout.marginWidth = 0; buttonColumn.setLayout(layout); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING); buttonColumn.setLayoutData(data); return buttonColumn; } /** * @see IClasspathTableOwner */ public Button primCreatePushButton(String label, Composite buttonColumn) { Button aButton = new Button(buttonColumn, SWT.PUSH); aButton.setText(label); return aButton; } /** * @see IClasspathTableOwner */ public Button primCreateRadioButton(String label, Composite parent) { Button aButton = new Button(parent, SWT.RADIO); aButton.setText(label); return aButton; } /** * @see Listener#handleEvent(Event) */ public void handleEvent(Event event) { if (event.widget == availableAppsCombo) availableAppsSelected(event); } protected void availableAppsSelected(Event event) { int index = availableAppsCombo.getSelectionIndex(); model.selectEAR(index); } protected void populateApps() { IVirtualComponent[] components = model.getAvailableEARComponents(); String[] values = new String[components.length]; for (int i = 0; i < components.length; i++) { values[i] = components[i].getProject().getName(); } if (availableAppsCombo != null) { availableAppsCombo.setItems(values); IVirtualComponent selected = model.getSelectedEARComponent(); if (selected != null) { int index = Arrays.asList(components).indexOf(selected); availableAppsCombo.select(index); } else availableAppsCombo.clearSelection(); } } protected void refresh() { populateApps(); if (tableManager != null) { tableManager.refresh(); } refreshText(); } public void refreshText() { ClassPathSelection sel = model.getClassPathSelection(); if (sel != null && classPathText != null) classPathText.setText(sel.toString()); } /** * @see ClasspathModelListener#modelChanged(ClasspathModelEvent) */ public void modelChanged(ClasspathModelEvent evt) { if (evt.getEventType() == ClasspathModelEvent.CLASS_PATH_CHANGED) { isDirty = true; refreshText(); } else if (evt.getEventType() == ClasspathModelEvent.EAR_PROJECT_CHANGED) { tableManager.refresh(); } } public void performDefaults() { model.resetClassPathSelection(); refresh(); isDirty = false; model.dispose(); } public boolean performCancel() { model.dispose(); return true; } /** * @see org.eclipse.jface.preference.IPreferencePage#performOk() */ public boolean performOk() { if (!isDirty) return true; modifyEARBundledLibs(); WorkspaceModifyComposedOperation composed = new WorkspaceModifyComposedOperation(createManifestOperation()); createClasspathAttributeUpdateOperation(composed, model.getClassPathSelection(), false); try { new ProgressMonitorDialog(propPage.getShell()).run(true, true, composed); } catch (InvocationTargetException ex) { String title = ManifestUIResourceHandler.An_internal_error_occurred_ERROR_; String msg = title; if (ex.getTargetException() != null && ex.getTargetException().getMessage() != null) msg = ex.getTargetException().getMessage(); MessageDialog.openError(propPage.getShell(), title, msg); org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(ex); return false; } catch (InterruptedException e) { // cancelled return false; } finally { model.dispose(); } isDirty = false; return true; } List getUnSelectedClassPathElementsForJ2EEDependency() { List unselectedForJ2EE = getUnSelectedClassPathSelection().getClasspathElements(); List unselected = new ArrayList(); if (model != null && model.getClassPathSelectionForWLPs() != null) { List wlpSelected = model.getClassPathSelectionForWLPs().getSelectedClasspathElements(); java.util.Iterator it = unselectedForJ2EE.iterator(); while (it.hasNext()) { ClasspathElement element = (ClasspathElement) it.next(); java.util.Iterator wlpIterator = wlpSelected.iterator(); boolean found = false; while (wlpIterator.hasNext()) { ClasspathElement wlpElement = (ClasspathElement) wlpIterator.next(); String text = element.getText(); int index = text.indexOf(IJ2EEModuleConstants.JAR_EXT); if (index != -1) { text = text.substring(0, index); if (text.equals(wlpElement.getText())) { found = true; break; } } } if (!found) { if (!unselected.contains(element)) unselected.add(element); } } } return unselected; } /** * @deprecated don't use this method it will be deleted * @return */ List getUnSelectedClassPathElementsForWebDependency() { List unselectedForWLP = getUnSelectedClassPathSelectionForWLPs().getClasspathElements(); List unselected = new ArrayList(); if (model != null && model.getClassPathSelection() != null) { List j2eeSelected = model.getClassPathSelection().getSelectedClasspathElements(); java.util.Iterator it = unselectedForWLP.iterator(); while (it.hasNext()) { ClasspathElement element = (ClasspathElement) it.next(); java.util.Iterator j2eeIterator = j2eeSelected.iterator(); boolean found = false; while (j2eeIterator.hasNext()) { ClasspathElement j2eeElement = (ClasspathElement) j2eeIterator.next(); String text = j2eeElement.getText(); int index = text.indexOf(IJ2EEModuleConstants.JAR_EXT); if( index != -1 ){ text = text.substring(0, index); if (element.getText().equals(text)) { found = true; break; } } } if (!found) { if (!unselected.contains(element)) unselected.add(element); } } } else { unselected = unselectedForWLP; } return unselected; } /** * DoNotUseMeThisWillBeDeletedPost15 * @return */ protected WorkspaceModifyComposedOperation createJ2EEComponentDependencyOperations() { WorkspaceModifyComposedOperation composedOp = null; List selected = getSelectedClassPathSelection().getClasspathElements(); List unselected = getUnSelectedClassPathElementsForJ2EEDependency(); List targetComponentsHandles = new ArrayList(); for (int i = 0; i < selected.size(); i++) { ClasspathElement element = (ClasspathElement) selected.get(i); IVirtualComponent component = element.getComponent(); if (null != component) { targetComponentsHandles.add(component); } } if (!targetComponentsHandles.isEmpty()) { composedOp = new WorkspaceModifyComposedOperation(); composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(ComponentUtilities.createReferenceComponentOperation(model.getComponent(), targetComponentsHandles))); } targetComponentsHandles = new ArrayList(); for (int i = 0; i < unselected.size(); i++) { ClasspathElement element = (ClasspathElement) unselected.get(i); IProject elementProject = element.getProject(); if (elementProject != null) { if (ModuleCoreNature.isFlexibleProject(elementProject)) { IVirtualComponent targetComp = ComponentCore.createComponent(elementProject); targetComponentsHandles.add(targetComp); } } else { URI archiveURI = element.getArchiveURI(); if (archiveURI != null && !archiveURI.equals("")) { //$NON-NLS-1$ String name = ""; //$NON-NLS-1$ try { String type = ModuleURIUtil.getArchiveType(archiveURI); String tmpname = ModuleURIUtil.getArchiveName(archiveURI); name = type + IPath.SEPARATOR + tmpname; } catch (UnresolveableURIException e) { Logger.getLogger().logError(e.getMessage()); } if (!name.equals("")) { //$NON-NLS-1$ IVirtualReference ref = model.getComponent().getReference(name); if (ref != null) { IVirtualComponent referenced = ref.getReferencedComponent(); targetComponentsHandles.add(referenced); } } } } } if (!targetComponentsHandles.isEmpty()) { if (composedOp == null) composedOp = new WorkspaceModifyComposedOperation(); composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(ComponentUtilities.removeReferenceComponentOperation(model.getComponent(), targetComponentsHandles))); } return composedOp; } /** * This should be moved to the {@link WebLibDependencyPropertiesPage} because it is only used there. * @return */ protected WorkspaceModifyComposedOperation createComponentDependencyOperations() { WorkspaceModifyComposedOperation composedOp = null; final ClassPathSelection selectedWLPs = getSelectedClassPathSelectionForWLPs(); List selected = selectedWLPs.getClasspathElements(); List unselected = getUnSelectedClassPathSelectionForWLPs().getClasspathElements(); List targetComponentsHandles = new ArrayList(); for (int i = 0; i < selected.size(); i++) { ClasspathElement element = (ClasspathElement) selected.get(i); if (element.isClasspathDependency() || element.isClasspathEntry()) { continue; } IProject elementProject = element.getProject(); if (elementProject != null) { IVirtualComponent targetComp = ComponentCore.createComponent(elementProject); targetComponentsHandles.add(targetComp); } } if (!targetComponentsHandles.isEmpty()) { composedOp = new WorkspaceModifyComposedOperation(); composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(ComponentUtilities.createWLPReferenceComponentOperation(model.getComponent(), targetComponentsHandles))); } targetComponentsHandles = new ArrayList(); for (int i = 0; i < unselected.size(); i++) { ClasspathElement element = (ClasspathElement) unselected.get(i); if (element.isClasspathDependency() || element.isClasspathEntry()) { continue; } IProject elementProject = element.getProject(); if (elementProject != null) { if (ModuleCoreNature.isFlexibleProject(elementProject)) { IVirtualComponent targetComp = ComponentCore.createComponent(elementProject); targetComponentsHandles.add(targetComp); } } else { URI archiveURI = element.getArchiveURI(); if (archiveURI != null && !archiveURI.equals("")) { //$NON-NLS-1$ String name = ""; //$NON-NLS-1$ try { String type = ModuleURIUtil.getArchiveType(archiveURI); String tmpname = ModuleURIUtil.getArchiveName(archiveURI); name = type + IPath.SEPARATOR + tmpname; } catch (UnresolveableURIException e) { Logger.getLogger().logError(e.getMessage()); } if (!name.equals("")) { //$NON-NLS-1$ IVirtualReference ref = model.getComponent().getReference(name); IVirtualComponent referenced = ref.getReferencedComponent(); targetComponentsHandles.add(referenced); } } } } if (!targetComponentsHandles.isEmpty()) { if (composedOp == null) { composedOp = new WorkspaceModifyComposedOperation(); } composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(ComponentUtilities.removeWLPReferenceComponentOperation(model.getComponent(), targetComponentsHandles))); } if (composedOp == null) { composedOp = new WorkspaceModifyComposedOperation(); } createClasspathAttributeUpdateOperation(composedOp, model.getClassPathSelectionForWLPs(), true); return composedOp; } protected WorkspaceModifyComposedOperation createFlexProjectOperations() { WorkspaceModifyComposedOperation composedOp = null; Object[] elements = tableManager.availableJARsViewer.getCheckedElements(); for (int i = 0; i < elements.length; i++) { ClasspathElement element = (ClasspathElement) elements[i]; IProject elementProject = element.getProject(); try { if (elementProject != null && !elementProject.hasNature(IModuleConstants.MODULE_NATURE_ID)) { if (composedOp == null) { composedOp = new WorkspaceModifyComposedOperation(); } composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(J2EEProjectUtilities.createFlexJavaProjectForProjectOperation(elementProject, false))); } } catch (CoreException e) { Logger.getLogger().logError(e); } } return composedOp; } protected ClassPathSelection getUnSelectedClassPathSelectionForWLPs() { ClassPathSelection selection = new ClassPathSelection(); Object[] checkedElements = tableManager.availableJARsViewer.getCheckedElements(); List modelElements = model.getClassPathSelectionForWLPs().getClasspathElements(); for (int i = 0; i < modelElements.size(); i++) { List checkedElementsList = Arrays.asList(checkedElements); if (!checkedElementsList.contains(modelElements.get(i))) { selection.getClasspathElements().add(modelElements.get(i)); } } return selection; } private ClassPathSelection getSelectedClassPathSelection() { ClassPathSelection selection = new ClassPathSelection(); Object[] checkedElements = tableManager.availableJARsViewer.getCheckedElements(); for (int i = 0; i < checkedElements.length; i++) { selection.getClasspathElements().add(checkedElements[i]); } return selection; } protected ClassPathSelection getUnSelectedClassPathSelection() { ClassPathSelection selection = new ClassPathSelection(); Object[] checkedElements = tableManager.availableJARsViewer.getCheckedElements(); List modelElements = model.getClassPathSelection().getClasspathElements(); for (int i = 0; i < modelElements.size(); i++) { List checkedElementsList = Arrays.asList(checkedElements); if (!checkedElementsList.contains(modelElements.get(i))) { selection.getClasspathElements().add(modelElements.get(i)); } } return selection; } private ClassPathSelection getSelectedClassPathSelectionForWLPs() { ClassPathSelection selection = new ClassPathSelection(); Object[] checkedElements = tableManager.availableJARsViewer.getCheckedElements(); for (int i = 0; i < checkedElements.length; i++) { selection.getClasspathElements().add(checkedElements[i]); } return selection; } protected UpdateManifestOperation createManifestOperation() { return new UpdateManifestOperation(project.getName(), model.getClassPathSelection().toString(), true); } protected void createClasspathAttributeUpdateOperation(final WorkspaceModifyComposedOperation composedOp, final ClassPathSelection selection, final boolean isWebApp) { final boolean webLibsOnly = isWebApp && !ClasspathDependencyEnablement.isAllowClasspathComponentDependency(); final Map selectedEntriesToRuntimePath = new HashMap(); final Map unselectedEntriesToRuntimePath = new HashMap(); final List elements = selection.getClasspathElements(); for (int i = 0; i < elements.size(); i++) { final ClasspathElement element = (ClasspathElement) elements.get(i); if (element.isClasspathEntry()) { final IClasspathEntry entry = element.getClasspathEntry(); final IClasspathAttribute attrib = ClasspathDependencyUtil.checkForComponentDependencyAttribute(entry, DependencyAttributeType.DEPENDENCY_OR_NONDEPENDENCY, webLibsOnly); boolean hasDepAttrib = false; if (attrib != null && attrib.getName().equals(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY)) { hasDepAttrib = true; } final IPath runtimePath = ClasspathDependencyUtil.getRuntimePath(attrib, isWebApp, ClasspathDependencyUtil.isClassFolderEntry(entry)); if (element.isSelected()) { // only add if we don't already have the attribute if (!hasDepAttrib) { selectedEntriesToRuntimePath.put(entry, runtimePath); } } else { // only add if we already have the attribute if (hasDepAttrib) { unselectedEntriesToRuntimePath.put(entry, runtimePath); } } } } // if there are any attributes to add, create an operation to add all necessary attributes if (!selectedEntriesToRuntimePath.isEmpty()) { IDataModelOperation op = UpdateClasspathAttributeUtil.createAddDependencyAttributesOperation(project.getName(), selectedEntriesToRuntimePath); composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(op)); } // if there are any attributes to remove, create an operation to remove all necessary attributes if (!unselectedEntriesToRuntimePath.isEmpty()) { IDataModelOperation op = UpdateClasspathAttributeUtil.createRemoveDependencyAttributesOperation(project.getName(), unselectedEntriesToRuntimePath); composedOp.addRunnable(WTPUIPlugin.getRunnableWithProgress(op)); } } protected boolean isReadOnly() { return JemProjectUtilities.isBinaryProject(project) && (project.findMember(IModuleConstants.COMPONENT_FILE_PATH) == null) ; } protected void modifyEARBundledLibs() { List compsToUncheckList = tableManager.getCheckedLibsAsList(); if (compsToUncheckList.size() == 0) return; Set allCompsToUncheck = new HashSet(); Set allCompNamesToUncheck = new HashSet(); for (int i = 0; i < compsToUncheckList.size(); i++) { IVirtualComponent comp = (IVirtualComponent)compsToUncheckList.get(i); allCompsToUncheck.add(comp); if (comp instanceof J2EEModuleVirtualArchiveComponent) allCompNamesToUncheck.add(comp.getName()); } IProject[] ears = EarUtilities.getReferencingEARProjects(project); for (int i = 0; i < ears.length; i++) { if (J2EEProjectUtilities.isJEEProject(ears[i])) { IVirtualComponent earComponent = ComponentCore.createComponent(ears[i]); List listToUncheck = createListToUncheck(earComponent, allCompsToUncheck, allCompNamesToUncheck); if (listToUncheck.size() == 0) continue; removeModulesFromEAR(new NullProgressMonitor(), earComponent, listToUncheck); addModulesToEAR(new NullProgressMonitor(), earComponent, listToUncheck); } } } //--------------------------------- private IStatus removeModulesFromEAR(IProgressMonitor monitor, final IVirtualComponent earComponent, final List compsToUncheckList) { IStatus stat = IDataModelProvider.OK_STATUS; String libDir = ((Application)ModelProviderManager.getModelProvider(earComponent.getProject()).getModelObject()).getLibraryDirectory(); libDir = (libDir == null) ? J2EEConstants.EAR_DEFAULT_LIB_DIR : libDir; Map dependentComps = getEARModuleDependencies(earComponent, compsToUncheckList); try { IDataModelOperation op = removeComponentFromEAROperation(earComponent, compsToUncheckList, libDir); op.execute(null, null); J2EEComponentClasspathUpdater.getInstance().queueUpdateEAR(earComponent.getProject()); removeEARComponentDependencies(dependentComps); } catch (ExecutionException e) { Logger.getLogger().log(e); } return stat; } private IStatus addModulesToEAR(IProgressMonitor monitor, final IVirtualComponent earComponent, final List compsToUncheckList) { try { IWorkspaceRunnable runnable = new IWorkspaceRunnable(){ public void run(IProgressMonitor monitor) throws CoreException{ execAddOp(monitor, compsToUncheckList, J2EEConstants.EAR_ROOT_DIR, earComponent); } }; J2EEUIPlugin.getWorkspace().run(runnable, monitor); } catch (Exception e) { Logger.getLogger().log(e); } return IDataModelProvider.OK_STATUS; } private List createListToUncheck(IVirtualComponent earComponent, Set compsToUncheckList, Set compNamesToUncheck) { LinkedList res = new LinkedList(); IVirtualReference[] refs = earComponent.getReferences(); for (int j = 0; j < refs.length; j++) { if (!refs[j].getRuntimePath().isRoot() && (compsToUncheckList.contains(refs[j].getReferencedComponent()) || compNamesToUncheck.contains(refs[j].getReferencedComponent().getName()))) { res.add(refs[j].getReferencedComponent()); } } return res; } private void execAddOp(IProgressMonitor monitor, List list, String path, IVirtualComponent earComponent) throws CoreException { IDataModel dm = DataModelFactory.createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider()); dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComponent); dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, list); dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, path); IStatus stat = dm.validateProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST); if (stat != IDataModelProvider.OK_STATUS) throw new CoreException(stat); try { dm.getDefaultOperation().execute(monitor, null); } catch (ExecutionException e) { Logger.getLogger().log(e); } } protected IDataModelOperation removeComponentFromEAROperation(IVirtualComponent sourceComponent, List targetComponentsHandles, String dir) { IDataModel model = DataModelFactory.createDataModel(new RemoveComponentFromEnterpriseApplicationDataModelProvider()); model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComponent); List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST); modHandlesList.addAll(targetComponentsHandles); model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList); model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, dir); return model.getDefaultOperation(); } private Map getEARModuleDependencies(final IVirtualComponent earComponent, final List components) { final Map dependentComps = new HashMap(); // get all current references to project within the scope of this EAR for (int i = 0; i < components.size(); i++) { final List compsForProject = new ArrayList(); final IVirtualComponent comp = (IVirtualComponent) components.get(i); Set<IProject> referencingComponents = IDependencyGraph.INSTANCE.getReferencingComponents(project); IProject [] dependentProjects = referencingComponents.toArray(new IProject[referencingComponents.size()]); for (int j = 0; j < dependentProjects.length; j++) { final IProject project = dependentProjects[j]; // if this is an EAR, can skip if (JavaEEProjectUtilities.isEARProject(project)) { continue; } final IVirtualComponent dependentComp = ComponentCore.createComponent(project); // ensure that the project's share an EAR final IProject[] refEARs = EarUtilities.getReferencingEARProjects(project); boolean sameEAR = false; for (int k = 0; k < refEARs.length; k++) { if (refEARs[k].equals(earComponent.getProject())) { sameEAR = true; break; } } if (!sameEAR) { continue; } // if the dependency is a web lib dependency, can skip if (JavaEEProjectUtilities.isDynamicWebProject(project)) { IVirtualReference ref = dependentComp.getReference(comp.getName()); if (ref != null && ref.getRuntimePath().equals(new Path("/WEB-INF/lib"))) { //$NON-NLS-1$ continue; } } compsForProject.add(dependentComp); } dependentComps.put(comp, compsForProject); } return dependentComps; } private void removeEARComponentDependencies(final Map dependentComps) throws ExecutionException { final Iterator targets = dependentComps.keySet().iterator(); while (targets.hasNext()) { final IVirtualComponent target = (IVirtualComponent) targets.next(); final List sources = (List) dependentComps.get(target); for (int i = 0; i < sources.size(); i++) { final IVirtualComponent source = (IVirtualComponent) sources.get(i); final IDataModel model = DataModelFactory.createDataModel(new RemoveReferenceComponentsDataModelProvider()); model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, source); final List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST); modHandlesList.add(target); model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList); model.getDefaultOperation().execute(null, null); // update the manifest removeManifestDependency(source, target); } } } private void removeManifestDependency(final IVirtualComponent source, final IVirtualComponent target) throws ExecutionException { final String sourceProjName = source.getProject().getName(); final String targetProjName = target.getProject().getName(); final IProgressMonitor monitor = new NullProgressMonitor(); final IFile manifestmf = J2EEProjectUtilities.getManifestFile(source.getProject()); final ArchiveManifest mf = J2EEProjectUtilities.readManifest(source.getProject()); if (mf == null) return; final IDataModel updateManifestDataModel = DataModelFactory.createDataModel(new UpdateManifestDataModelProvider()); updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, sourceProjName); updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false); updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, manifestmf); String[] cp = mf.getClassPathTokenized(); List cpList = new ArrayList(); String cpToRemove = targetProjName + IJ2EEModuleConstants.JAR_EXT; for (int i = 0; i < cp.length; i++) { if (!cp[i].equals(cpToRemove)) { cpList.add(cp[i]); } } updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, cpList); updateManifestDataModel.getDefaultOperation().execute(monitor, null ); } }