| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| package org.apache.ivyde.internal.eclipse.cpcontainer; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.apache.ivy.core.module.descriptor.ModuleDescriptor; |
| import org.apache.ivyde.eclipse.IvyDEException; |
| import org.apache.ivyde.eclipse.cp.IvyClasspathContainerConfiguration; |
| import org.apache.ivyde.eclipse.cp.IvyClasspathContainerHelper; |
| import org.apache.ivyde.eclipse.cp.SettingsSetup; |
| import org.apache.ivyde.internal.eclipse.IvyMarkerManager; |
| import org.apache.ivyde.internal.eclipse.IvyPlugin; |
| import org.apache.ivyde.internal.eclipse.ui.AdvancedSetupTab; |
| import org.apache.ivyde.internal.eclipse.ui.ClasspathSetupTab; |
| import org.apache.ivyde.internal.eclipse.ui.ConfTableViewer; |
| import org.apache.ivyde.internal.eclipse.ui.IvyFilePathText; |
| import org.apache.ivyde.internal.eclipse.ui.MappingSetupTab; |
| import org.apache.ivyde.internal.eclipse.ui.SettingsSetupTab; |
| import org.apache.ivyde.internal.eclipse.ui.ConfTableViewer.ConfTableListener; |
| import org.apache.ivyde.internal.eclipse.ui.IvyFilePathText.IvyXmlPathListener; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jdt.core.IClasspathAttribute; |
| import org.eclipse.jdt.core.IClasspathContainer; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.ui.wizards.IClasspathContainerPage; |
| import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension; |
| import org.eclipse.jdt.ui.wizards.NewElementWizardPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| 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.Control; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.TabFolder; |
| import org.eclipse.swt.widgets.TabItem; |
| |
| /** |
| * Editor of the classpath container configuration at the project level. |
| */ |
| public class IvydeContainerPage extends NewElementWizardPage implements IClasspathContainerPage, |
| IClasspathContainerPageExtension { |
| |
| private IJavaProject project; |
| |
| private IvyFilePathText ivyFilePathText; |
| |
| private ConfTableViewer confTableViewer; |
| |
| private IvyClasspathContainerConfiguration conf; |
| |
| private IClasspathEntry entry; |
| |
| private TabFolder tabs; |
| |
| private boolean exported = false; |
| |
| private String oldIvyFile = null; |
| |
| private List oldConfs = null; |
| |
| private IvyClasspathContainerState state; |
| |
| private SettingsSetupTab settingsSetupTab; |
| |
| private ClasspathSetupTab classpathSetupTab; |
| |
| private MappingSetupTab mappingSetupTab; |
| |
| private AdvancedSetupTab advancedSetupTab; |
| |
| /** |
| * Constructor |
| */ |
| public IvydeContainerPage() { |
| super("IvyDE Container"); |
| } |
| |
| public IJavaProject getProject() { |
| return project; |
| } |
| |
| void checkCompleted() { |
| String error = null; |
| if (ivyFilePathText.getIvyFilePath().length() == 0) { |
| error = "Choose an ivy file"; |
| } else if (project != null) { |
| error = checkConf(); |
| } |
| setErrorMessage(error); |
| setPageComplete(error == null); |
| } |
| |
| /** |
| * Check that the chosen configuration doesn't already exist within the current project |
| * <p> |
| * The uniqueness is for xmlivyPath + conf |
| * |
| * @return |
| */ |
| private String checkConf() { |
| String error = null; |
| |
| String ivyFilePath = ivyFilePathText.getIvyFilePath(); |
| List selectedConfigurations = confTableViewer.getSelectedConfigurations(); |
| |
| List/* <IvyClasspathContainer> */containers = IvyClasspathContainerHelper |
| .getContainers(project); |
| if (containers == null) { |
| return null; |
| } |
| |
| Iterator/* <IvyClasspathContainer> */itContainers = containers.iterator(); |
| while (error == null && itContainers.hasNext()) { |
| IvyClasspathContainerImpl ivycp = (IvyClasspathContainerImpl) itContainers.next(); |
| IvyClasspathContainerConfiguration cpc = ivycp.getConf(); |
| |
| // first check that this is not the one we are editing |
| if (oldIvyFile != null && cpc.getIvyXmlPath().equals(oldIvyFile) && oldConfs != null |
| && oldConfs.size() == cpc.getConfs().size() |
| && oldConfs.containsAll(cpc.getConfs())) { |
| continue; |
| } |
| |
| if (cpc.getIvyXmlPath().equals(ivyFilePath)) { |
| if (selectedConfigurations.isEmpty() || selectedConfigurations.contains("*") |
| || cpc.getConfs().isEmpty() || cpc.getConfs().contains("*")) { |
| error = "A container already exists for the selected conf of " |
| + "the module descriptor"; |
| } else { |
| ArrayList list = new ArrayList(cpc.getConfs()); |
| list.retainAll(selectedConfigurations); |
| if (!list.isEmpty()) { |
| error = "A container already exists for the selected conf of " |
| + "the module descriptor"; |
| } |
| } |
| } |
| } |
| |
| return error; |
| } |
| |
| void checkIvyXmlPath() { |
| ModuleDescriptor md; |
| try { |
| md = state.getModuleDescriptor(); |
| ivyFilePathText.setIvyXmlError(null); |
| } catch (IvyDEException e) { |
| md = null; |
| ivyFilePathText.setIvyXmlError(e); |
| } |
| confTableViewer.setModuleDescriptor(md); |
| checkCompleted(); |
| } |
| |
| public boolean finish() { |
| List confs = confTableViewer.getSelectedConfigurations(); |
| if (confs.isEmpty()) { |
| confs = Collections.singletonList("*"); |
| } |
| conf.setConfs(confs); |
| |
| if (settingsSetupTab.isProjectSpecific()) { |
| conf.setSettingsProjectSpecific(true); |
| conf.setIvySettingsSetup(settingsSetupTab.getSettingsEditor().getIvySettingsSetup()); |
| } else { |
| conf.setSettingsProjectSpecific(false); |
| } |
| |
| if (classpathSetupTab.isProjectSpecific()) { |
| conf.setClassthProjectSpecific(true); |
| conf.setClasspathSetup(classpathSetupTab.getClasspathSetupEditor().getClasspathSetup()); |
| } else { |
| conf.setClassthProjectSpecific(false); |
| } |
| |
| if (mappingSetupTab.isProjectSpecific()) { |
| conf.setMappingProjectSpecific(true); |
| conf.setMappingSetup(mappingSetupTab.getMappingSetupEditor().getMappingSetup()); |
| } else { |
| conf.setMappingProjectSpecific(false); |
| } |
| |
| if (advancedSetupTab.isProjectSpecific()) { |
| conf.setAdvancedProjectSpecific(true); |
| conf.setAdvancedSetup(advancedSetupTab.getAdvancedSetupEditor().getAdvancedSetup()); |
| } else { |
| conf.setAdvancedProjectSpecific(false); |
| } |
| |
| IPath path = IvyClasspathContainerConfAdapter.getPath(conf); |
| IClasspathAttribute[] atts = conf.getAttributes(); |
| |
| entry = JavaCore.newContainerEntry(path, null, atts, exported); |
| |
| if (project != null) { |
| try { |
| IvyClasspathContainerImpl ivycp = new IvyClasspathContainerImpl(project, path, |
| new IClasspathEntry[0], atts); |
| JavaCore.setClasspathContainer(path, new IJavaProject[] {project}, |
| new IClasspathContainer[] {ivycp}, null); |
| ivycp.launchResolve(false, null); |
| } catch (JavaModelException e) { |
| IvyPlugin.log(e); |
| } |
| } |
| |
| if (conf.getJavaProject() != null && oldIvyFile != null |
| && !oldIvyFile.equals(conf.getIvyXmlPath())) { |
| // changing the ivy.xml, remove old marker on the old file, if any |
| IvyMarkerManager ivyMarkerManager = IvyPlugin.getDefault().getIvyMarkerManager(); |
| ivyMarkerManager.removeMarkers(conf.getJavaProject().getProject(), oldIvyFile); |
| } |
| |
| return true; |
| } |
| |
| public IClasspathEntry getSelection() { |
| return entry; |
| } |
| |
| public void setSelection(IClasspathEntry entry) { |
| if (entry == null) { |
| conf = new IvyClasspathContainerConfiguration(project, "ivy.xml", true); |
| } else { |
| conf = new IvyClasspathContainerConfiguration(project, entry.getPath(), true, |
| entry.getExtraAttributes()); |
| exported = entry.isExported(); |
| } |
| state = new IvyClasspathContainerState(conf); |
| oldIvyFile = conf.getIvyXmlPath(); |
| oldConfs = conf.getConfs(); |
| } |
| |
| public void setSelection(IFile ivyfile) { |
| conf = new IvyClasspathContainerConfiguration(project, ivyfile.getProjectRelativePath() |
| .toString(), true); |
| // if there is an ivysettings.xml file at the root of the project, configure the container |
| // to use it |
| if (project != null) { |
| IResource settings = project.getProject().findMember(new Path("ivysettings.xml")); |
| if (settings != null) { |
| conf.setSettingsProjectSpecific(true); |
| SettingsSetup setup = new SettingsSetup(); |
| setup.setIvySettingsPath("ivysettings.xml"); |
| conf.setIvySettingsSetup(setup); |
| } |
| } |
| state = new IvyClasspathContainerState(conf); |
| } |
| |
| public void createControl(Composite parent) { |
| setTitle("IvyDE Managed Libraries"); |
| setDescription("Choose ivy file and its configurations."); |
| |
| tabs = new TabFolder(parent, SWT.BORDER); |
| tabs.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); |
| |
| TabItem mainTab = new TabItem(tabs, SWT.NONE); |
| mainTab.setText("Main"); |
| mainTab.setControl(createMainTab(tabs)); |
| |
| IProject p = project == null ? null : project.getProject(); |
| settingsSetupTab = new SettingsSetupTab(tabs, p) { |
| protected void settingsUpdated() { |
| try { |
| conf.setSettingsProjectSpecific(isProjectSpecific()); |
| conf.setIvySettingsSetup(getSettingsEditor().getIvySettingsSetup()); |
| state.setIvySettingsLastModified(-1); |
| state.getIvy(); |
| getSettingsEditor().setSettingsError(null); |
| checkIvyXmlPath(); |
| } catch (IvyDEException e) { |
| getSettingsEditor().setSettingsError(e); |
| } |
| } |
| }; |
| |
| classpathSetupTab = new ClasspathSetupTab(tabs, p); |
| |
| mappingSetupTab = new MappingSetupTab(tabs, p); |
| |
| advancedSetupTab = new AdvancedSetupTab(tabs, p); |
| |
| tabs.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| ivyFilePathText.updateErrorMarker(); |
| settingsSetupTab.getSettingsEditor().updateErrorMarker(); |
| } |
| }); |
| |
| setControl(tabs); |
| |
| loadFromConf(); |
| checkCompleted(); |
| tabs.setFocus(); |
| } |
| |
| private Control createMainTab(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NONE); |
| composite.setLayout(new GridLayout()); |
| composite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); |
| |
| // CheckStyle:MagicNumber| OFF |
| Composite configComposite = new Composite(composite, SWT.NONE); |
| configComposite.setLayout(new GridLayout(2, false)); |
| configComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); |
| |
| ivyFilePathText = new IvyFilePathText(configComposite, SWT.NONE, project == null ? null |
| : project.getProject()); |
| ivyFilePathText.addListener(new IvyXmlPathListener() { |
| public void ivyXmlPathUpdated(String path) { |
| conf.setIvyXmlPath(path); |
| checkIvyXmlPath(); |
| } |
| }); |
| ivyFilePathText.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, |
| 1)); |
| |
| // Label for ivy configurations field |
| Label confLabel = new Label(configComposite, SWT.NONE); |
| confLabel.setText("Configurations"); |
| |
| // table for configuration selection |
| confTableViewer = new ConfTableViewer(configComposite, SWT.NONE); |
| confTableViewer.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); |
| confTableViewer.addListener(new ConfTableListener() { |
| public void confTableUpdated(List confs) { |
| checkCompleted(); |
| } |
| }); |
| |
| // refresh |
| Button refreshConf = new Button(configComposite, SWT.NONE); |
| refreshConf.setLayoutData(new GridData(GridData.END, GridData.CENTER, true, false, 2, 1)); |
| refreshConf.setText("Reload the list of configurations"); |
| refreshConf.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent ev) { |
| ModuleDescriptor md; |
| try { |
| md = state.getModuleDescriptor(); |
| } catch (IvyDEException e) { |
| md = null; |
| e.show(IStatus.ERROR, "Ivy configuration error", |
| "The configurations of the ivy.xml could not be retrieved: "); |
| } |
| confTableViewer.setModuleDescriptor(md); |
| } |
| }); |
| |
| return composite; |
| } |
| |
| private void loadFromConf() { |
| ivyFilePathText.init(conf.getIvyXmlPath()); |
| |
| settingsSetupTab.init(conf.isSettingsProjectSpecific(), conf.getIvySettingsSetup()); |
| confTableViewer.init(conf.getConfs()); // *after* settingsSetupTab.init()! |
| classpathSetupTab.init(conf.isClassthProjectSpecific(), conf.getClasspathSetup()); |
| mappingSetupTab.init(conf.isMappingProjectSpecific(), conf.getMappingSetup()); |
| // project == null <==> container in a launch config: always resolve before launch |
| advancedSetupTab.init(conf.isAdvancedProjectSpecific(), conf.getAdvancedSetup(), |
| project == null); |
| |
| settingsSetupTab.projectSpecificChanged(); |
| classpathSetupTab.projectSpecificChanged(); |
| mappingSetupTab.projectSpecificChanged(); |
| advancedSetupTab.projectSpecificChanged(); |
| } |
| |
| public void initialize(IJavaProject p, IClasspathEntry[] currentEntries) { |
| this.project = p; |
| } |
| |
| } |