KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > za > org > coefficient > modules > vote > Vote


1 /*
2  * Coefficient - facilitates project based collaboration
3  * Copyright (C) 2003, Dylan Etkin, CSIR icomtek
4  * PO Box 395
5  * Pretoria 0001, RSA
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19
20 package za.org.coefficient.modules.vote;
21
22 import net.sf.hibernate.Hibernate;
23 import net.sf.hibernate.HibernateException;
24 import net.sf.hibernate.Session;
25
26 import za.org.coefficient.authentication.Role;
27 import za.org.coefficient.core.Project;
28 import za.org.coefficient.interfaces.CoefficientContext;
29 import za.org.coefficient.modules.BaseProjectModule;
30 import za.org.coefficient.modules.project.ProjectConstants;
31 import za.org.coefficient.util.common.InvokerFactory;
32 import net.sf.hibernate.util.HibernateUtil;
33 import za.org.coefficient.util.ejb.SecurityUtil;
34 import za.org.coefficient.util.ejb.VelocityScreenUtil;
35
36 import java.util.ArrayList JavaDoc;
37 import java.util.HashMap JavaDoc;
38 import java.util.List JavaDoc;
39 import java.util.StringTokenizer JavaDoc;
40
41 /**
42  * @pojo2ejb.class
43  * name="Vote"
44  * jndi-prefix="za/org/coefficient/project/"
45  * interface-extends="za.org.coefficient.interfaces.Module"
46  * interface-local-extends="za.org.coefficient.interfaces.ModuleLocal"
47  *
48  * @web.resource-env-ref
49  * name="za/org/coefficient/project/Vote"
50  * type="za.org.coefficient.modules.vote.Vote"
51  * @web.resource-env-ref
52  * name="Vote"
53  * type="za.org.coefficient.modules.vote.Vote"
54  */

