001package org.nuxeo.snapshot;
002
003import java.util.Collections;
004import java.util.List;
005
006import org.nuxeo.ecm.core.api.CoreSession;
007import org.nuxeo.ecm.core.api.DocumentModel;
008import org.nuxeo.ecm.core.api.IterableQueryResult;
009import org.nuxeo.ecm.core.event.impl.ShallowDocumentModel;
010import org.nuxeo.ecm.core.query.QueryFilter;
011import org.nuxeo.ecm.core.query.sql.NXQL;
012import org.nuxeo.ecm.core.versioning.OrphanVersionRemovalFilter;
013
014public class SnapshotRemovalPolicy implements OrphanVersionRemovalFilter {
015
016    protected boolean canRemoveVersions(CoreSession session, DocumentModel doc, List<String> uuids) {
017        IterableQueryResult result = null;
018        try {
019            StringBuffer nxql = new StringBuffer("select ecm:uuid from Document where ");
020            nxql.append(SnapshotableAdapter.CHILDREN_PROP + "/* IN (");
021            for (int i = 0; i < uuids.size(); i++) {
022                if (i > 0) {
023                    nxql.append(",");
024                }
025                nxql.append("'" + uuids.get(i) + "'");
026            }
027            nxql.append(")");
028            result = session.queryAndFetch(nxql.toString(), NXQL.NXQL, QueryFilter.EMPTY);
029            if (result.iterator().hasNext()) {
030                return false;
031            }
032            return true;
033        } finally {
034            if (result != null) {
035                result.close();
036            }
037        }
038
039    }
040
041    @SuppressWarnings("unchecked")
042    @Override
043    public List<String> getRemovableVersionIds(CoreSession session, ShallowDocumentModel deletedLiveDoc,
044            List<String> versionUUIDs) {
045
046        if (canRemoveVersions(session, deletedLiveDoc, versionUUIDs)) {
047            return Collections.emptyList();
048        }
049        return versionUUIDs;
050    }
051}