/*
* This class needs to be re-created to be based on XmlFileSearcher
* Created on Oct 18, 2006
*/
package com.openedit.comments;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.openedit.entermedia.Asset;
import org.openedit.repository.filesystem.FileItem;
import org.openedit.util.GenericsUtil;
import org.openedit.util.LocaleManager;
import com.openedit.OpenEditException;
import com.openedit.hittracker.ListHitTracker;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.users.User;
import com.openedit.users.UserManager;
import com.openedit.util.FileUtils;
import com.openedit.util.XmlUtil;
public class CommentArchive
{
private static final Log log = LogFactory.getLog(CommentArchive.class);
protected UserManager fieldUserManager;
protected PageManager fieldPageManager;
protected XmlUtil fieldXmlUtil;
protected LocaleManager fieldLocaleManager;
public LocaleManager getLocaleManager()
{
if (fieldLocaleManager == null)
{
fieldLocaleManager = new LocaleManager();
}
return fieldLocaleManager;
}
public void setLocaleManager(LocaleManager inLocaleManager)
{
fieldLocaleManager = inLocaleManager;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public UserManager getUserManager()
{
return fieldUserManager;
}
public XmlUtil getXmlUtil()
{
if (fieldXmlUtil == null)
{
fieldXmlUtil = new XmlUtil();
}
return fieldXmlUtil;
}
public void setXmlUtil(XmlUtil inXmlUtil)
{
fieldXmlUtil = inXmlUtil;
}
protected Comment loadComment(Element inCommentElement) throws ParseException
{
Comment comment = new Comment();
comment.setLocaleManager(getLocaleManager());
String username = inCommentElement.attributeValue("username");
if( username != null)
{
User user = getUserManager().getUser(username);
comment.setUser(user);
}
comment.setComment(inCommentElement.getTextTrim());
comment.setCreationDate(inCommentElement.attributeValue("date"));
return comment;
}
public Set<User> loadUsersWhoCommented(String inCatalogId, String inPath)
{
Set<User> usernames = GenericsUtil.createSet();
for (Iterator iterator = loadComments(inCatalogId, inPath).iterator(); iterator.hasNext();)
{
Comment c = (Comment) iterator.next();
usernames.add(c.getUser());
}
return usernames;
}
public Collection loadComments(Asset inAsset)
{
String path = findPath( inAsset.getCatalogId(), inAsset.getSourcePath() );
Page page = getPageManager().getPage(path);
if(!page.exists()){
path = "/WEB-INF/data/" + inAsset.getCatalogId() + "/comments/" + inAsset.getSourcePath() + "/folder.xml";
page = getPageManager().getPage(path);
}
return loadComments(page);
}
public Collection loadComments(String path)
{
Page page = getPageManager().getPage(path);
return loadComments(page);
}
public Collection loadComments(String inCatalogId, String inPath)
{
String path = findPath(inCatalogId, inPath);
Page page = getPageManager().getPage(path);
// if(!page.exists()){
// path = "/WEB-INF/data/" + inCatalogId + "/comments/" + inPath + "/folder.xml";
// page = getPageManager().getPage(path);
// }
return loadComments(page);
}
public String findPath(String inCatalogId, String inPath) {
String path = "/WEB-INF/data/"+inCatalogId + "/comments/" + inPath + ".xml";
return path;
}
protected Collection loadComments(Page inPage) throws OpenEditException
{
List<Comment> comments = GenericsUtil.createList();
if ( inPage.exists() )
{
log.debug( "Loading comments for page " + inPage.getPath() );
Reader reader = inPage.getReader();
try
{
Element root = getXmlUtil().getXml(reader, inPage.getCharacterEncoding());
for (Object o: root.elements("comment"))
{
Element element = (Element) o;
Comment comment = loadComment(element);
comments.add(comment);
}
}
catch ( Exception ex)
{
throw new OpenEditException(ex);
}
finally
{
FileUtils.safeClose(reader);
}
}
log.info("Found " + comments.size());
return new ListHitTracker(comments);
}
public void setUserManager(UserManager inUserManager)
{
fieldUserManager = inUserManager;
}
public void addComment(String inCatalogId, String inSourcePath, Comment inComment)
{
String path = findPath(inCatalogId, inSourcePath);
Page page = getPageManager().getPage(path);
addComment(page, inComment);
}
public void removeComment(String inCatalogId, String inSourcePath, Comment inComment)
{
String path = findPath(inCatalogId, inSourcePath);
Page page = getPageManager().getPage(path);
removeComment(page, inComment);
}
protected void addComment(Page inPage, Comment inComment)
{
List comments = new ArrayList(loadComments(inPage));
if( comments.isEmpty() )
{
comments.add(inComment);
}
else
{
comments.add(0, inComment);
}
saveComments(inPage, comments);
//inPage.get.pu setProperty("comments", comments);
//getPageManager().
//inPage.getp
}
public Comment getLastComment(String inCatalogId,String inSourcePath)
{
Collection comments = loadComments(inCatalogId, inSourcePath);
if(comments.size() > 0)
{
return (Comment)comments.toArray()[comments.size() - 1];
}
return null;
}
protected void removeComment(Page inPage, Comment inComment)
{
Collection comments = loadComments(inPage);
Comment toremove = null;
for (Iterator iterator = comments.iterator(); iterator.hasNext();)
{
Comment c = (Comment) iterator.next();
//Wow terrible code
if(c.getComment().equals(inComment.getComment()))
{
if(c.getDate().equals(inComment.getDate()) && c.getUser().equals(inComment.getUser()))
{
toremove = c;
break;
}
}
}
if(toremove != null)
{
comments.remove(toremove);
}
saveComments(inPage, comments);
}
public void saveComments(String inPath, Collection inComments)
{
if(inPath.endsWith("/"))
{
inPath = inPath + "folder.xml";
}
if (!inPath.endsWith(".xml"))
{
inPath = inPath + ".xml";
}
Page page = getPageManager().getPage(inPath);
saveComments(page, inComments);
}
public void saveComments(Page inPage, Collection inComments) throws OpenEditException
{
Element root = DocumentHelper.createDocument().addElement("comments");
for (Object o: inComments)
{
Comment com = (Comment) o; // <comment author="admin" date="Feb 18, 2005 2:42:29 PM">This is a snide remark</comment>
Element comment = root.addElement("comment");
if( com.getUser() != null)
{
comment.addAttribute("username",com.getUser().getUserName());
}
comment.addAttribute("date",com.getCreationDate());
comment.setText(com.getComment());
}
try
{
//TODO: Add locking
File tmp = File.createTempFile("comment", "junk");
getXmlUtil().saveXml(root.getDocument(), tmp);
FileItem item = new FileItem();
item.setFile(tmp);
item.setPath(inPage.getPath());
Page tmpPage = new Page(inPage);
tmpPage.setContentItem(item);
getPageManager().copyPage(tmpPage, inPage); //Copy over as a tmp file in case there is a problem
tmp.delete();
}
catch (IOException ex)
{
throw new OpenEditException(ex);
}
}
}