/**********************************************************************************
* $URL:https://source.sakaiproject.org/svn/osp/trunk/portal/api-impl/src/java/org/theospi/portfolio/portal/impl/PortalManagerImpl.java $
* $Id:PortalManagerImpl.java 9134 2006-05-08 20:28:42Z chmaurer@iupui.edu $
***********************************************************************************
*
* 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.theospi.portfolio.portal.impl;
import org.sakaiproject.authz.api.Role;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.javax.PagingPosition;
import org.sakaiproject.metaobj.shared.mgt.IdManager;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SitePage;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.util.ResourceLoader;
import org.theospi.portfolio.portal.intf.PortalManager;
import org.theospi.portfolio.portal.model.SitePageWrapper;
import org.theospi.portfolio.portal.model.SiteType;
import org.theospi.portfolio.portal.model.ToolCategory;
import org.theospi.portfolio.portal.model.ToolType;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: John Ellis
* Date: Feb 11, 2006
* Time: 8:38:52 AM
* To change this template use File | Settings | File Templates.
*/
public class PortalManagerImpl extends HibernateDaoSupport implements PortalManager {
private UserDirectoryService userDirectoryService;
private SiteService siteService;
private IdManager idManager;
private org.sakaiproject.metaobj.security.AuthorizationFacade sakaiAuthzManager;
private org.theospi.portfolio.security.AuthorizationFacade ospAuthzManager;
private boolean displayToolCategories = true;
private boolean displaySiteTypes = true;
private boolean useDb = false;
private boolean reloadDb = false;
private boolean cleanedDb = false;
private boolean autoDdl = true;
private Map siteTypes;
private static final String TYPE_PREFIX = "org.theospi.portfolio.portal.";
private ResourceLoader rl = new ResourceLoader();
public void init() {
if (isUseDb() && isAutoDdl()) {
Map<String, SiteType> siteTypesTempMap = loadDbSiteTypes();
if (siteTypesTempMap.size() == 0 || isReloadDb()) {
siteTypesTempMap = storeComponentsSiteTypes(siteTypes);
cleanedDb = true;
}
else {
setSiteTypes(new HashMap(siteTypesTempMap));
}
}
}
public Map<String, SiteType> storeComponentsSiteTypes(Map siteTypes) {
Map<String, SiteType> siteTypesTempMap = loadDbSiteTypes();
getHibernateTemplate().deleteAll(siteTypesTempMap.values());
getHibernateTemplate().flush();
Map<String, SiteType> returned = new Hashtable<String, SiteType>();
Collection<SiteType> siteTypesCol = siteTypes.values();
for (Iterator<SiteType> i=siteTypesCol.iterator();i.hasNext();) {
SiteType type = i.next();
storeComponentsSiteType(type);
returned.put(type.getName(), type);
}
setSiteTypes(new HashMap(siteTypesTempMap));
return returned;
}
protected void storeComponentsSiteType(SiteType type) {
List<ToolCategory> toolCategories = type.getToolCategories();
for (Iterator<ToolCategory> i=toolCategories.iterator();i.hasNext();) {
fixComponentsToolCategory(i.next());
}
getHibernateTemplate().save(type);
}
protected void fixComponentsToolCategory(ToolCategory toolCategory) {
for (Iterator<Map.Entry> i=toolCategory.getTools().entrySet().iterator();i.hasNext();) {
Map.Entry entry = i.next();
if (entry.getValue() instanceof String) {
entry.setValue(new ToolType());
}
}
//todo load i18n pages
}
protected Map<String, SiteType> loadDbSiteTypes() {
Map<String, SiteType> returned = new Hashtable<String, SiteType>();
List<SiteType> siteTypesList = getHibernateTemplate().loadAll(SiteType.class);
for (Iterator<SiteType> i=siteTypesList.iterator();i.hasNext();) {
SiteType type = i.next();
returned.put(type.getName(), type);
}
return returned;
}
public User getCurrentUser() {
return getUserDirectoryService().getCurrentUser();
}
public Map getSitesByType() {
return getSitesByType(null);
}
public Map getSitesByType(String siteId) {
Map typeMap = new Hashtable();
boolean addSite = (siteId != null);
if (siteId != null) {
getOspAuthzManager().pushAuthzGroups(siteId);
}
User currentUser = getCurrentUser();
if (currentUser != null && currentUser.getId().length() > 0) {
String mySiteId = addMyWorkspace(typeMap);
if (addSite) {
addSite = !(siteId.equals(mySiteId));
}
}
else {
return createGatewayMap(typeMap, siteId);
}
List types = getSiteService().getSiteTypes();
List allUserSites = getSiteService().getSites(SiteService.SelectionType.ACCESS,
null, null, null, SiteService.SortType.TITLE_ASC, null);
for (Iterator i=types.iterator();i.hasNext();) {
String type = (String) i.next();
SiteType siteType = (SiteType) getSiteTypes().get(type);
if (siteType == null) {
siteType = SiteType.OTHER;
}
if (!siteType.isHidden()) {
List sites = getSiteService().getSites(SiteService.SelectionType.ACCESS, type, null,
null, SiteService.SortType.TITLE_ASC, null);
addSpecialSites(siteType.getSpecialSites(), sites, allUserSites);
if (sites.size() > 0 && siteType.isDisplayTab()) {
if (addSite) {
addSite = !checkSites(siteId, sites);
}
typeMap.put(siteType, sites);
}
}
}
if (addSite) {
// didn't already get the site... let's add it here
Site siteToAdd = getSite(siteId);
SiteType typeToAdd = (SiteType) getSiteTypes().get(siteToAdd.getType());
if (typeToAdd == null) {
typeToAdd = SiteType.OTHER;
}
List sitesToAdd = (List) typeMap.get(typeToAdd);
if (sitesToAdd == null) {
sitesToAdd = new ArrayList();
typeMap.put(typeToAdd, sitesToAdd);
}
sitesToAdd.add(siteToAdd);
}
return typeMap;
}
protected boolean checkSites(String siteId, List sites) {
for (Iterator i=sites.iterator();i.hasNext();) {
Site site = (Site) i.next();
if (site.getId().equals(siteId)) {
return true;
}
}
return false;
}
protected void addSpecialSites(List specialSites, List sites, List allUserSites) {
if (specialSites == null) {
return;
}
for (Iterator i=allUserSites.iterator();i.hasNext();) {
Site site = (Site) i.next();
if (specialSites.contains(site.getId())) {
sites.add(site);
}
}
Collections.sort(sites, new SiteTitleComparator());
}
protected Map createGatewayMap(Map typeMap, String siteId) {
String gatewayId = ServerConfigurationService.getGatewaySiteId();
//If I'm passing a site, I want to override the configured gateway
if (siteId != null) {
gatewayId = siteId;
}
try {
Site gateway = getSiteService().getSite(gatewayId);
List sites = new ArrayList();
sites.add(gateway);
typeMap.put(SiteType.GATEWAY, sites);
return typeMap;
}
catch (IdUnusedException e) {
throw new RuntimeException(e);
}
}
protected String addMyWorkspace(Map typeMap) {
String myWorkspaceId = getSiteService().getUserSiteId(getCurrentUser().getId());
try {
Site myWorkspace = getSiteService().getSite(myWorkspaceId);
List sites = new ArrayList();
sites.add(myWorkspace);
typeMap.put(SiteType.MY_WORKSPACE, sites);
return myWorkspace.getId();
}
catch (IdUnusedException e) {
throw new RuntimeException(e);
}
}
public List getSitesForType(String type, SiteService.SortType sort, PagingPosition page) {
String baseType = extractType(type);
List sites = getSiteService().getSites(SiteService.SelectionType.ACCESS, baseType, null,
null, sort, page);
List allUserSites = getSiteService().getSites(SiteService.SelectionType.ACCESS,
null, null, null, SiteService.SortType.TITLE_ASC, null);
SiteType siteType = (SiteType) getSiteTypes().get(baseType);
addSpecialSites(siteType.getSpecialSites(), sites, allUserSites);
return sites;
}
protected String extractType(String type) {
return type.substring(TYPE_PREFIX.length());
}
public Map getPagesByCategory(String siteId) {
try {
Site site = getSiteService().getSite(siteId);
List pages = site.getPages();
List toolOrder = new ArrayList(ServerConfigurationService.getToolOrder(site.getType()));
SiteType siteType = (SiteType) getSiteTypes().get(site.getType());
if (siteType != null) {
while (siteType.getFirstCategory() > toolOrder.size()) {
toolOrder.add(Integer.valueOf(0));
}
toolOrder.addAll(siteType.getFirstCategory(), siteType.getToolCategories());
}
getOspAuthzManager().pushAuthzGroups(siteId);
getSakaiAuthzManager().pushAuthzGroups(siteId);
Map categories = categorizePages(pages, siteType, toolOrder);
List categoryList = new ArrayList(categories.keySet());
Collections.sort(categoryList);
Map newCategories = new HashMap();
int index = 0;
for (Iterator i=categoryList.iterator();i.hasNext();) {
ToolCategory category = (ToolCategory) i.next();
Object oldValue = categories.get(category);
category.setOrder(index);
index++;
newCategories.put(category, oldValue);
}
return newCategories;
}
catch (IdUnusedException e) {
throw new RuntimeException(e);
}
}
protected Map categorizePages(List pages, SiteType type, List toolOrder) {
Map pageMap = new Hashtable();
int index = 0;
for (Iterator i=pages.iterator();i.hasNext();) {
SitePage page = (SitePage) i.next();
categorizePage(page, pageMap, type, findIndex(page, toolOrder, index));
index++;
}
return pageMap;
}
protected int findIndex(SitePage page, List toolOrder, int defaultValue) {
List tools = page.getTools();
if (tools.size() == 1) {
ToolConfiguration toolConfig = (ToolConfiguration) tools.get(0);
if (toolConfig.getTool() != null) {
String toolId = toolConfig.getTool().getId();
if (toolOrder.contains(toolId)) {
return toolOrder.indexOf(toolId);
}
}
}
return defaultValue;
}
protected void categorizePage(SitePage page, Map pageMap, SiteType siteType, int index) {
ToolCategory[] categories = findCategories(page, siteType, index);
for (int i=0;i<categories.length;i++) {
List pages = (List) pageMap.get(categories[i]);
if (pages == null) {
pages = new ArrayList();
pageMap.put(categories[i], pages);
}
pages.add(new SitePageWrapper(page, index));
}
}
protected ToolCategory[] findCategories(SitePage page, SiteType siteType, int index) {
List tools = page.getTools();
if (tools.size() == 0 || !isDisplayToolCategories()) {
return createUncategorized(index);
}
Placement tool = (Placement) tools.get(0);
boolean foundCategory = false;
List toolCategories = new ArrayList();
if (tool.getTool() != null) {
String toolId = tool.getTool().getId();
if (siteType != null && siteType.getToolCategories() != null) {
for (Iterator i=siteType.getToolCategories().iterator();i.hasNext();){
ToolCategory category = (ToolCategory) i.next();
if (category.getTools().containsKey(toolId)) {
foundCategory = true;
Object key = category.getTools().get(toolId);
if (key instanceof String) {
// no functions or authz to check here...
toolCategories.add(new ToolCategory(category));
}
else if (hasAccess(page, tool, (ToolType)category.getTools().get(toolId))) {
toolCategories.add(new ToolCategory(category));
}
}
}
}
}
if (toolCategories.size() == 0 && !foundCategory) {
return createUncategorized(index);
}
return (ToolCategory[]) toolCategories.toArray(new ToolCategory[toolCategories.size()]);
}
protected boolean hasAccess(SitePage page, Placement tool, ToolType toolType) {
if (toolType.getFunctions() == null || toolType.getFunctions().size() == 0) {
// nothin to check
return true;
}
for (Iterator i=toolType.getFunctions().iterator();i.hasNext();) {
if (toolType.getQualifierType().equals(ToolType.SAKAI_QUALIFIER)) {
if (getSakaiAuthzManager().isAuthorized((String)i.next(), null)) {
return true;
}
}
else {
String qualifier = null;
if (toolType.getQualifierType().equals(ToolType.PLACEMENT_QUALIFIER)) {
qualifier = tool.getId();
}
else if (toolType.getQualifierType().equals(ToolType.SITE_QUALIFIER)) {
qualifier = page.getSiteId();
}
else {
throw new RuntimeException("invalid tool type qualifier");
}
if (getOspAuthzManager().isAuthorized((String)i.next(), getIdManager().getId(qualifier))) {
return true;
}
}
}
return false;
}
protected ToolCategory[] createUncategorized(int index) {
try {
ToolCategory category = (ToolCategory) ToolCategory.UNCATEGORIZED.clone();
category.setOrder(index);
return new ToolCategory[]{category};
}
catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public List getToolsForPage(String pageId) {
SitePage page = getSiteService().findPage(pageId);
return page.getTools();
}
public Site getSite(String siteId) {
try {
return getSiteService().getSite(siteId);
}
catch (IdUnusedException e) {
throw new RuntimeException(e);
}
}
public SitePage getSitePage(String pageId) {
return getSiteService().findPage(pageId);
}
public String getPageCategory(String siteId, String pageId) {
Site site = getSite(siteId);
SitePage page = site.getPage(pageId);
SiteType siteType = (SiteType) getSiteTypes().get(decorateSiteType(site));
ToolCategory[] categories = findCategories(page, siteType, 0);
if (categories.length == 0){
return ToolCategory.UNCATEGORIZED.getKey();
}
return categories[0].getKey();
}
public String decorateSiteType(String siteTypeKey) {
return TYPE_PREFIX + siteTypeKey;
}
public String decorateSiteType(Site site) {
if (getSiteService().isUserSite(site.getId())){
return SiteType.MY_WORKSPACE.getKey();
}
else if (site.getType() != null) {
String siteType = decorateSiteType(site.getType());
return siteType;
}
else {
return findSpecialSiteType(site);
}
}
protected String findSpecialSiteType(Site site) {
for (Iterator i=getSiteTypes().values().iterator();i.hasNext();) {
SiteType type = (SiteType) i.next();
if (type.getSpecialSites() != null && type.getSpecialSites().contains(site.getId())) {
return type.getKey();
}
}
return null;
}
public SiteType getSiteType(String siteTypeKey) {
for (Iterator i=getSiteTypes().values().iterator();i.hasNext();) {
SiteType siteType = (SiteType) i.next();
if (siteType.getKey().equals(siteTypeKey)) {
return siteType;
}
}
return null;
}
public ToolCategory getToolCategory(String siteTypeKey, String toolCategoryKey) {
SiteType siteType = getSiteType(siteTypeKey);
for (Iterator i = siteType.getToolCategories().iterator();i.hasNext();) {
ToolCategory toolCategory = (ToolCategory) i.next();
if (toolCategory.getKey().equals(toolCategoryKey)) {
return toolCategory;
}
}
return null;
}
public boolean isAvailable(String toolId, String siteId) {
Site site = getSite(siteId);
ToolConfiguration tool = site.getToolForCommonId(toolId);
// todo check permissions
return tool != null;
}
public SitePage getPage(String toolId, String siteId) {
Site site = getSite(siteId);
ToolConfiguration tool = site.getToolForCommonId(toolId);
if (tool == null) {
return null;
}
return getSitePage(tool.getPageId());
}
public boolean isUserInRole(String roleId, String siteId) {
Site site = getSite(siteId);
Role role = site.getUserRole(getCurrentUser().getId());
return role.getId().equals(roleId);
}
public List getRoles(String siteId) {
Site site = getSite(siteId);
List roles = new ArrayList();
roles.add(site.getUserRole(getCurrentUser().getId()));
return roles;
}
public UserDirectoryService getUserDirectoryService() {
return userDirectoryService;
}
public void setUserDirectoryService(UserDirectoryService userDirectoryService) {
this.userDirectoryService = userDirectoryService;
}
public SiteService getSiteService() {
return siteService;
}
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
public Map getSiteTypes() {
return siteTypes;
}
public void setSiteTypes(Map siteTypes) {
this.siteTypes = siteTypes;
}
public org.sakaiproject.metaobj.security.AuthorizationFacade getSakaiAuthzManager() {
return sakaiAuthzManager;
}
public void setSakaiAuthzManager(org.sakaiproject.metaobj.security.AuthorizationFacade sakaiAuthzManager) {
this.sakaiAuthzManager = sakaiAuthzManager;
}
public org.theospi.portfolio.security.AuthorizationFacade getOspAuthzManager() {
return ospAuthzManager;
}
public void setOspAuthzManager(org.theospi.portfolio.security.AuthorizationFacade ospAuthzManager) {
this.ospAuthzManager = ospAuthzManager;
}
public boolean isDisplayToolCategories() {
return displayToolCategories;
}
public void setDisplayToolCategories(boolean displayToolCategories) {
this.displayToolCategories = displayToolCategories;
}
public boolean isDisplaySiteTypes() {
return displaySiteTypes;
}
public Collection getCategoriesInNeedOfFiles() {
if (isCleanedDb()) {
return loadPages(getHibernateTemplate().loadAll(ToolCategory.class));
}
else {
return null;
}
}
protected Collection loadPages(List list) {
for (Iterator<ToolCategory> i = list.iterator();i.hasNext();) {
i.next().getPages().size();
}
return list;
}
public void saveToolCategories(Collection toolCategories) {
getHibernateTemplate().saveOrUpdateAll(toolCategories);
}
public void setDisplaySiteTypes(boolean displaySiteTypes) {
this.displaySiteTypes = displaySiteTypes;
}
public IdManager getIdManager() {
return idManager;
}
public void setIdManager(IdManager idManager) {
this.idManager = idManager;
}
public boolean isUseDb() {
return useDb;
}
public byte[] getCategoryPage(String href) {
List categories = (List) getHibernateTemplate().find(" from ToolCategory where type_key=?", href);
if (categories.size() > 0) {
ToolCategory cat = (ToolCategory) categories.get(0);
String localeStr = rl.getLocale().toString();
if (cat.getPages().get(localeStr) != null) {
return (byte[]) cat.getPages().get(localeStr);
}
localeStr = localeStr.replaceFirst("_.*","");
if (cat.getPages().get(localeStr) != null) {
return (byte[]) cat.getPages().get(localeStr);
}
return (byte[]) cat.getPages().get("");
}
return new byte[0];
}
public void setUseDb(boolean useDb) {
this.useDb = useDb;
}
public boolean isReloadDb() {
return reloadDb;
}
public void setReloadDb(boolean reloadDb) {
this.reloadDb = reloadDb;
}
public boolean isCleanedDb() {
return cleanedDb;
}
public void setCleanedDb(boolean cleanedDb) {
this.cleanedDb = cleanedDb;
}
public boolean isAutoDdl() {
return autoDdl;
}
public void setAutoDdl(boolean autoDdl) {
this.autoDdl = autoDdl;
}
}