ontopoly.pages.EmbeddedHierarchicalInstancePage.java Source code

Java tutorial

Introduction

Here is the source code for ontopoly.pages.EmbeddedHierarchicalInstancePage.java

Source

/*
 * #!
 * Ontopoly Editor
 * #-
 * Copyright (C) 2001 - 2013 The Ontopia Project
 * #-
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * !#
 */
package ontopoly.pages;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;

import net.ontopia.topicmaps.core.OccurrenceIF;
import net.ontopia.topicmaps.core.TopicIF;
import net.ontopia.utils.ObjectUtils;
import ontopoly.components.LinkPanel;
import ontopoly.components.TreePanel;
import ontopoly.model.PSI;
import ontopoly.model.Topic;
import ontopoly.model.TopicType;
import ontopoly.models.TopicModel;
import ontopoly.pojos.TopicNode;
import ontopoly.utils.OntopolyModelUtils;
import ontopoly.utils.OntopolyUtils;
import ontopoly.utils.TreeModels;

import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.tree.AbstractTree;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

public class EmbeddedHierarchicalInstancePage extends EmbeddedInstancePage {

    private TopicModel<Topic> hierarchyModel;

    public EmbeddedHierarchicalInstancePage(PageParameters parameters) {
        // expect there to be a topicId parameter
        super(parameters);

        // find hierarchy topic
        String hierarchyId = parameters.getString("hierarchyId");
        if (hierarchyId == null)
            this.hierarchyModel = new TopicModel<Topic>(getHierarchyTopic(getTopic()));
        else
            this.hierarchyModel = new TopicModel<Topic>(parameters.getString("topicMapId"), hierarchyId);

        // create a tree
        TreePanel treePanel = createTreePanel("treePanel",
                createTreeModel(new TopicModel<Topic>(getHierarchyTopic()), new TopicModel<Topic>(getTopic())));
        treePanel.setOutputMarkupId(true);
        add(treePanel);
    }

    @Override
    protected boolean isTraversable() {
        return true;
    }

    protected Topic getHierarchyTopic() {
        return hierarchyModel.getTopic();
    }

    protected Topic getHierarchyTopic(Topic topic) {
        // find hierarchy definition query for topic
        String query = getDefinitionQuery(topic);
        if (query != null)
            return topic;

        // find hierarchy definition query for topic's topic types
        Iterator<TopicType> titer = topic.getTopicTypes().iterator();
        while (titer.hasNext()) {
            TopicType topicType = titer.next();
            if (getDefinitionQuery(topicType) != null)
                return topicType;
        }
        return null;
    }

    protected String getDefinitionQuery(Topic topic) {
        TopicIF typeIf = OntopolyModelUtils.getTopicIF(topic.getTopicMap(), PSI.ON, "hierarchy-definition-query");
        if (typeIf == null)
            return null;
        OccurrenceIF occ = OntopolyModelUtils.findOccurrence(typeIf, topic.getTopicIF());
        return (occ == null ? null : occ.getValue());
    }

    protected IModel<TreeModel> createTreeModel(final TopicModel<Topic> hierarchyTopicModel,
            final TopicModel<Topic> currentNodeModel) {
        final TreeModel treeModel;
        Topic hierarchyTopic = hierarchyTopicModel.getTopic();
        Topic currentNode = currentNodeModel.getTopic();

        // find hierarchy definition query for topic
        String query = (hierarchyTopic == null ? null : getDefinitionQuery(hierarchyTopic));

        if (query != null) {
            Map<String, TopicIF> params = new HashMap<String, TopicIF>(2);
            params.put("hierarchyTopic", hierarchyTopic.getTopicIF());
            params.put("currentNode", currentNode.getTopicIF());
            treeModel = TreeModels.createQueryTreeModel(currentNode.getTopicMap(), query, params);
        } else if (currentNode.isTopicType()) {
            // if no definition query found, then show topic in instance hierarchy
            treeModel = TreeModels.createTopicTypesTreeModel(currentNode.getTopicMap(), isAnnotationEnabled(),
                    isAdministrationEnabled());
        } else {
            treeModel = TreeModels.createInstancesTreeModel(OntopolyUtils.getDefaultTopicType(currentNode),
                    isAdministrationEnabled());
        }

        return new AbstractReadOnlyModel<TreeModel>() {
            @Override
            public TreeModel getObject() {
                return treeModel;
            }
        };
    }

    protected TreePanel createTreePanel(final String id, IModel<TreeModel> treeModel) {
        return new TreePanel(id, treeModel) {
            @Override
            protected boolean isMenuEnabled() {
                return true;
            }

            @Override
            protected void initializeTree(AbstractTree tree) {
                // expand current node
                TreeModel treeModel = (TreeModel) tree.getModelObject();
                DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
                DefaultMutableTreeNode treeNode = findTopicNode(root, getTopic());
                if (treeNode != null)
                    expandNode(tree, treeNode);
            }

            protected DefaultMutableTreeNode findTopicNode(DefaultMutableTreeNode parent, Topic topic) {
                @SuppressWarnings("rawtypes")
                Enumeration e = parent.children();
                while (e.hasMoreElements()) {
                    DefaultMutableTreeNode child = (DefaultMutableTreeNode) e.nextElement();
                    Topic nodeTopic = ((TopicNode) child.getUserObject()).getTopic();
                    if (ObjectUtils.equals(nodeTopic, topic))
                        return child;
                    DefaultMutableTreeNode found = findTopicNode(child, topic);
                    if (found != null)
                        return found;
                }
                return null;
            }

            @Override
            protected Component populateNode(String id, TreeNode treeNode) {
                DefaultMutableTreeNode mTreeNode = (DefaultMutableTreeNode) treeNode;
                final TopicNode node = (TopicNode) mTreeNode.getUserObject();
                Topic topic = node.getTopic();
                final boolean isCurrentTopic = ObjectUtils.equals(topic, getTopic());
                // create link with label
                return new LinkPanel(id) {
                    @Override
                    protected Label newLabel(String id) {
                        return new Label(id, new Model<String>(getLabel(node.getTopic()))) {
                            @Override
                            protected void onComponentTag(final ComponentTag tag) {
                                if (isCurrentTopic)
                                    tag.put("class", "emphasis");
                                super.onComponentTag(tag);
                            }
                        };
                    }

                    @Override
                    protected Link<Page> newLink(String id) {
                        Topic topic = node.getTopic();
                        return new BookmarkablePageLink<Page>(id, getPageClass(topic), getPageParameters(topic));
                    }
                };
            }
        };
    }

    @Override
    public PageParameters getPageParameters(Topic topic) {
        // add hierarchyId to parent parameters
        PageParameters params = super.getPageParameters(topic);
        Topic hierarchyTopic = getHierarchyTopic();
        if (hierarchyTopic != null)
            params.put("hierarchyId", hierarchyTopic.getId());
        return params;
    }

}