/**
* 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.data.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import ddf.catalog.data.AttributeDescriptor;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.MetacardType;
public class MetacardImplTest {
private static final String DEFAULT_SERIALIZATION_FILE_LOCATION = "target/metacard1.ser";
MetacardImpl mc;
Date createdDate;
Date effectiveDate;
Date expireDate;
Date modDate;
String mcId;
String locWkt;
URI resourceUri;
URI nsUri;
@Before
public void setUp() throws Exception {
Calendar c = Calendar.getInstance();
createdDate = c.getTime();
c.add(Calendar.HOUR, 1);
effectiveDate = c.getTime();
c.add(Calendar.DAY_OF_YEAR, 1);
modDate = c.getTime();
c.add(Calendar.YEAR, 1);
expireDate = c.getTime();
mcId = UUID.randomUUID()
.toString();
locWkt = "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))";
nsUri = new URI("http://" + MetacardImplTest.class.getName());
resourceUri = new URI(nsUri.toString() + "/resource.html");
mc = new MetacardImpl(BasicTypes.BASIC_METACARD);
mc.setContentTypeName("testContentType");
mc.setContentTypeVersion("testContentTypeVersion");
mc.setAttribute("testAtt", "testAttValue");
mc.setCreatedDate(createdDate);
mc.setEffectiveDate(effectiveDate);
mc.setExpirationDate(expireDate);
mc.setModifiedDate(modDate);
mc.setId(mcId);
mc.setLocation(locWkt);
mc.setMetadata("testMetadata");
mc.setResourceURI(resourceUri);
mc.setSourceId("testSourceId");
mc.setTargetNamespace(nsUri);
mc.setTitle("testTitle");
mc.setThumbnail(mc.getId()
.getBytes());
mc.setDescription("testDescription");
mc.setPointOfContact("pointOfContact");
}
@Test(expected = IllegalArgumentException.class)
public void testMetacardTypeAsNull() {
new MetacardImpl((MetacardType) null);
}
/**
* Test XML support
*
* @throws ParserConfigurationException
*/
@Test
public void metacardObjectTest() throws ParserConfigurationException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("test");
document.appendChild(rootElement);
MetacardImpl metacard = new MetacardImpl();
String xml = "<xml/>";
metacard.setMetadata(xml);
metacard.setId("id1");
}
/**
* make sure type conversion works in MetacardImpl
*/
@Test
public void testMetacardImplAttributes() {
MetacardImpl metacard = new MetacardImpl();
Date now = new Date();
metacard.setEffectiveDate(now);
assertEquals(now, metacard.getEffectiveDate());
}
/**
* make sure type conversion works in MetacardImpl
*/
@Test
public void testMetacardAttributes() {
Metacard metacard = new MetacardImpl();
Date now = new Date();
metacard.setAttribute(new AttributeImpl(Metacard.EFFECTIVE, now));
assertEquals(now, metacard.getEffectiveDate());
}
@Test
public void testMetacardImpl() {
MetacardImpl mi = new MetacardImpl();
assertEquals(null, mi.getContentTypeName());
assertEquals(null, mi.getContentTypeNamespace());
assertEquals(null, mi.getContentTypeVersion());
assertEquals(null, mi.getCreatedDate());
assertEquals(null, mi.getEffectiveDate());
assertEquals(null, mi.getExpirationDate());
assertEquals(null, mi.getId());
assertEquals(null, mi.getLocation());
assertEquals(BasicTypes.BASIC_METACARD, mi.getMetacardType());
assertEquals(null, mi.getMetadata());
assertEquals(null, mi.getModifiedDate());
assertEquals(null, mi.getResourceSize());
assertEquals(null, mi.getResourceURI());
assertEquals(null, mi.getSourceId());
assertEquals(null, mi.getThumbnail());
assertEquals(null, mi.getTitle());
assertEquals(null, mi.getDescription());
assertEquals(null, mi.getPointOfContact());
mi = new MetacardImpl(BasicTypes.BASIC_METACARD);
assertEquals(null, mi.getContentTypeName());
assertEquals(null, mi.getContentTypeNamespace());
assertEquals(null, mi.getContentTypeVersion());
assertEquals(null, mi.getCreatedDate());
assertEquals(null, mi.getEffectiveDate());
assertEquals(null, mi.getExpirationDate());
assertEquals(null, mi.getId());
assertEquals(null, mi.getLocation());
assertEquals(BasicTypes.BASIC_METACARD, mi.getMetacardType());
assertEquals(null, mi.getMetadata());
assertEquals(null, mi.getModifiedDate());
assertEquals(null, mi.getResourceSize());
assertEquals(null, mi.getResourceURI());
assertEquals(null, mi.getSourceId());
assertEquals(null, mi.getThumbnail());
assertEquals(null, mi.getTitle());
assertEquals(null, mi.getDescription());
assertEquals(null, mi.getPointOfContact());
mi = new MetacardImpl(mc);
assertEquals(mc.getContentTypeName(), mi.getContentTypeName());
assertEquals(mc.getContentTypeNamespace(), mi.getContentTypeNamespace());
assertEquals(mc.getContentTypeVersion(), mi.getContentTypeVersion());
assertEquals(mc.getCreatedDate(), mi.getCreatedDate());
assertEquals(mc.getEffectiveDate(), mi.getEffectiveDate());
assertEquals(mc.getExpirationDate(), mi.getExpirationDate());
assertEquals(mc.getId(), mi.getId());
assertEquals(mc.getLocation(), mi.getLocation());
assertEquals(BasicTypes.BASIC_METACARD, mi.getMetacardType());
assertEquals(mc.getMetacardType(), mi.getMetacardType());
assertEquals(mc.getMetadata(), mi.getMetadata());
assertEquals(mc.getModifiedDate(), mi.getModifiedDate());
assertEquals(mc.getResourceSize(), mi.getResourceSize());
assertEquals(mc.getResourceURI(), mi.getResourceURI());
assertEquals(mc.getSourceId(), mi.getSourceId());
assertEquals(mc.getThumbnail(), mi.getThumbnail());
assertEquals(mc.getTitle(), mi.getTitle());
assertEquals(mc.getDescription(), mi.getDescription());
assertEquals(mc.getPointOfContact(), mi.getPointOfContact());
}
@Test
public void testUpdatingWrappedMetacardFields() {
HashSet<AttributeDescriptor> descriptors = new HashSet<AttributeDescriptor>();
descriptors.add(new AttributeDescriptorImpl("test-string",
true /* indexed */,
true /* stored */,
false /* tokenized */,
false /* multivalued */,
BasicTypes.STRING_TYPE));
MetacardType testType = new MetacardTypeImpl("test.type", descriptors);
MetacardImpl mi = new MetacardImpl(mc);
mi.setSourceId("testSource");
mi.setType(testType);
assertEquals("testSource", mi.getSourceId());
assertEquals(testType, mi.getMetacardType());
}
@Test
public void testSetNullFields() {
mc.setContentTypeName(null);
mc.setContentTypeVersion(null);
mc.setAttribute(null);
mc.setAttribute(new AttributeImpl("testNullValueAtt1", (Serializable) null));
mc.setAttribute("testNullValueAtt2", null);
mc.setCreatedDate(null);
mc.setEffectiveDate(null);
mc.setExpirationDate(null);
mc.setModifiedDate(null);
mc.setId(null);
mc.setLocation(null);
mc.setMetadata(null);
mc.setResourceURI(null);
mc.setSourceId(null);
mc.setTitle(null);
mc.setThumbnail(null);
mc.setDescription(null);
mc.setPointOfContact(null);
assertEquals(null, mc.getAttribute("testNullValueAtt1"));
assertEquals(null, mc.getAttribute("testNullValueAtt2"));
assertEquals(null, mc.getContentTypeName());
assertEquals(null, mc.getContentTypeVersion());
assertEquals(null, mc.getCreatedDate());
assertEquals(null, mc.getEffectiveDate());
assertEquals(null, mc.getExpirationDate());
assertEquals(null, mc.getId());
assertEquals(null, mc.getLocation());
assertEquals(null, mc.getMetadata());
assertEquals(null, mc.getModifiedDate());
assertEquals(null, mc.getResourceSize());
assertNotNull(mc.getResourceURI());
assertEquals(null, mc.getSourceId());
assertEquals(null, mc.getThumbnail());
assertEquals(null, mc.getTitle());
assertEquals(null, mc.getDescription());
assertEquals(null, mc.getPointOfContact());
}
@Test
public void testEmptyStringFields() {
}
@Test
public void testSerializationSingle()
throws IOException, ClassNotFoundException, URISyntaxException {
MetacardImpl metacard = new MetacardImpl();
Date now = new Date();
metacard.setTitle("Flagstaff");
metacard.setContentTypeName("nitf");
metacard.setContentTypeVersion("DDF_20");
metacard.setLocation("POINT (1 0)");
metacard.setMetadata("<something/>");
metacard.setCreatedDate(now);
metacard.setResourceURI(new URI("http://ddf.com"));
byte[] buffer = {-86};
metacard.setThumbnail(buffer);
metacard.setSourceId("mySourceId");
metacard.setDescription("Northern Arizona City");
metacard.setPointOfContact("poc");
Serializer<Metacard> serializer = new Serializer<Metacard>();
/* WRITE */
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
/* READ */
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
assertEquals(metacard.getTitle(), readMetacard.getTitle());
assertEquals(metacard.getContentTypeName(), readMetacard.getContentTypeName());
assertEquals(metacard.getContentTypeVersion(), readMetacard.getContentTypeVersion());
assertEquals(metacard.getLocation(), readMetacard.getLocation());
assertEquals(metacard.getMetadata(), readMetacard.getMetadata());
assertEquals(metacard.getCreatedDate(), readMetacard.getCreatedDate());
assertEquals(metacard.getExpirationDate(), readMetacard.getExpirationDate());
assertEquals(metacard.getResourceURI(), readMetacard.getResourceURI());
assertEquals(metacard.getResourceSize(), readMetacard.getResourceSize());
assertTrue(Arrays.equals(metacard.getThumbnail(), readMetacard.getThumbnail()));
assertEquals(metacard.getSourceId(), readMetacard.getSourceId());
assertEquals(metacard.getDescription(),
readMetacard.getAttribute("description")
.getValue());
assertEquals(metacard.getPointOfContact(),
readMetacard.getAttribute("point-of-contact")
.getValue());
MetacardType metacardType = metacard.getMetacardType();
MetacardType readMetacardType = readMetacard.getMetacardType();
assertEquals(metacardType.getName(), readMetacardType.getName());
Set<AttributeDescriptor> oldAd = metacardType.getAttributeDescriptors();
Set<AttributeDescriptor> newAd = readMetacardType.getAttributeDescriptors();
assertEquals(oldAd.size(), newAd.size());
for (int i = 0; i < oldAd.size(); i++) {
AttributeDescriptor oldDescriptor = oldAd.iterator()
.next();
boolean match = false;
for (AttributeDescriptor newDescriptor : newAd) {
if (oldDescriptor.equals(newDescriptor)) {
match = true;
break;
}
}
assertTrue(match);
}
}
@Test
public void testSerializationSingleWrapped()
throws IOException, ClassNotFoundException, URISyntaxException {
MetacardImpl innerMetacard = new MetacardImpl();
Date now = new Date();
innerMetacard.setTitle("Flagstaff");
innerMetacard.setContentTypeName("nitf");
innerMetacard.setContentTypeVersion("DDF_20");
innerMetacard.setLocation("POINT (1 0)");
innerMetacard.setMetadata("<something/>");
innerMetacard.setCreatedDate(now);
innerMetacard.setResourceURI(new URI("http://ddf.com"));
byte[] buffer = {-86};
innerMetacard.setThumbnail(buffer);
innerMetacard.setDescription("Northern Arizona City");
innerMetacard.setPointOfContact("poc");
Metacard metacard = new MetacardImpl(innerMetacard);
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
assertEquals(metacard.getTitle(), readMetacard.getTitle());
assertEquals(metacard.getContentTypeName(), readMetacard.getContentTypeName());
assertEquals(metacard.getContentTypeVersion(), readMetacard.getContentTypeVersion());
assertEquals(metacard.getLocation(), readMetacard.getLocation());
assertEquals(metacard.getMetadata(), readMetacard.getMetadata());
assertEquals(metacard.getCreatedDate(), readMetacard.getCreatedDate());
assertEquals(metacard.getExpirationDate(), readMetacard.getExpirationDate());
assertEquals(metacard.getResourceURI(), readMetacard.getResourceURI());
assertEquals(metacard.getResourceSize(), readMetacard.getResourceSize());
assertEquals(metacard.getAttribute("description")
.getValue(),
readMetacard.getAttribute("description")
.getValue());
assertEquals(metacard.getAttribute("point-of-contact")
.getValue(),
readMetacard.getAttribute("point-of-contact")
.getValue());
assertTrue(Arrays.equals(metacard.getThumbnail(), readMetacard.getThumbnail()));
MetacardType metacardType = metacard.getMetacardType();
MetacardType readMetacardType = readMetacard.getMetacardType();
assertEquals(metacardType.getName(), readMetacardType.getName());
Set<AttributeDescriptor> oldAd = metacardType.getAttributeDescriptors();
Set<AttributeDescriptor> newAd = readMetacardType.getAttributeDescriptors();
assertEquals(oldAd.size(), newAd.size());
assertEquals(oldAd.size(), newAd.size());
for (int i = 0; i < oldAd.size(); i++) {
AttributeDescriptor oldDescriptor = oldAd.iterator()
.next();
boolean match = false;
for (AttributeDescriptor newDescriptor : newAd) {
if (oldDescriptor.equals(newDescriptor)) {
match = true;
break;
}
}
assertTrue(match);
}
}
@Test
public void testSerializingEmptyMetacard() throws IOException, ClassNotFoundException {
MetacardImpl metacard = new MetacardImpl();
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
MetacardType metacardType = metacard.getMetacardType();
MetacardType readMetacardType = readMetacard.getMetacardType();
assertEquals(metacardType.getName(), readMetacardType.getName());
for (AttributeDescriptor ad : readMetacardType.getAttributeDescriptors()) {
assertNull(readMetacard.getAttribute(ad.getName()));
}
}
@Test
public void testSerializingWithEmptyMetacardType() throws IOException, ClassNotFoundException {
MetacardImpl metacard = new MetacardImpl(new EmptyMetacardType());
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
MetacardType metacardType = metacard.getMetacardType();
MetacardType readMetacardType = readMetacard.getMetacardType();
assertEquals(metacardType.getName(), readMetacardType.getName());
assertTrue(readMetacardType.getAttributeDescriptors()
.isEmpty());
assertEquals(metacardType.getAttributeDescriptor(null),
readMetacardType.getAttributeDescriptor(null));
assertTrue(readMetacardType.getName() == null);
assertTrue(readMetacardType.getAttributeDescriptor(null) == null);
}
@Test
public void testSerializingEmptyWrappedMetacardType()
throws IOException, ClassNotFoundException {
MetacardImpl metacard = new MetacardImpl(new MetacardImpl(new EmptyMetacardType()));
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
MetacardType metacardType = metacard.getMetacardType();
MetacardType readMetacardType = readMetacard.getMetacardType();
assertNotNull(readMetacardType);
assertTrue(readMetacardType.getName() == null);
assertTrue(readMetacardType.getAttributeDescriptor(null) == null);
assertTrue(readMetacardType.getAttributeDescriptors()
.isEmpty());
assertEquals(metacardType.getName(), readMetacardType.getName());
assertEquals(metacardType.getAttributeDescriptor(null),
readMetacardType.getAttributeDescriptor(null));
}
/*
* A test where a metacardType is not defined but there are attributes in the metacard
*/
@Test()
public void testDeserializingUndefinedMetacardType()
throws IOException, ClassNotFoundException {
MetacardImpl metacard = new MetacardImpl(new EmptyMetacardType());
metacard.setTitle("someTitle");
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
// the expected return is an empty list because it is documented that
// the MetacardImpl will not use the original MetacardType
// implementation.
// It will use ddf.catalog.data.MetacardTypeImpl
// which does not allow null for attribute descriptors list
assertEquals(0,
readMetacard.getMetacardType()
.getAttributeDescriptors()
.size());
assertEquals(null,
readMetacard.getMetacardType()
.getName());
assertEquals("someTitle", readMetacard.getTitle());
assertEquals(null, readMetacard.getSourceId());
}
/*
* Test when an attribute exists but is not defined in the Metacard type
*/
@Test()
public void testDeserializingHiddenAttribute() throws IOException, ClassNotFoundException {
MetacardImpl metacard = new MetacardImpl();
metacard.setAttribute(new AttributeImpl("newName", "newNameValue"));
Serializer<Metacard> serializer = new Serializer<Metacard>();
serializer.serialize(metacard, DEFAULT_SERIALIZATION_FILE_LOCATION);
Metacard readMetacard = serializer.deserialize(DEFAULT_SERIALIZATION_FILE_LOCATION);
assertEquals("newNameValue",
readMetacard.getAttribute("newName")
.getValue());
}
}