/** * Copyright (c) Codice Foundation * <p/> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p/> * 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 * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package ddf.catalog.source.solr; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.codice.solr.factory.ConfigurationFileProxy; import org.codice.solr.factory.ConfigurationStore; import org.codice.solr.factory.SolrServerFactory; import org.joda.time.DateTime; import org.junit.BeforeClass; import org.opengis.filter.Filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ddf.catalog.data.Metacard; import ddf.catalog.data.Result; import ddf.catalog.filter.proxy.adapter.GeotoolsFilterAdapterImpl; import ddf.catalog.operation.CreateResponse; import ddf.catalog.operation.DeleteResponse; import ddf.catalog.operation.Query; import ddf.catalog.operation.QueryRequest; import ddf.catalog.operation.SourceResponse; import ddf.catalog.operation.UpdateResponse; import ddf.catalog.operation.impl.CreateRequestImpl; import ddf.catalog.operation.impl.DeleteRequestImpl; import ddf.catalog.operation.impl.QueryImpl; import ddf.catalog.operation.impl.QueryRequestImpl; import ddf.catalog.operation.impl.UpdateRequestImpl; import ddf.catalog.source.IngestException; import ddf.catalog.source.UnsupportedQueryException; public abstract class SolrProviderTestCase { protected static final int ALL_RESULTS = -1; protected static final String MASKED_ID = "scp"; private static final Logger LOGGER = LoggerFactory.getLogger(TestSolrProvider.class); private static final int TEST_METHOD_NAME_INDEX = 3; private static final int ONE_SECOND = 1; private static final int TIME_STEP_10SECONDS = 10 * ONE_SECOND; private static final int TIME_STEP_30SECONDS = 30 * ONE_SECOND; private static final int A_LITTLE_WHILE = TIME_STEP_10SECONDS; protected static TestSolrFilterBuilder filterBuilder = new TestSolrFilterBuilder(); protected static SolrCatalogProvider provider = null; @BeforeClass public static void setup() throws Exception { LOGGER.info("RUNNING one-time setup."); ConfigurationStore.getInstance().setDataDirectoryPath("target/solr"); ConfigurationStore.getInstance().setForceAutoCommit(true); ConfigurationFileProxy configurationFileProxy = new ConfigurationFileProxy( ConfigurationStore.getInstance()); provider = new SolrCatalogProvider(SolrServerFactory .getEmbeddedSolrServer("solrconfig.xml", "schema.xml", configurationFileProxy), new GeotoolsFilterAdapterImpl(), new SolrFilterDelegateFactoryImpl()); // Mask the id, this is something that the CatalogFramework would // usually do provider.setId(MASKED_ID); } protected static void messageBreak(String string) { String stars = StringUtils.repeat("*", string.length() + 2); LOGGER.info(stars); LOGGER.info("* {}", string); LOGGER.info(stars); } protected static void deleteAllIn(SolrCatalogProvider solrProvider) throws IngestException, UnsupportedQueryException { deleteAllIn(solrProvider, TEST_METHOD_NAME_INDEX); } protected static void deleteAllIn(SolrCatalogProvider solrProvider, int methodNameIndex) throws IngestException, UnsupportedQueryException { messageBreak( Thread.currentThread().getStackTrace()[methodNameIndex].getMethodName() + "()"); boolean isCaseSensitive = false; boolean isFuzzy = false; QueryImpl query = null; SourceResponse sourceResponse = null; CommonQueryBuilder queryBuilder = new CommonQueryBuilder(); query = queryBuilder.like(Metacard.ID, "*", isCaseSensitive, isFuzzy); query.setPageSize(ALL_RESULTS); sourceResponse = solrProvider.query(new QueryRequestImpl(query)); List<String> ids = new ArrayList<String>(); for (Result r : sourceResponse.getResults()) { ids.add(r.getMetacard().getId()); } LOGGER.info("Records found for deletion: {}", ids); provider.delete(new DeleteRequestImpl(ids.toArray(new String[ids.size()]))); LOGGER.info("Deletion complete. -----------"); } protected static CreateResponse createIn(List<Metacard> metacards, SolrCatalogProvider solrProvider) throws IngestException { CreateResponse createResponse = solrProvider.create(new CreateRequestImpl(metacards)); return createResponse; } protected QueryRequest quickQuery(Filter filter) { return new QueryRequestImpl(new QueryImpl(filter)); } protected void deleteAll() throws IngestException, UnsupportedQueryException { deleteAllIn(provider); } protected void queryAndVerifyCount(int count, Filter filter) throws UnsupportedQueryException { Query query = new QueryImpl(filter); QueryRequest request = new QueryRequestImpl(query); SourceResponse response = provider.query(request); assertEquals(count, response.getResults().size()); } protected DeleteResponse delete(String identifier) throws IngestException { return delete(new String[] {identifier}); } protected DeleteResponse delete(String[] identifier) throws IngestException { DeleteResponse deleteResponse = provider.delete(new DeleteRequestImpl(identifier)); return deleteResponse; } protected UpdateResponse update(String id, Metacard metacard) throws IngestException { String[] ids = {id}; return update(ids, Arrays.asList(metacard)); } protected UpdateResponse update(String[] ids, List<Metacard> list) throws IngestException { UpdateResponse updateResponse = provider.update(new UpdateRequestImpl(ids, list)); return updateResponse; } protected CreateResponse create(Metacard metacard) throws IngestException { return create(Arrays.asList(metacard)); } protected CreateResponse create(List<Metacard> metacards) throws IngestException { return createIn(metacards, provider); } protected List<Metacard> addMetacardWithModifiedDate(DateTime now) throws IngestException { List<Metacard> list = new ArrayList<Metacard>(); MockMetacard m = new MockMetacard(Library.getFlagstaffRecord()); m.setEffectiveDate(dateNow(now)); list.add(m); create(list); return list; } protected List<Result> getResultsForFilteredQuery(Filter filter) throws UnsupportedQueryException { QueryImpl query = new QueryImpl(filter); SourceResponse sourceResponse = provider.query(new QueryRequestImpl(query)); return sourceResponse.getResults(); } protected Date dateAfterNow(DateTime now) { return now.plusSeconds(A_LITTLE_WHILE).toDate(); } protected Date dateBeforeNow(DateTime now) { return now.minusSeconds(A_LITTLE_WHILE).toDate(); } protected Date dateNow(DateTime now) { return now.toDate(); } }