org.nuxeo.ecm.core.resolver.TestDocumentModelResolver.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.core.resolver.TestDocumentModelResolver.java

Source

/*
 * (C) Copyright 2014 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:
 *     Nicolas Chapurlat
 */
package org.nuxeo.ecm.core.resolver;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.nuxeo.ecm.core.model.DocumentModelResolver.NAME;
import static org.nuxeo.ecm.core.model.DocumentModelResolver.PARAM_STORE;
import static org.nuxeo.ecm.core.model.DocumentModelResolver.STORE_ID_REF;
import static org.nuxeo.ecm.core.model.DocumentModelResolver.STORE_PATH_REF;

import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.inject.Inject;

import org.apache.commons.lang.SerializationUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.facet.VersioningDocument;
import org.nuxeo.ecm.core.api.validation.DocumentValidationService;
import org.nuxeo.ecm.core.model.Document;
import org.nuxeo.ecm.core.model.DocumentModelResolver;
import org.nuxeo.ecm.core.model.DocumentModelResolver.MODE;
import org.nuxeo.ecm.core.schema.types.SimpleType;
import org.nuxeo.ecm.core.test.CoreFeature;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;

@RunWith(FeaturesRunner.class)
@Deploy({ "org.nuxeo.ecm.core.test.tests:OSGI-INF/test-document-resolver-contrib.xml" })
@Features(CoreFeature.class)
@RepositoryConfig(cleanup = Granularity.METHOD)
public class TestDocumentModelResolver {

    private static final String ID_XPATH = "dr:docIdRef";

    private static final String PATH_XPATH = "dr:docPathRef";

    @Inject
    protected CoreSession session;

    @Inject
    protected DocumentValidationService validator;

    protected DocumentModel doc;

    protected String idRef;

    protected String pathRef;

    @Before
    public void setup() throws Exception {
        doc = session.createDocumentModel("/", "doc1", "TestResolver");
        doc = session.createDocument(doc);
        idRef = doc.getRepositoryName() + ":" + doc.getId();
        pathRef = doc.getRepositoryName() + ":" + doc.getPathAsString();
        session.save();
    }

    @Test
    public void supportedClasses() throws Exception {
        List<Class<?>> classes = new DocumentModelResolver().getManagedClasses();
        assertEquals(1, classes.size());
        assertTrue(classes.contains(DocumentModel.class));
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleNoConfigurationFetch() {
        new DocumentModelResolver().fetch("/doc1");
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleNoConfigurationFetchCast() {
        new DocumentModelResolver().fetch(DocumentModel.class, idRef);
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleNoConfigurationGetReference() {
        new DocumentModelResolver().getReference(doc);
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleNoConfigurationGetParameters() {
        new DocumentModelResolver().getParameters();
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleNoConfigurationGetConstraintErrorMessage() {
        new DocumentModelResolver().getConstraintErrorMessage(null, Locale.ENGLISH);
    }

    @Test(expected = IllegalStateException.class)
    public void testLifecycleConfigurationTwice() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        dmrr.configure(parameters);
        dmrr.configure(parameters);
    }

    @Test
    public void testConfigurationDefaultIdRef() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertEquals(MODE.ID_REF, dmrr.getMode());
        Map<String, Serializable> outputParameters = dmrr.getParameters();
        assertEquals(STORE_ID_REF, outputParameters.get(PARAM_STORE));
    }

    @Test
    public void testConfigurationIdRef() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        assertEquals(MODE.ID_REF, dmrr.getMode());
        Map<String, Serializable> outputParameters = dmrr.getParameters();
        assertEquals(STORE_ID_REF, outputParameters.get(PARAM_STORE));
    }

    @Test
    public void testConfigurationPathRef() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertEquals(MODE.PATH_REF, dmrr.getMode());
        Map<String, Serializable> outputParameters = dmrr.getParameters();
        assertEquals(STORE_PATH_REF, outputParameters.get(PARAM_STORE));
    }

    @Test
    public void testName() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertEquals(NAME, dmrr.getName());
    }

