/*******************************************************************************
* Copyright (c) 2009, 2015 Fair Isaac Corporation.
* All rights reserved. This program and the accompanying materials
* are 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:
* Fair Isaac Corporation - initial API and implementation
* Simon Scholz <simon.scholz@vogella.com> - Bug 460405
******************************************************************************/
package org.eclipse.ui.tests.navigator.extension;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.PipelinedShapeModification;
import org.eclipse.ui.navigator.PipelinedViewerUpdate;
import org.eclipse.ui.tests.navigator.m12.ResourceWrapperContentProvider;
import org.eclipse.ui.tests.navigator.m12.model.M1Core;
import org.eclipse.ui.tests.navigator.m12.model.M1Project;
import org.eclipse.ui.tests.navigator.m12.model.ResourceWrapper;
/**
* @since 3.3
*
*/
public class TestPipelineProvider extends ResourceWrapperContentProvider {
public static final Map ELEMENTS = new HashMap(),
CHILDREN = new HashMap(),
ADDS = new HashMap(),
REMOVES = new HashMap(),
UPDATES = new HashMap();
private String _id;
@Override
public void getPipelinedChildren(Object aParent, Set theCurrentChildren) {
_track(CHILDREN, aParent, _id);
}
@Override
public void getPipelinedElements(Object anInput, Set currentElements) {
List newElements = new ArrayList();
for (Iterator it = currentElements.iterator(); it.hasNext();) {
Object element = it.next();
IProject project = getProject(element);
if (project != null) {
M1Project m1Project = new M1Project(project);
it.remove();
newElements.add(m1Project);
}
}
currentElements.addAll(newElements);
_track(ELEMENTS, anInput, _id);
}
@Override
public boolean hasPipelinedChildren(Object anInput, boolean currentHasChildren) {
return currentHasChildren;
}
private IProject getProject(Object element) {
if (element instanceof IProject) {
return (IProject) element;
}
if (element instanceof IAdaptable) {
return ((IAdaptable) element).getAdapter(IProject.class);
}
return null;
}
/**
* @param elements2
* @param anInput
* @param id
*/
private void _track(Map map, Object key, String id) {
if (key instanceof ResourceWrapper) {
key = ((ResourceWrapper)key).getResource();
}
System.out.println("track: " + mapName(map) + " " + key + " id: " + id);
String queries = (String) map.get(key);
StringBuffer buf = new StringBuffer(queries==null ? "" : queries);
buf.append(id);
map.put(key, buf.toString());
}
@Override
public PipelinedShapeModification interceptAdd(PipelinedShapeModification anAddModification) {
Set children = anAddModification.getChildren();
for (Iterator it = children.iterator(); it.hasNext(); ) {
_track(ADDS, it.next(), _id);
}
return super.interceptAdd(anAddModification);
}
@Override
public boolean interceptRefresh(PipelinedViewerUpdate update) {
Set targets = update.getRefreshTargets();
for (Iterator it = targets.iterator(); it.hasNext(); ) {
_track(UPDATES, it.next(), _id);
}
return super.interceptRefresh(update);
}
@Override
public PipelinedShapeModification interceptRemove(PipelinedShapeModification aRemoveModification) {
Set children = aRemoveModification.getChildren();
for (Iterator it = children.iterator(); it.hasNext(); ) {
_track(REMOVES, it.next(), _id);
}
return super.interceptRemove(aRemoveModification);
}
@Override
public boolean interceptUpdate(PipelinedViewerUpdate update) {
Set targets = update.getRefreshTargets();
for (Iterator it = targets.iterator(); it.hasNext(); ) {
_track(UPDATES, it.next(), _id);
}
return super.interceptUpdate(update);
}
@Override
public void init(ICommonContentExtensionSite config) {
_id = config.getExtension().getId();
int i = _id.lastIndexOf('.');
if (i >= 0) {
_id = _id.substring(i+1);
}
}
@Override
public Object[] getChildren(Object parentElement) {
try {
_track(CHILDREN, parentElement, _id + "1");
return ((ResourceWrapper)parentElement).getChildren();
} catch (CoreException e) {
e.printStackTrace();
return NO_CHILDREN;
}
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
@Override
public Object[] getElements(Object inputElement) {
_track(ELEMENTS, inputElement, _id + "1");
return null;
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public void restoreState(IMemento aMemento) {
}
@Override
public void saveState(IMemento aMemento) {
}
@Override
protected Object _convertToModelObject(Object object)
{
if (object instanceof IResource) {
return M1Core.getModelObject((IResource)object);
}
return null;
}
public static String mapName(Map map) {
if (map == ELEMENTS)
return "ELEMENTS";
if (map == CHILDREN)
return "CHILDREN";
if (map == ADDS)
return "ADDS";
if (map == REMOVES)
return "REMOVES";
if (map == UPDATES)
return "UPDATES";
return "??? unknown";
}
/**
*
*/
public static void reset() {
ELEMENTS.clear();
CHILDREN.clear();
ADDS.clear();
REMOVES.clear();
UPDATES.clear();
}
}