/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.poll.model;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Stack;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.entity.api.Entity;
import org.sakaiproject.entity.api.ResourceProperties;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.text.DateFormat;
import java.text.ParseException;
public class Poll implements Entity {
private static final long serialVersionUID = 2L;
private Long id;
private String owner;
private String siteId;
private Date creationDate;
private String pollText;
private String description;
private int minOptions = 1;
private int maxOptions = 1;
private Date voteOpen;
private Date voteClose;
private List<Option> options;
private List<Vote> votes;
private String displayResult = "open";
private boolean limitVoting = true;
private boolean currentUserVoted = false;
private List<Vote> currentUserVotes = null;
private String entityID;
private boolean isPublic = false;
public Poll() {
//set the defaults
this.pollText = "";
this.description = "";
this.minOptions = 1;
this.maxOptions = 1;
this.limitVoting = true;
this.isPublic = false;
this.voteOpen = new Date();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 7);
this.voteClose = cal.getTime();
this.displayResult = "open";
this.options = new ArrayList<Option>();
this.votes = new ArrayList<Vote>();
}
/**
* Get the id of the poll
* @return the polls ID
*/
public Long getPollId() {
return id;
}
public void setPollId(Long id) {
this.id = id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getSiteId() {
return siteId;
}
public void setSiteId(String siteId) {
this.siteId = siteId;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public String getText() {
return pollText;
}
public void setText(String poll) {
this.pollText = poll;
}
public void setMinOptions(int value) {
this.minOptions = value;
}
/**
* Get the minimum number of options that must be selected to vote
* @return
*/
public int getMinOptions() {
return this.minOptions;
}
public void setMaxOptions(int value) {
this.maxOptions = value;
}
public int getMaxOptions() {
return this.maxOptions;
}
public void setVoteOpen(Date value) {
this.voteOpen = value;
}
public Date getVoteOpen() {
return this.voteOpen;
}
public void setVoteClose(Date value) {
this.voteClose = value;
}
public Date getVoteClose() {
return this.voteClose;
}
public String getPollText() {
return pollText;
}
public void setPollText(String pollText) {
this.pollText = pollText;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isCurrentUserVoted() {
return currentUserVoted;
}
public void setCurrentUserVoted(boolean currentUserVoted) {
this.currentUserVoted = currentUserVoted;
}
public List<Vote> getCurrentUserVotes() {
if (currentUserVotes == null) {
return new ArrayList<Vote>();
}
return currentUserVotes;
}
public void setCurrentUserVotes(List<Vote> currentUserVotes) {
this.currentUserVotes = currentUserVotes;
}
/**
* Set when to display the results
*
* @param display
* String which can be:
* open - can be viewd at any time
* never - not diplayed
* afterVoting - after user has voted
* afterClosing - once the vote has closed
*/
public void setDisplayResult(String value) {
this.displayResult = value;
}
public String getDisplayResult() {
return this.displayResult;
}
/**
* Options and operators for votes and options
*/
/**
* Set the votes list for this poll
* @param votes
*/
public void setVotes(List<Vote> value) {
this.votes = value;
}
public List<Vote> getVotes() {
return this.votes;
}
/**
* Attach a vote to the list of votes for this poll
* @param vote
*/
public void addVote(Vote vote) {
votes.add(vote);
}
public void setOptions(List<Option> value) {
this.options = value;
}
public List<Option> getPollOptions(){
return this.options;
}
public void addOption(Option option) {
this.options.add(option);
}
public void setLimitVoting(boolean value){
this.limitVoting = value;
}
public boolean getLimitVoting(){
return this.limitVoting;
}
public void setDetails(String value){
this.description = value;
}
public String getDetails(){
return this.description;
}
/*
* Basic comparison functions for objects
* Uses commons-lang to make it so we can be sure about comparisons as long
* as the data in the object is the same
*/
public String toString() {
return new ToStringBuilder(this)
.append(this.id)
.append(this.owner)
.append(this.siteId)
.append(this.creationDate)
.append(this.pollText)
.toString();
}
/*
* Entity Methods
*/
public String getUrl() {
return ServerConfigurationService.getAccessUrl() + "/poll/" + this.getId();
}
public String getReference() {
return ServerConfigurationService.getAccessUrl() + "/poll/" + Entity.SEPARATOR + this.getId();
}
public String getUrl(String arg0) {
return getUrl();
}
public String getReference(String arg0) {
return getReference();
}
public String getId() {
if (entityID == null) {
entityID = id + "";
}
return entityID;
}
public void setId(String s) {
entityID = s;
}
public boolean getIsPublic() {
return isPublic;
}
public void setIsPublic(boolean isPublic) {
this.isPublic = isPublic;
}
public ResourceProperties getProperties() {
// TODO Auto-generated method stub
return null;
}
/* Constants used for conversion to and from XML */
private static final String ID = "id";
private static final String POLL_ID = "pollid";
private static final String POLL_TEXT = "title";
private static final String DESCRIPTION = "description";
private static final String VOTE_OPEN = "open-time";
private static final String VOTE_CLOSE = "close-time";
private static final String LIMIT_VOTING = "limit-voting";
private static final String MIN_OPTIONS = "min-options";
private static final String MAX_OPTIONS = "max-options";
private static DateFormat getDateFormatForXML() {
return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
}
public Element toXml(Document doc, Stack stack) {
Element poll = doc.createElement("poll");
if (stack.isEmpty())
{
doc.appendChild(poll);
}
else
{
((Element) stack.peek()).appendChild(poll);
}
stack.push(poll);
poll.setAttribute(ID, getId());
poll.setAttribute(POLL_ID, getPollId().toString());
poll.setAttribute(POLL_TEXT, getText());
poll.setAttribute(MIN_OPTIONS, (new Integer(getMinOptions()).toString()));
poll.setAttribute(MAX_OPTIONS, (new Integer(getMaxOptions()).toString()));
if (description != null) poll.setAttribute(DESCRIPTION, description);
DateFormat dformat = getDateFormatForXML();
poll.setAttribute(VOTE_OPEN, dformat.format(this.voteOpen));
poll.setAttribute(VOTE_CLOSE, dformat.format(this.voteClose));
poll.setAttribute(LIMIT_VOTING, Boolean.valueOf(limitVoting).toString());
// properties
//getProperties().toXml(doc, stack);
//apppend the options as chidren
stack.pop();
return poll;
}
public static Poll fromXML(Element element) {
Poll poll = new Poll();
poll.setId(element.getAttribute(ID));
poll.setText(element.getAttribute(POLL_TEXT));
poll.setDescription(element.getAttribute(DESCRIPTION));
DateFormat dformat = getDateFormatForXML();
if (!"".equals(element.getAttribute(VOTE_OPEN))) {
try {
poll.setVoteOpen(dformat.parse(element.getAttribute(VOTE_OPEN)));
} catch (ParseException e) {
//should log this
}
}
if (!"".equals(element.getAttribute(VOTE_CLOSE))) {
try {
poll.setVoteOpen(dformat.parse(element.getAttribute(VOTE_CLOSE)));
} catch (ParseException e) {
//should log this
}
}
if (!"".equals(element.getAttribute(MIN_OPTIONS))) {
try {
poll.setMinOptions(Integer.parseInt(element.getAttribute(MIN_OPTIONS)));
} catch (NumberFormatException e) {
//should log this
}
}
if (!"".equals(element.getAttribute(MAX_OPTIONS))) {
try {
poll.setMaxOptions(Integer.parseInt(element.getAttribute(MAX_OPTIONS)));
} catch (NumberFormatException e) {
//should log this
}
}
poll.setLimitVoting(Boolean.parseBoolean(element.getAttribute(LIMIT_VOTING)));
return poll;
}
}