1 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 ; 16 17 import org.mmbase.bridge.*; 18 import org.mmbase.bridge.util.Queries; 19 20 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 c) throws JspTagException { 47 container = getAttribute(c); 48 } 49 50 51 54 public void setType(String t) throws JspTagException { 55 type = getAttribute(t); 56 } 57 60 public void setRole(String r) throws JspTagException { 61 role = getAttribute(r); 62 } 63 64 public void setSearchdir(String s) throws JspTagException { 65 searchDir = getAttribute(s); 66 } 67 68 69 protected NodeQuery getRelatedQuery() throws JspTagException { 70 if (relatedQuery == null) { 71 relatedQuery = Queries.createRelatedNodesQuery(relatedFromNode, nm, (String ) role.getValue(this), (String ) searchDir.getValue(this)); 72 if (orderby != Attribute.NULL) { 73 Queries.addSortOrders(relatedQuery, (String ) orderby.getValue(this), (String ) directions.getValue(this)); 74 } 75 Queries.sortUniquely(relatedQuery); 76 } 77 return relatedQuery; 78 } 79 80 public Node getRelatedNode() throws JspTagException { 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 { 98 int superresult = doStartTagHelper(); 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 ) 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) { relatedFromNode = getNode(); 115 if (relatedFromNode == null) { 116 throw new JspTagException ("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 ) role.getValue(this), (String ) searchDir.getValue(this)); 125 relatedQuery = null; } else { 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 ) orderby.getValue(this), (String ) directions.getValue(this)); 134 } 135 Queries.sortUniquely(relatedQuery); 136 } 137 138 139 if (orderby != Attribute.NULL) { 140 Queries.addSortOrders(query, (String ) orderby.getValue(this), (String ) directions.getValue(this)); 141 } 142 143 Queries.sortUniquely(query); 144 145 NodesAndTrim result = getNodesAndTrim(query); 146 result.nodeList.setProperty("relatedFromNode", relatedFromNode); 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 { 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 |