package service.filestore;
import java.util.Map;
import java.util.Set;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import models.Flag;
import models.FlagDAO;
import models.IdentifiableUser;
import models.User;
import org.apache.jackrabbit.commons.JcrUtils;
import org.jcrom.JcrMappingException;
import org.jcrom.Jcrom;
import service.EventManager.Event;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
public class FlagStore {
public enum FlagType {
WATCH ("/flags/watch"),
EDIT ("/flags/edit");
private String rootPath;
private FlagType(final String rootPath) {
this.rootPath = rootPath;
}
public String getRootPath() {
return rootPath;
}
}
public class Manager {
private final FlagDAO flagDao;
Manager(final Session session) {
this.flagDao = new FlagDAO(session, jcrom);
}
public Set<Flag> getFlags(FlagType t) {
return ImmutableSet.copyOf(flagDao.findAll(t.getRootPath()));
}
public boolean hasFlag(FlagType t, String targetId, User user) {
return getFlag(t, targetId, user) != null;
}
public Flag getFlag(String flagId) {
return flagDao.loadById(flagId);
}
public Flag getFlag(FlagType t, String flagId) {
try {
Flag flag = flagDao.loadById(flagId);
if (!flag.getPath().startsWith(t.getRootPath()))
return null;
return flag;
} catch (JcrMappingException e) {
return null;
}
}
public Flag getFlag(FlagType t, String targetId, User user) {
return flagDao.get(t.getRootPath()+"/"+Flag.generateName(targetId, user));
}
public Flag setFlag(FlagType t, String targetId, User user) {
if (hasFlag(t, targetId, user)) {
return getFlag(t, targetId, user);
} else {
return flagDao.create(
t.getRootPath(),
new models.Flag(null, targetId, user));
}
}
public void unsetFlag(FlagType t, String flagId) {
deleteFlag(this.getFlag(t, flagId));
}
private void deleteFlag(Flag flag) {
if (flag != null)
flagDao.removeById(flag.getId());
}
}
public static class Events {
public static Event create(Flag flag, FlagType t, IdentifiableUser u)
throws RepositoryException {
return new Event("flag:create", nodeInfo(flag, t, u));
}
public static Event delete(Flag flag, FlagType t, IdentifiableUser u)
throws RepositoryException {
return new Event("flag:delete", nodeInfo(flag, t, u));
}
private static Map<String, String> nodeInfo(Flag flag, FlagType t,
IdentifiableUser u) {
final ImmutableMap.Builder<String, String> b = ImmutableMap.builder();
b.put("id", flag.getId());
b.put("type", t.toString());
b.put("owner:id", flag.getUser().getId());
b.put("owner:email", flag.getUser().getEmail());
b.put("owner:name", flag.getUser().getName());
b.put("target:id", flag.getTargetId());
if (!u.getId().equals(flag.getUser().getId())) {
b.put("instigator:id", u.getId());
b.put("instigator:email", u.getEmail());
b.put("instigator:name", u.getName());
}
return b.build();
}
}
protected final Jcrom jcrom;
public FlagStore(final Jcrom jcrom, final Session initialSession)
throws RepositoryException {
this.jcrom = jcrom;
for (FlagType ft : FlagType.values()) {
JcrUtils.getOrCreateByPath(ft.getRootPath(),
NodeType.NT_UNSTRUCTURED, initialSession);
}
}
public Manager getManager(Session session) {
return new Manager(session);
}
}