/* * Licensed to DuraSpace under one or more contributor license agreements. * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * DuraSpace licenses this file to you 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. */ package org.fcrepo.integration.kernel.modeshape.services; import static org.fcrepo.kernel.modeshape.FedoraSessionImpl.getJcrSession; import static org.fcrepo.kernel.modeshape.utils.FedoraTypesUtils.getJcrNode; import static org.junit.Assert.assertEquals; import org.fcrepo.integration.kernel.modeshape.AbstractIT; import org.fcrepo.kernel.api.FedoraRepository; import org.fcrepo.kernel.api.FedoraSession; import org.fcrepo.kernel.api.exception.RepositoryRuntimeException; import org.fcrepo.kernel.api.models.FedoraResource; import org.fcrepo.kernel.api.services.NodeService; import org.fcrepo.kernel.api.services.ContainerService; import org.fcrepo.kernel.api.services.VersionService; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import javax.inject.Inject; import javax.jcr.RepositoryException; import javax.jcr.version.VersionHistory; /** * @author escowles * @since 2014-05-29 */ @ContextConfiguration({"/spring-test/repo.xml"}) public class VersionServiceImplIT extends AbstractIT { @Inject private FedoraRepository repository; @Inject NodeService nodeService; @Inject ContainerService containerService; @Inject VersionService versionService; private static final String LABEL = "label"; private static final String SECOND_LABEL = "second-label"; @Test public void testCreateVersion() throws RepositoryException { final FedoraSession session = repository.login(); final String pid = getRandomPid(); final FedoraResource resource = containerService.findOrCreate(session, "/" + pid); session.commit(); // create a version and make sure there are 2 versions (root + created) versionService.createVersion(session, "/" + pid, LABEL); session.commit(); assertEquals(2L, countVersions(session, resource)); } @Test public void testRemoveVersion() throws RepositoryException { final FedoraSession session = repository.login(); final String pid = getRandomPid(); final FedoraResource resource = containerService.findOrCreate(session, "/" + pid); session.commit(); // create a version and make sure there are 2 versions (root + created) versionService.createVersion(session, "/" + pid, LABEL); session.commit(); assertEquals(2L, countVersions(session, resource)); // create another version versionService.createVersion(session, "/" + pid, SECOND_LABEL); session.commit(); assertEquals(3L, countVersions(session, resource)); // remove the old version and make sure there two versions again versionService.removeVersion( session, "/" + pid,LABEL ); session.commit(); assertEquals(2L, countVersions(session, resource)); } @Test public void testRevertToVersion() throws RepositoryException { final FedoraSession session = repository.login(); final String pid = getRandomPid(); final FedoraResource resource = containerService.findOrCreate(session, "/" + pid); session.commit(); // create a version and make sure there are 2 versions (root + created) final String label = versionService.createVersion(session, "/" + pid, LABEL); session.commit(); assertEquals(2L, countVersions(session, resource)); // create another version versionService.createVersion(session, "/" + pid, SECOND_LABEL); session.commit(); assertEquals(3L, countVersions(session, resource)); // revert to the old version and make sure there two versions again versionService.revertToVersion( session, "/" + pid, LABEL ); session.commit(); assertEquals(label, currentVersion(session,resource)); } @Test( expected = RepositoryRuntimeException.class ) public void testRevertToInvalidVersion() throws RepositoryException { final FedoraSession session = repository.login(); final String pid = getRandomPid(); final FedoraResource resource = containerService.findOrCreate(session, "/" + pid); session.commit(); // create a version and make sure there are 2 versions (root + created) versionService.createVersion(session, "/" + pid, LABEL); session.commit(); assertEquals(2L, countVersions(session, resource)); // revert to an invalid version versionService.revertToVersion( session, "/" + pid, "invalid-version-label" ); session.commit(); } @Test( expected = RepositoryRuntimeException.class ) public void testRemoveInvalidVersion() throws RepositoryException { final FedoraSession session = repository.login(); final String pid = getRandomPid(); final FedoraResource resource = containerService.findOrCreate(session, "/" + pid); session.commit(); // create a version and make sure there are 2 versions (root + created) versionService.createVersion(session, "/" + pid, LABEL); session.commit(); assertEquals(2L, countVersions(session, resource)); // revert to an invalid version versionService.removeVersion( session, "/" + pid, "invalid-version-label" ); session.commit(); } private static String currentVersion(final FedoraSession session, final FedoraResource resource ) throws RepositoryException { return getJcrSession(session).getWorkspace().getVersionManager().getBaseVersion(getJcrNode(resource).getPath()) .getFrozenNode().getIdentifier(); } private static long countVersions(final FedoraSession session, final FedoraResource resource ) throws RepositoryException { final VersionHistory versions = getJcrSession(session).getWorkspace().getVersionManager().getVersionHistory( getJcrNode(resource).getPath() ); return versions.getAllVersions().getSize(); } }