/**
* Copyright (C) 2014 Cohesive Integrations, LLC (info@cohesiveintegrations.com)
*
* 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 net.di2e.ecdr.search.transform.atom.response;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.activation.MimeType;
import net.di2e.ecdr.api.security.SecurityConfiguration;
import net.di2e.ecdr.commons.constants.SearchConstants;
import net.di2e.ecdr.commons.filter.config.AtomSearchResponseTransformerConfig;
import net.di2e.ecdr.search.transform.atom.AtomTransformer;
import net.di2e.ecdr.search.transform.atom.geo.GeoHelper;
import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.Entry;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.XMLUnit;
import org.geotools.filter.text.cql2.CQL;
import org.junit.BeforeClass;
import org.junit.Test;
import ddf.action.ActionProvider;
import ddf.catalog.data.BinaryContent;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.operation.ProcessingDetails;
import ddf.catalog.operation.QueryRequest;
import ddf.catalog.operation.SourceResponse;
import ddf.catalog.operation.impl.ProcessingDetailsImpl;
import ddf.catalog.operation.impl.QueryImpl;
import ddf.catalog.operation.impl.QueryRequestImpl;
import ddf.catalog.operation.impl.QueryResponseImpl;
import ddf.catalog.source.UnsupportedQueryException;
/**
* Test out the atom transformer
*/
public class AtomTransformerTest extends net.di2e.ecdr.search.transform.atom.response.AtomTest {
private static final String RESPONSE_FILE = "/exampleResponse.xml";
@BeforeClass
public static void setUp() {
XMLUnit.setControlParser("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
XMLUnit.setTestParser("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
XMLUnit.setSAXParserFactory("org.apache.xerces.jaxp.SAXParserFactoryImpl");
XMLUnit.setTransformerFactory("org.apache.xalan.processor.TransformerFactoryImpl");
XMLUnit.setNormalize(true);
XMLUnit.setNormalizeWhitespace(true);
}
@Test
public void testPointTransform() throws Exception {
// use gml georss (default)
Entry entry = performTransform(POINT_WKT, true);
compareXML(GML_POINT, entry.getExtension(GeoHelper.QNAME_WHERE));
// use simple georss
entry = performTransform(POINT_WKT, false);
compareXML(SIMPLE_POINT, entry.getExtension(GeoHelper.QNAME_SIMPLE_POINT));
}
@Test
public void testLineTransform() throws Exception {
// use gml georss (default)
Entry entry = performTransform(LINE_WKT, true);
compareXML(GML_LINE, entry.getExtension(GeoHelper.QNAME_WHERE));
// use simple georss
entry = performTransform(LINE_WKT, false);
compareXML(SIMPLE_LINE, entry.getExtension(GeoHelper.QNAME_SIMPLE_LINE));
}
@Test
public void testBoxTransform() throws Exception {
// use gml georss (default)
Entry entry = performTransform(BOX_WKT, true);
compareXML(GML_BOX, entry.getExtension(GeoHelper.QNAME_WHERE));
// use simple georss
entry = performTransform(BOX_WKT, false);
compareXML(SIMPLE_BOX, entry.getExtension(GeoHelper.QNAME_SIMPLE_BOX));
}
@Test
public void testPolygonTransform() throws Exception {
// use gml georss (default)
Entry entry = performTransform(POLYGON_WKT, true);
compareXML(GML_POLYGON, entry.getExtension(GeoHelper.QNAME_WHERE));
// use simple georss
entry = performTransform(POLYGON_WKT, false);
compareXML(SIMPLE_POLYGON, entry.getExtension(GeoHelper.QNAME_SIMPLE_POLYGON));
}
@Test
public void testResponseTransform() throws Exception {
String sourceName = "Example";
String sourceName2 = "Bad Example";
AtomResponseTransformer responseTransformer = new AtomResponseTransformer( new AtomSearchResponseTransformerConfig() );
QueryRequest request = new QueryRequestImpl( new QueryImpl( CQL.toFilter( "title like 'test'" ) ) );
SourceResponse sourceResponse = responseTransformer.processSearchResponse( getClass().getResourceAsStream( RESPONSE_FILE ), request, sourceName );
QueryResponseImpl queryResponse = new QueryResponseImpl( sourceResponse, sourceName );
Map<String, Serializable> queryProperties = new HashMap<>();
queryProperties.put( "site-list", new ArrayList<>( Arrays.asList( sourceName, sourceName2 ) ) );
queryProperties.put( sourceName, getSiteMap() );
queryProperties.put( sourceName2, getSiteMap() );
queryResponse.setProperties( queryProperties );
Set<ProcessingDetails> details = new HashSet<>();
ProcessingDetailsImpl goodSite = new ProcessingDetailsImpl();
goodSite.setSourceId( sourceName );
details.add( goodSite );
ProcessingDetailsImpl badSite = new ProcessingDetailsImpl();
badSite.setSourceId( sourceName2 );
badSite.setException( new UnsupportedQueryException( "Unsupported test query" ) );
badSite.setWarnings( Arrays.asList( "Example Warning" ) );
details.add( badSite );
queryResponse.setProcessingDetails( details );
AtomTransformer transformer = createTransformer();
Map<String, Serializable> properties = new HashMap<>();
properties.put( SearchConstants.STATUS_PARAMETER, Boolean.TRUE );
properties.put( SearchConstants.PATH_PARAMETER, "/path" );
transformer.transform( queryResponse, properties );
}
@Test
public void testResponseTransformNoDetails() throws Exception {
String sourceName = "Example";
AtomResponseTransformer responseTransformer = new AtomResponseTransformer( new AtomSearchResponseTransformerConfig() );
QueryRequest request = new QueryRequestImpl( new QueryImpl( CQL.toFilter( "title like 'test'" ) ) );
SourceResponse sourceResponse = responseTransformer.processSearchResponse( getClass().getResourceAsStream( RESPONSE_FILE ), request, sourceName );
QueryResponseImpl queryResponse = new QueryResponseImpl( sourceResponse, sourceName );
Map<String, Serializable> queryProperties = new HashMap<>();
queryProperties.put( "site-list", new ArrayList<>( Arrays.asList( sourceName ) ) );
queryProperties.put( sourceName, getSiteMap() );
queryResponse.setProperties( queryProperties );
AtomTransformer transformer = createTransformer();
Map<String, Serializable> properties = new HashMap<>();
properties.put( SearchConstants.STATUS_PARAMETER, Boolean.TRUE );
properties.put( SearchConstants.PATH_PARAMETER, "/path" );
transformer.transform( queryResponse, properties );
}
@Test
public void testLocalResponseTransform() throws Exception {
String sourceName = "Example";
AtomResponseTransformer responseTransformer = new AtomResponseTransformer( new AtomSearchResponseTransformerConfig() );
QueryRequest request = new QueryRequestImpl( new QueryImpl( CQL.toFilter( "title like 'test'" ) ) );
SourceResponse sourceResponse = responseTransformer.processSearchResponse( getClass().getResourceAsStream( RESPONSE_FILE ), request, sourceName );
QueryResponseImpl queryResponse = new QueryResponseImpl( sourceResponse, sourceName );
Map<String, Serializable> queryProperties = new HashMap<>();
queryProperties.put( sourceName, getSiteMap() );
queryResponse.setProperties( queryProperties );
AtomTransformer transformer = createTransformer();
Map<String, Serializable> properties = new HashMap<>();
properties.put( SearchConstants.STATUS_PARAMETER, Boolean.TRUE );
properties.put( SearchConstants.PATH_PARAMETER, "/path" );
transformer.transform( queryResponse, properties );
}
private Entry performTransform(String locationWKT, boolean useGMLEncoding) throws Exception {
MetacardImpl metacard = new MetacardImpl();
metacard.setLocation(locationWKT);
AtomTransformer transformer = createTransformer();
transformer.setUseGMLEncoding(useGMLEncoding);
BinaryContent content = transformer.transform(metacard, new HashMap<String, Serializable>());
// parse into abdera
Abdera abdera = new Abdera();
Document<Entry> doc = abdera.getParser().parse(content.getInputStream());
return doc.getRoot();
}
private AtomTransformer createTransformer() throws Exception {
ActionProvider viewMetacardProvider = mock(ActionProvider.class);
ActionProvider metadataProvider = mock(ActionProvider.class);
ActionProvider resourceProvider = mock(ActionProvider.class);
ActionProvider thumbnailProvider = mock(ActionProvider.class);
List<SecurityConfiguration> securityConfig = Collections.emptyList();
MimeType thumbnailMime = new MimeType("image/jpeg");
MimeType viewMime = new MimeType("text/html");
return new AtomTransformer( viewMetacardProvider, metadataProvider, resourceProvider, thumbnailProvider, thumbnailMime, viewMime, securityConfig );
}
private void compareXML(String expectedXML, Element atomElement) throws Exception {
Diff diff = XMLUnit.compareXML(expectedXML, atomElement.toString());
assertTrue(diff.similar());
}
private HashMap<String, Serializable> getSiteMap() {
HashMap<String, Serializable> siteMap = new HashMap<String, Serializable>();
siteMap.put( "elapsed-time", new Long(1000) );
siteMap.put( "total-hits", new Long(20) );
siteMap.put( "total-results-returned", 20 );
return siteMap;
}
}