/*
* Copyright (C) 2014 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.imports;
import cz.cas.lib.proarc.common.CustomTemporaryFolder;
import cz.cas.lib.proarc.common.config.AppConfiguration;
import cz.cas.lib.proarc.common.config.AppConfigurationFactory;
import cz.cas.lib.proarc.common.dao.Batch;
import cz.cas.lib.proarc.common.dao.BatchItem.ObjectState;
import cz.cas.lib.proarc.common.dao.empiredb.DbUnitSupport;
import cz.cas.lib.proarc.common.dao.empiredb.EmpireBatchDaoTest;
import cz.cas.lib.proarc.common.dao.empiredb.EmpireDaoFactory;
import cz.cas.lib.proarc.common.dao.empiredb.SqlTransaction;
import cz.cas.lib.proarc.common.fedora.FedoraTestSupport;
import cz.cas.lib.proarc.common.fedora.LocalStorage;
import cz.cas.lib.proarc.common.fedora.LocalStorage.LocalObject;
import cz.cas.lib.proarc.common.fedora.RemoteStorage;
import cz.cas.lib.proarc.common.fedora.RemoteStorage.RemoteObject;
import cz.cas.lib.proarc.common.fedora.SearchView;
import cz.cas.lib.proarc.common.fedora.SearchView.Item;
import cz.cas.lib.proarc.common.fedora.relation.RelationEditor;
import cz.cas.lib.proarc.common.imports.ImportBatchManager.BatchItemObject;
import cz.cas.lib.proarc.common.object.model.MetaModelRepository;
import cz.cas.lib.proarc.common.object.ndk.NdkPlugin;
import java.io.File;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dbunit.dataset.CompositeDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.rules.TestName;
/**
*
* @author Jan Pokorsky
*/
public class FedoraImportTest {
@Rule
public CustomTemporaryFolder temp = new CustomTemporaryFolder();
@Rule
public TestName testName = new TestName();
private AppConfiguration appConf;
private static DbUnitSupport dbsupport;
private static EmpireDaoFactory daos;
private FedoraImport fedoraImport;
private static FedoraTestSupport fedoraSupport;
private ImportBatchManager ibm;
private LocalStorage localStorage;
private RemoteStorage remoteStorage;
private SearchView search;
public FedoraImportTest() {
}
@BeforeClass
public static void setUpClass() {
fedoraSupport = new FedoraTestSupport();
dbsupport = new DbUnitSupport();
daos = new EmpireDaoFactory(dbsupport.getEmireCfg());
daos.init();
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() throws Exception {
fedoraSupport.cleanUp();
MetaModelRepository.setInstance(new String[0]);
localStorage = new LocalStorage();
remoteStorage = RemoteStorage.getInstance();
search = remoteStorage.getSearch();
File configHome = temp.newFolder(AppConfiguration.DEFAULT_APP_HOME_NAME);
Map<String, String> env = new HashMap<String, String>();
env.put(AppConfiguration.PROPERTY_APP_HOME, configHome.toString());
appConf = AppConfigurationFactory.getInstance().create(env);
ibm = new ImportBatchManager(appConf, daos);
fedoraImport = new FedoraImport(remoteStorage, ibm);
}
@After
public void tearDown() {
}
private ReplacementDataSet database(IDataSet... ds) throws Exception {
ReplacementDataSet rds = new ReplacementDataSet(new CompositeDataSet(ds));
rds.addReplacementObject("{$user.home}", "relative/path/");
Timestamp dbTimestamp = new Timestamp(System.currentTimeMillis());
rds.addReplacementObject("{$now}", dbTimestamp);
return rds;
}
@Test
public void testImportItem() throws Exception {
File batchFolder = temp.newFolder("batch");
// prepare foxml 1
LocalObject lobj = localStorage.create(new File(batchFolder, "item1.foxml"));
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel("item1");
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel("model:page");
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
// prepare remote parent
RemoteObject parent = createParent(testName.getMethodName() + "_parent");
ReplacementDataSet db = database(
dbsupport.loadFlatXmlDataStream(EmpireBatchDaoTest.class, "user.xml"),
dbsupport.loadFlatXmlDataStream(getClass(), "batch.xml")
);
db.addReplacementObject("{$parent_pid}", parent.getPid());
SqlTransaction tx = daos.createTransaction();
dbsupport.cleanInsert(dbsupport.getConnection(tx), db);
tx.commit();
// add item 1
Batch batch = ibm.get(1);
assertNotNull(batch);
BatchItemObject item1 = ibm.addLocalObject(batch, lobj);
item1.setState(ObjectState.LOADED);
ibm.update(item1);
// import
BatchItemObject result = fedoraImport.importItem(
item1, fedoraSupport.getTestUser(), false);
assertNotNull(result);
assertEquals(ObjectState.INGESTED, result.getState());
result = ibm.findBatchObject(batch.getId(), item1.getPid());
assertEquals(ObjectState.INGESTED, result.getState());
List<Item> fItems = search.find(lobj.getPid());
assertEquals(1, fItems.size());
FedoraTestSupport.assertItem(fItems, lobj.getPid());
}
@Test
public void testImportItemFailure() throws Exception {
File batchFolder = temp.newFolder("batch");
// prepare foxml 1
LocalObject lobj = localStorage.create(new File(batchFolder, "item1.foxml"));
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel("item1");
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel("model:page");
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
// prepare remote parent
RemoteObject parent = createParent(testName.getMethodName() + "_parent");
ReplacementDataSet db = database(
dbsupport.loadFlatXmlDataStream(EmpireBatchDaoTest.class, "user.xml"),
dbsupport.loadFlatXmlDataStream(getClass(), "batch.xml")
);
db.addReplacementObject("{$parent_pid}", parent.getPid());
SqlTransaction tx = daos.createTransaction();
dbsupport.cleanInsert(dbsupport.getConnection(tx), db);
tx.commit();
// add item 1
Batch batch = ibm.get(1);
assertNotNull(batch);
BatchItemObject item1 = ibm.addLocalObject(batch, lobj);
item1.setState(ObjectState.LOADED);
ibm.update(item1);
// import deleted foxml
assertTrue(lobj.getFoxml().delete());
BatchItemObject result = fedoraImport.importItem(
item1, fedoraSupport.getTestUser(), false);
assertNotNull(result);
assertEquals(ObjectState.INGESTING_FAILED, result.getState());
assertNotNull(result.getLog());
result = ibm.findBatchObject(batch.getId(), item1.getPid());
assertEquals(ObjectState.INGESTING_FAILED, result.getState());
assertNotNull(result.getLog());
List<Item> fItems = search.find(lobj.getPid());
assertEquals(0, fItems.size());
}
@Test
public void testImportItemRepairFailure() throws Exception {
File batchFolder = temp.newFolder("batch");
// prepare foxml 1
LocalObject lobj = localStorage.create(new File(batchFolder, "item1.foxml"));
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel("item1");
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel("model:page");
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
// prepare remote parent
RemoteObject parent = createParent(testName.getMethodName() + "_parent");
ReplacementDataSet db = database(
dbsupport.loadFlatXmlDataStream(EmpireBatchDaoTest.class, "user.xml"),
dbsupport.loadFlatXmlDataStream(getClass(), "batch.xml")
);
db.addReplacementObject("{$parent_pid}", parent.getPid());
SqlTransaction tx = daos.createTransaction();
dbsupport.cleanInsert(dbsupport.getConnection(tx), db);
tx.commit();
// add item 1
Batch batch = ibm.get(1);
assertNotNull(batch);
BatchItemObject item1 = ibm.addLocalObject(batch, lobj);
item1.setState(ObjectState.INGESTING_FAILED);
item1.setLog("failure");
ibm.update(item1);
// import
BatchItemObject result = fedoraImport.importItem(
item1, fedoraSupport.getTestUser(), true);
assertNotNull(result);
assertEquals(ObjectState.INGESTED, result.getState());
assertNull(result.getLog());
result = ibm.findBatchObject(batch.getId(), item1.getPid());
assertEquals(ObjectState.INGESTED, result.getState());
assertNull(result.getLog());
List<Item> fItems = search.find(lobj.getPid());
assertEquals(1, fItems.size());
FedoraTestSupport.assertItem(fItems, lobj.getPid());
}
@Test
public void testImportItemRepairNotLinked() throws Exception {
File batchFolder = temp.newFolder("batch");
// prepare foxml 1
LocalObject lobj = localStorage.create(new File(batchFolder, "item1.foxml"));
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel("item1");
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel("model:page");
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
// ingested but not linked by parent; caused by a blackout
remoteStorage.ingest(lobj, fedoraSupport.getTestUser(), "junit");
// prepare remote parent
RemoteObject parent = createParent(testName.getMethodName() + "_parent");
ReplacementDataSet db = database(
dbsupport.loadFlatXmlDataStream(EmpireBatchDaoTest.class, "user.xml"),
dbsupport.loadFlatXmlDataStream(getClass(), "batch.xml")
);
db.addReplacementObject("{$parent_pid}", parent.getPid());
SqlTransaction tx = daos.createTransaction();
dbsupport.cleanInsert(dbsupport.getConnection(tx), db);
tx.commit();
// add item 1
Batch batch = ibm.get(1);
assertNotNull(batch);
BatchItemObject item1 = ibm.addLocalObject(batch, lobj);
item1.setState(ObjectState.INGESTED);
ibm.update(item1);
// import
BatchItemObject result = fedoraImport.importItem(
item1, fedoraSupport.getTestUser(), true);
assertNotNull(result);
assertEquals(ObjectState.INGESTED, result.getState());
result = ibm.findBatchObject(batch.getId(), item1.getPid());
assertEquals(ObjectState.INGESTED, result.getState());
List<Item> fItems = search.find(lobj.getPid());
assertEquals(1, fItems.size());
FedoraTestSupport.assertItem(fItems, lobj.getPid());
}
@Test
public void testImportItemRepairLinked() throws Exception {
File batchFolder = temp.newFolder("batch");
// prepare foxml 1
LocalObject lobj = localStorage.create(new File(batchFolder, "item1.foxml"));
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel("item1");
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel("model:page");
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
// ingested and linked by parent; caused by a following blackout
remoteStorage.ingest(lobj, fedoraSupport.getTestUser(), "junit");
// prepare remote parent
RemoteObject parent = createParent(testName.getMethodName() + "_parent", lobj.getPid());
ReplacementDataSet db = database(
dbsupport.loadFlatXmlDataStream(EmpireBatchDaoTest.class, "user.xml"),
dbsupport.loadFlatXmlDataStream(getClass(), "batch.xml")
);
db.addReplacementObject("{$parent_pid}", parent.getPid());
SqlTransaction tx = daos.createTransaction();
dbsupport.cleanInsert(dbsupport.getConnection(tx), db);
tx.commit();
// add item 1
Batch batch = ibm.get(1);
assertNotNull(batch);
BatchItemObject item1 = ibm.addLocalObject(batch, lobj);
item1.setState(ObjectState.INGESTED);
ibm.update(item1);
// import
BatchItemObject result = fedoraImport.importItem(
item1, fedoraSupport.getTestUser(), true);
// test skipped by repair process
assertNull(result);
result = ibm.findBatchObject(batch.getId(), item1.getPid());
assertEquals(ObjectState.INGESTED, result.getState());
List<Item> fItems = search.find(lobj.getPid());
assertEquals(1, fItems.size());
FedoraTestSupport.assertItem(fItems, lobj.getPid());
}
private RemoteObject createParent(String label, String... childPid) throws Exception {
LocalObject lobj = localStorage.create();
lobj.setOwner(fedoraSupport.getTestUser());
lobj.setLabel(label);
RelationEditor locRels = new RelationEditor(lobj);
locRels.setModel(NdkPlugin.MODEL_MONOGRAPHVOLUME);
locRels.setMembers(Arrays.asList(childPid));
locRels.write(locRels.getLastModified(), "test");
lobj.flush();
remoteStorage.ingest(lobj, lobj.getOwner(), "junit test");
return remoteStorage.find(lobj.getPid());
}
}