/*
* 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.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.jface.resource.ImageDescriptor;
public class RobotModel implements RobotElement {
private final List<RobotElement> projects = new ArrayList<>();
public synchronized RobotProject createRobotProject(final IProject project) {
if (project == null) {
return null;
}
final RobotProject robotProject = new RobotProject(this, project);
if (projects.contains(robotProject)) {
return (RobotProject) projects.get(projects.indexOf(robotProject));
} else {
projects.add(robotProject);
return robotProject;
}
}
synchronized RobotFolder createRobotSuite(final IFolder folder) {
if (folder == null) {
return null;
}
if (folder.getParent().equals(folder.getProject())) {
return createRobotProject((IProject) folder.getParent()).createRobotSuite(folder);
} else {
return createRobotSuite((IFolder) folder.getParent()).createRobotSuite(folder);
}
}
public synchronized RobotSuiteFile createSuiteFile(final IFile file) {
if (file == null) {
return null;
}
if (file.getParent().equals(file.getProject())) {
return createRobotProject((IProject) file.getParent()).createSuiteFile(file);
} else {
return createRobotSuite((IFolder) file.getParent()).createSuiteFile(file);
}
}
@Override
public List<RobotElement> getChildren() {
return projects;
}
@Override
public String getName() {
return "";
}
@Override
public RobotElement getParent() {
return null;
}
@Override
public int getIndex() {
return -1;
}
@Override
public ImageDescriptor getImage() {
return null;
}
synchronized List<RobotElementChange> removeProject(final IProject project) {
final List<RobotElementChange> changes = new ArrayList<>();
final List<RobotElement> toRemove = new ArrayList<>();
for (final RobotElement element : projects) {
if (((RobotProject) element).getProject().equals(project)) {
toRemove.add(element);
changes.add(RobotElementChange.createRemovedElement(element));
}
}
projects.removeAll(toRemove);
return changes;
}
synchronized List<RobotElementChange> synchronizeChanges(final IResourceDelta delta) {
final List<IProject> toRemove = new ArrayList<>();
final List<RobotElementChange> changes = new ArrayList<>();
for (final RobotElement element : projects) {
final RobotProject project = (RobotProject) element;
final IResourceDelta projectDelta = delta.findMember(project.getProject().getFullPath());
if (isRemoved(projectDelta)) {
changes.add(RobotElementChange.createRemovedElement(element));
toRemove.add((IProject) projectDelta.getResource());
} else if (isChanged(projectDelta)) {
changes.add(RobotElementChange.createAddedElement(element));
changes.addAll(project.synchronizeChanges(delta));
}
}
for (final IProject project : toRemove) {
removeProject(project);
}
return changes;
}
private boolean isChanged(final IResourceDelta projectDelta) {
return projectDelta != null && projectDelta.getKind() == IResourceDelta.CHANGED;
}
private boolean isRemoved(final IResourceDelta projectDelta) {
return projectDelta != null && projectDelta.getKind() == IResourceDelta.REMOVED;
}
}