blob: 87655bda7a37773d0b331d846b258c3090875188 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.wizards.buildpath;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IBuildpathContainer;
import org.eclipse.dltk.core.IBuildpathContainerExtension3;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IScriptProject;
public class BPUserLibraryElement {
private class UpdatedBuildpathContainer
implements IBuildpathContainer, IBuildpathContainerExtension3 {
@Override
public IBuildpathEntry[] getBuildpathEntries() {
BPListElement[] children = getChildren();
IBuildpathEntry[] entries = new IBuildpathEntry[children.length];
for (int i = 0; i < entries.length; i++) {
entries[i] = children[i].getBuildpathEntry();
}
return entries;
}
@Override
public String getDescription() {
return getName();
}
@Override
public int getKind() {
return isSystemLibrary() ? IBuildpathContainer.K_SYSTEM
: K_APPLICATION;
}
@Override
public IPath getPath() {
return BPUserLibraryElement.this.getPath();
}
@Override
public Map<String, String> getAttributes() {
return BPUserLibraryElement.this.getAttributes();
}
}
private String fName;
private List<BPListElement> fChildren;
private boolean fIsSystemLibrary;
private Map<String, String> fAttributes;
public BPUserLibraryElement(String name, IBuildpathContainer container,
IScriptProject project) {
this(name, container, project, null);
}
public BPUserLibraryElement(String name, IBuildpathContainer container,
IScriptProject project, Map<String, String> attributes) {
fName = name;
fChildren = new ArrayList<>();
if (container != null) {
IBuildpathEntry[] entries = container.getBuildpathEntries();
BPListElement[] res = new BPListElement[entries.length];
for (int i = 0; i < res.length; i++) {
IBuildpathEntry curr = entries[i];
BPListElement elem = BPListElement.createFromExisting(this,
curr, project);
// elem.setAttribute(CPListElement.SOURCEATTACHMENT,
// curr.getSourceAttachmentPath());
// elem.setAttribute(CPListElement.JAVADOC,
// ScriptUI.getLibraryJavadocLocation(curr.getPath()));
fChildren.add(elem);
}
fIsSystemLibrary = container
.getKind() == IBuildpathContainer.K_SYSTEM;
} else {
fIsSystemLibrary = false;
}
if (attributes != null)
fAttributes = new HashMap<>(attributes);
}
public BPUserLibraryElement(String name, boolean isSystemLibrary,
BPListElement[] children) {
this(name, isSystemLibrary, children, null);
}
public BPUserLibraryElement(String name, boolean isSystemLibrary,
BPListElement[] children, Map<String, String> attributes) {
fName = name;
fChildren = new ArrayList<>();
if (children != null) {
for (int i = 0; i < children.length; i++) {
BPListElement child = children[i];
child.setParentContainer(this);
fChildren.add(children[i]);
}
}
fIsSystemLibrary = isSystemLibrary;
if (attributes != null)
fAttributes = new HashMap<>(attributes);
}
public BPListElement[] getChildren() {
return fChildren.toArray(new BPListElement[fChildren.size()]);
}
public String getName() {
return fName;
}
public IPath getPath() {
return new Path(DLTKCore.USER_LIBRARY_CONTAINER_ID).append(fName);
}
public boolean isSystemLibrary() {
return fIsSystemLibrary;
}
public Map<String, String> getAttributes() {
return fAttributes != null
? Collections.<String, String> unmodifiableMap(fAttributes)
: Collections.<String, String> emptyMap();
}
public String getAttribute(String name) {
if (fAttributes == null) {
return null;
}
return fAttributes.get(name);
}
public void add(BPListElement element) {
if (!fChildren.contains(element)) {
fChildren.add(element);
}
}
private List<BPListElement> moveUp(List<BPListElement> elements,
List<BPListElement> move) {
int nElements = elements.size();
List<BPListElement> res = new ArrayList<>(nElements);
BPListElement floating = null;
for (int i = 0; i < nElements; i++) {
BPListElement curr = elements.get(i);
if (move.contains(curr)) {
res.add(curr);
} else {
if (floating != null) {
res.add(floating);
}
floating = curr;
}
}
if (floating != null) {
res.add(floating);
}
return res;
}
public void moveUp(List<BPListElement> toMoveUp) {
if (toMoveUp.size() > 0) {
fChildren = moveUp(fChildren, toMoveUp);
}
}
public void moveDown(List<BPListElement> toMoveDown) {
if (toMoveDown.size() > 0) {
Collections.reverse(fChildren);
fChildren = moveUp(fChildren, toMoveDown);
Collections.reverse(fChildren);
}
}
public void remove(BPListElement element) {
fChildren.remove(element);
}
public void replace(BPListElement existingElement, BPListElement element) {
if (fChildren.contains(element)) {
fChildren.remove(existingElement);
} else {
int index = fChildren.indexOf(existingElement);
if (index != -1) {
fChildren.set(index, element);
} else {
fChildren.add(element);
}
copyAttribute(existingElement, element, BPListElement.ACCESSRULES);
}
}
private void copyAttribute(BPListElement source, BPListElement target,
String attributeName) {
Object value = source.getAttribute(attributeName);
if (value != null) {
target.setAttribute(attributeName, value);
}
}
public IBuildpathContainer getUpdatedContainer() {
return new UpdatedBuildpathContainer();
}
public boolean hasChanges(IBuildpathContainer oldContainer,
IScriptProject project) {
if (oldContainer == null || (oldContainer
.getKind() == IBuildpathContainer.K_SYSTEM) != fIsSystemLibrary) {
return true;
}
IBuildpathEntry[] oldEntries = oldContainer.getBuildpathEntries();
if (fChildren.size() != oldEntries.length) {
return true;
}
for (int i = 0; i < oldEntries.length; i++) {
BPListElement child = fChildren.get(i);
if (!child.getBuildpathEntry().equals(oldEntries[i])) {
return true;
}
}
return false;
}
}