/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * HUMBOLDT EU Integrated Project #030962 * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.ui.views.data.internal.explore; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import com.google.common.collect.Iterables; import eu.esdihumboldt.hale.common.instance.model.Group; import eu.esdihumboldt.hale.common.instance.model.Instance; import eu.esdihumboldt.hale.common.schema.model.Definition; import eu.esdihumboldt.hale.ui.views.data.internal.Metadata; import eu.esdihumboldt.util.Pair; /** * Content provider showing an instance property tree with all values. Elements * are {@link Definition}/value {@link Pair}s. * * @author Simon Templer */ public class InstanceContentProvider implements ITreeContentProvider { /** * @see IContentProvider#dispose() */ @Override public void dispose() { // do nothing } /** * @see IContentProvider#inputChanged(Viewer, Object, Object) */ @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // ignore } /** * @see ITreeContentProvider#getElements(Object) */ @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Instance) { if (!((Instance) inputElement).getMetaDataNames().isEmpty()) { return new Object[] { new Pair<Object, Object>(((Instance) inputElement).getDefinition(), inputElement), (new Pair<Object, Object>(Metadata.METADATA, inputElement)) }; } else return new Object[] { new Pair<Object, Object>( ((Instance) inputElement).getDefinition(), inputElement) }; } else return new Object[0]; } /** * @see ITreeContentProvider#getChildren(Object) */ @Override public Object[] getChildren(Object parentElement) { boolean isMetaData = false; if (parentElement instanceof Pair<?, ?>) { Pair<?, ?> pair = (Pair<?, ?>) parentElement; parentElement = pair.getSecond(); if (pair.getFirst() == Metadata.METADATA && pair.getSecond() instanceof Instance) { isMetaData = true; } } if (parentElement instanceof Group && isMetaData == false) { Group group = (Group) parentElement; List<Object> children = new ArrayList<Object>(); for (QName name : group.getPropertyNames()) { Definition<?> childDef = group.getDefinition().getChild(name); for (Object value : group.getProperty(name)) { children.add(new Pair<Object, Object>(childDef, value)); } } return children.toArray(); } if (parentElement instanceof Group && isMetaData == true) { Instance inst = (Instance) parentElement; List<Object> metachildren = new ArrayList<Object>(); for (String key : inst.getMetaDataNames()) { List<Object> values = inst.getMetaData(key); for (Object value : values) { metachildren.add(new Pair<String, Object>(key, value)); } } return metachildren.toArray(); } return new Object[0]; } /** * @see ITreeContentProvider#getParent(Object) */ @Override public Object getParent(Object element) { return null; // not supported currently } /** * @see ITreeContentProvider#hasChildren(Object) */ @Override public boolean hasChildren(Object element) { if (element instanceof Pair<?, ?>) { Pair<?, ?> pair = (Pair<?, ?>) element; if (pair.getFirst() == Metadata.METADATA && pair.getSecond() instanceof Instance) { return true; } element = pair.getSecond(); } if (element instanceof Group) { Group group = (Group) element; return !Iterables.isEmpty(group.getPropertyNames()); } return false; } }