You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by im...@apache.org on 2007/03/04 09:20:43 UTC

svn commit: r514369 - in /myfaces/fusion/trunk/examples/src/main: java/org/apache/myfaces/examples/ballot/backings/ java/org/apache/myfaces/examples/ballot/dao/ java/org/apache/myfaces/examples/ballot/lib/ java/org/apache/myfaces/examples/ballot/model/...

Author: imario
Date: Sun Mar  4 00:20:42 2007
New Revision: 514369

URL: http://svn.apache.org/viewvc?view=rev&rev=514369
Log:
added page to show the votes

Added:
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopicVotes.java
      - copied, changed from r514225, myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/lib/SendMail.java
    myfaces/fusion/trunk/examples/src/main/webapp/ballot/TopicVotes.jsp
      - copied, changed from r514225, myfaces/fusion/trunk/examples/src/main/webapp/ballot/VoteTopic.jsp
Modified:
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotHall.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopic.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoter.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/dao/VoterDao.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Topic.java
    myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Voter.java
    myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/applicationContext.xml
    myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/faces-config.xml
    myfaces/fusion/trunk/examples/src/main/webapp/ballot/Hall.jsp

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotHall.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotHall.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotHall.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotHall.java Sun Mar  4 00:20:42 2007
@@ -153,6 +153,14 @@
 		return FacesConst.SUCCESS;
 	}
 
