package play.modules.cream.ocm; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.version.Version; import javax.jcr.version.VersionHistory; import javax.jcr.version.VersionIterator; import javax.jcr.version.VersionManager; import org.jcrom.JcrMappingException; import play.modules.cream.JCR; public class JcrVersionMapper { public static <T> T getVersion(Class<T> clazz, String path, String versionName) { return getVersion(clazz, path, versionName, "*", -1); } public static <T> T getVersion(Class<T> clazz, String path, String versionName, String childNodeFilter, int maxDepth) { try { return getVersion(clazz, getSession().getRootNode().getNode(JcrMapper.relativePath(path)), versionName, childNodeFilter, maxDepth); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version", e); } } public static <T> T getVersionByUUID(Class<T> clazz, String uuid, String versionName) { return getVersionByUUID(clazz, uuid, versionName, "*", -1); } public static <T> T getVersionByUUID(Class<T> clazz, String uuid, String versionName, String childNodeFilter, int maxDepth) { try { return getVersion(clazz, getSession().getNodeByIdentifier(uuid), versionName, childNodeFilter, maxDepth); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version", e); } } public static <T> List<T> getVersionList(Class<T> clazz, String path) { try { return getVersionList(clazz, getSession().getRootNode().getNode(JcrMapper.relativePath(path)), "*", -1); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static <T> List<T> getVersionList(Class<T> clazz, String path, String childNameFilter, int maxDepth) { try { return getVersionList(clazz, getSession().getRootNode().getNode(JcrMapper.relativePath(path)), childNameFilter, maxDepth); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static <T> List<T> getVersionList(Class<T> clazz, String path, String childNameFilter, int maxDepth, long startIndex, long resultSize) { try { return getVersionList(clazz, getSession().getRootNode().getNode(JcrMapper.relativePath(path)), childNameFilter, maxDepth, startIndex, resultSize); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static <T> List<T> getVersionListByUUID(Class<T> clazz, String uuid) { try { return getVersionList(clazz, getSession().getNodeByIdentifier(uuid), "*", -1); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static <T> List<T> getVersionListByUUID(Class<T> clazz, String uuid, String childNameFilter, int maxDepth) { try { return getVersionList(clazz, getSession().getNodeByIdentifier(uuid), childNameFilter, maxDepth); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static <T> List<T> getVersionListByUUID(Class<T> clazz, String uuid, String childNameFilter, int maxDepth, long startIndex, long resultSize) { try { return getVersionList(clazz, getSession().getNodeByIdentifier(uuid), childNameFilter, maxDepth, startIndex, resultSize); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } public static long getVersionSize(String path) { try { return getVersionSize(getSession().getRootNode().getNode(JcrMapper.relativePath(path))); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version history size", e); } } public static long getVersionSizeByUUID(String uuid) { try { return getVersionSize(getSession().getNodeByIdentifier(uuid)); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version history size", e); } } public static void removeVersion(String path, String versionName) { try { removeVersion(getSession().getRootNode().getNode(JcrMapper.relativePath(path)), versionName); } catch (RepositoryException e) { throw new JcrMappingException("Could not remove version", e); } } public static void removeVersionByUUID(String uuid, String versionName) { try { removeVersion(getSession().getNodeByIdentifier(uuid), versionName); } catch (RepositoryException e) { throw new JcrMappingException("Could not remove version", e); } } public static void restoreVersion(String path, String versionName) { restoreVersion(path, versionName, true); } public static void restoreVersion(String path, String versionName, boolean removeExisting) { try { restoreVersion(getSession().getRootNode().getNode(JcrMapper.relativePath(path)), versionName, removeExisting); } catch (RepositoryException e) { throw new JcrMappingException("Could not restore version", e); } } public static void restoreVersionByUUID(String uuid, String versionName) { restoreVersionByUUID(uuid, versionName, true); } public static void restoreVersionByUUID(String uuid, String versionName, boolean removeExisting) { try { restoreVersion(getSession().getNodeByIdentifier(uuid), versionName, removeExisting); } catch (RepositoryException e) { throw new JcrMappingException("Could not restore version", e); } } public static void setBaseVersionInfo(Object object, String name, Calendar created) throws JcrMappingException { JcrMapper.setBaseVersionInfo(object, name, created); } protected static Session getSession() { return JCR.getSession(); } protected static <T> T getVersion(Class<T> clazz, Node node, String versionName, String childNodeFilter, int maxDepth) { try { VersionManager versionManager = JCR.getVersionManager(); VersionHistory versionHistory = versionManager.getVersionHistory(node.getPath()); Version version = versionHistory.getVersion(versionName); return JcrMapper.fromNode(clazz, version.getNodes().nextNode(), childNodeFilter, maxDepth); } catch (RepositoryException e) { throw new JcrMappingException("Could not get version", e); } } protected static <T> List<T> getVersionList(Class<T> clazz, Node node, String childNameFilter, int maxDepth) { try { List<T> versionList = new ArrayList<T>(); VersionManager versionManager = JCR.getVersionManager(); VersionHistory versionHistory = versionManager.getVersionHistory(node.getPath()); VersionIterator versionIterator = versionHistory.getAllVersions(); versionIterator.skip(1); while (versionIterator.hasNext()) { Version version = versionIterator.nextVersion(); NodeIterator nodeIterator = version.getNodes(); while (nodeIterator.hasNext()) { T entityVersion = JcrMapper.fromNode(clazz, nodeIterator.nextNode(), childNameFilter, maxDepth); Version baseVersion = versionManager.getBaseVersion(node.getPath()); JcrMapper.setBaseVersionInfo(entityVersion, baseVersion.getName(), baseVersion.getCreated()); versionList.add(entityVersion); } } return versionList; } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } protected static <T> List<T> getVersionList(Class<T> clazz, Node node, String childNameFilter, int maxDepth, long startIndex, long resultSize) { try { List<T> versionList = new ArrayList<T>(); VersionManager versionManager = JCR.getVersionManager(); VersionHistory versionHistory = versionManager.getVersionHistory(node.getPath()); VersionIterator versionIterator = versionHistory.getAllVersions(); versionIterator.skip(1 + startIndex); long counter = 0; while (versionIterator.hasNext()) { if (counter == resultSize) { break; } Version version = versionIterator.nextVersion(); NodeIterator nodeIterator = version.getNodes(); while (nodeIterator.hasNext()) { versionList.add(JcrMapper.fromNode(clazz, nodeIterator.nextNode(), childNameFilter, maxDepth)); } counter++; } return versionList; } catch (RepositoryException e) { throw new JcrMappingException("Could not get version list", e); } } protected static long getVersionSize(Node node) { try { VersionManager versionManager = JCR.getVersionManager(); VersionHistory versionHistory = versionManager.getVersionHistory(node.getPath()); return versionHistory.getAllVersions().getSize() - 1; } catch (RepositoryException e) { throw new JcrMappingException("Could not get version history size", e); } } protected static void removeVersion(Node node, String versionName) { try { VersionManager versionManager = JCR.getVersionManager(); versionManager.getVersionHistory(node.getPath()).removeVersion(versionName); } catch (RepositoryException e) { throw new JcrMappingException("Could not remove version", e); } } protected static void restoreVersion(Node node, String versionName, boolean removeExisting) { try { VersionManager versionManager = JCR.getVersionManager(); versionManager.checkout(node.getPath()); versionManager.restore(node.getPath(), versionName, removeExisting); } catch (RepositoryException e) { throw new JcrMappingException("Could not restore version", e); } } private JcrVersionMapper() { } }