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