+	public String topicVotesAction()
+	{
+		// ensure we start with a fresh conversation on the next page
+		// TODO: we can avoid it once we have the flash scope
+		ConversationUtils.invalidateIfExists("ballotTopicVotes");
+		return FacesConst.SUCCESS;
+	}
+
 	public String newTopicAction()
 	{
 		return FacesConst.SUCCESS;

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopic.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopic.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopic.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopic.java Sun Mar  4 00:20:42 2007
@@ -22,8 +22,10 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.myfaces.examples.ballot.dao.TopicDao;
 import org.apache.myfaces.examples.ballot.dao.ItemDao;
+import org.apache.myfaces.examples.ballot.dao.VoterDao;
 import org.apache.myfaces.examples.ballot.model.Item;
 import org.apache.myfaces.examples.ballot.model.Topic;
+import org.apache.myfaces.examples.ballot.lib.BallotState;
 import org.apache.myfaces.examples.lib.FacesConst;
 import org.apache.myfaces.fusion.conversation.Conversation;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +36,9 @@
 {
 	private TopicDao topicDao;
 	private ItemDao itemDao;
+	private VoterDao voterDao;
+
+	private BallotState ballotState;
 
 	private Topic topic;
 
@@ -60,6 +65,26 @@
 		this.itemDao = itemDao;
 	}
 
+	public VoterDao getVoterDao()
+	{
+		return voterDao;
+	}
+
+	public void setVoterDao(VoterDao voterDao)
+	{
+		this.voterDao = voterDao;
+	}
+
+	public BallotState getBallotState()
+	{
+		return ballotState;
+	}
+
+	public void setBallotState(BallotState ballotState)
+	{
+		this.ballotState = ballotState;
+	}
+
 	public void initView()
 	{
 		if (topic == null)
@@ -134,6 +159,7 @@
 			addItemAction();
 		}
 
+		topic.setOwner(getVoterDao().getByKey(getBallotState().getVoterId()));
 		topicDao.save(topic);
 
 		Conversation.getCurrentInstance().invalidate();

Copied: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopicVotes.java (from r514225, myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java)
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopicVotes.java?view=diff&rev=514369&p1=myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java&r1=514225&p2=myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopicVotes.java&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotTopicVotes.java Sun Mar  4 00:20:42 2007
@@ -35,24 +35,20 @@
 import org.apache.myfaces.examples.ballot.model.Voter;
 import org.apache.myfaces.examples.lib.FacesConst;
 import org.apache.myfaces.examples.lib.FacesUtils;
-import org.apache.myfaces.examples.lib.SpringUtils;
-import org.apache.myfaces.fusion.conversation.Conversation;
-import org.apache.myfaces.fusion.conversation.ConversationUtils;
-import org.springframework.transaction.PlatformTransactionManager;
 
 import javax.faces.context.FacesContext;
-import javax.faces.event.ValueChangeEvent;
 import javax.faces.model.SelectItem;
-import javax.servlet.ServletRequest;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class BallotVoteTopic
+public class BallotTopicVotes
 {
-	private PlatformTransactionManager transactionManager;
+	@PersistenceContext
+	private EntityManager entityManager;
 
 	private TopicDao topicDao;
 	private VoteDao voteDao;
@@ -60,12 +56,12 @@
 	private ItemDao itemDao;
 
 	private BallotState ballotState;
-	private BallotVoteTopicCmp ballotVoteTopicCmp;
 
 	private Topic topic;
+	private Long selectedVoterId;
 
 	private List<ItemInfo> itemInfos;
-	private List<SelectItem> choices;
+	private List<SelectItem> voters;
 
 	public static class ItemInfo
 	{
@@ -94,26 +90,22 @@
 		{
 			return currentVote;
 		}
-	}
-
-	public BallotVoteTopicCmp getBallotVoteTopicCmp()
-	{
-		return ballotVoteTopicCmp;
-	}
 
-	public void setBallotVoteTopicCmp(BallotVoteTopicCmp ballotVoteTopicCmp)
-	{
-		this.ballotVoteTopicCmp = ballotVoteTopicCmp;
-	}
-
-	public PlatformTransactionManager getTransactionManager()
-	{
-		return transactionManager;
-	}
+		public String getVoteChoice()
+		{
+			StringBuilder choiceText=new StringBuilder();
+			if (getVote().getChoice() > 0)
+			{
+				choiceText.append("+");
+			}
+			else if (getVote().getChoice()<0)
+			{
+				choiceText.append("-");
+			}
+			choiceText.append(Integer.toString(getVote().getChoice()));
 
-	public void setTransactionManager(PlatformTransactionManager transactionManager)
-	{
-		this.transactionManager = transactionManager;
+			return choiceText.toString();
+		}
 	}
 
 	public BallotState getBallotState()
@@ -166,16 +158,20 @@
 		this.voterDao = voterDao;
 	}
 
-	public void initView()
+	public Long getSelectedVoterId()
 	{
-		if (!getBallotState().isAuthenticated())
-		{
-			FacesUtils.addErrorMessage("you are not authenticated");
+		return selectedVoterId;
+	}
 
-			redirectToHall();
-			return;
-		}
+	public void setSelectedVoterId(Long selectedVoterId)
+	{
+		this.selectedVoterId = selectedVoterId;
+	}
 
+	public void initView()
+	{
+		System.err.println("init view");
+		
 		if (topic == null)
 		{
 			String topicId = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("topicId");
@@ -192,6 +188,15 @@
 				return;
 			}
 		}
+
+		if (getSelectedVoterId() == null)
+		{
+			setSelectedVoterId(getBallotState().getVoterId());
+			if (getSelectedVoterId() != null)
+			{
+				selectVoterAction();
+			}
+		}
 	}
 
 	private void redirectToHall()
@@ -204,34 +209,39 @@
 	{
 		topic = topicDao.getByKey(id);
 	}
-	
+
 	public Topic getTopic()
 	{
 		return topic;
 	}
 
-	public void voteChanged(ValueChangeEvent event)
+	public List<SelectItem> getVoters()
 	{
-		Date now = new Date();
+		if (voters != null)
+		{
+			return voters;
+		}
 
-		ItemInfo itemInfo = (ItemInfo) getBallotVoteTopicCmp().getItemInfoTable().getRowData();
-		Vote vote = itemInfo.getVote();
-		vote.setChanged(now);
-		
-		ServletRequest sr = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
-		vote.setRemoteIp(sr.getRemoteAddr());
+		voters = new ArrayList<SelectItem>();
+		for (Voter voter : voterDao.getVoterForTopic(getTopic()))
+		{
+			voters.add(new SelectItem(voter.getId(), voter.getName() +  "(" + voter.getEmail() + ")"));
+		}
+
+		return voters;
 	}
 
