/* * #! * Ontopia Navigator * #- * 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 net.ontopia.topicmaps.nav2.taglibs.TMvalue; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import javax.servlet.jsp.JspTagException; import net.ontopia.topicmaps.core.TopicNameIF; import net.ontopia.topicmaps.core.TopicIF; import net.ontopia.topicmaps.core.TopicMapIF; import net.ontopia.topicmaps.nav2.core.NavigatorRuntimeException; import net.ontopia.topicmaps.nav2.taglibs.value.BaseScopedTag; /** * INTERNAL: Value Producing Tag for finding all variant names related * to the objects in a collection (can be either objects of classes * TopicNameIF, TopicIF or TopicMapIF). */ public class VariantsTag extends BaseScopedTag { public Collection process(Collection characteristics) throws JspTagException { // find all variant names of all characteristics in collection if (characteristics == null) { return Collections.EMPTY_SET; } else { ArrayList variantnames = new ArrayList(); Iterator iter = characteristics.iterator(); Object obj = null; while (iter.hasNext()) { obj = iter.next(); // -- first try if instance of TopicNameIF try { TopicNameIF basename = (TopicNameIF) obj; accumulateVariantsOfBasename( basename, variantnames ); } catch (ClassCastException e) { // --- if TopicIF if (obj instanceof TopicIF) { TopicIF topic = (TopicIF) obj; accumulateVariantsOfTopic( topic, variantnames ); } // --- if TopicMapIF else if (obj instanceof TopicMapIF) { TopicMapIF topicmap = (TopicMapIF) obj; accumulateVariantsOfTopicmap( topicmap, variantnames ); } // --- otherwise else { String msg = "VariantsTag expected to get a input collection of " + "basename, topic or topicmap instances, " + "but got instance of class " + obj.getClass().getName(); throw new NavigatorRuntimeException(msg); } } } // while iter return variantnames; } } // ----------------------------------------------------------------- // internal helper methods // ----------------------------------------------------------------- private final void accumulateVariantsOfBasename(TopicNameIF basename, Collection variants) { variants.addAll(basename.getVariants()); } private final void accumulateVariantsOfTopic(TopicIF topic, Collection variants) { if (topic != null) { Iterator iterBase = topic.getTopicNames().iterator(); while (iterBase.hasNext()) { TopicNameIF basename = (TopicNameIF) iterBase.next(); accumulateVariantsOfBasename(basename, variants); } } } private final void accumulateVariantsOfTopicmap(TopicMapIF topicmap, Collection variants) { if (topicmap != null) { Iterator iterTopic = topicmap.getTopics().iterator(); while (iterTopic.hasNext()) { TopicIF topic = (TopicIF) iterTopic.next(); accumulateVariantsOfTopic(topic, variants); } } } }