/*******************************************************************************
* Copyright (c) 2013 Cloud Bees, Inc.
* All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cloud Bees, Inc. - initial API and implementation
*******************************************************************************/
package com.cloudbees.eclipse.dev.ui.views.build;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import com.cloudbees.eclipse.core.jenkins.api.ChangeSetPathItem;
import com.cloudbees.eclipse.core.jenkins.api.JenkinsBuildDetailsResponse;
import com.cloudbees.eclipse.core.jenkins.api.JenkinsBuildDetailsResponse.ChangeSet.ChangeSetItem;
public class RecentChangesContentProvider implements ITreeContentProvider {
private JenkinsBuildDetailsResponse buildDetails;
private ChangeSetItem[] model;
public void dispose() {
this.model = null;
this.buildDetails = null;
}
public JenkinsBuildDetailsResponse getBuildDetails() {
return this.buildDetails;
}
public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
if (newInput instanceof ChangeSetItem[]) {
this.model = (ChangeSetItem[]) newInput;
} else if (newInput instanceof JenkinsBuildDetailsResponse) {
this.buildDetails = (JenkinsBuildDetailsResponse) newInput;
this.model = ((JenkinsBuildDetailsResponse) newInput).changeSet.items;
}
}
public Object[] getElements(final Object inputElement) {
return getChildren(inputElement);
}
public Object[] getChildren(final Object parentElement) {
if (parentElement == null) {
return this.model;
}
if (parentElement instanceof String) {
return new String[0];
}
if (parentElement instanceof ChangeSetItem[]) {
return (ChangeSetItem[]) parentElement;
}
if (parentElement instanceof JenkinsBuildDetailsResponse) {
return ((JenkinsBuildDetailsResponse) parentElement).changeSet.items;
}
if (parentElement instanceof ChangeSetItem) {
List<ChangeSetPathItem> ret = new ArrayList<ChangeSetPathItem>();
ChangeSetItem el = (ChangeSetItem) parentElement;
String[] added = el.addedPaths;
String[] removed = el.deletedPaths;
String[] modified = el.modifiedPaths;
ChangeSetItem.ChangePath[] changes = el.paths;
if (added != null) {
for (int i = 0; i < added.length; i++) {
ret.add(new ChangeSetPathItem(el, ChangeSetPathItem.TYPE.ADDED, added[i]));
}
}
if (removed != null) {
for (int i = 0; i < removed.length; i++) {
ret.add(new ChangeSetPathItem(el, ChangeSetPathItem.TYPE.DELETED, removed[i]));
}
}
if (modified != null) {
for (int i = 0; i < modified.length; i++) {
ret.add(new ChangeSetPathItem(el, ChangeSetPathItem.TYPE.MODIFIED, modified[i]));
}
}
if (changes != null) {
for (int i = 0; i < changes.length; i++) {
ChangeSetItem.ChangePath change = changes[i];
ChangeSetPathItem.TYPE type = ChangeSetPathItem.TYPE.MODIFIED;
if ("add".equalsIgnoreCase(change.editType)) {
type = ChangeSetPathItem.TYPE.ADDED;
} else if ("delete".equalsIgnoreCase(change.editType)) {
type = ChangeSetPathItem.TYPE.DELETED;
}
ret.add(new ChangeSetPathItem(el, type, change.file));
}
}
return ret.toArray(new ChangeSetPathItem[ret.size()]);
}
//System.out.println("Unknown parent: " + parentElement);
return null;
}
public Object getParent(final Object element) {
if (element instanceof ChangeSetPathItem) {
return ((ChangeSetPathItem) element).parent;
}
return null;
}
public boolean hasChildren(final Object element) {
if (element instanceof ChangeSetItem) {
ChangeSetItem item = (ChangeSetItem) element;
if (item.addedPaths != null && item.addedPaths.length > 0) {
return true;
}
if (item.deletedPaths != null && item.deletedPaths.length > 0) {
return true;
}
if (item.modifiedPaths != null && item.modifiedPaths.length > 0) {
return true;
}
if (item.paths != null && item.paths.length > 0) {
return true;
}
}
if (element instanceof ChangeSetItem[]) {
return ((ChangeSetItem[]) element).length > 0;
}
if (element instanceof JenkinsBuildDetailsResponse) {
return ((JenkinsBuildDetailsResponse) element).changeSet != null
&& ((JenkinsBuildDetailsResponse) element).changeSet.items != null
&& ((JenkinsBuildDetailsResponse) element).changeSet.items.length > 0;
}
return false;
}
public ChangeSetItem[] getModel() {
return this.model;
}
}