org.nuxeo.ecm.platform.annotations.service.AnnotationsOnVersionTest.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.platform.annotations.service.AnnotationsOnVersionTest.java

Source

/*
 * (C) Copyright 2006-2009 Nuxeo SA (http://nuxeo.com/) and others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Contributors:
 *     troger
 */
package org.nuxeo.ecm.platform.annotations.service;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentModelList;
import org.nuxeo.ecm.core.api.DocumentRef;
import org.nuxeo.ecm.core.api.NuxeoPrincipal;
import org.nuxeo.ecm.core.api.impl.UserPrincipal;
import org.nuxeo.ecm.core.api.security.SecurityConstants;
import org.nuxeo.ecm.platform.annotations.api.Annotation;
import org.nuxeo.ecm.platform.annotations.repository.AbstractRepositoryTestCase;
import org.nuxeo.ecm.platform.annotations.repository.URNDocumentViewTranslator;
import org.nuxeo.ecm.platform.url.DocumentViewImpl;

/**
 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a>
 */
public class AnnotationsOnVersionTest extends AbstractRepositoryTestCase {

    private static final Log log = LogFactory.getLog(AnnotationsOnVersionTest.class);

    private static final String SERVER = "http://server.com/nuxeo/";

    private final NuxeoPrincipal user = new UserPrincipal(SecurityConstants.ADMINISTRATOR, new ArrayList<String>(),
            false, false);

    private final URNDocumentViewTranslator translator = new URNDocumentViewTranslator();

    @Test
    public void testAnnotationsOnVersion() throws Exception {
        DocumentModel docModel = createDocument(session.getRootDocument().getPathAsString(),
                "fileAnnotationsOnVersion");

        String url = viewCodecManager.getUrlFromDocumentView(new DocumentViewImpl(docModel), true, SERVER);
        assertNotNull(url);
        addAnnotationOn(url);

        URI uri = translator.getNuxeoUrn(docModel.getRepositoryName(), docModel.getId());

        List<Annotation> annotations = service.queryAnnotations(uri, user);
        assertEquals(1, annotations.size());

        DocumentRef versionRef = checkIn(docModel.getRef());

        // annotation reset on current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(0, annotations.size());
        log.debug(annotations.size() + " annotations for: " + uri);
        // 1 annotation on the version
        DocumentModel versionModel = session.getDocument(versionRef);
        URI uriVersion = translator.getNuxeoUrn(versionModel.getRepositoryName(), versionModel.getId());
        annotations = service.queryAnnotations(uriVersion, user);
        log.debug(annotations.size() + " annotations for: " + uriVersion);
        assertEquals(1, annotations.size());

        addAnnotationOn(url);
        // 2 annotations on the current document
        annotations = service.queryAnnotations(uri, user);
        log.debug(annotations.size() + " annotations for: " + uri);
        assertEquals(1, annotations.size());

        // but still 1 on the version
        annotations = service.queryAnnotations(uriVersion, user);
        log.debug(annotations.size() + " annotations for: " + uriVersion);
        assertEquals(1, annotations.size());

    }

    @Test
    public void testAnnotationsOnRestore() throws Exception {
        DocumentModel docModel = createDocument(session.getRootDocument().getPathAsString(),
                "fileAnnotationsOnRestore");
        String url = viewCodecManager.getUrlFromDocumentView(new DocumentViewImpl(docModel), true, SERVER);
        assertNotNull(url);
        addAnnotationOn(url);

        URI uri = translator.getNuxeoUrn(docModel.getRepositoryName(), docModel.getId());

        List<Annotation> annotations = service.queryAnnotations(uri, user);
        assertEquals(1, annotations.size());

        DocumentRef versionRef = checkIn(docModel.getRef());

        // annotation reset on current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(0, annotations.size());

        // 1 annotation on the version
        DocumentModel versionModel = session.getDocument(versionRef);
        URI uriVersion = translator.getNuxeoUrn(versionModel.getRepositoryName(), versionModel.getId());
        annotations = service.queryAnnotations(uriVersion, user);
        assertEquals(1, annotations.size());

        addAnnotationOn(url);
        // 1 new annotation on document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(1, annotations.size());

        // and still 1 on the version
        annotations = service.queryAnnotations(uriVersion, user);
        assertEquals(1, annotations.size());

        // Restore the first version
        docModel = restoreToVersion(docModel.getRef(), versionRef);
        // 1 annotation on the current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(1, annotations.size());
    }

    @Test
    public void testAnnotationsOnRestoreWithMultipleVersions() throws Exception {
        DocumentModel docModel = createDocument(session.getRootDocument().getPathAsString(),
                "fileAnnotationsOnRestoreWithMultipleVersions");
        String url = viewCodecManager.getUrlFromDocumentView(new DocumentViewImpl(docModel), true, SERVER);
        assertNotNull(url);
        addAnnotationsOn(url, 3);

        URI uri = translator.getNuxeoUrn(docModel.getRepositoryName(), docModel.getId());

        List<Annotation> annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());

        DocumentRef version1ref = checkIn(docModel.getRef());
        List<DocumentModel> versions = session.getVersions(docModel.getRef());
        assertEquals(1, versions.size());

        DocumentModel versionModel1 = session.getDocument(version1ref);
        URI uriVersion1 = translator.getNuxeoUrn(versionModel1.getRepositoryName(), versionModel1.getId());
        annotations = service.queryAnnotations(uriVersion1, user);
        assertEquals(3, annotations.size());