    @Test
    public void testValidateGoodIdRefWithDefaultConf() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertTrue(dmrr.validate(idRef));
    }

    @Test
    public void testValidateGoodIdRefWithIdRefMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        assertTrue(dmrr.validate(idRef));
    }

    @Test
    public void testValidateIdRefFailedWithBadValue() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertFalse(dmrr.validate("BAD uuid !"));
    }

    @Test
    public void testValidateIdRefFailedWithPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertFalse(dmrr.validate(idRef));
    }

    @Test
    public void testValidateGoodPathRefWithDefaultConf() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertFalse(dmrr.validate(pathRef));
    }

    @Test
    public void testValidateGoodPathRefWithPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertTrue(dmrr.validate(pathRef));
    }

    @Test
    public void testValidatePathRedFailedWithBadValue() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertFalse(dmrr.validate("test:BAD path !"));
    }

    @Test
    public void testValidatePathRedFailedWithBadRepository() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertFalse(dmrr.validate("badrepo:" + doc.getPathAsString()));
    }

    @Test
    public void testValidatePathRefFailedWithIdMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        assertFalse(dmrr.validate(pathRef));
    }

    @Test
    public void testFetchGoodIdRefWithDefaultConf() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        Object entity = dmrr.fetch(idRef);
        assertTrue(entity instanceof DocumentModel);
        assertEquals("doc1", ((DocumentModel) entity).getName());
    }

    @Test
    public void testFetchGoodIdRefWithIdRef() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        Object entity = dmrr.fetch(idRef);
        assertTrue(entity instanceof DocumentModel);
        assertEquals("doc1", ((DocumentModel) entity).getName());
    }

    @Test
    public void testFetchIdRefFailedWithBadValue() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.fetch("test:BAD value !"));
    }

    @Test
    public void testFetchIdRefFailedWithBadRepository() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.fetch("badrepo:" + doc.getId()));
    }

    @Test
    public void testFetchIdRefFailedWithPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertNull(dmrr.fetch(idRef));
    }

    @Test
    public void testFetchGoodPathRefWithDefaultConf() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.fetch(pathRef));
    }

    @Test
    public void testFetchGoodPathRefWithPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        Object entity = dmrr.fetch(pathRef);
        assertTrue(entity instanceof DocumentModel);
        assertEquals("doc1", ((DocumentModel) entity).getName());
    }

    @Test
    public void testFetchPathRefFailedWithBadValue() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertNull(dmrr.fetch("test:BAD value !"));
    }

    @Test
    public void testFetchPathRefFailedWithBadRepository() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertNull(dmrr.fetch("badrepo:" + doc.getPathAsString()));
    }

    @Test
    public void testFetchPathRefFailedWithIdMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        assertNull(dmrr.fetch(pathRef));
    }

    @Test
    public void testFetchCastDocumentModelIdMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        DocumentModel document = dmrr.fetch(DocumentModel.class, idRef);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        assertNull(dmrr.fetch(DocumentModel.class, pathRef));
        assertNull(dmrr.fetch(DocumentModel.class, "test:uuid1234567890"));
        assertNull(dmrr.fetch(DocumentModel.class, "badrepo:" + doc.getId()));
    }

    @Test
    public void testFetchCastAdapterIdMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        dmrr.configure(parameters);
        VersioningDocument document = dmrr.fetch(VersioningDocument.class, idRef);
        assertNotNull(document);
        assertNotNull(document.getVersionLabel());
    }

    @Test
    public void testFetchCastDocumentModelPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        DocumentModel document = dmrr.fetch(DocumentModel.class, pathRef);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        assertNull(dmrr.fetch(DocumentModel.class, idRef));
        assertNull(dmrr.fetch(DocumentModel.class, "test:/doc/toto"));
        assertNull(dmrr.fetch(DocumentModel.class, "badrepo:" + doc.getPathAsString()));
    }

    @Test
    public void testFetchCastAdapterPathMode() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        VersioningDocument document = dmrr.fetch(VersioningDocument.class, pathRef);
        assertNotNull(document);
        assertNotNull(document.getVersionLabel());
    }

    @Test
    public void testFetchCastDoesntSupportDocumentType() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.fetch(Document.class, idRef));
    }

    @Test
    public void testFetchCastDoesntSupportStupidTypes() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.fetch(List.class, idRef));
    }

    @Test
    public void testGetReferenceIdRef() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertEquals(idRef, dmrr.getReference(doc));
    }

    @Test
    public void testGetReferenceGroup() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_PATH_REF);
        dmrr.configure(parameters);
        assertEquals(pathRef, dmrr.getReference(doc));
    }

    @Test
    public void testGetReferenceInvalid() {
        DocumentModelResolver dmrr = new DocumentModelResolver();
        dmrr.configure(new HashMap<String, String>());
        assertNull(dmrr.getReference("nothing"));
    }

    @Test
    public void testConfigurationIsLoaded() {
        DocumentModelResolver idResolver = (DocumentModelResolver) ((SimpleType) doc.getProperty(ID_XPATH)
                .getType()).getObjectResolver();
        assertEquals(MODE.ID_REF, idResolver.getMode());
        assertEquals(STORE_ID_REF, idResolver.getParameters().get(PARAM_STORE));
        DocumentModelResolver pathResolver = (DocumentModelResolver) ((SimpleType) doc.getProperty(PATH_XPATH)
                .getType()).getObjectResolver();
        assertEquals(MODE.PATH_REF, pathResolver.getMode());
        assertEquals(STORE_PATH_REF, pathResolver.getParameters().get(PARAM_STORE));
    }

    @Test
    public void testNullValueReturnNull() {
        assertNull(doc.getObjectResolver(ID_XPATH).fetch());
        assertNull(doc.getObjectResolver(ID_XPATH).fetch(DocumentModel.class));
        assertNull(doc.getProperty(ID_XPATH).getObjectResolver().fetch());
        assertNull(doc.getProperty(ID_XPATH).getObjectResolver().fetch(DocumentModel.class));
        assertNull(doc.getObjectResolver(PATH_XPATH).fetch());
        assertNull(doc.getObjectResolver(PATH_XPATH).fetch(DocumentModel.class));
        assertNull(doc.getProperty(PATH_XPATH).getObjectResolver().fetch());
        assertNull(doc.getProperty(PATH_XPATH).getObjectResolver().fetch(DocumentModel.class));
    }

    @Test
    public void testBadValuesValidationFailed() {
        doc.setPropertyValue(ID_XPATH, "BAD id !");
        assertNull(doc.getProperty(ID_XPATH).getObjectResolver().fetch());
        assertFalse(doc.getProperty(ID_XPATH).getObjectResolver().validate());
        doc.setPropertyValue(PATH_XPATH, "BAD path !");
        assertNull(doc.getProperty(PATH_XPATH).getObjectResolver().fetch());
        assertFalse(doc.getProperty(PATH_XPATH).getObjectResolver().validate());
        assertEquals(2, validator.validate(doc).numberOfErrors());
    }

    @Test
    public void testIdRefCorrectValues() {
        doc.setPropertyValue(ID_XPATH, idRef);
        DocumentModel document = (DocumentModel) doc.getProperty(ID_XPATH).getObjectResolver().fetch();
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = doc.getProperty(ID_XPATH).getObjectResolver().fetch(DocumentModel.class);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = (DocumentModel) doc.getObjectResolver(ID_XPATH).fetch();
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = doc.getObjectResolver(ID_XPATH).fetch(DocumentModel.class);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
    }

    @Test
    public void testIdRefDoesntSupportPath() {
        doc.setPropertyValue(ID_XPATH, pathRef);
        assertNull(doc.getProperty(ID_XPATH).getObjectResolver().fetch());
    }

    @Test
    public void testPathRefCorrectValues() {
        doc.setPropertyValue(PATH_XPATH, pathRef);
        DocumentModel document = (DocumentModel) doc.getProperty(PATH_XPATH).getObjectResolver().fetch();
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = doc.getProperty(PATH_XPATH).getObjectResolver().fetch(DocumentModel.class);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = (DocumentModel) doc.getObjectResolver(PATH_XPATH).fetch();
        assertNotNull(document);
        assertEquals("doc1", document.getName());
        document = doc.getObjectResolver(PATH_XPATH).fetch(DocumentModel.class);
        assertNotNull(document);
        assertEquals("doc1", document.getName());
    }

    @Test
    public void testPathRefFieldDoesntSupportId() {
        doc.setPropertyValue(PATH_XPATH, idRef);
        assertNull(doc.getProperty(PATH_XPATH).getObjectResolver().fetch());
    }

    @Test
    public void testTranslation() {
        DocumentModelResolver iddmrr = new DocumentModelResolver();
        Map<String, String> userParams = new HashMap<String, String>();
        userParams.put(PARAM_STORE, STORE_ID_REF);
        iddmrr.configure(userParams);
        checkMessage(iddmrr);
        DocumentModelResolver pathdmrr = new DocumentModelResolver();
        Map<String, String> groupParams = new HashMap<String, String>();
        groupParams.put(PARAM_STORE, STORE_PATH_REF);
        pathdmrr.configure(groupParams);
        checkMessage(pathdmrr);

    }

    @Test
    public void testSerialization() throws Exception {
        // create it
        DocumentModelResolver resolver = new DocumentModelResolver();
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put(PARAM_STORE, STORE_ID_REF);
        resolver.configure(parameters);
        // write it
        byte[] buffer = SerializationUtils.serialize(resolver);
        // forget the resolver
        resolver = null;
        // read it
        Object readObject = SerializationUtils.deserialize(buffer);
        // check it's a dir resolver
        assertTrue(readObject instanceof DocumentModelResolver);
        DocumentModelResolver readResolver = (DocumentModelResolver) readObject;
        // check the configuration
        Map<String, Serializable> outputParameters = readResolver.getParameters();
        assertEquals(STORE_ID_REF, outputParameters.get(PARAM_STORE));
        // test it works: validate
        assertTrue(readResolver.validate(idRef));
        // test it works: fetch
        Object entity = readResolver.fetch(idRef);
        assertTrue(entity instanceof DocumentModel);
        assertEquals(doc.getPathAsString(), ((DocumentModel) entity).getPathAsString());
        // test it works: getReference
        assertEquals(idRef, readResolver.getReference(doc));
    }

    private void checkMessage(DocumentModelResolver dmrr) {
        for (Locale locale : Arrays.asList(Locale.FRENCH, Locale.ENGLISH)) {
            String message = dmrr.getConstraintErrorMessage("abc123", locale);
            assertNotNull(message);
            assertFalse(message.trim().isEmpty());
            System.out.println(message);
        }
    }

}