/**
* Copyright (c) Codice Foundation
*
* 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.
*
* 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 org.codice.ddf.spatial.kml.transformer;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import org.apache.commons.io.IOUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import ddf.action.Action;
import ddf.action.ActionProvider;
import ddf.catalog.data.BinaryContent;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.transform.CatalogTransformerException;
import de.micromata.opengis.kml.v_2_2_0.LineString;
import de.micromata.opengis.kml.v_2_2_0.MultiGeometry;
import de.micromata.opengis.kml.v_2_2_0.Placemark;
import de.micromata.opengis.kml.v_2_2_0.Point;
import de.micromata.opengis.kml.v_2_2_0.Polygon;
import de.micromata.opengis.kml.v_2_2_0.TimeSpan;
public class TestKMLTransformerImpl {
private static final String DEFAULT_STYLE_LOCATION = "/kml-styling/defaultStyling.kml";
private static final String ID = "1234567890";
private static final String TITLE = "myTitle";
private static final String POINT_WKT = "POINT (-110.00540924072266 34.265270233154297)";
private static final String LINESTRING_WKT = "LINESTRING (1 1,2 1)";
private static final String POLYGON_WKT = "POLYGON ((1 1,2 1,2 2,1 2,1 1))";
private static final String MULTIPOINT_WKT = "MULTIPOINT ((1 1), (0 0), (2 2))";
private static final String MULTILINESTRING_WKT = "MULTILINESTRING ((1 1, 2 1), (1 2, 0 0))";
private static final String MULTIPOLYGON_WKT = "MULTIPOLYGON (((1 1,2 1,2 2,1 2,1 1)), ((0 0,1 1,2 0,0 0)))";
private static final String GEOMETRYCOLLECTION_WKT =
"GEOMETRYCOLLECTION (" + POINT_WKT + ", " + LINESTRING_WKT + ", " + POLYGON_WKT + ")";
private static final String ACTION_URL = "http://example.com/source/id?transform=resource";
private static BundleContext mockContext = mock(BundleContext.class);
private static Bundle mockBundle = mock(Bundle.class);
private static KMLTransformerImpl kmlTransformer;
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
private static ActionProvider mockActionProvider;
private static Action mockAction;
@BeforeClass
public static void setUp() throws IOException {
when(mockContext.getBundle()).thenReturn(mockBundle);
URL url = TestKMLTransformerImpl.class.getResource(DEFAULT_STYLE_LOCATION);
when(mockBundle.getResource(any(String.class))).thenReturn(url);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
mockActionProvider = mock(ActionProvider.class);
mockAction = mock(Action.class);
when(mockActionProvider.getAction(any(Metacard.class))).thenReturn(mockAction);
when(mockAction.getUrl()).thenReturn(new URL(ACTION_URL));
kmlTransformer = new KMLTransformerImpl(mockContext, DEFAULT_STYLE_LOCATION,
new KmlStyleMap(), mockActionProvider);
}
@Test(expected = CatalogTransformerException.class)
public void testPerformDefaultTransformationNoLocation() throws CatalogTransformerException {
Metacard metacard = createMockMetacard();
kmlTransformer.performDefaultTransformation(metacard, null);
}
@Test
public void testPerformDefaultTransformationPointLocation() throws CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(POINT_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getStyleSelector().isEmpty(), is(true));
assertThat(placemark.getStyleUrl(), nullValue());
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(Point.class));
}
@Test
public void testPerformDefaultTransformationLineStringLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(LINESTRING_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(LineString.class));
}
@Test
public void testPerformDefaultTransformationPolygonLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(POLYGON_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(Polygon.class));
}
@Test
public void testPerformDefaultTransformationMultiPointLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(MULTIPOINT_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(MultiGeometry.class));
MultiGeometry multiPoint = (MultiGeometry) multiGeo.getGeometry().get(1);
assertThat(multiPoint.getGeometry().size(), is(3));
assertThat(multiPoint.getGeometry().get(0), is(Point.class));
assertThat(multiPoint.getGeometry().get(1), is(Point.class));
assertThat(multiPoint.getGeometry().get(2), is(Point.class));
}
@Test
public void testPerformDefaultTransformationMultiLineStringLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(MULTILINESTRING_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(MultiGeometry.class));
MultiGeometry multiLineString = (MultiGeometry) multiGeo.getGeometry().get(1);
assertThat(multiLineString.getGeometry().size(), is(2));
assertThat(multiLineString.getGeometry().get(0), is(LineString.class));
assertThat(multiLineString.getGeometry().get(1), is(LineString.class));
}
@Test
public void testPerformDefaultTransformationMultiPolygonLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(MULTIPOLYGON_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(MultiGeometry.class));
MultiGeometry multiPolygon = (MultiGeometry) multiGeo.getGeometry().get(1);
assertThat(multiPolygon.getGeometry().size(), is(2));
assertThat(multiPolygon.getGeometry().get(0), is(Polygon.class));
assertThat(multiPolygon.getGeometry().get(1), is(Polygon.class));
}
@Test
public void testPerformDefaultTransformationGeometryCollectionLocation() throws
CatalogTransformerException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(GEOMETRYCOLLECTION_WKT);
Placemark placemark = kmlTransformer.performDefaultTransformation(metacard, null);
assertThat(placemark.getId(), is("Placemark-" + ID));
assertThat(placemark.getName(), is(TITLE));
assertThat(placemark.getTimePrimitive(), is(TimeSpan.class));
TimeSpan timeSpan = (TimeSpan) placemark.getTimePrimitive();
assertThat(timeSpan.getBegin(), is(dateFormat.format(metacard.getEffectiveDate())));
assertThat(placemark.getGeometry(), is(MultiGeometry.class));
MultiGeometry multiGeo = (MultiGeometry) placemark.getGeometry();
assertThat(multiGeo.getGeometry().size(), is(2));
assertThat(multiGeo.getGeometry().get(0), is(Point.class));
assertThat(multiGeo.getGeometry().get(1), is(MultiGeometry.class));
MultiGeometry multiGeo2 = (MultiGeometry) multiGeo.getGeometry().get(1);
assertThat(multiGeo2.getGeometry().size(), is(3));
assertThat(multiGeo2.getGeometry().get(0), is(Point.class));
assertThat(multiGeo2.getGeometry().get(1), is(LineString.class));
assertThat(multiGeo2.getGeometry().get(2), is(Polygon.class));
}
@Test
public void testTransformMetacardGetsDefaultStyle() throws CatalogTransformerException,
IOException {
MetacardImpl metacard = createMockMetacard();
metacard.setLocation(POINT_WKT);
BinaryContent content = kmlTransformer.transform(metacard, null);
assertThat(content.getMimeTypeValue(), is(KMLTransformerImpl.kmlMimetype.toString()));
String kml = IOUtils.toString(content.getInputStream());
// TODO - validate the style is there
}
private MetacardImpl createMockMetacard() {
MetacardImpl metacard = new MetacardImpl();
metacard.setContentTypeName("myContentType");
metacard.setContentTypeVersion("myVersion");
metacard.setCreatedDate(Calendar.getInstance().getTime());
metacard.setEffectiveDate(Calendar.getInstance().getTime());
metacard.setExpirationDate(Calendar.getInstance().getTime());
metacard.setId("1234567890");
// metacard.setLocation(wkt);
metacard.setMetadata("<xml>Metadata</xml>");
metacard.setModifiedDate(Calendar.getInstance().getTime());
// metacard.setResourceSize("10MB");
// metacard.setResourceURI(uri)
metacard.setSourceId("sourceID");
metacard.setTitle("myTitle");
return metacard;
}
}