-	public List<ItemInfo> getItems()
+	public String selectVoterAction()
 	{
-		if (itemInfos != null)
+		itemInfos = new ArrayList<ItemInfo>();
+
+		if (getSelectedVoterId() == null)
 		{
-			return itemInfos;
+			FacesUtils.addErrorMessage("no voter selected");
+			return FacesConst.FAILURE;
 		}
 
-		itemInfos = new ArrayList<ItemInfo>();
-
-		Voter voter = voterDao.getByKey(getBallotState().getVoterId());
+		Voter voter = voterDao.getByKey(getSelectedVoterId());
 
 		Map<Item, Vote> voteMap = new HashMap<Item, Vote>();
 		for (Vote vote : voteDao.getVotesForVoter(voter))
@@ -253,75 +263,11 @@
 			itemInfos.add(new ItemInfo(item, vote, itemVotes.get(item)));
 		}
 
-		return itemInfos;
-	}
-
-	public String saveAction()
-	{
-		int voteCount = 0;
-		
-		for (ItemInfo itemInfo : itemInfos)
-		{
-			if (itemInfo.getVote().getChoice() != 0)
-			{
-				voteCount++;
-			}
-
-			Date now = new Date();
-
-			Vote vote = itemInfo.getVote();
-			if (vote.getCreated() == null)
-			{
-				vote.setCreated(now);
-			}
-
-			if (vote.getRemoteIp() == null)
-			{
-				ServletRequest sr = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
-				vote.setRemoteIp(sr.getRemoteAddr());
-			}
-
-			voteDao.save(vote);
-		}
-
-		if (voteCount != getTopic().getMaxVoteCount())
-		{
-			FacesUtils.addErrorMessage("you have to choose (not 0 vote) exactly '" + getTopic().getMaxVoteCount() + "' items");
-			return FacesConst.FAILURE;
-		}
-		
-		SpringUtils.commit(transactionManager);
-		
-
-		BallotVoteTopic newBallotVoteTopic = (BallotVoteTopic) ConversationUtils.invalidateAndRestart(Conversation.getCurrentInstance());
-		newBallotVoteTopic.initTopic(getTopic().getId());
-
 		return FacesConst.SUCCESS;
 	}
 
-	public List<SelectItem> getChoices()
+	public List<ItemInfo> getItems()
 	{
-		if (choices != null)
-		{
-			return choices;
-		}
-
-		choices = new ArrayList<SelectItem>();
-		for (int i = getTopic().getMinVote(); i < (getTopic().getMaxVote()+1); i++)
-		{
-			StringBuilder choiceText=new StringBuilder();
-			if (i > 0)
-			{
-				choiceText.append("+");
-			}
-			else if (i<0)
-			{
-				choiceText.append("-");
-			}
-			choiceText.append(Integer.toString(i));
-			choices.add(new SelectItem(i, choiceText.toString()));
-		}
-
-		return choices;
+		return itemInfos;
 	}
 }

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoteTopic.java Sun Mar  4 00:20:42 2007
@@ -29,6 +29,7 @@
 import org.apache.myfaces.examples.ballot.dao.VoteDao;
 import org.apache.myfaces.examples.ballot.dao.VoterDao;
 import org.apache.myfaces.examples.ballot.lib.BallotState;
+import org.apache.myfaces.examples.ballot.lib.SendMail;
 import org.apache.myfaces.examples.ballot.model.Item;
 import org.apache.myfaces.examples.ballot.model.Topic;
 import org.apache.myfaces.examples.ballot.model.Vote;
@@ -39,16 +40,20 @@
 import org.apache.myfaces.fusion.conversation.Conversation;
 import org.apache.myfaces.fusion.conversation.ConversationUtils;
 import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.mail.javamail.JavaMailSender;
 
 import javax.faces.context.FacesContext;
 import javax.faces.event.ValueChangeEvent;
 import javax.faces.model.SelectItem;
 import javax.servlet.ServletRequest;