        addAnnotationsOn(url, 3);
        annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());

        DocumentRef version2ref = checkIn(docModel.getRef());
        versions = session.getVersions(docModel.getRef());
        assertEquals(2, versions.size());

        DocumentModel versionModel2 = session.getDocument(version2ref);
        URI uriVersion2 = translator.getNuxeoUrn(versionModel2.getRepositoryName(), versionModel2.getId());

        // 3 annotations on version 2
        annotations = service.queryAnnotations(uriVersion2, user);
        assertEquals(3, annotations.size());

        // annotations reset on current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(0, annotations.size());

        // 3 annotations on version 1
        annotations = service.queryAnnotations(uriVersion1, user);
        assertEquals(3, annotations.size());

        // Restore the first version
        docModel = restoreToVersion(docModel.getRef(), version1ref);
        // 1 annotation on the current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());

        // Restore the second version
        docModel = restoreToVersion(docModel.getRef(), version2ref);
        // 1 annotation on the current document
        annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());
    }

    @Test
    public void testDeleteAnnotationsOnVersions() throws Exception {
        DocumentModel docModel = createDocument(session.getRootDocument().getPathAsString(),
                "fileDeleteAnnotationsOnVersions");
        String url = viewCodecManager.getUrlFromDocumentView(new DocumentViewImpl(docModel), true, SERVER);
        assertNotNull(url);
        addAnnotationsOn(url, 3);

        URI uri = translator.getNuxeoUrn(docModel.getRepositoryName(), docModel.getId());

        List<Annotation> annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());

        DocumentRef version1ref = checkIn(docModel.getRef());
        List<DocumentModel> versions = session.getVersions(docModel.getRef());
        assertEquals(1, versions.size());

        DocumentModel versionModel1 = session.getDocument(version1ref);
        URI uriVersion1 = translator.getNuxeoUrn(versionModel1.getRepositoryName(), versionModel1.getId());
        annotations = service.queryAnnotations(uriVersion1, user);
        assertEquals(3, annotations.size());

        addAnnotationsOn(url, 3);
        annotations = service.queryAnnotations(uri, user);
        assertEquals(3, annotations.size());

        DocumentRef version2ref = checkIn(docModel.getRef());
        versions = session.getVersions(docModel.getRef());
        assertEquals(2, versions.size());

        DocumentModel versionModel2 = session.getDocument(version2ref);
        URI uriVersion2 = translator.getNuxeoUrn(versionModel2.getRepositoryName(), versionModel2.getId());
        annotations = service.queryAnnotations(uriVersion2, user);
        assertEquals(3, annotations.size());

        // the text 'zombie' is not found in the document
        DocumentModelList results = session.query("SELECT * FROM Document WHERE ecm:fulltext = 'zombie'", 10);
        assertEquals(0, results.size());

        // put an text annotation a checked in version to check the fulltext
        // indexing
        Annotation annotationVersion1 = getAnnotation(uriVersion1.toASCIIString(), 1);
        annotationVersion1.setBodyText("zombie annotation");
        service.addAnnotation(annotationVersion1, user, uriVersion1.toASCIIString());

        session.save();
        nextTransaction();
        sleepForFulltext();

        results = session.query("SELECT * FROM Document WHERE ecm:fulltext = 'zombie'", 10);
        assertEquals(1, results.size());
        assertEquals(version1ref, results.get(0).getRef());

        // Delete annotations for version 1
        annotations = service.queryAnnotations(uriVersion1, user);
        for (Annotation annotation : annotations) {
            service.deleteAnnotationFor(uriVersion1, annotation, user);
        }
        annotations = service.queryAnnotations(uriVersion1, user);
        assertEquals(0, annotations.size());

        // Delete annotations for version 2
        annotations = service.queryAnnotations(uriVersion2, user);
        for (Annotation annotation : annotations) {
            service.deleteAnnotationFor(uriVersion2, annotation, user);
        }
        annotations = service.queryAnnotations(uriVersion2, user);
        assertEquals(0, annotations.size());

        // restore version 1
        docModel = restoreToVersion(docModel.getRef(), version1ref);
        annotations = service.queryAnnotations(uri, user);
        // still no annotation on the current document
        assertEquals(0, annotations.size());
    }

    protected DocumentModel createDocument(String parentPath, String id) throws Exception {
        DocumentModel docModel = session.createDocumentModel(parentPath, id, "File");
        docModel = session.createDocument(docModel);
        session.save();
        return docModel;
    }

    protected Annotation addAnnotationOn(String url) throws Exception {
        Annotation annotation = getAnnotation(url, 1);
        return service.addAnnotation(annotation, user, SERVER);
    }

    protected void addAnnotationsOn(String url, int count) throws Exception {
        for (int i = 0; i < count; i++) {
            addAnnotationOn(url);
        }
    }

    protected DocumentRef checkIn(DocumentRef ref) throws Exception {
        session.save();
        DocumentRef v = session.checkIn(ref, null, null);
        session.checkOut(ref);
        session.save();
        nextTransaction();
        return v;
    }

    protected DocumentModel restoreToVersion(DocumentRef docRef, DocumentRef versionRef) throws Exception {
        session.save();
        DocumentModel docModel = session.restoreToVersion(docRef, versionRef);
        session.save();
        nextTransaction();
        return docModel;
    }

}