/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006 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.component.app.messageforums;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.sakaiproject.api.app.messageforums.Rank;
import org.sakaiproject.api.app.messageforums.RankImage;
import org.sakaiproject.api.app.messageforums.RankManager;
import org.sakaiproject.component.app.messageforums.dao.hibernate.RankImageImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.RankImpl;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.event.api.EventTrackingService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.InUseException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.id.api.IdManager;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.user.api.UserDirectoryService;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.user.api.User;
import org.sakaiproject.util.Validator;
public class RankManagerImpl extends HibernateDaoSupport implements RankManager {
private static final Log LOG = LogFactory.getLog(RankManagerImpl.class);
private static final String QUERY_BY_CONTEXT_ID_USERID = "findRanksByContextIdUserID";
private static final String QUERY_BY_CONTEXT_ID_NUM_POSTS_BASED = "findRanksByContextIdBasedOnNumPost";
private static final String QUERY_BY_CONTEXT_ID = "findRanksByContextId";
private static final String QUERY_BY_CONTEXT_ID_ORDER_BY_MIN_POST_DESC = "findRanksByContextIdOrderByMinPostDesc";
private static final String QUERY_BY_RANK_ID = "findRankByRankId";
private IdManager idManager;
private SessionManager sessionManager;
protected UserDirectoryService userDirectoryService;
private EventTrackingService eventTrackingService;
private ContentHostingService contentHostingService;
public void init() {
LOG.info("init()");
}
public EventTrackingService getEventTrackingService() {
return eventTrackingService;
}
public void setEventTrackingService(EventTrackingService eventTrackingService) {
this.eventTrackingService = eventTrackingService;
}
public void setContentHostingService(ContentHostingService contentHostingService) {
this.contentHostingService = contentHostingService;
}
public void setUserDirectoryService(UserDirectoryService userDirectoryService) {
this.userDirectoryService = userDirectoryService;
}
private String getContextId() {
if (TestUtil.isRunningTests()) {
return "test-context";
}
Placement placement = ToolManager.getCurrentPlacement();
String presentSiteId = placement.getContext();
return presentSiteId;
}
public void saveRank(Rank rank) {
rank.setUuid(getNextUuid());
rank.setCreated(new Date());
rank.setCreatedBy(getCurrentUser());
rank.setModified(new Date());
rank.setModifiedBy(getCurrentUser());
rank.setContextId(getContextId());
getHibernateTemplate().saveOrUpdate(rank);
if (LOG.isDebugEnabled()) LOG.debug("saveRank executed for rank = " + rank.getTitle() + " contextid = " + rank.getContextId());
}
public List getRankList(final String contextId) {
if (LOG.isDebugEnabled()) {
LOG.debug("getRank(contextId: " + contextId + ")");
}
if (contextId == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.getNamedQuery(QUERY_BY_CONTEXT_ID);
q.setParameter("contextId", contextId, Hibernate.STRING);
return q.list();
}
};
List ranklist = (List) getHibernateTemplate().execute(hcb);
return ranklist;
}
public List findRanksByContextIdOrderByMinPostDesc(final String contextId) {
if (LOG.isDebugEnabled()) {
LOG.debug("getRank(contextId: " + contextId + ")");
}
if (contextId == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.getNamedQuery(QUERY_BY_CONTEXT_ID_ORDER_BY_MIN_POST_DESC);
q.setParameter("contextId", contextId, Hibernate.STRING);
return q.list();
}
};
List ranklist = (List) getHibernateTemplate().execute(hcb);
return ranklist;
}
private String getCurrentUser() {
if (TestUtil.isRunningTests()) {
return "test-user";
}
return sessionManager.getCurrentSessionUserId();
}
private String getNextUuid() {
return idManager.createUuid();
}
public void setSessionManager(SessionManager sessionManager) {
this.sessionManager = sessionManager;
}
public void setIdManager(IdManager idManager) {
this.idManager = idManager;
}
public IdManager getIdManager() {
return idManager;
}
public SessionManager getSessionManager() {
return sessionManager;
}
public RankImage createRankImage() {
RankImage image = new RankImageImpl();
image.setUuid(getNextUuid());
image.setCreated(new Date());
image.setCreatedBy(getCurrentUser());
image.setModified(new Date());
image.setModifiedBy(getCurrentUser());
LOG.info("createRankImage: Rank Image " + image.getUuid() + " created successfully");
return image;
}
public void removeRank(Rank rank) {
LOG.info("removeRank(Rank rank)");
if (rank.getRankImage() != null) {
removeImageAttachmentObject(rank.getRankImage());
}
getHibernateTemplate().delete(rank);
}
public void removeImageAttachmentObject(RankImage o) {
LOG.info("removeImageAttachmentObject(RankImage o)");
getHibernateTemplate().delete(o);
}
public void removeImageAttachToRank(final Rank rank, final RankImage imageAttach) {
LOG.info("removeImageAttachToRank(final Rank rank, final RankImage imageAttach)");
if (rank == null || imageAttach == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Rank returnedData = (Rank) session.get(RankImpl.class, rank.getId());
RankImage returnedAttach = (RankImage) session.get(RankImageImpl.class, Long.valueOf(imageAttach.getId()));
if (returnedData != null) {
returnedData.setRankImage(null);
session.saveOrUpdate(returnedData);
if (returnedAttach.getAttachmentId().toLowerCase().startsWith("/attachment"))
try {
contentHostingService.removeResource(returnedAttach.getAttachmentId());
// returnedAttach.setSyllabus(null);
// session.saveOrUpdate(returnedAttach);
session.delete(returnedAttach);
} catch (PermissionException e) {
e.printStackTrace();
} catch (IdUnusedException e) {
e.printStackTrace();
} catch (TypeException e) {
e.printStackTrace();
} catch (InUseException e) {
e.printStackTrace();
}
}
return null;
}
};
getHibernateTemplate().execute(hcb);
}
public Rank getRankById(final Long rankId) {
if (LOG.isDebugEnabled()) {
LOG.debug("getRankById: " + rankId + ")");
}
if (rankId == null) {
throw new IllegalArgumentException("getRankById(): rankId is null");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.getNamedQuery(QUERY_BY_RANK_ID);
q.setParameter("rankId", rankId, Hibernate.LONG);
return q.uniqueResult();
}
};
Rank rank = (Rank) getHibernateTemplate().execute(hcb);
return rank;
}
public RankImage createRankImageAttachmentObject(String attachId, String name) {
try {
RankImage attach = new RankImageImpl();
attach.setCreated(new Date());
attach.setModified(new Date());
ContentResource cr = contentHostingService.getResource(attachId);
User creator = userDirectoryService.getUser(cr.getProperties().getProperty(cr.getProperties().getNamePropCreator()));
attach.setCreatedBy(creator.getDisplayName());
User modifier = userDirectoryService.getUser(cr.getProperties().getProperty(cr.getProperties().getNamePropModifiedBy()));
attach.setModifiedBy(modifier.getDisplayName());
attach.setAttachmentSize((Long.valueOf(cr.getContentLength())).toString());
attach.setAttachmentId(attachId);
attach.setAttachmentName(name);
attach.setAttachmentType(cr.getContentType());
String tempString = cr.getUrl();
attach.setAttachmentUrl(resourceUrlEscaping(tempString));
getHibernateTemplate().saveOrUpdate(attach);
return attach;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void addImageAttachToRank(final Rank rank, final RankImage imageAttach) {
if (rank == null || imageAttach == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Rank returnedData = (Rank) session.get(RankImpl.class, rank.getId());
if (returnedData != null) {
imageAttach.setRank(rank);
returnedData.setRankImage(imageAttach);
session.save(returnedData);
}
return null;
}
};
getHibernateTemplate().execute(hcb);
}
/**
* Apparently, the ContentResource object gives a url, but it doesn't escape any special characters. So, need to do some
* escaping just for the name portion of the url. So, find the string "attachment" and escape anything after it.
*/
private String resourceUrlEscaping(String url) {
int attIndex = url.indexOf("attachment");
String leftOfAttachment = url.substring(0, attIndex);
String rightOfAttachment = url.substring(attIndex);
String finalUrl = leftOfAttachment.concat(Validator.escapeUrl(rightOfAttachment));
return finalUrl;
}
public List findRanksByContextIdUserId(final String contextId, final String userid) {
if (LOG.isDebugEnabled()) {
LOG.debug("findRanksByContextIdBasedOnRoles(contextId: " + contextId + ")");
}
if (contextId == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.getNamedQuery(QUERY_BY_CONTEXT_ID_USERID);
q.setParameter("contextId", contextId, Hibernate.STRING);
q.setParameter("userId", userid, Hibernate.STRING);
return q.list();
}
};
List ranklist = (List) getHibernateTemplate().execute(hcb);
return ranklist;
}
public List findRanksByContextIdBasedOnNumPost(final String contextId) {
if (LOG.isDebugEnabled()) {
LOG.debug("findRanksByContextIdBasedOnNumPost(contextId: " + contextId + ")");
}
if (contextId == null) {
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.getNamedQuery(QUERY_BY_CONTEXT_ID_NUM_POSTS_BASED);
q.setParameter("contextId", contextId, Hibernate.STRING);
return q.list();
}
};
List ranklist = (List) getHibernateTemplate().execute(hcb);
return ranklist;
}
}