+import javax.mail.MessagingException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.io.StringWriter;
+import java.io.PrintWriter;
 
 public class BallotVoteTopic
 {
@@ -67,6 +72,8 @@
 	private List<ItemInfo> itemInfos;
 	private List<SelectItem> choices;
 
+	private JavaMailSender mailSender;
+
 	public static class ItemInfo
 	{
 		private final Item item;
@@ -116,6 +123,16 @@
 		this.transactionManager = transactionManager;
 	}
 
+	public JavaMailSender getMailSender()
+	{
+		return mailSender;
+	}
+
+	public void setMailSender(JavaMailSender mailSender)
+	{
+		this.mailSender = mailSender;
+	}
+
 	public BallotState getBallotState()
 	{
 		return ballotState;
@@ -256,10 +273,21 @@
 		return itemInfos;
 	}
 
-	public String saveAction()
+	public String saveAction() throws MessagingException
 	{
 		int voteCount = 0;
-		
+
+		StringWriter sw = new StringWriter();
+		PrintWriter out = new PrintWriter(sw);
+		out.println("Hi!");
+		out.println();
+		out.println("A new vote has been placed by:");
+		Voter voter = voterDao.getByKey(getBallotState().getVoterId());
+		out.println(voter.getId() + " " + voter.getEmail() + " " + voter.getName());
+		out.println();
+		out.println("Topic:");
+		out.println(getTopic().getName());
+
 		for (ItemInfo itemInfo : itemInfos)
 		{
 			if (itemInfo.getVote().getChoice() != 0)
@@ -282,7 +310,13 @@
 			}
 
 			voteDao.save(vote);
+
+			out.println(vote.getItem().getContent() + " " + vote.getChoice());
 		}
+		out.println();
+		out.println("See you,");
+		out.println("The Voting Machine - Ballot");
+		out.close();
 
 		if (voteCount != getTopic().getMaxVoteCount())
 		{
@@ -291,11 +325,23 @@
 		}
 		
 		SpringUtils.commit(transactionManager);
-		
+
+		SendMail.sendMail(mailSender,
+			getTopic().getOwner().getEmail(),
+			getTopic().getOwner().getEmail(),
+			"A new vote from " + voter.getName(),
+			sw.toString());
+
+		SendMail.sendMail(mailSender,
+			getTopic().getOwner().getEmail(),
+			voter.getEmail(),
+			"Your vote for " + getTopic().getName(),
+			sw.toString());
 
 		BallotVoteTopic newBallotVoteTopic = (BallotVoteTopic) ConversationUtils.invalidateAndRestart(Conversation.getCurrentInstance());
 		newBallotVoteTopic.initTopic(getTopic().getId());
 
+		FacesUtils.addInfoMessage("vote accepted, you should get a email as approvement");
 		return FacesConst.SUCCESS;
 	}
 

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoter.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoter.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoter.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/backings/BallotVoter.java Sun Mar  4 00:20:42 2007
@@ -20,18 +20,17 @@
 
 import org.apache.myfaces.examples.ballot.dao.VoterDao;
 import org.apache.myfaces.examples.ballot.lib.BallotState;
+import org.apache.myfaces.examples.ballot.lib.SendMail;
 import org.apache.myfaces.examples.ballot.model.Voter;
 import org.apache.myfaces.examples.lib.FacesConst;
 import org.apache.myfaces.examples.lib.FacesUtils;
 import org.apache.myfaces.examples.lib.SpringUtils;
 import org.apache.myfaces.fusion.conversation.Conversation;
 import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.transaction.PlatformTransactionManager;
 
 import javax.faces.context.FacesContext;
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 import javax.servlet.http.HttpServletRequest;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -226,13 +225,11 @@
 
 		out.close();
 
