KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > jsp > taglib > typehandler > NodeHandler


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
11 package org.mmbase.bridge.jsp.taglib.typehandler;
12
13 import java.util.*;
14
15 import javax.servlet.jsp.JspTagException JavaDoc;
16
17 import org.mmbase.bridge.*;
18 import org.mmbase.bridge.jsp.taglib.FieldInfoTag;
19 import org.mmbase.storage.search.Constraint;
20 import org.mmbase.util.Encode;
21 import org.mmbase.util.functions.*;
22
23 //import org.mmbase.util.logging.*;
24

25
26 /**
27  * Taglibs handler for Node typed fields.
28  *
29  *
30  * Currently this recognizes node manager names for the guitype (produces dropdowns). If gui-type is not another builder,
31  * this falls back to 'AbstractTypeHandler'. This behaviour is legacy. AbstractTypeHandler deals with enumerations genericly.
32  *
33  * @author Gerard van de Looi
34  * @author Michiel Meeuwissen
35  * @since MMBase-1.6
36  * @version $Id: NodeHandler.java,v 1.37 2006/04/18 21:30:30 michiel Exp $
37  */

38
39 public class NodeHandler extends AbstractTypeHandler {
40
41     //private static final Logger log = Logging.getLoggerInstance(NodeHandler.class);
42

43     /**
44      * Constructor for NodeHandler.
45      * @param tag
46      */

47     public NodeHandler(FieldInfoTag tag) {
48         super(tag);
49     }
50
51     protected class IgnoreCaseComparator implements Comparator {
52         public int compare(Object JavaDoc o1, Object JavaDoc o2) {
53             String JavaDoc s1 = (String JavaDoc)o1;
54             String JavaDoc s2 = (String JavaDoc)o2;
55             return s1.toUpperCase().compareTo(s2.toUpperCase());
56         }
57     }
58
59     // checks whether a node passed refers to a relation builder
60
// (a nodemanager used for creating relations)
61
private boolean isRelationBuilder(Node n) throws JspTagException JavaDoc {
62         try {
63             NodeManager nm = tag.getCloudVar().getNodeManager(n.getStringValue("name"));
64             // not a really good way to check, but it wil work for now
65
// better is to use some property like
66
// NodeManager.getNodeClass()
67
// which might then return Node, Relation, NodeManager, or RelationManager.
68
return nm.hasField("snumber") && !nm.getName().equals("typerel");
69         } catch (BridgeException e) {
70             return false;
71         }
72     }
73
74     /**
75      * @since MMBase-1.8
76      */

77     protected boolean useLegacy(Node node, Field field) {
78         return field.getDataType().getEnumerationValues(null, field.getNodeManager().getCloud(), node, field) == null;
79     }
80
81     /**
82      * @see TypeHandler#htmlInput(Node, Field, boolean)
83      */

84     public String JavaDoc htmlInput(Node node, Field field, boolean search) throws JspTagException JavaDoc {
85
86         // if the gui was a builder(maybe query in future) then show a drop down for this thing, listing the nodes..
87
if(useLegacy(node, field) &&
88            // backwards compatibility. super should deal correctly with enumerations, also for node-fields
89
tag.getCloudVar().hasNodeManager(field.getGUIType())) {
90             StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
91             // yippee! the gui was the same a an builder!
92
buffer.append("<select class=\"" + getClasses(field) + "\" name=\"").append( prefix(field.getName()) ).append("\" ");
93             buffer.append("id=\"").append( prefixID(field.getName()) ).append("\" ");
94             addExtraAttributes(buffer);
95             buffer.append(">\n");
96             // list all our nodes of the specified builder here...
97
String JavaDoc value = "0";
98             if (node != null) value = node.getStringValue(field.getName());
99
100
101             // args for gui function
102
Parameters args = new Parameters(org.mmbase.module.core.MMObjectBuilder.GUI_PARAMETERS);
103             args.set("field", "");
104             args.set("locale", tag.getLocale());
105             args.set("response", tag.getPageContext().getResponse());
106             args.set("request", tag.getPageContext().getRequest());
107             // should actually be added
108
//args.add(sessionName);
109
//args.add(tag.pageContext.getResponse());
110

111             NodeIterator nodes = tag.getCloudVar().getNodeManager(field.getGUIType()).getList(null, null, null).nodeIterator();
112
113             SortedMap sortedGUIs = new TreeMap(new IgnoreCaseComparator());
114
115             // If this is the 'builder' field of the reldef builder, we need to filter
116
// as we are only interested in insrel-derived builders.
117
// Since there is no facility to filter this, we need to 'hard code' this.
118
// Not so nice, but since it involves a core builder, this may work for now.
119
// possibly in the future we need to define a new typehandler.
120
boolean reldefFilter = field.getName().equals("builder") && field.getNodeManager().getName().equals("reldef");
121
122             while(nodes.hasNext()) {
123                 Node n = nodes.nextNode();
124                 // if this is reldef, filter the 'builder' node
125
if (!reldefFilter || isRelationBuilder(n)) {
126                   sortedGUIs.put(n.getFunctionValue("gui", args).toString(), "" + n.getNumber());
127                 }
128             }
129             Iterator i = sortedGUIs.entrySet().iterator();
130             while(i.hasNext()) {
131                 Map.Entry gui = (Map.Entry) i.next();
132
133                 // we have a match on the number!
134
buffer.append(" <option ");
135                 if(gui.getValue().equals(value)) {
136                     // this is the selected one!
137
buffer.append("selected=\"selected\" ");
138                 } else if (search) {
139                     String JavaDoc searchi = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(field.getName()));
140                     if (gui.getValue().equals(searchi)) {
141                         buffer.append(" selected=\"selected\" ");
142                     }
143                 }
144                 buffer.append("value=\"" + gui.getValue() + "\">");
145                 buffer.append(Encode.encode("ESCAPE_XML", (String JavaDoc) gui.getKey()));
146                 buffer.append("</option>\n");
147             }
148             buffer.append("</select>");
149             if (search) {
150                 buffer.append("<input type=\"checkbox\" name=\"");
151                 String JavaDoc name = prefix(field.getName() + "_search");
152                 buffer.append(name);
153                 String JavaDoc searchi = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), name);
154                 buffer.append("\" ");
155                 buffer.append("id=\"").append(prefixID(field.getName() + "_search")).append("\" ");
156                 if (searchi != null) {
157                     buffer.append("checked=\"checked\"");
158                 }
159                 buffer.append(" />\n");
160             }
161             return buffer.toString();
162         }
163         return super.htmlInput(node, field, search);
164     }
165
166     /**
167      * @see TypeHandler#whereHtmlInput(Field)
168      */

169     public String JavaDoc whereHtmlInput(Field field) throws JspTagException JavaDoc {
170         String JavaDoc fieldName = field.getName();
171         if(useLegacy(null, field) &&
172             tag.getCloudVar().hasNodeManager(field.getGUIType())) {
173             String JavaDoc id = prefix(fieldName + "_search");
174             if ( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), id) == null) {
175                 return null;
176             }
177         }
178         return super.whereHtmlInput(field);
179     }
180
181     public Constraint whereHtmlInput(Field field, Query query) throws JspTagException JavaDoc {
182         String JavaDoc fieldName = field.getName();
183         if(useLegacy(null, field) &&
184            tag.getCloudVar().hasNodeManager(field.getGUIType())) {
185             String JavaDoc id = prefix(fieldName + "_search");
186             if ( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), id) == null) {
187                 return null;
188             }
189         }
190         return super.whereHtmlInput(field, query);
191     }
192
193
194 }
195
Popular Tags