/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/site-manage/trunk/site-association-tool/tool/src/java/org/sakaiproject/siteassociation/tool/helper/siteAssoc/SiteAssociationBean.java $
* $Id: SiteAssociationBean.java 71049 2010-01-08 15:54:13Z savithap@umich.edu $
***********************************************************************************
*
* Copyright (c) 2006, 2007 The Sakai Foundation.
*
* Licensed under the Educational Community License, Version 1.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/ecl1.php
*
* 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.siteassociation.tool.helper.siteAssoc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.site.api.SiteService.SelectionType;
import org.sakaiproject.siteassociation.tool.common.BaseBean;
import org.sakaiproject.siteassociation.tool.util.Pager;
import org.sakaiproject.siteassociation.tool.util.Sort;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.user.cover.UserDirectoryService;
public class SiteAssociationBean extends BaseBean {
// Sort strings
static final String ID = "id", TITLE = "title";
private static final Log logger = LogFactory
.getLog(SiteAssociationBean.class);
// Pager sitesPager; See GM-47
private List<Site> searchSites = new ArrayList<Site>();
private List<Site> assocSites;
private List<Site> searchSitesCompleteCopy = new ArrayList<Site>();
Sort sitesSort, confirmSort, assocSitesSort, searchSitesSort;
List<DecoratedSite> confirmSites;
private String searchSiteParam = "", prevSearchParam ="";
private Pager searchSitesPager, assocSitesPager;
private int searchSiteListSize = -1;
private int assocSiteListSize = -1;
private ToolConfiguration tool;
public SiteAssociationBean() {
super();
}
public String cancelChanges() {
cleanup();
return CANCEL;
}
/*
* public Pager getSitesPager() { if (sitesPager == null) sitesPager = new
* Pager(Integer.valueOf(getSites().size()), Integer.valueOf(0),
* Integer.valueOf(20)); return sitesPager; }
*/
protected void cleanup() {
searchSites = null;
assocSites = null;
searchSitesPager = null;
searchSitesCompleteCopy = null;
assocSitesPager = null;
searchSiteParam = prevSearchParam = "";
// sitesPager = null;
sitesSort = confirmSort = assocSitesSort = searchSitesSort = null;
}
public List<DecoratedSite> getConfirmSites() {
// Refresh this every time since we don't know what
// has changed since a confirm cancel
confirmSites = new ArrayList<DecoratedSite>();
List<Site> current = getSavedAssocSites();
for(Site s : assocSites){
DecoratedSite ds = new DecoratedSite(s, true);
ds.setModified(true);
confirmSites.add(ds);
}
for (Site s : current) {
boolean exists = false;
for(int i = confirmSites.size() - 1; i >= 0; i--){
DecoratedSite dsite = confirmSites.get(i);
if(dsite.getSite().getId().compareTo(s.getId()) == 0){
exists = true;
confirmSites.remove(i);
}
}
if(!exists){
DecoratedSite ds = new DecoratedSite(s, false);
ds.setModified(true);
confirmSites.add(ds);
}
}
sortDecoratedSites(confirmSites, getConfirmSort());
return confirmSites;
}
public Sort getConfirmSort() {
if (confirmSort == null) {
confirmSort = new Sort("", true);
}
return confirmSort;
}
public boolean getShowUnassociateWarning() {
for (DecoratedSite dSite : getConfirmSites()) {
if (dSite.isModified() && !dSite.isAssociated()) {
return true;
}
}
return false;
}
public Site getSite() {
Site site = null;
try {
site = getSiteService().getSite(getContext());
} catch (IdUnusedException iue) {
logger.error(iue.getMessage(), iue);
}
return site;
}
public List<Site> getSavedAssocSites(){
ArrayList<Site> l = new ArrayList<Site>();
for (String fromContext : getSiteAssocManager().getAssociatedTo(
getContext())) {
try {
Site site = getSiteService().getSite(fromContext);
l.add(site);
} catch (IdUnusedException iue) {
logger.error(iue.getMessage(), iue);
}
}
return l;
}
public List<Site> getAssocSites(){
if(assocSites == null){
searchSites = getSearchResults(SiteService.SelectionType.ACCESS, searchSiteParam);
assocSites = getSavedAssocSites();
//save a copy of the complete search list for when a user removes an already
//associated list, that you will be able to decide if that removed site should
//pop back into the searchList
searchSitesCompleteCopy = new ArrayList<Site>();
for(int i = 0; i < searchSites.size(); i++){
searchSitesCompleteCopy.add(searchSites.get(i));
}
//remove any sites that are already associated:
for(int i = 0; i < assocSites.size(); i++){
searchSites.remove(assocSites.get(i));
}
resetSearchSitesPager();
}
sortSites(assocSites, getAssocSitesSort());
return assocSites;
}
public List<Site> getSearchSites(){
sortSites(searchSites, getSearchSitesSort());
return searchSites;
}
public String getSearchSiteParam() {
return searchSiteParam;
}
public void setSearchSiteParam(String searchSiteParam) {
this.searchSiteParam = searchSiteParam;
}
public Sort getSitesSort() {
if (sitesSort == null) {
sitesSort = new Sort("", true);
}
return sitesSort;
}
public Sort getAssocSitesSort() {
if (assocSitesSort == null) {
assocSitesSort = new Sort("", true);
}
return assocSitesSort;
}
public Sort getSearchSitesSort() {
if (searchSitesSort == null) {
searchSitesSort = new Sort("", true);
}
return searchSitesSort;
}
public String saveChanges() {
List<Site> current = getSavedAssocSites();
if(current.size() != assocSites.size()){
return SAVE;
}else{
for (Site s : current) {
boolean exists = false;
for(Site assoc : assocSites){
if(assoc.getId().compareTo(s.getId()) == 0){
exists = true;
}
}
if(!exists){
return SAVE;
}
}
}
return cancelChanges();
}
public String resetChanges() {
cleanup();
return null;
}
public void sortSites(List<Site> list, final Sort sort) {
Collections.sort(list, new Comparator<Site>() {
public int compare(Site o1, Site o2) {
Site s1 = null;
Site s2 = null;
if (sort.isAscending()) {
s1 = o1;
s2 = o2;
} else {
s2 = o1;
s1 = o2;
}
if (sort.getSort().equalsIgnoreCase(TITLE)) {
return s1.getTitle().compareToIgnoreCase(
s2.getTitle());
} else if (sort.getSort().equalsIgnoreCase(ID)) {
return s1.getId().compareToIgnoreCase(
s2.getId());
} else {
return s1.getTitle().compareToIgnoreCase(
s2.getTitle());
}
}
});
}
public void sortDecoratedSites(List<DecoratedSite> list, final Sort sort) {
Collections.sort(list, new Comparator<DecoratedSite>() {
public int compare(DecoratedSite o1, DecoratedSite o2) {
DecoratedSite s1 = null;
DecoratedSite s2 = null;
if (sort.isAscending()) {
s1 = o1;
s2 = o2;
} else {
s2 = o1;
s1 = o2;
}
if (sort.getSort().equalsIgnoreCase(TITLE)) {
return s1.getSite().getTitle().compareToIgnoreCase(
s2.getSite().getTitle());
} else if (sort.getSort().equalsIgnoreCase(ID)) {
return s1.getSite().getId().compareToIgnoreCase(
s2.getSite().getId());
} else {
return s1.getSite().getTitle().compareToIgnoreCase(
s2.getSite().getTitle());
}
}
});
}
public String updateSites() {
for (DecoratedSite dSite : confirmSites) {
if (dSite.isAssociated()) {
getSiteAssocManager().addAssociation(dSite.getSite().getId(),
getContext());
} else {
getSiteAssocManager().removeAssociation(dSite.getSite().getId(),
getContext());
}
}
cleanup();
return SAVE;
}
public class DecoratedSite {
Site site;
boolean original;
boolean associated;
boolean modified;
public DecoratedSite(Site site, boolean associated) {
this.site = site;
original = this.associated = associated;
}
public Site getSite() {
return site;
}
public boolean isAssociated() {
return associated;
}
public boolean isModified() {
return modified;
}
public void setModified(boolean modified){
this.modified = modified;
}
public void setAssociated(boolean associated) {
this.associated = associated;
}
}
public String getPrevSearchParam() {
return prevSearchParam;
}
public void setPrevSearchParam(String prevSearchParam) {
this.prevSearchParam = prevSearchParam;
}
public List<Site> getSearchResults(SelectionType type, String criteria){
List<Site> searchResults = getSiteService().getSites(type, null, criteria,
null, SiteService.SortType.TITLE_ASC, null);
boolean found = false;
for (Site site : searchResults) {
if(site.getId().compareTo(criteria) == 0){
found = true;
break;
}
}
if(!found){
//look up site by ID
try {
Site s = getSiteService().getSite(criteria);
if(SiteService.SelectionType.ACCESS.equals(type) && s.isAllowed(UserDirectoryService.getCurrentUser().getId(), "site.visit")
|| SiteService.SelectionType.ANY.equals(type)){
searchResults.add(s);
}
} catch (IdUnusedException e) {
//site doesn't exists, so don't worry
}
}
return searchResults;
}
public void searchForSites(){
if(isInstitutionSite()){
searchSites = getSearchResults(SiteService.SelectionType.ANY, searchSiteParam);
}else{
searchSites = getSearchResults(SiteService.SelectionType.ACCESS, searchSiteParam);
}
//save a copy of the complete search list for when a user removes an already
//associated list, that you will be able to decide if that removed site should
//pop back into the searchList
searchSitesCompleteCopy = new ArrayList<Site>();
for(int i = 0; i < searchSites.size(); i++){
searchSitesCompleteCopy.add(searchSites.get(i));
}
//remove any sites that are already associated:
for(int i = 0; i < assocSites.size(); i++){
searchSites.remove(assocSites.get(i));
}
resetSearchSitesPager();
searchSitesPager = null;
prevSearchParam = searchSiteParam;
searchSiteParam = "";
}
public Pager getSearchSitesPager() {
if (searchSitesPager == null) {
searchSitesPager = new Pager(Integer.valueOf(searchSites == null? 0 : searchSites.size()), Integer
.valueOf(0), Integer.valueOf(5));
}
return searchSitesPager;
}
public Pager getAssocSitesPager() {
if (assocSitesPager == null) {
assocSitesPager = new Pager(Integer.valueOf(assocSites == null? 0 : assocSites.size()), Integer
.valueOf(0), Integer.valueOf(5));
}
return assocSitesPager;
}
public int getSearchSiteListSize(){
return searchSiteListSize = (searchSites == null) ? -1 : searchSites.size();
}
public int getAssocSiteListSize(){
if(assocSites == null){
getAssocSites();
}
return assocSiteListSize = (assocSites == null) ? -1 : assocSites.size();
}
public String addSiteToAssocList(){
String siteId = (String) getSessionManager().getCurrentToolSession()
.getAttribute("addSiteId");
boolean exists = false;
for(Site s : assocSites){
if(s.getId().compareTo(siteId) == 0 ){
exists = true;
}
}
if(!exists){
Site s;
try {
s = getSiteService().getSite(siteId);
if(assocSites == null){
assocSites = new ArrayList<Site>();
assocSites.add(s);
}else{
assocSites.add(s);
//set the assoc site pager to the way the user had it
resetAssocSitesPager();
}
//remove this from the results list
searchSites.remove(s);
resetSearchSitesPager();
} catch (IdUnusedException e) {
}
}
sortSites(assocSites, getAssocSitesSort());
return null;
}
public String removeSiteFromAssocList(){
String siteId = (String) getSessionManager().getCurrentToolSession()
.getAttribute("removeSiteId");
int removeIndex = -1;
for(int i = 0; i < assocSites.size(); i++){
if(assocSites.get(i).getId().compareTo(siteId) == 0 ){
removeIndex = i;
}
}
if(removeIndex != -1){
Site removedS = assocSites.get(removeIndex);
assocSites.remove(removeIndex);
//add the removed assoc site to the search site if it is
//in the searchSitesCompleteCopy list
if(searchSitesCompleteCopy.contains(removedS)){
searchSites.add(removedS);
resetSearchSitesPager();
}
//set the assoc site pager to the way the user had it
resetAssocSitesPager();
}
return null;
}
public void addAllSites(){
int first, results;
if(searchSitesPager != null){
first = searchSitesPager.getFirstItem();
results = searchSitesPager.getPageSize();
//show all case
if(results == 0){
results = searchSites.size();
}
}else{
first = 0;
results = searchSites.size();
}
// for (Iterator iterator = searchSites.iterator(); iterator.hasNext();) {
//}
int startI = (first + results > searchSites.size()) ? searchSites.size() - 1 : first + results - 1;
for(int i = startI; i >= first; i--){
Site site = searchSites.get(i);
//assoc list:
int exists = -1;
for(int j = 0; j < assocSites.size(); j++){
Site s = assocSites.get(j);
if(s.getId().compareTo(site.getId()) == 0){
exists = j;
}
}
if(exists == -1){
assocSites.add(site);
//remove this from the results list
searchSites.remove(site);
resetSearchSitesPager();
}
}
resetAssocSitesPager();
}
public void removeAllSites(){
int first, results;
if(assocSitesPager != null){
first = assocSitesPager.getFirstItem();
results = assocSitesPager.getPageSize();
//show all case
if(results == 0){
results = assocSites.size();
}
}else{
first = 0;
results = assocSites.size();
}
int i = (first + results > assocSites.size()) ? assocSites.size() - 1 : first + results - 1;
for(int j = i; j >= first; j--){
Site removedS = assocSites.get(j);
assocSites.remove(j);
if(searchSitesCompleteCopy.contains(removedS)){
searchSites.add(removedS);
}
}
resetSearchSitesPager();
//reset assoc pager:
resetAssocSitesPager();
}
public void resetAssocSitesPager(){
if(assocSitesPager != null){
if(assocSites.size() > 5){
int firstItem = assocSitesPager.getFirstItem();
int pageSize = assocSitesPager.getPageSize();
if(firstItem >= assocSites.size()){
firstItem--;
}
assocSitesPager = null;
getAssocSitesPager().setFirstItem(firstItem);
getAssocSitesPager().setPageSize(pageSize);
}else{
assocSitesPager = null;
}
}
}
public void resetSearchSitesPager(){
if(searchSitesPager != null){
if(searchSites.size() > 5){
int firstItem = searchSitesPager.getFirstItem();
int pageSize = searchSitesPager.getPageSize();
if(firstItem >= searchSites.size()){
firstItem--;
}
searchSitesPager = null;
getSearchSitesPager().setFirstItem(firstItem);
getSearchSitesPager().setPageSize(pageSize);
}else{
searchSitesPager = null;
}
}
}
public boolean isInstitutionSite(){
if(tool == null){
tool = getSiteAssocManager().getSite(getContext()).getTool(ToolManager.getCurrentPlacement().getId());
}
return Boolean.parseBoolean((String)tool.getConfig().getProperty("institutionSite"));
}
}