KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > jsp > taglib > ListRelationsTag


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.bridge.jsp.taglib;
11
12 import org.mmbase.bridge.jsp.taglib.util.Attribute;
13 import org.mmbase.bridge.jsp.taglib.containers.ListRelationsContainerTag;
14
15 import javax.servlet.jsp.JspTagException JavaDoc;
16
17 import org.mmbase.bridge.*;
18 import org.mmbase.bridge.util.Queries;
19
20 /**
21  * ListRelationsTag, a tag around bridge.Node.getRelations.
22  *
23  * @author Michiel Meeuwissen
24  * @version $Id: ListRelationsTag.java,v 1.20 2006/07/17 15:38:47 johannes Exp $
25  */

26
27 public class ListRelationsTag extends AbstractNodeListTag {
28
29     private Attribute type = Attribute.NULL;
30     private Attribute role = Attribute.NULL;
31     private Attribute searchDir = Attribute.NULL;
32     protected Attribute container = Attribute.NULL;
33
34     private NodeManager nm;
35     private NodeList relatedNodes = null;
36     private NodeQuery relatedQuery = null;
37     private Node relatedFromNode;
38
39
40     Node getRelatedfromNode() {
41         NodeList returnList = getReturnList();
42         return returnList == null ? null : (Node) returnList.getProperty("relatedFromNode");
43     }
44
45
46     public void setContainer(String JavaDoc c) throws JspTagException JavaDoc {
47         container = getAttribute(c);
48     }
49
50
51     /**
52      * @param t The name of a node manager
53      */

54     public void setType(String JavaDoc t) throws JspTagException JavaDoc {
55         type = getAttribute(t);
56     }
57     /**
58      * @param r a role
59      */

60     public void setRole(String JavaDoc r) throws JspTagException JavaDoc {
61         role = getAttribute(r);
62     }
63
64     public void setSearchdir(String JavaDoc s) throws JspTagException JavaDoc {
65         searchDir = getAttribute(s);
66     }
67
68
69     protected NodeQuery getRelatedQuery() throws JspTagException JavaDoc {
70         if (relatedQuery == null) {
71             relatedQuery = Queries.createRelatedNodesQuery(relatedFromNode, nm, (String JavaDoc) role.getValue(this), (String JavaDoc) searchDir.getValue(this));
72             if (orderby != Attribute.NULL) {
73                 Queries.addSortOrders(relatedQuery, (String JavaDoc) orderby.getValue(this), (String JavaDoc) directions.getValue(this));
74             }
75             Queries.sortUniquely(relatedQuery);
76         }
77         return relatedQuery;
78     }
79
80     public Node getRelatedNode() throws JspTagException JavaDoc {
81         if (relatedNodes == null) {
82             NodesAndTrim result = getNodesAndTrim(getRelatedQuery());
83             relatedNodes = result.nodeList;
84             if (getId() != null) {
85                 getRelatedQuery();
86                 listHelper.getReturnList().setProperty("relatedNodes", relatedNodes);
87             }
88
89         }
90         int i = listHelper.getIndex();
91         if (i >= relatedNodes.size()) i = relatedNodes.size() - 1;
92         if (i < 0) i = 0;
93         return relatedNodes.getNode(i);
94
95     }
96
97     public int doStartTag() throws JspTagException JavaDoc{
98         int superresult = doStartTagHelper(); // the super-tag handles the use of referid...
99
if (superresult != NOT_HANDLED) {
100             relatedFromNode = (Node) listHelper.getReturnList().getProperty("relatedFromNode");
101             relatedQuery = (NodeQuery) listHelper.getReturnList().getProperty("relatedQuery");
102             relatedNodes = (NodeList) listHelper.getReturnList().getProperty("relatedNodes");
103             return superresult;
104         }
105
106         ListRelationsContainerTag c = (ListRelationsContainerTag) findParentTag(ListRelationsContainerTag.class, (String JavaDoc) container.getValue(this), false);
107
108         relatedNodes = null;
109         relatedQuery = null;
110
111         NodeQuery query;
112         if (c == null || type != Attribute.NULL || role != Attribute.NULL || searchDir != Attribute.NULL) { // containerless version
113
// obtain a reference to the node through a parent tag
114
relatedFromNode = getNode();
115             if (relatedFromNode == null) {
116                 throw new JspTagException JavaDoc("Could not find parent node!!");
117             }
118
119             nm = null;
120             if (type != Attribute.NULL) {
121                 nm = relatedFromNode.getCloud().getNodeManager(type.getString(this));
122             }
123
124             query = Queries.createRelationNodesQuery(relatedFromNode, nm, (String JavaDoc) role.getValue(this), (String JavaDoc) searchDir.getValue(this));
125             relatedQuery = null; // determin when needed
126
} else { // working with container
127
query = (NodeQuery) c.getQuery();
128             relatedQuery = c.getRelatedQuery();
129             relatedQuery.setOffset(query.getOffset());
130             relatedQuery.setMaxNumber(query.getMaxNumber());
131             relatedFromNode = c.getRelatedFromNode();
132             if (orderby != Attribute.NULL) {
133                 Queries.addSortOrders(relatedQuery, (String JavaDoc) orderby.getValue(this), (String JavaDoc) directions.getValue(this));
134             }
135             Queries.sortUniquely(relatedQuery);
136         }
137
138
139         if (orderby != Attribute.NULL) {
140             Queries.addSortOrders(query, (String JavaDoc) orderby.getValue(this), (String JavaDoc) directions.getValue(this));
141         }
142
143         Queries.sortUniquely(query);
144
145         NodesAndTrim result = getNodesAndTrim(query);
146         result.nodeList.setProperty("relatedFromNode", relatedFromNode); // used to be used by mm:relatednode but not any more.
147

148
149         if (getId() != null) {
150             getRelatedQuery();
151             result.nodeList.setProperty("relatedQuery", relatedQuery);
152         }
153
154         return setReturnValues(result.nodeList, result.needsTrim);
155     }
156
157     public int doEndTag() throws JspTagException JavaDoc {
158         return super.doEndTag();
159     }
160
161     public void doFinally() {
162         nm = null;
163         relatedNodes = null;
164         relatedQuery = null;
165         relatedFromNode = null;
166         super.doFinally();
167     }
168 }
169
170
Popular Tags