55 public class Vote extends BaseProjectModule {
56     //~ Static fields/initializers =============================================
57

58     static {
59         try {
60             HibernateUtil.configureHibernateForClass(VoteData.class);
61         } catch (HibernateException he) {
62             he.printStackTrace();
63         }
64     }
65
66     /*
67      * button names
68      */

69     public static final String JavaDoc ADD = "add";
70     public static final String JavaDoc CLOSE = "close";
71     public static final String JavaDoc DELETE = "delete";
72     public static final String JavaDoc REOPEN = "reopen";
73     public static final String JavaDoc RESET = "reset";
74     public static final String JavaDoc EDIT = "edit";
75
76     /*
77      * context keywords
78      */

79     public static final String JavaDoc ERROR = "error";
80     public static final String JavaDoc MODULE = "module";
81     public static final String JavaDoc PROJECT = "project";
82     public static final String JavaDoc OP = "op";
83     public static final String JavaDoc BUTTON = "button";
84     public static final String JavaDoc DATEUTIL = "dateutil";
85     public static final String JavaDoc NAME = "name";
86     public static final String JavaDoc PERSON = "person";
87     public static final String JavaDoc QUESTION = "question";
88     public static final String JavaDoc CHOICE = "choice";
89     public static final String JavaDoc CHOICE1 = "choice1";
90     public static final String JavaDoc CHOICE2 = "choice2";
91     public static final String JavaDoc STARTYEAR = "startyear";
92     public static final String JavaDoc STARTMONTH = "startmonth";
93     public static final String JavaDoc STARTDAY = "startday";
94     public static final String JavaDoc ENDYEAR = "endyear";
95     public static final String JavaDoc ENDMONTH = "endmonth";
96     public static final String JavaDoc ENDDAY = "endday";
97     public static final String JavaDoc ROLES = "roles";
98     public static final String JavaDoc MINIMUMROLE = "minimumrole";
99     public static final String JavaDoc VOTE = "vote";
100     public static final String JavaDoc VOTES = "votes";
101     public static final String JavaDoc MORE = "more";
102     public static final String JavaDoc ON = "on";
103     public static final String JavaDoc ID = "id";
104     public static final String JavaDoc RESULTS = "results";
105     public static final String JavaDoc DEFAULTUSER = "guest";
106
107     /*
108      * form fields
109      */

110     /*
111      * velocity pages
112      */

113     public static final String JavaDoc ERRORPAGE = "error.vm";
114     public static final String JavaDoc ADMINPAGE = "admin.vm";
115     public static final String JavaDoc LISTPAGE = "list.vm";
116     public static final String JavaDoc INDEXPAGE = "index.vm";
117     public static final String JavaDoc RESULTSPAGE = "results.vm";
118     public static final String JavaDoc ADDMSG = "add.vm";
119     public static final String JavaDoc COMPLETEDMSG = "completed.vm";
120     public static final String JavaDoc FINISHED = "100%";
121
122     /*
123      * error messages
124      */

125     public static final String JavaDoc NOPROJECT = "You do not have a project";
126     public static final String JavaDoc MISSINGDATA = "Please fill in all the data";
127
128     //~ Methods ================================================================
129

130     public String JavaDoc getMainMethod() {
131         // NOTE: this can be any method of this class that makes sense
132
return "showSummaryForProject";
133     }
134
135     public String JavaDoc getModuleDescription() {
136         return "vote module";
137     }
138
139     public String JavaDoc getModuleDisplayName() {
140         return "Vote";
141     }
142
143     public String JavaDoc canExecuteForRole(CoefficientContext ctx, String JavaDoc methodName,
144         Role usersHighestRole) {
145         return null;
146     }
147
148     public CoefficientContext castavote(CoefficientContext ctx) throws Exception JavaDoc {
149         Project project = ctx.getProject();
150         HashMap JavaDoc map = new HashMap JavaDoc();
151         StringBuffer JavaDoc sb = new StringBuffer JavaDoc("Problem here");
152         map.put(MODULE, this);
153         if (project != null) {
154             map.put(OP, InvokerFactory.getInvoker()
155                     .invokeMethodOnModule("VoteAdmin", "getOp",
156                                           new Object JavaDoc[]{ctx}));
157             map.put(PROJECT, project);
158             List JavaDoc polls = (List JavaDoc)InvokerFactory.getInvoker()
159                 .invokeMethodOnModule("VoteAdmin", "getExistingOpenPolls",
160                                       new Object JavaDoc[]{project});
161             map.put(VOTES, polls);
162             String JavaDoc button = ctx.getParameter(BUTTON, "");
163
164             // vote button was pressed
165
if (button.toLowerCase().equals(VOTE)) {
166                 processVotes(ctx, map);
167                 polls = (List JavaDoc)InvokerFactory.getInvoker()
168                     .invokeMethodOnModule("VoteAdmin", "getExistingOpenPolls",
169                                           new Object JavaDoc[]{project});
170                 map.put(VOTES, polls);
171                 sb = VelocityScreenUtil.getProcessedScreen(RESULTSPAGE, map);
172                 ctx.setForward("project");
173             }
174         } else {
175             map.put(ERROR, NOPROJECT);
176             sb = VelocityScreenUtil.getProcessedScreen(ERRORPAGE, map);
177         }
178
179         // Set the html into the context
180
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
181         return ctx;
182     }
183
184     public CoefficientContext deleteAllForProject(CoefficientContext ctx) throws Exception JavaDoc {
185         Project project = ctx.getProject();
186         if (project != null) {
187             List JavaDoc polls = (List JavaDoc)InvokerFactory.getInvoker()
188                 .invokeMethodOnModule("VoteAdmin", "getExistingOpenPolls",
189                                       new Object JavaDoc[]{project});
190             int i;
191
192             for (i = 0; i < polls.size(); i++) {
193                 try {
194                     HibernateUtil.delete(polls.get(i));
195                 } catch (Throwable JavaDoc t) {
196                     System.out.println("Hibernate can not delete " + t);
197                 }
198             }
199         }
200         return ctx;
201     }
202
203     public String JavaDoc getSummaryForProject(CoefficientContext ctx) throws HibernateException {
204         HashMap JavaDoc map = new HashMap JavaDoc();
205         Session sess = HibernateUtil.getSession();
206         map.put("pollCnt", ((Integer JavaDoc)sess.iterate("select count(*) from "
207             + VoteData.class.getName()
208             + " as voteData where voteData.projectId = ?",
209             ctx.getProject().getId(), Hibernate.LONG).next()));
210         map.put("projectName", ProjectConstants.PROJECT_NAME);
211
212         // TODO: remove this when the hibernate util is all fixed up, this won't
213
// be needed.
214
HibernateUtil.finalizeSession();
215         StringBuffer JavaDoc sb = VelocityScreenUtil
216             .getProcessedScreen("getSummaryForProject.vm", map);
217         return sb.toString();
218     }
219
220     public CoefficientContext showSummaryForProject(CoefficientContext ctx) throws Exception JavaDoc {
221         Project project = ctx.getProject();
222         HashMap JavaDoc map = new HashMap JavaDoc();
223         StringBuffer JavaDoc sb = new StringBuffer JavaDoc("Problem here");
224         map.put(MODULE, this);
225         if (project != null) {
226             map.put(OP, InvokerFactory.getInvoker()
227                     .invokeMethodOnModule("VoteAdmin", "getOp",
228                                           new Object JavaDoc[]{ctx}));
229             map.put(PROJECT, project);
230             List JavaDoc polls = (List JavaDoc)InvokerFactory.getInvoker()
231                 .invokeMethodOnModule("VoteAdmin", "getExistingOpenPolls",
232                                       new Object JavaDoc[]{project});
233             List JavaDoc unvoted;
234             if (ctx.getCurrentUser() == null) {
235                 unvoted = (List JavaDoc)InvokerFactory.getInvoker()
236                     .invokeMethodOnModule("VoteAdmin", "removePollsAlreadyVoted",
237                                           new Object JavaDoc[]{polls, DEFAULTUSER});
238             } else {
239                 unvoted = (List JavaDoc)InvokerFactory.getInvoker()
240                     .invokeMethodOnModule("VoteAdmin", "removePollsAlreadyVoted",
241                                           new Object JavaDoc[]{polls, ctx.getCurrentUser().getUserName()});
242             }
243             List JavaDoc allowed;
244             allowed = (List JavaDoc)InvokerFactory.getInvoker()
245                 .invokeMethodOnModule("VoteAdmin", "removePollsNotAllowed",
246                                           new Object JavaDoc[]{ctx, unvoted});
247             map.put(VOTES, allowed);
248             sb = VelocityScreenUtil.getProcessedScreen(INDEXPAGE, map);
249         } else {
250             map.put(ERROR, NOPROJECT);
251             sb = VelocityScreenUtil.getProcessedScreen(ERRORPAGE, map);
252         }
253
254         // Set the html into the context
255
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
256         return ctx;
257     }
258
259     private void processVotes(CoefficientContext ctx, HashMap JavaDoc map) {
260         int i;
261         List JavaDoc votes = new ArrayList JavaDoc();
262         String JavaDoc choice;
263
264         for (i = 0; true; i++) {
265             choice = ctx.getParameter(CHOICE + i);
266             votes.add(choice);
267             if (choice == null) {
268                 break;
269             }
270         }
271
272         StringTokenizer JavaDoc toks;
273         String JavaDoc id;
274         String JavaDoc pos;
275         VoteData vote;
276         for (i = 0; i < votes.size(); i++) {
277             if (votes.get(i) == null) {
278                 continue;
279             }
280             toks = new StringTokenizer JavaDoc((String JavaDoc) votes.get(i), "-");
281             List JavaDoc list = null;
282             try {
283                 id = (String JavaDoc) toks.nextElement();
284                 pos = (String JavaDoc) toks.nextElement();
285                 list =
286                     HibernateUtil.find("FROM " + VoteData.class.getName()
287                         + " as vote " + "WHERE vote.id = ? ", new Long JavaDoc(id),
288                         Hibernate.LONG);
289                 vote = (VoteData) (list.get(0));
290                 String JavaDoc user;
291                 if (ctx.getCurrentUser() == null) {
292                     user = DEFAULTUSER;
293                 } else {
294                     user = ctx.getCurrentUser()
295                               .getUserName();
296                 }
297                 List JavaDoc voters = vote.getVoters();
298                 if (vote.getMinimumRole()
299                         .getRoleValue() < SecurityUtil.getHighestRoleForUser(
300                         ctx.getCurrentUser(), ctx.getProject())
301                                                       .getRoleValue()) {
302                 }
303                 if (!user.equals(DEFAULTUSER) && voters.contains(user)) {
304                     map.put(ERROR, "You already voted on this issue!");
305                 } else if (vote.getMinimumRole()
306                                .getRoleValue() < SecurityUtil.getHighestRoleForUser(
307                         ctx.getCurrentUser(), ctx.getProject())
308                                                              .getRoleValue()) {
309                     map.put(ERROR,
310                         "You do not have permission to vote on this issue");
311                 } else {
312                     vote.getVoters()
313                         .add(user);
314                     int k;
315                     k = Integer.parseInt(pos);
316                     Long JavaDoc cnt = (Long JavaDoc) vote.getCounts()
317                                           .get(k);
318                     long l = Long.parseLong("" + cnt);
319                     l++;
320                     List JavaDoc oldcounts = vote.getCounts();
321                     List JavaDoc counts = new ArrayList JavaDoc();
322                     int j;
323                     for (j = 0; j < oldcounts.size(); j++) {
324                         if (j == k) {
325                             counts.add(new Long JavaDoc(l));
326                         } else {
327                             counts.add(oldcounts.get(j));
328                         }
329                     }
330                     vote.setCounts(counts);
331                 }
332                 HibernateUtil.saveOrUpdate(vote);
333             } catch (Throwable JavaDoc t) {
334                 System.out.println("Hibernate session throws " + t);
335             }
336         }
337     }
338
339     private void transferChoices(CoefficientContext ctx, VoteData data) {
340         int i;
341         String JavaDoc choice;
342
343         for (i = 1; true; i++) {
344             choice = ctx.getParameter(CHOICE + i);
345             if (choice == null) {
346                 break;
347             }
348             data.getAnswers()
349                 .add(choice);
350             data.getCounts()
351                 .add(new Long JavaDoc(0));
352         }
353     }
354 }
355
Popular Tags