/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.dao;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.annotations.*;
import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
import org.jboss.seam.wiki.core.model.LinkProtocol;
import org.jboss.seam.wiki.core.model.WikiDirectory;
import org.jboss.seam.wiki.core.model.WikiDocument;
import org.jboss.seam.wiki.util.WikiUtil;
import org.jboss.seam.wiki.preferences.Preferences;
import static org.jboss.seam.international.StatusMessage.Severity.ERROR;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NoResultException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@Name("wikiNodeFactory")
public class WikiNodeFactory implements Serializable {
@Logger
Log log;
@Observer("Wiki.startup")
public void checkPreferences() {
log.info("checking wiki preferences...");
/* TODO: needs to be disabled in testing
// We need a fake user so we can retrieve preferences without a request, on startup
Contexts.getEventContext().set("currentPreferencesUser", new User());
Long rootId = loadWikiRoot().getId();
Long memberId = loadMemberArea().getId();
Long helpId = loadHelpArea().getId();
Long trashId = loadTrashArea().getId();
assert !rootId.equals(memberId);
assert !rootId.equals(helpId);
assert !rootId.equals(trashId);
assert !memberId.equals(helpId);
assert !memberId.equals(trashId);
assert !helpId.equals(trashId);
*/
}
@Factory(value = "wikiRoot", scope = ScopeType.PAGE, autoCreate = true)
public WikiDirectory loadWikiRoot() {
log.debug("loading wiki root");
EntityManager em = (EntityManager)Component.getInstance("entityManager");
try {
return (WikiDirectory) em
.createQuery("select d from WikiDirectory d left join fetch d.feed where d.parent is null")
.setHint("org.hibernate.comment", "Loading wikiRoot")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (RuntimeException ex) {
throw new RuntimeException("You need to INSERT at least one parentless directory into the database", ex);
}
}
@Factory(value = "wikiStart", scope = ScopeType.CONVERSATION, autoCreate = true)
public WikiDocument loadWikiStart() {
log.debug("loading wiki start into current conversation");
EntityManager em = (EntityManager)Component.getInstance("restrictedEntityManager");
try {
return (WikiDocument) em
.createQuery("select d from WikiDocument d where d.id = :id")
.setParameter("id", Preferences.instance().get(WikiPreferences.class).getDefaultDocumentId())
.setHint("org.hibernate.comment", "Loading wikiStart")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (EntityNotFoundException ex) {
} catch (NoResultException ex) {
}
// TODO: Message instead!
throw new RuntimeException("Couldn't find wiki default start document with id '"
+ Preferences.instance().get(WikiPreferences.class).getDefaultDocumentId() +"'");
}
// Loads the same instance into a different persistence context
@Factory(value = "restrictedWikiRoot", scope = ScopeType.PAGE, autoCreate = true)
public WikiDirectory loadWikiRootRestricted() {
log.debug("loading wiki root into restricted PC");
EntityManager em = (EntityManager)Component.getInstance("restrictedEntityManager");
WikiDirectory wikiroot = (WikiDirectory) Component.getInstance("wikiRoot");
try {
return (WikiDirectory) em
.createQuery("select d from WikiDirectory d left join fetch d.feed where d.id = :id")
.setParameter("id", wikiroot.getId())
.setHint("org.hibernate.comment", "Loading wikiRootRestricted")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (RuntimeException ex) {
throw new RuntimeException("You need to INSERT at least one parentless directory into the database", ex);
}
}
@Factory(value = "memberArea", scope = ScopeType.PAGE, autoCreate = true)
public WikiDirectory loadMemberArea() {
log.debug("loading member area");
EntityManager em = (EntityManager)Component.getInstance("entityManager");
String memberAreaName = Preferences.instance().get(WikiPreferences.class).getMemberArea();
try {
return (WikiDirectory) em
.createQuery("select d from WikiDirectory d left join fetch d.feed where d.wikiname = :name and d.parent.parent is null")
.setParameter("name", WikiUtil.convertToWikiName(memberAreaName) )
.setHint("org.hibernate.comment", "Loading memberArea")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (RuntimeException ex) {
StatusMessages.instance().addFromResourceBundleOrDefault(
ERROR,
"lacewiki.msg.MemberHomedirectoryNotFound",
"Could not find member area with name {0} - your configuration is broken, please change it.",
memberAreaName
);
return null;
}
}
@Factory(value = "trashArea", scope = ScopeType.PAGE, autoCreate = true)
public WikiDirectory loadTrashArea() {
log.debug("loading trash area");
EntityManager em = (EntityManager)Component.getInstance("entityManager");
String trashAreaName = Preferences.instance().get(WikiPreferences.class).getTrashArea();
try {
return (WikiDirectory) em
.createQuery("select d from WikiDirectory d left join fetch d.feed where d.wikiname = :name and d.parent.parent is null")
.setParameter("name", WikiUtil.convertToWikiName(trashAreaName) )
.setHint("org.hibernate.comment", "Loading trashArea")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (RuntimeException ex) {
StatusMessages.instance().addFromResourceBundleOrDefault(
ERROR,
"lacewiki.msg.TrashAreaNotFound",
"Could not find trash area with name {0} - your configuration is broken, please change it.",
trashAreaName
);
return null;
}
}
@Factory(value = "helpArea", scope = ScopeType.PAGE, autoCreate = true)
public WikiDirectory loadHelpArea() {
log.debug("loading help area");
EntityManager em = (EntityManager)Component.getInstance("entityManager");
String helpAreaName = Preferences.instance().get(WikiPreferences.class).getHelpArea();
try {
return (WikiDirectory) em
.createQuery("select d from WikiDirectory d left join fetch d.feed where d.wikiname = :name and d.parent.parent is null")
.setParameter("name", WikiUtil.convertToWikiName(helpAreaName) )
.setHint("org.hibernate.comment", "Loading trashArea")
.setHint("org.hibernate.cacheable", false)
.getSingleResult();
} catch (RuntimeException ex) {
StatusMessages.instance().addFromResourceBundleOrDefault(
ERROR,
"lacewiki.msg.HelpAreaNotFound",
"Could not find help area with name {0} - your configuration is broken, please change it.",
helpAreaName
);
return null;
}
}
@Factory(value = "linkProtocolMap", scope = ScopeType.CONVERSATION, autoCreate = true)
public Map<String, LinkProtocol> loadLinkProtocols() {
log.debug("loading link protocol map");
EntityManager em = (EntityManager)Component.getInstance("entityManager");
Map<String, LinkProtocol> linkProtocols = new TreeMap<String, LinkProtocol>();
//noinspection unchecked
List<Object[]> result = em
.createQuery("select lp.prefix, lp from LinkProtocol lp order by lp.prefix asc")
.setHint("org.hibernate.comment", "Loading link protocols")
.setHint("org.hibernate.cacheable", true)
.getResultList();
for (Object[] objects : result) {
linkProtocols.put((String)objects[0], (LinkProtocol)objects[1]);
}
return linkProtocols;
}
}