/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.jface.resource.ImageDescriptor;
public abstract class RobotContainer implements RobotElement {
private final RobotElement parent;
protected final IContainer container;
private final List<RobotElement> elements;
RobotContainer(final RobotElement parent, final IContainer container) {
this.parent = parent;
this.container = container;
this.elements = new ArrayList<>();
}
synchronized RobotFolder createRobotSuite(final IFolder folder) {
if (folder == null) {
return null;
}
final RobotFolder robotFolder = new RobotFolder(this, folder);
if (elements.contains(robotFolder)) {
return (RobotFolder) elements.get(elements.indexOf(robotFolder));
} else {
elements.add(robotFolder);
return robotFolder;
}
}
synchronized RobotSuiteFile createSuiteFile(final IFile file) {
if (file == null) {
return null;
}
final RobotSuiteFile robotFile = new RobotSuiteFile(this, file);
if (elements.contains(robotFile)) {
return (RobotSuiteFile) elements.get(elements.indexOf(robotFile));
} else {
elements.add(robotFile);
return robotFile;
}
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
} else if (obj.getClass() == getClass()) {
final RobotContainer other = (RobotContainer) obj;
return container.equals(other.container);
}
return false;
}
@Override
public int hashCode() {
return container.hashCode();
}
@Override
public String getName() {
return container.getName();
}
@Override
public RobotElement getParent() {
return parent;
}
@Override
public List<RobotElement> getChildren() {
return elements;
}
@Override
public int getIndex() {
return parent == null ? -1 : parent.getChildren().indexOf(this);
}
@Override
public ImageDescriptor getImage() {
return null;
}
List<RobotElementChange> synchronizeChanges(final IResourceDelta delta) {
final List<RobotElement> toRemove = new ArrayList<>();
final List<RobotElementChange> changes = new ArrayList<>();
for (final RobotElement element : elements) {
if (element instanceof RobotContainer) {
final RobotContainer folder = (RobotContainer) element;
final IResourceDelta elementDelta = delta.findMember(folder.container.getFullPath());
if (isRemoved(elementDelta)) {
changes.add(RobotElementChange.createRemovedElement(folder));
toRemove.add(folder);
} else if (isChanged(elementDelta)) {
changes.add(RobotElementChange.createChangedElement(folder));
changes.addAll(folder.synchronizeChanges(delta));
}
} else if (element instanceof RobotSuiteFile) {
final RobotSuiteFile file = (RobotSuiteFile) element;
final IResourceDelta elementDelta = delta.findMember(file.getFile().getFullPath());
if (isRemoved(elementDelta)) {
changes.add(RobotElementChange.createRemovedElement(file));
toRemove.add(file);
} else if (isChanged(elementDelta)) {
changes.add(RobotElementChange.createChangedElement(file));
changes.addAll(file.synchronizeChanges(elementDelta));
}
}
}
elements.removeAll(toRemove);
return changes;
}
private boolean isChanged(final IResourceDelta elementDelta) {
return elementDelta != null && elementDelta.getKind() == IResourceDelta.CHANGED
&& !((elementDelta.getFlags() & IResourceDelta.MARKERS) == IResourceDelta.MARKERS);
}
private boolean isRemoved(final IResourceDelta elementDelta) {
return elementDelta != null && elementDelta.getKind() == IResourceDelta.REMOVED;
}
}