/* * (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); } } }