/* * Copyright (c) 2010-2012 Eike Stepper (Berlin, Germany) and others. * 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.internal.ui; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.CDOState; import org.eclipse.emf.cdo.internal.ui.messages.Messages; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import java.util.ArrayList; import java.util.List; import java.util.WeakHashMap; /** * @author Eike Stepper * @since 3.0 */ @Deprecated public class AsyncContentProvider implements ITreeContentProvider { private static final Object[] NO_CHILDREN = {}; private ITreeContentProvider delegate; private WeakHashMap<Object, LoadJob> loadJobs = new WeakHashMap<Object, LoadJob>(); public AsyncContentProvider(ITreeContentProvider delegate) { this.delegate = delegate; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { delegate.inputChanged(viewer, oldInput, newInput); } public void dispose() { delegate.dispose(); } public final Object[] getElements(Object inputElement) { return getChildren(inputElement); } public Object[] getChildren(Object parentElement) { if (parentElement instanceof LoadJob) { return NO_CHILDREN; } if (parentElement instanceof CDOObject) { CDOObject object = (CDOObject)parentElement; if (object.cdoState() == CDOState.PROXY) { LoadJob loadJob = getLoadJob(parentElement); return loadJob.getChildren(); } } return delegate.getChildren(parentElement); } public boolean hasChildren(Object parentElement) { if (parentElement instanceof LoadJob) { return false; } if (parentElement instanceof CDOObject) { CDOObject object = (CDOObject)parentElement; if (object.cdoState() == CDOState.PROXY) { LoadJob loadJob = getLoadJob(parentElement); return loadJob.hasChildren(); } } return delegate.hasChildren(parentElement); } public Object getParent(Object element) { if (element instanceof LoadJob) { LoadJob loadJob = (LoadJob)element; return loadJob.getParent(); } if (element instanceof CDOObject) { CDOObject object = (CDOObject)element; if (object.cdoState() == CDOState.PROXY) { LoadJob loadJob = getLoadJob(element); return loadJob.getParent(); } } return delegate.getParent(element); } private synchronized LoadJob getLoadJob(Object parentElement) { LoadJob loadJob = loadJobs.get(parentElement); if (loadJob == null) { loadJob = new LoadJob(parentElement); loadJobs.put(parentElement, loadJob); new Thread(loadJob).start(); } return loadJob; } /** * @author Eike Stepper */ private final class LoadJob implements Runnable { private Object parent; private List<Object> children = new ArrayList<Object>(); public LoadJob(Object parent) { this.parent = parent; } public Object getParent() { return parent; } public Object[] getChildren() { synchronized (children) { return children.toArray(new Object[children.size()]); } } public boolean hasChildren() { return false; } public void run() { } @Override public String toString() { return Messages.getString("AsyncContentProvider_0"); //$NON-NLS-1$ } } }