-		MimeMessage mimeMessage = mailSender.createMimeMessage();
-		MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
-		mimeMessageHelper.setSubject("Login Url For The Voting Machine");
-		mimeMessageHelper.setFrom("mario@ops.co.at");
-		mimeMessageHelper.setTo(voter.getEmail());
-		mimeMessageHelper.setText(sw.toString(), false);
-
-		mailSender.send(mimeMessage);
+		SendMail.sendMail(
+			mailSender,
+			"mario@ops.co.at",
+			voter.getEmail(),
+			"Login Url For The Voting Machine",
+			sw.toString());
 	}
 }

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/dao/VoterDao.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/dao/VoterDao.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/dao/VoterDao.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/dao/VoterDao.java Sun Mar  4 00:20:42 2007
@@ -24,11 +24,13 @@
 package org.apache.myfaces.examples.ballot.dao;
 
 import org.apache.myfaces.examples.ballot.model.Voter;
+import org.apache.myfaces.examples.ballot.model.Topic;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
 import javax.persistence.NoResultException;
+import java.util.List;
 
 public class VoterDao
 {
@@ -97,5 +99,12 @@
 	{
 		Voter voter = getVoterByIdentification(identification);
 		return voter != null && voter.getEmail().equals(mail);
+	}
+
+	public List<Voter> getVoterForTopic(Topic topic)
+	{
+		Query query = entityManager.createNamedQuery("getVoterForTopic");
+		query.setParameter("topic", topic);
+		return query.getResultList();
 	}
 }

Added: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/lib/SendMail.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/lib/SendMail.java?view=auto&rev=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/lib/SendMail.java (added)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/lib/SendMail.java Sun Mar  4 00:20:42 2007
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.examples.ballot.lib;
+
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.mail.javamail.JavaMailSender;
+
+import javax.mail.internet.MimeMessage;
+import javax.mail.MessagingException;
+
+public final class SendMail
+{
+	private SendMail()
+	{
+	}
+
+	public static void sendMail(JavaMailSender mailSender, String from, String to, String subject, String text) throws MessagingException
+	{
+		MimeMessage mimeMessage = mailSender.createMimeMessage();
+		MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
+		mimeMessageHelper.setSubject(subject);
+		mimeMessageHelper.setFrom(from);
+		mimeMessageHelper.setTo(to);
+		mimeMessageHelper.setText(text, false);
+
+		mailSender.send(mimeMessage);
+	}
+}

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Topic.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Topic.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Topic.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Topic.java Sun Mar  4 00:20:42 2007
@@ -28,6 +28,7 @@
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.OrderBy;
+import javax.persistence.ManyToOne;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -57,6 +58,9 @@
 	@Column(nullable = false)
 	private int maxVoteCount;
 
+	@ManyToOne(optional = false)
+	private Voter owner;
+
 	@OneToMany(mappedBy="topic", cascade = CascadeType.ALL)
 	@OrderBy(value="content")
 	private List<Item> items;
@@ -165,5 +169,15 @@
 	public void setMaxVoteCount(int maxVoteCount)
 	{
 		this.maxVoteCount = maxVoteCount;
+	}
+
+	public Voter getOwner()
+	{
+		return owner;
+	}
+
+	public void setOwner(Voter owner)
+	{
+		this.owner = owner;
 	}
 }

