/*
* Copyright 2009-2011 Collaborative Research Centre SFB 632
*
* 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.
*/
package annis.administration;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.MockitoAnnotations.initMocks;
public class TestCorpusAdministration
{
@Mock
private AdministrationDao administrationDao;
private CorpusAdministration administration;
@Before
public void setup()
{
initMocks(this);
administration = new CorpusAdministration();
administration.setAdministrationDao(administrationDao);
Mockito.when(administrationDao.importCorpus(Matchers.anyString(), Matchers.
anyString(), Matchers.anyBoolean(), Matchers.anyBoolean())).thenReturn(
Boolean.TRUE);
}
@Test
public void importCorporaOne() throws IOException
{
File f = createDummyANNIS("somePath", "corpus1");
String path = f.getAbsolutePath();
administration.importCorporaSave(true, null, null, false, path);
// insertion of a corpus needs to follow an exact order
InOrder inOrder = inOrder(administrationDao);
verifyPreImport(inOrder);
// verify that the corpus was imported
verifyImport(inOrder, path);
verifyPostImport(inOrder);
inOrder.verify(administrationDao).analyzeParentFacts();
// that should be it
verifyNoMoreInteractions(administrationDao);
}
@Test
public void importCorporaMany() throws IOException
{
File f1 = createDummyANNIS("somePath", "corpus1");
File f2 = createDummyANNIS("anotherPath", "corpus2");
File f3 = createDummyANNIS("yetAnotherPath", "corpus3");
String path1 = f1.getPath();
String path2 = f2.getPath();
String path3 = f3.getPath();
administration.importCorporaSave(true, null, null, false, path1, path2, path3);
// insertion of a corpus needs to follow an exact order
InOrder inOrder = inOrder(administrationDao);
// drop indexes only once
verifyPreImport(inOrder);
// verify that each corpus was inserted in order
verifyImport(inOrder, path1);
verifyImport(inOrder, path2);
verifyImport(inOrder, path3);
inOrder.verify(administrationDao).analyzeParentFacts();
// that should be it
verifyNoMoreInteractions(administrationDao);
}
private File createDummyANNIS(String path, String corpusName) throws IOException
{
File tmp = Files.createTempDir();
tmp.deleteOnExit();
File root = new File(tmp, path);
root.mkdirs();
Files.append("0\t" + corpusName + "\tCORPUS\tNULL\t0\t1",
new File(root, "corpus.annis"), Charsets.UTF_8);
return root;
}
private void verifyPreImport(InOrder inOrder)
{
// no pre import actions yet
}
private void verifyPostImport(InOrder inOrder)
{
// no post import actions yet
}
// a correct import requires this order
private void verifyImport(InOrder inOrder, String path)
{
inOrder.verify(administrationDao).importCorpus(path, null, true, false);
// // create the staging area
// inOrder.verify(administrationDao).createStagingArea(true);
//
// // bulk import the data
// inOrder.verify(administrationDao).bulkImport(path);
//
// // compute and verify top-level corpus
// inOrder.verify(administrationDao).computeTopLevelCorpus();
//
// // update IDs in staging area
// long corpusID = inOrder.verify(administrationDao).updateIds();
//
// // import binaries
// inOrder.verify(administrationDao).importBinaryData(path);
//
// inOrder.verify(administrationDao).createStagingAreaIndexes();
// inOrder.verify(administrationDao).analyzeStagingTables();
//
//
// // post-process the data to speed up queries
// inOrder.verify(administrationDao).computeLeftTokenRightToken();
// inOrder.verify(administrationDao).computeRealRoot();
// inOrder.verify(administrationDao).computeLevel();
//
// // gather statistics about this corpus
// inOrder.verify(administrationDao).computeCorpusStatistics();
//
// inOrder.verify(administrationDao).updateCorpusStatsId(corpusID);
//
// // apply constraints to ensure data integrity
// inOrder.verify(administrationDao).applyConstraints();
//
// inOrder.verify(administrationDao).analyzeStagingTables();
//
// // insert the corpus from the staging area to the main db
// inOrder.verify(administrationDao).insertCorpus();
//
// inOrder.verify(administrationDao).computeCorpusPath(corpusID);
//
// inOrder.verify(administrationDao).createAnnotations(corpusID);
//
// // the facts child table must be created
//
// inOrder.verify(administrationDao).createFacts(corpusID);
//
// inOrder.verify(administrationDao).updateCorpusStatistic();
//
// // drop the staging area is not necessary, because we have no staging area in this test
// inOrder.verify(administrationDao).dropStagingArea();
//
// // analyze facts table
// inOrder.verify(administrationDao).analyzeFacts(corpusID);
}
}