/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.assetmanager.impl; import static org.junit.Assert.assertEquals; import org.opencastproject.assetmanager.impl.persistence.EntityPaths; import org.opencastproject.mediapackage.MediaPackage; import org.opencastproject.security.api.DefaultOrganization; import com.mysema.query.jpa.JPASubQuery; import org.junit.Test; public class AbstractAssetManagerDeleteSnapshotTest extends AbstractAssetManagerDeleteTestBase implements EntityPaths { // run asset manager or raw JPA queries private static final boolean RUN_RAW_QUERIES = false; /** * Deleting a whole episode should also delete all of its properties. * This test case deletes all snapshots. */ @Test public void testDeleteAll() throws Exception { final int mpCount = 3; final String[] mp = createAndAddMediaPackagesSimple(mpCount, 1, 1); am.setProperty(p.agent.mk(mp[0], "agent-1")); am.setProperty(p.agent.mk(mp[1], "agent-2")); am.setProperty(p.agent.mk(mp[2], "agent-2")); assertTotals(mpCount, mpCount, 3); assertStoreSize(6); assertEquals(3, q.delete(OWNER, q.snapshot()).run()); assertTotals(0, 0, 0); assertStoreSize(0); } /** * Deleting a complete episode should also delete all of its properties. * This test case deletes all versions (snapshots) of one episode. */ @Test public void testDeleteAllVersionsOfOne() throws Exception { final int mpCount = 3; final int versionCount = 5; final String[] mp = createAndAddMediaPackagesSimple(mpCount, versionCount, versionCount); // each mp has one property am.setProperty(p.agent.mk(mp[0], "agent-1")); am.setProperty(p.agent.mk(mp[1], "agent-2")); am.setProperty(p.agent.mk(mp[2], "agent-2")); assertTotals(mpCount * versionCount, mpCount * versionCount, 3); assertStoreSize(mpCount * versionCount * 2); if (RUN_RAW_QUERIES) { delete(Q_PROPERTY, Q_PROPERTY.mediaPackageId.eq(mp[0])); delete(Q_ASSET, Q_ASSET.snapshotId.in(new JPASubQuery().from(Q_SNAPSHOT).where(Q_SNAPSHOT.mediaPackageId.eq(mp[0])).list(Q_SNAPSHOT.id))); delete(Q_SNAPSHOT, Q_SNAPSHOT.mediaPackageId.eq(mp[0])); } else { assertEquals(versionCount, q.delete(OWNER, q.snapshot()).where(q.mediaPackageId(mp[0])).run()); } assertTotals((mpCount - 1) * versionCount, (mpCount - 1) * versionCount, 2); assertStoreSize((mpCount - 1) * versionCount * 2); assertPropertiesOfMediaPackage(0, mp[0]); } /** * If, after deleting versions of an episode at least one version remains, no properties of the episode should be deleted. */ @Test public void testDeleteOneVersionOfOne() throws Exception { final String[] mp = createAndAddMediaPackagesSimple(3, 2, 2); am.setProperty(p.agent.mk(mp[0], "agent-1")); am.setProperty(p.agent.mk(mp[1], "agent-2")); am.setProperty(p.agent.mk(mp[2], "agent-2")); assertTotals(6, 6, 3); assertStoreSize(6 * 2); if (RUN_RAW_QUERIES) { assertEquals(3, delete(Q_ASSET, Q_ASSET.snapshotId.in( new JPASubQuery().from(Q_SNAPSHOT).where( Q_SNAPSHOT.version.eq( new JPASubQuery().from(Q_SNAPSHOT).unique(Q_SNAPSHOT.version.min()))) .list(Q_SNAPSHOT.id)))); assertEquals(3, delete(Q_SNAPSHOT, Q_SNAPSHOT.version.eq( new JPASubQuery().from(Q_SNAPSHOT).unique(Q_SNAPSHOT.version.min())))); } else { assertEquals("Three snapshots should be deleted", 3, q.delete(OWNER, q.snapshot()).where(q.version().isFirst()).run()); } assertTotals(3, 3, 3); assertStoreSize(3 * 2); } /** * If, after deleting versions of an episode no version remains, all properties of the episode should be deleted. */ @Test public void testDeleteAllVersionsOfOne2() throws Exception { final String[] mp = createAndAddMediaPackagesSimple(3, 2, 2); am.setProperty(p.agent.mk(mp[0], "agent-1")); am.setProperty(p.agent.mk(mp[1], "agent-2")); am.setProperty(p.agent.mk(mp[2], "agent-2")); assertTotals(6, 6, 3); assertStoreSize(6 * 2); assertEquals("Three snapshots should be deleted", 3, q.delete(OWNER, q.snapshot()).where(q.version().isFirst()).run()); assertTotals(3, 3, 3); assertStoreSize(3 * 2); } @Test public void testDeleteByProperty() throws Exception { final String[] mp = createAndAddMediaPackagesSimple(3, 1, 1); am.setProperty(p.agent.mk(mp[0], "agent-1")); am.setProperty(p.agent.mk(mp[2], "agent-1")); am.setProperty(p.agent.mk(mp[1], "agent-2")); assertTotals(3, 3, 3); assertStoreSize(3 * 2); if (RUN_RAW_QUERIES) { /* DELETE FROM mh_assets_asset WHERE mh_assets_asset.snapshot_id IN ( SELECT e.id FROM mh_assets_snapshot e LEFT JOIN mh_assets_properties p ON p.mediapackage_id = e.mediapackage_id WHERE p.namespace = 'org.opencastproject.service' AND p.property_name = 'agent' AND p.val_string = 'agent-2' ); Query: DeleteAllQuery(referenceClass=AssetDto jpql="delete from Asset assetDto where assetDto.snapshotId in (select episodeDto.id from Snapshot snapshotDto left join Property propertyDto on snapshotDto.mediaPackageId = propertyDto.mediaPackageId where propertyDto.namespace = ?1 and propertyDto.propertyName = ?2 and propertyDto.stringValue = ?3)") */ assertEquals(2, delete( Q_ASSET, Q_ASSET.snapshotId.in( new JPASubQuery() .from(Q_SNAPSHOT, Q_PROPERTY) .where(Q_PROPERTY.mediaPackageId.eq(Q_SNAPSHOT.mediaPackageId) .and(Q_PROPERTY.namespace.eq(p.agent.name().getNamespace())) .and(Q_PROPERTY.propertyName.eq(p.agent.name().getName())) .and(Q_PROPERTY.stringValue.eq("agent-1"))) .list(Q_SNAPSHOT.id)))); assertEquals(2, delete( Q_SNAPSHOT, Q_SNAPSHOT.mediaPackageId.in( new JPASubQuery() .from(Q_PROPERTY) .where(Q_PROPERTY.mediaPackageId.eq(Q_SNAPSHOT.mediaPackageId) .and(Q_PROPERTY.namespace.eq(p.agent.name().getNamespace())) .and(Q_PROPERTY.propertyName.eq(p.agent.name().getName())) .and(Q_PROPERTY.stringValue.eq("agent-1"))) .list(Q_PROPERTY.mediaPackageId)))); assertEquals(2, delete( Q_PROPERTY, Q_PROPERTY.namespace.eq(p.agent.name().getNamespace()) .and(Q_PROPERTY.propertyName.eq(p.agent.name().getName())) .and(Q_PROPERTY.stringValue.eq("agent-1")))); } else { assertEquals("Two snapshots should be deleted", 2, q.delete(OWNER, q.snapshot()).where(p.agent.eq("agent-1")).run()); } assertTotals(1, 1, 1); assertStoreSize(2); } @Test public void testDeleteByOrganizationAndPropertyExistence() { final String[] mp = createAndAddMediaPackagesSimple(3, 1, 1); am.setProperty(p.agent.mk(mp[0], "agent-1")); assertTotals(3, 3, 1); assertEquals(2, q.delete(OWNER, q.snapshot()).where(q.organizationId(DefaultOrganization.DEFAULT_ORGANIZATION_ID).and(q.hasProperties().not())).run()); assertTotals(1, 1, 1); } @Test public void testOwnership() throws Exception { final MediaPackage mp = mkMediaPackage(mkCatalog()); am.takeSnapshot("owner-1", mp); am.takeSnapshot("owner-2", mp); am.takeSnapshot("owner-3", mp); am.takeSnapshot("owner-3", mp); am.setProperty(p.agent.mk(mp.getIdentifier().toString(), "agent")); // assertEquals("There should be 1 property", 1, q.select(q.propertiesOf()).where(q.version().isLatest()).run().getSize()); assertEquals("There should be 4 snapshots", 4, q.select(q.snapshot()).run().getSize()); // assertEquals("Two snapshots should be deleted", 2, q.delete("owner-3", q.snapshot()).run()); assertEquals("There should be 2 snapshots left", 2, q.select(q.snapshot()).run().getSize()); // assertEquals("Property should be deleted since ownership is being ignored when deleting properties", 1, q.delete("owner-3", p.agent.target()).run()); assertEquals("Property has already been deleted", 0, q.delete("owner-1", p.agent.target()).run()); assertEquals("There should be no more properties", 0, q.select().where(p.agent.exists()).run().getSize()); // // Wildcard deletion. Disabled as of ticket CERV-1158. Kept for potentially later reference. // assertEquals("All remaining snapshots should be deleted", 2, q.delete("", q.snapshot()).run()); // assertEquals("There should be no more snapshots", 0, q.select(q.snapshot()).run().getSize()); } }