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