eu.esdihumboldt.hale.ui.views.data.internal.explore.InstanceContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.views.data.internal.explore.InstanceContentProvider.java

Source

/*
 * 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;
    }

}