1 package com.fc.taglibs.castor;
2
3 import java.io.*;
4 import java.util.ArrayList;
5 import javax.naming.*;
6 import javax.servlet.jsp.*;
7 import javax.servlet.jsp.tagext.*;
8 import org.apache.taglibs.standard.lang.support.*;
9
10 import org.exolab.castor.jdo.DataObjects;
11 import org.exolab.castor.jdo.Database;
12 import org.exolab.castor.jdo.ClassNotPersistenceCapableException;
13 import org.exolab.castor.jdo.TransactionNotInProgressException;
14 import org.exolab.castor.jdo.PersistenceException;
15
16 public class CastorLoadTag extends BodyTagSupport
17 {
18
19 /***
20 * The name of this tag
21 */
22 private static String _tagName = "CastorLoadTag";
23
24 /***
25 * The object to load
26 */
27 private Object data = null;
28
29 /***
30 * The Class of the object to load
31 */
32 private Class c = null;
33
34 /***
35 * The database to perform the update
36 */
37 private Database db = null;
38
39 /***
40 * The id by which we will refer to the data object in the JSP page.
41 */
42 private String id;
43
44 /***
45 * The fully qualified class name of the bean returned
46 */
47 private String className;
48
49 /***
50 * The primary key of the bean in the database
51 */
52 private String key;
53
54
55 /***
56 * The scope the bean will be placed in.
57 * Default to page scope
58 */
59 private String scope = "page";
60
61 /***
62 * For determining access mode
63 */
64 private boolean accessModeSet = false;
65 private short _accessMode = Database.Shared;
66 private String accessMode = null;
67
68 /***
69 * Sets the name of the page scoped attribute
70 * that is the bean we are deleting/updating
71 */
72 public void setId(String _id)
73 {
74 this.id = _id;
75 }
76
77 /***
78 * Sets the classname
79 */
80 public void setClassName(String _class)
81 {
82 this.className = _class;
83 }
84
85
86 /***
87 * Sets the primary key
88 */
89 public void setKey(String _key)
90 {
91 this.key = _key;
92 }
93
94 /***
95 * Sets the scope of the bean
96 */
97 public void setScope(String _scope)
98 {
99 this.scope = _scope;
100 }
101
102 /***
103 * Sets the access mode string
104 */
105 public void setAccessMode(String _accessModeStr)
106 {
107 this.accessModeSet = true;
108 this.accessMode = _accessModeStr;
109 }
110
111 /***
112 * Do the start tag bit
113 */
114 public int doStartTag() throws JspException
115 {
116
117 try
118 {
119 /***
120 * Determine the accessmode
121 */
122 if (this.accessModeSet)
123 {
124 if (this.accessMode.equals("DbLocked"))
125 this._accessMode = Database.DbLocked;
126 else if (this.accessMode.equals("Exclusive"))
127 this._accessMode = Database.Exclusive;
128 else if (this.accessMode.equals("Shared"))
129 this._accessMode = Database.Shared;
130 else if (this.accessMode.equals("ReadOnly"))
131 this._accessMode = Database.ReadOnly;
132 else
133 {
134 String msg = "Invalid Access Mode set.";
135 log(msg , null);
136 throw new JspTagException(msg);
137 }
138 }
139
140
141 /*
142 * Check to see if this tag is nested within a transactional tag
143 * Get the transaction. Exception if no Transaction parent tag found.
144 */
145 CastorTransactionInitiator t = (CastorTransactionInitiator)findAncestorWithClass(this, CastorTransactionInitiator.class);
146 if (t!=null)
147 {
148 db = t.getDatabase();
149 log ("Got transaction from parent tag", null);
150
151 /*
152 * Evaluate the primary key
153 */
154 Object pk = null;
155 if (this.key != null)
156 {
157 pk = (Object)ExpressionEvaluatorManager.evaluate("dataSource",this.key, Object.class, this, pageContext);
158 }
159
160 /*
161 * Create an instance of the Class we are retrieving
162 */
163 c = Class.forName(this.className);
164
165 /*
166 * Attempt to load the object only if the key is not null
167 */
168 log("Loading object of type " + c + " with key " + pk, null);
169
170 if (pk!=null)
171 data = db.load(c,pk,_accessMode);
172 else
173 data = c.newInstance();
174 /*
175 * Put the returned object in the
176 * specified scope.
177 */
178
179 if (this.scope.equals("request"))
180 pageContext.setAttribute(this.id, data, PageContext.REQUEST_SCOPE);
181 else if (this.scope.equals("page"))
182 pageContext.setAttribute(this.id, data, PageContext.PAGE_SCOPE);
183 else if (this.scope.equals("session"))
184 pageContext.setAttribute(this.id, data, PageContext.SESSION_SCOPE);
185 else if (this.scope.equals("application"))
186 pageContext.setAttribute(this.id, data, PageContext.APPLICATION_SCOPE);
187
188 }
189 else
190 {
191 String msg = "Tag not nested within a CastorTransactionTag.";
192 log(msg,null);
193 throw new Exception(msg);
194 }
195 }
196 catch(TransactionNotInProgressException e)
197 {
198 log(e.getMessage() , e);
199 throw new JspTagException(e.getMessage());
200 }
201 catch(PersistenceException e)
202 {
203 log(e.getMessage() , e);
204 throw new JspTagException(e.getMessage());
205 }
206 catch(Exception e)
207 {
208 log(e.getMessage() , e);
209 throw new JspTagException(e.getMessage());
210 }
211
212 return EVAL_PAGE;
213 }
214
215 private void log(String msg,Exception e)
216 {
217 if (e!=null)
218 {
219 System.err.println(_tagName + ": " + msg);
220 e.printStackTrace();
221 }
222 else
223 {
224 System.out.println(_tagName + ": " + msg);
225 }
226 }
227
228 }
This page was automatically generated by Maven