Modified: myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Voter.java
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Voter.java?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Voter.java (original)
+++ myfaces/fusion/trunk/examples/src/main/java/org/apache/myfaces/examples/ballot/model/Voter.java Sun Mar  4 00:20:42 2007
@@ -34,18 +34,21 @@
 
 @NamedQueries(
 	value = {
-		@NamedQuery(
-			name = "getVoterByIdentification",
-			query = "select voter from Voter voter where voter.identification = :identification"),
-		@NamedQuery(
-			name = "getVoterByEmail",
-			query = "select voter from Voter voter where voter.email = :email")
+	@NamedQuery(
+		name = "getVoterByIdentification",
+		query = "select voter from Voter voter where voter.identification = :identification"),
+	@NamedQuery(
+		name = "getVoterByEmail",
+		query = "select voter from Voter voter where voter.email = :email"),
+	@NamedQuery(
+		name = "getVoterForTopic",
+		query = "select distinct voter from Vote vote join vote.voter voter where vote.item.topic = :topic")
 		})
 @Entity
 public class Voter
 {
 	@Id
-	@GeneratedValue(strategy= GenerationType.SEQUENCE)
+	@GeneratedValue(strategy = GenerationType.SEQUENCE)
 	private Long id;
 
 	@Column(nullable = false)

Modified: myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/applicationContext.xml
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/applicationContext.xml?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/applicationContext.xml (original)
+++ myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/applicationContext.xml Sun Mar  4 00:20:42 2007
@@ -186,6 +186,14 @@
 	</bean>
 
 	<bean
+		name="ballotTopicVotes"
+		class="org.apache.myfaces.examples.ballot.backings.BallotTopicVotes"
+		scope="conversation"
+		autowire="byName">
+
+	</bean>
+
+	<bean
 		name="ballotTopic"
 		class="org.apache.myfaces.examples.ballot.backings.BallotTopic"
 		scope="conversation"

Modified: myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/faces-config.xml?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/faces-config.xml (original)
+++ myfaces/fusion/trunk/examples/src/main/webapp/WEB-INF/faces-config.xml Sun Mar  4 00:20:42 2007
@@ -95,6 +95,12 @@
 			<to-view-id>/ballot/VoteTopic.jsp?topicId=#{param.topicId}</to-view-id>
 			<redirect/>
 		</navigation-case>
+		<navigation-case>
+			<from-action>#{ballotHall.topicVotesAction}</from-action>
+			<from-outcome>success</from-outcome>
+			<to-view-id>/ballot/TopicVotes.jsp?topicId=#{param.topicId}</to-view-id>
+			<redirect/>
+		</navigation-case>
 	</navigation-rule>
 
 	<navigation-rule>

Modified: myfaces/fusion/trunk/examples/src/main/webapp/ballot/Hall.jsp
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/webapp/ballot/Hall.jsp?view=diff&rev=514369&r1=514368&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/webapp/ballot/Hall.jsp (original)
+++ myfaces/fusion/trunk/examples/src/main/webapp/ballot/Hall.jsp Sun Mar  4 00:20:42 2007
@@ -92,23 +92,36 @@
 				<h:outputText value="Action" />
 			</f:facet>
 
-			<h:commandLink
-				value="Show details"
-				action="#{ballotHall.showItemsAction}"
-				rendered="#{!topicInfo.topic.started}">
+			<h:panelGrid
+				columns="1"
+				columnClasses="nowrap">
+				<h:commandLink
+					value="Show details"
+					action="#{ballotHall.showItemsAction}"
+					rendered="#{!topicInfo.topic.started}">
 
-				<f:param name="topicId" value="#{topicInfo.topic.id}" />
+					<f:param name="topicId" value="#{topicInfo.topic.id}" />
 
-			</h:commandLink>
+				</h:commandLink>
 
-			<h:commandLink
-				value="Vote"
-				action="#{ballotHall.voteAction}"
-				rendered="#{topicInfo.topic.started}">
+				<h:commandLink
+					value="Vote"
+					action="#{ballotHall.voteAction}"
+					rendered="#{topicInfo.topic.started}">
 
-				<f:param name="topicId" value="#{topicInfo.topic.id}" />
+					<f:param name="topicId" value="#{topicInfo.topic.id}" />
 
-			</h:commandLink>
+				</h:commandLink>
+
+				<h:commandLink
+					value="Vote details"
+					action="#{ballotHall.topicVotesAction}"
+					rendered="#{topicInfo.topic.started}">
+
+					<f:param name="topicId" value="#{topicInfo.topic.id}" />
+
+				</h:commandLink>
+			</h:panelGrid>
 		</h:column>
 
 	</t:dataTable>

Copied: myfaces/fusion/trunk/examples/src/main/webapp/ballot/TopicVotes.jsp (from r514225, myfaces/fusion/trunk/examples/src/main/webapp/ballot/VoteTopic.jsp)
URL: http://svn.apache.org/viewvc/myfaces/fusion/trunk/examples/src/main/webapp/ballot/TopicVotes.jsp?view=diff&rev=514369&p1=myfaces/fusion/trunk/examples/src/main/webapp/ballot/VoteTopic.jsp&r1=514225&p2=myfaces/fusion/trunk/examples/src/main/webapp/ballot/TopicVotes.jsp&r2=514369
==============================================================================
--- myfaces/fusion/trunk/examples/src/main/webapp/ballot/VoteTopic.jsp (original)
+++ myfaces/fusion/trunk/examples/src/main/webapp/ballot/TopicVotes.jsp Sun Mar  4 00:20:42 2007
@@ -33,23 +33,13 @@
 		</t:htmlTag>
 
 		<s:subForm>
-			<h:commandLink action="ballotHall" value="Back to Hall" />
+			<h:commandLink action="ballotHall" value="Back to Hall"/>
 		</s:subForm>
 
 		<h:panelGrid
 			columns="1"
 			width="100%">
 
-			<f:facet name="footer">
-				<h:panelGrid columns="2">
-
-					<h:commandButton
-						value="Save"
-						action="#{ballotVoteTopic.saveAction}"/>
-
-				</h:panelGrid>
-			</f:facet>
-
 			<h:panelGrid
 				columns="2"
 				rowClasses="TR1, TR2"
@@ -63,25 +53,55 @@
 					value="Name"/>
 
 				<h:outputText
-					value="#{ballotVoteTopic.topic.name}"/>
+					value="#{ballotTopicVotes.topic.name}"/>
 
 				<h:outputText
 					value="Description"/>
 				<h:outputText
-					value="#{ballotVoteTopic.topic.description}"/>
+					value="#{ballotTopicVotes.topic.description}"/>
 
 				<h:outputText
 					value="Info"/>
 				<h:outputText
-					value="You have to cast '#{ballotVoteTopic.topic.maxVoteCount}' not 0 votes"/>
+					value="Every voter had to cast '#{ballotTopicVotes.topic.maxVoteCount}' not 0 votes"/>
+
+			</h:panelGrid>
+
+			<h:panelGrid
+				columns="2"
+				width="40%"
+				rowClasses="TR1,TR2">
+
+				<f:facet name="header">
+					<h:outputText value="Select Voter" />
+				</f:facet>
+
+				<f:facet name="footer">
+					<h:commandButton
+						id="voterSelect"
+						action="#{ballotTopicVotes.selectVoterAction}"
+						value="Select Voter"/>
+				</f:facet>
+
+				<h:outputLabel
+					for="voter"
+					value="Voter" />
+				<h:selectOneMenu
+					id="voter"
+					value="#{ballotTopicVotes.selectedVoterId}">
+					<f:selectItems value="#{ballotTopicVotes.voters}"/>
+
+					<s:submitOnEvent
+						for="voterSelect"
+						event="change"/>
+				</h:selectOneMenu>
 
 			</h:panelGrid>
 
 			<t:dataTable
-				binding="#{ballotVoteTopicCmp.itemInfoTable}"
 				styleClass="inputTable"
 				var="itemInfo"
-				value="#{ballotVoteTopic.items}"
+				value="#{ballotTopicVotes.items}"
 				rowClasses="TR1,TR2"
 				columnClasses="nowrap,nowrap"
 				width="40%">
@@ -109,11 +129,7 @@
 						<h:outputText value="Vote"/>
 					</f:facet>
 
-					<h:selectOneRadio
-						value="#{itemInfo.vote.choice}"
-						valueChangeListener="#{ballotVoteTopic.voteChanged}">
-						<f:selectItems value="#{ballotVoteTopic.choices}" />
-					</h:selectOneRadio>
+					<h:outputText value="#{itemInfo.voteChoice}"/>
 
 				</h:column>