/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008, 2009 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.tool.producers;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.poll.logic.ExternalLogic;
import org.sakaiproject.poll.logic.PollListManager;
import org.sakaiproject.poll.logic.PollVoteManager;
import org.sakaiproject.poll.model.Poll;
import org.sakaiproject.poll.tool.params.PollViewParameters;
import org.sakaiproject.poll.tool.params.VoteBean;
import uk.org.ponder.localeutil.LocaleGetter;
import uk.org.ponder.messageutil.MessageLocator;
import uk.org.ponder.messageutil.TargettedMessageList;
import uk.org.ponder.rsf.components.UIBranchContainer;
import uk.org.ponder.rsf.components.UICommand;
import uk.org.ponder.rsf.components.UIContainer;
import uk.org.ponder.rsf.components.UIELBinding;
import uk.org.ponder.rsf.components.UIForm;
import uk.org.ponder.rsf.components.UIInternalLink;
import uk.org.ponder.rsf.components.UILink;
import uk.org.ponder.rsf.components.UIMessage;
import uk.org.ponder.rsf.components.UIOutput;
import uk.org.ponder.rsf.components.UISelect;
import uk.org.ponder.rsf.components.UISelectChoice;
import uk.org.ponder.rsf.components.UIVerbatim;
import uk.org.ponder.rsf.components.decorators.DecoratorList;
import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator;
import uk.org.ponder.rsf.components.decorators.UILabelTargetDecorator;
import uk.org.ponder.rsf.components.decorators.UITooltipDecorator;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCase;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCaseReporter;
import uk.org.ponder.rsf.view.ComponentChecker;
import uk.org.ponder.rsf.view.DefaultView;
import uk.org.ponder.rsf.view.ViewComponentProducer;
import uk.org.ponder.rsf.viewstate.SimpleViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParameters;
import uk.org.ponder.stringutil.StringList;
public class PollToolProducer implements ViewComponentProducer,
DefaultView,NavigationCaseReporter {
public static final String VIEW_ID = "votePolls";
private PollListManager pollListManager;
private MessageLocator messageLocator;
private LocaleGetter localegetter;
private PollVoteManager pollVoteManager;
private static final String NAVIGATE_ADD = "actions-add";
private static final String NAVIGATE_PERMISSIONS = "actions-permissions";
private static final String NAVIGATE_VOTE = "poll-vote";
private static final Log LOG = LogFactory.getLog(PollToolProducer.class);
public String getViewID() {
return VIEW_ID;
}
private ExternalLogic externalLogic;
public void setExternalLogic(ExternalLogic externalLogic) {
this.externalLogic = externalLogic;
}
public void setMessageLocator(MessageLocator messageLocator) {
this.messageLocator = messageLocator;
}
public void setPollListManager(PollListManager pollListManager) {
this.pollListManager = pollListManager;
}
public void setLocaleGetter(LocaleGetter localegetter) {
this.localegetter = localegetter;
}
public void setPollVoteManager(PollVoteManager pvm){
this.pollVoteManager = pvm;
}
private VoteBean voteBean;
public void setVoteBean(VoteBean vb){
this.voteBean = vb;
}
private TargettedMessageList tml;
public void setTargettedMessageList(TargettedMessageList tml) {
this.tml = tml;
}
public void fillComponents(UIContainer tofill, ViewParameters viewparams,
ComponentChecker checker) {
voteBean.setPoll(null);
voteBean.voteCollection = null;
UIOutput.make(tofill, "poll-list-title", messageLocator.getMessage("poll_list_title"));
boolean renderDelete = false;
//populate the action links
if (this.isAllowedPollAdd() || this.isSiteOwner() ) {
UIBranchContainer actions = UIBranchContainer.make(tofill,"actions:",Integer.toString(0));
LOG.debug("this user has some admin functions");
if (this.isAllowedPollAdd()) {
LOG.debug("User can add polls");
//UIOutput.make(tofill, "poll-add", messageLocator
// .getMessage("action_add_poll"));
UIInternalLink.make(actions,NAVIGATE_ADD,UIMessage.make("action_add_poll"),
new PollViewParameters(AddPollProducer.VIEW_ID, "New 0"));
}
if (this.isSiteOwner()) {
UIInternalLink.make(actions, NAVIGATE_PERMISSIONS, UIMessage.make("action_set_permissions"),new SimpleViewParameters(PermissionsProducer.VIEW_ID));
}
}
List<Poll> polls = new ArrayList<Poll>();
String siteId = externalLogic.getCurrentLocationId();
if (siteId != null) {
polls = pollListManager.findAllPolls(siteId);
} else {
LOG.warn("Unable to get siteid!");
}
if(polls.isEmpty()){
UIOutput.make(tofill, "no-polls", messageLocator.getMessage("poll_list_empty"));
UIOutput.make(tofill, "add-poll-icon");
if (this.isAllowedPollAdd()) {
UIInternalLink.make(tofill,"add-poll",UIMessage.make("new_poll_title"),
new PollViewParameters(AddPollProducer.VIEW_ID, "New 0"));
}
}
else{
// fix for broken en_ZA locale in JRE http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6488119
Locale M_locale = null;
String langLoc[] = localegetter.get().toString().split("_");
if ( langLoc.length >= 2 ) {
if ("en".equals(langLoc[0]) && "ZA".equals(langLoc[1]))
M_locale = new Locale("en", "GB");
else
M_locale = new Locale(langLoc[0], langLoc[1]);
} else{
M_locale = new Locale(langLoc[0]);
}
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.SHORT, M_locale);
TimeZone tz = externalLogic.getLocalTimeZone();
df.setTimeZone(tz);
//m_log.debug("got timezone: " + tz.getDisplayName());
UIForm deleteForm = UIForm.make(tofill, "delete-poll-form");
// Create a multiple selection control for the tasks to be deleted.
// We will fill in the options at the loop end once we have collected them.
UISelect deleteselect = UISelect.makeMultiple(deleteForm, "delete-poll",
null, "#{pollToolBean.deleteids}", new String[] {});
//get the headers for the table
/*UIMessage.make(deleteForm, "poll-question-title","poll_question_title");
UIMessage.make(deleteForm, "poll-open-title", "poll_open_title");
UIMessage.make(deleteForm, "poll-close-title", "poll_close_title");*/
UIMessage.make(deleteForm, "poll-result-title", "poll_result_title");
UIMessage.make(deleteForm, "poll-remove-title", "poll_remove_title");
UILink question = UILink.make(tofill,"poll-question-title",messageLocator.getMessage("poll_question_title"), "#");
question.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("poll_question_title_tooltip")));
UILink open = UILink.make(tofill,"poll-open-title",messageLocator.getMessage("poll_open_title"), "#");
open.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("poll_open_title_tooltip")));
UILink close = UILink.make(tofill,"poll-close-title",messageLocator.getMessage("poll_close_title"), "#");
close.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("poll_close_title_tooltip")));
StringList deletable = new StringList();
for (int i = 0 ; i < polls.size(); i++) {
Poll poll = (Poll)polls.get(i);
boolean canVote = pollVoteManager.pollIsVotable(poll);
UIBranchContainer pollrow = UIBranchContainer.make(deleteForm,
canVote ? "poll-row:votable"
: "poll-row:nonvotable", poll.getPollId().toString());
LOG.debug("adding poll row for " + poll.getText());
if (canVote) {
UIInternalLink voteLink = UIInternalLink.make(pollrow, NAVIGATE_VOTE, poll.getText(),
new PollViewParameters(PollVoteProducer.VIEW_ID, poll.getPollId().toString()));
//we need to add a decorator for the alt text
voteLink.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("poll_vote_title") +":" + poll.getText()));
} else {
//the poll is lazily loaded so get the options
poll.setOptions(pollListManager.getOptionsForPoll(poll.getPollId()));
//is this not votable because of no options?
if (poll.getPollOptions().size() == 0 )
UIOutput.make(pollrow,"poll-text",poll.getText() + " (" + messageLocator.getMessage("poll_no_options") + ")");
else
UIOutput.make(pollrow,"poll-text",poll.getText());
}
if (pollListManager.isAllowedViewResults(poll, externalLogic.getCurrentUserId())) {
UIInternalLink resultsLink = UIInternalLink.make(pollrow, "poll-results", messageLocator.getMessage("action_view_results"),
new PollViewParameters(ResultsProducer.VIEW_ID, poll.getPollId().toString()));
resultsLink.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("action_view_results")+ ":" + poll.getText()));
}
if (poll.getVoteOpen()!=null)
UIOutput.make(pollrow,"poll-open-date",df.format(poll.getVoteOpen()))
.decorators = new DecoratorList(new UIFreeAttributeDecorator("name", "realDate:"+poll.getVoteOpen().toString()));
else
UIVerbatim.make(pollrow,"poll-open-date"," ");
if (poll.getVoteClose()!=null)
UIOutput.make(pollrow,"poll-close-date",df.format(poll.getVoteClose()))
.decorators = new DecoratorList(new UIFreeAttributeDecorator("name", "realDate:"+poll.getVoteClose().toString()));
else
UIVerbatim.make(pollrow,"poll-close-date"," ");
if (pollCanEdit(poll)) {
UIInternalLink editLink = UIInternalLink.make(pollrow,"poll-revise",messageLocator.getMessage("action_revise_poll"),
new PollViewParameters(AddPollProducer.VIEW_ID,poll.getPollId().toString()));
editLink.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("action_revise_poll")+ ":" + poll.getText()));
}
if (pollCanDelete(poll)) {
deletable.add(poll.getPollId().toString());
UISelectChoice delete = UISelectChoice.make(pollrow, "poll-select", deleteselect.getFullID(), (deletable.size()-1));
delete.decorators = new DecoratorList(new UITooltipDecorator(UIMessage.make("delete_poll_tooltip", new String[] {poll.getText()})));
UIMessage message = UIMessage.make(pollrow,"delete-label","delete_poll_tooltip", new String[] {poll.getText()});
UILabelTargetDecorator.targetLabel(message,delete);
LOG.debug("this poll can be deleted");
renderDelete = true;
}
}
deleteselect.optionlist.setValue(deletable.toStringArray());
deleteForm.parameters.add(new UIELBinding("#{pollToolBean.siteID}", siteId));
if (renderDelete)
UICommand.make(deleteForm, "delete-polls", UIMessage.make("poll_list_delete"),
"#{pollToolBean.processActionDelete}").decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("poll_list_delete_tooltip")));
}
}
private boolean isAllowedPollAdd() {
if (externalLogic.isUserAdmin())
return true;
if (externalLogic.isAllowedInLocation(PollListManager.PERMISSION_ADD, externalLogic.getCurrentLocationReference()))
return true;
return false;
}
private boolean isSiteOwner(){
if (externalLogic.isUserAdmin())
return true;
else if (externalLogic.isAllowedInLocation("site.upd", externalLogic.getCurrentLocationReference()))
return true;
else
return false;
}
public List<NavigationCase> reportNavigationCases() {
List<NavigationCase> togo = new ArrayList<NavigationCase>(); // Always navigate back to this view.
togo.add(new NavigationCase(null, new SimpleViewParameters(VIEW_ID)));
return togo;
}
private boolean pollCanEdit(Poll poll) {
if (externalLogic.isUserAdmin())
return true;
if (externalLogic.isAllowedInLocation(PollListManager.PERMISSION_EDIT_ANY, externalLogic.getCurrentLocationReference()))
return true;
if (externalLogic.isAllowedInLocation(PollListManager.PERMISSION_EDIT_OWN, externalLogic.getCurrentLocationReference())
&& poll.getOwner().equals(externalLogic.getCurrentUserId()))
return true;
return false;
}
private boolean pollCanDelete(Poll poll) {
if (externalLogic.isUserAdmin())
return true;
if (externalLogic.isAllowedInLocation(PollListManager.PERMISSION_DELETE_ANY, externalLogic.getCurrentLocationReference()))
return true;
if (externalLogic.isAllowedInLocation(PollListManager.PERMISSION_DELETE_OWN, externalLogic.getCurrentLocationReference()) && poll.getOwner().equals(externalLogic.getCurrentUserId()))
return true;
return false;
}
}