package com.openkm.cache;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.openkm.bean.Document;
import com.openkm.core.DatabaseException;
import com.openkm.core.RepositoryException;
import com.openkm.dao.UserItemsDAO;
import com.openkm.dao.bean.cache.UserItems;
public class UserItemsManager {
private static Logger log = LoggerFactory.getLogger(UserItemsManager.class);
private static Map<String, UserItems> userItemsMgr = new HashMap<String, UserItems>();
/**
* Get stored user item
*/
public static UserItems get(String uid) {
UserItems userItems = userItemsMgr.get(uid);
if (userItems == null) {
userItems = new UserItems();
userItems.setUser(uid);
userItemsMgr.put(uid, userItems);
}
return userItems;
}
/**
* Increment document number
*/
public static synchronized void incDocuments(String uid, int value) {
log.debug("incDocuments({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setDocuments(userItems.getDocuments() + value);
}
/**
* Decrement document number
*/
public static synchronized void decDocuments(String uid, int value) {
log.debug("decDocuments({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setDocuments(userItems.getDocuments() - value);
}
/**
* Increment folder number
*/
public static synchronized void incFolders(String uid, int value) {
log.debug("incFolders({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setFolders(userItems.getFolders() + value);
}
/**
* Decrement folder number
*/
public static synchronized void decFolders(String uid, int value) {
log.debug("decFolders({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setFolders(userItems.getFolders() - value);
}
/**
* Increment document size
*/
public static synchronized void incSize(String uid, long value) {
log.debug("incSize({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setSize(userItems.getSize() + value);
}
/**
* Decrement document size
*/
public static synchronized void decSize(String uid, long value) {
log.debug("decSize({}, {})", uid, value);
UserItems userItems = get(uid);
userItems.setSize(userItems.getSize() - value);
}
/**
* TODO: Not fully implemented
*/
public static synchronized void refreshUserItems(Session session) throws RepositoryException {
log.info("refreshUserItems({})", session);
try {
String statement = "/jcr:root/okm:root//element(*, okm:document)[okm:content/@okm:author='"+session.getUserID()+"']";
Workspace workspace = session.getWorkspace();
QueryManager queryManager = workspace.getQueryManager();
Query query = queryManager.createQuery(statement, Query.XPATH);
QueryResult result = query.execute();
long size = 0;
for (NodeIterator nit = result.getNodes(); nit.hasNext(); ) {
Node node = nit.nextNode();
Node contentNode = node.getNode(Document.CONTENT);
size += contentNode.getProperty(Document.SIZE).getLong();
}
UserItems userItems = new UserItems();
userItemsMgr.put(session.getUserID(), userItems);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
}
log.info("refreshUserItems: void");
}
/**
* Store data in database
*/
public static synchronized void serialize() throws DatabaseException {
for (String user : userItemsMgr.keySet()) {
UserItemsDAO.update(userItemsMgr.get(user));
}
}
/**
* Read data from database
*/
public static synchronized void deserialize() throws DatabaseException {
for (UserItems ui : UserItemsDAO.findAll()) {
userItemsMgr.put(ui.getUser(), ui);
}
}
}