1 /*
2  * @(#)TOCItemTag.java	1.5 06/10/30
3  *
4  * Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
5  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6  *
7  * This code is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License version 2 only, as
9  * published by the Free Software Foundation.  Sun designates this
10  * particular file as subject to the "Classpath" exception as provided
11  * by Sun in the LICENSE file that accompanied this code.
12  *
13  * This code is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16  * version 2 for more details (a copy is included in the LICENSE file that
17  * accompanied this code).
18  *
19  * You should have received a copy of the GNU General Public License version
20  * 2 along with this work; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
22  *
23  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
24  * CA 95054 USA or visit www.sun.com if you need additional information or
25  * have any questions.
26  */
27 
28 package javax.help.tagext;
29 
30 import javax.servlet.jsp.*;
31 import javax.servlet.jsp.tagext.*;
32 import java.util.*;
33 import java.io.*;
34 import java.net.URL;
35 import java.net.MalformedURLException;
36 import javax.help.HelpBroker;
37 import javax.help.HelpSet;
38 import javax.help.Map;
39 import javax.help.Map.ID;
40 import javax.help.Merge;
41 import javax.help.MergeHelpUtilities;
42 import javax.help.NavigatorView;
43 import javax.help.TOCItem;
44 import javax.help.TOCView;
45 import javax.help.SortMerge;
46 import javax.swing.tree.DefaultMutableTreeNode;
47 import javax.swing.tree.TreeNode;
48 
49 /**
50  * The JSP tag extra info class for an TocItem
51  *
52  * @author Roger D. Brinkley
53  * @version	1.5	10/30/06
54  * @see javax.help.TOCItem
55  */
56 
57 public class TOCItemTag extends BodyTagSupport {
58     private Enumeration treeEnum;
59     private DefaultMutableTreeNode topNode;
60     private String baseID="root";
61     private HelpBroker hb;
62     private TOCView view=null;
63 
setTocView(TOCView view)64     public void setTocView(TOCView view) {
65 	this.view = view;
66     }
67 
setBaseID(String baseID)68     public void setBaseID(String baseID) {
69 	this.baseID = baseID;
70     }
71 
setHelpBroker(HelpBroker hb)72     public void setHelpBroker(HelpBroker hb) {
73 	this.hb = hb;
74     }
75 
initialize()76     private void initialize() {
77 	if (view == null) {
78 	    return;
79 	}
80 	topNode = view.getDataAsTree();
81 
82 	String mergeType = view.getMergeType();
83 	HelpSet hs = view.getHelpSet();
84         Locale locale = hs.getLocale();
85 
86 
87 	// Make sure the children are all handled correctly
88 	MergeHelpUtilities.mergeNodeChildren(mergeType, topNode);
89 
90 	// add all the subhelpsets
91         addSubHelpSets(hs);
92 
93 	treeEnum = topNode.preorderEnumeration();
94     }
95 
96     /** Adds subhelpsets
97      *
98      * @param hs The HelpSet which subhelpsets will be added
99      */
addSubHelpSets(HelpSet hs)100     private void addSubHelpSets(HelpSet hs){
101         for( Enumeration e = hs.getHelpSets(); e.hasMoreElements(); ) {
102 	    HelpSet ehs = (HelpSet) e.nextElement();
103 	    if (ehs == null) {
104 		continue;
105 	    }
106             // merge views
107             NavigatorView[] views = ehs.getNavigatorViews();
108             for(int i = 0; i < views.length; i++){
109 		if (views[i] instanceof TOCView) {
110 		    Merge mergeObject =
111 			Merge.DefaultMergeFactory.getMerge(view, views[i]);
112 		    if (mergeObject != null) {
113 			mergeObject.processMerge(topNode);
114 		    }
115 		}
116             }
117             addSubHelpSets( ehs );
118 	}
119     }
120 
doStartTag()121     public int doStartTag() {
122 	initialize();
123 	if(treeEnum.hasMoreElements()) {
124 	    DefaultMutableTreeNode node =
125 		(DefaultMutableTreeNode) treeEnum.nextElement();
126 	    // never use the top node. It is just the container node
127  	    if (node == topNode) {
128 		try {
129 		    node = (DefaultMutableTreeNode) treeEnum.nextElement();
130 		} catch (NoSuchElementException e) {
131 		    return SKIP_BODY;
132 		}
133 	    }
134 	    setNodeAttributes(node);
135 	    return EVAL_BODY_TAG;
136 	}
137 	else {
138 	    return SKIP_BODY;
139 	}
140     }
141 
doAfterBody()142     public int doAfterBody() throws JspException {
143 	BodyContent body = getBodyContent();
144 	try {
145 	    body.writeOut(getPreviousOut());
146 	} catch (IOException e) {
147 	    throw new JspTagException("TOCItemTag: " + e.getMessage());
148 	}
149 
150 	// clear up so the next time the body content is empty
151 	body.clearBody();
152 	if (treeEnum.hasMoreElements()) {
153 	    DefaultMutableTreeNode node =
154 		(DefaultMutableTreeNode) treeEnum.nextElement();
155 	    setNodeAttributes(node);
156 	    return EVAL_BODY_TAG;
157 	} else {
158 	    return SKIP_BODY;
159 	}
160     }
161 
setNodeAttributes(DefaultMutableTreeNode node)162     private void setNodeAttributes(DefaultMutableTreeNode node) {
163 	TOCItem item = (TOCItem) node.getUserObject();
164 	pageContext.setAttribute("name", item.getName());
165 	String helpID = "";
166 	if (item.getID() != null) {
167 	    helpID = item.getID().id;
168 	}
169 	pageContext.setAttribute("helpID", helpID);
170 	pageContext.setAttribute("parent", Integer.toHexString(node.getParent().hashCode()));
171 	String id = getID(node.getParent());
172 	pageContext.setAttribute("parentID", id);
173 	pageContext.setAttribute("node", Integer.toHexString(node.hashCode()));
174 	id = getID(node);
175 	pageContext.setAttribute("nodeID", id);
176 	String content = getContentURL(item);
177 	pageContext.setAttribute("contentURL", content);
178 	String icon = getIconURL(node, item, true);
179 	pageContext.setAttribute("iconURL", icon);
180 	String iconOpen = getIconURL(node, item, false);
181 	pageContext.setAttribute("iconOpenURL", iconOpen);
182 	String expansionType = Integer.toString(item.getExpansionType());
183 	pageContext.setAttribute("expansionType", expansionType);
184     }
185 
getID(TreeNode node)186     private String getID(TreeNode node) {
187 	if (node == topNode) {
188 	    return baseID;
189 	}
190 	TreeNode parent = node.getParent();
191 	if (parent == null) {
192 	    return "";
193 	}
194 	String id = getID(parent);
195         id = id.concat("_" + Integer.toString(parent.getIndex(node)));
196 	return id;
197     }
198 
199     /**
200      * return the content URL in String form for a given TOCItem
201      *
202      * returns an empty String if no content exists.
203      */
getContentURL(TOCItem item)204     private String getContentURL(TOCItem item) {
205 	URL url = null;
206 	ID id = item.getID();
207 	if (id != null) {
208 	    HelpSet hs = id.hs;
209 	    Map map = hs.getLocalMap();
210 	    try {
211 		url = map.getURLFromID(id);
212 	    } catch (MalformedURLException e) {
213 		// just ignore
214 	    }
215 	}
216 	if (url == null) {
217 	    return "";
218 	}
219 	return url.toExternalForm();
220     }
221 
222     /**
223      * return the icon URL in String form for a given TOCItem
224      *
225      * returns empty String if no content exists.
226      */
getIconURL(DefaultMutableTreeNode node, TOCItem item, boolean closedIcon)227     private String getIconURL(DefaultMutableTreeNode node,
228 			      TOCItem item,
229 			      boolean closedIcon) {
230 	URL url = null;
231 	ID id = item.getImageID();
232 	if (id == null) {
233 	    if (node.isLeaf()) {
234 		id = view.getTopicImageID();
235 	    } else {
236 		if (closedIcon) {
237 		    id = view.getCategoryClosedImageID();
238 		} else {
239 		    id = view.getCategoryOpenImageID();
240 		}
241 	    }
242 	}
243 	if (id != null) {
244 	    HelpSet hs = id.hs;
245 	    Map map = hs.getLocalMap();
246 	    try {
247 		url = map.getURLFromID(id);
248 	    } catch (MalformedURLException e) {
249 		// just ignore
250 	    }
251 	}
252 	if (url == null) {
253 	    return "";
254 	}
255 	return url.toExternalForm();
256     }
257 }
258 
259