/** * 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.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import org.apache.commons.io.IOUtils; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; import org.mockito.ArgumentCaptor; import ddf.catalog.data.Attribute; import ddf.catalog.data.AttributeDescriptor; import ddf.catalog.data.Metacard; import ddf.catalog.data.MetacardType; import ddf.catalog.data.impl.AttributeDescriptorImpl; import ddf.catalog.data.impl.BasicTypes; public class DynamicSchemaResolverTest { /** * Verify that when a metacard type has attribute descriptors that inherit from AttributeDescriptorImpl, the attribute * descriptors are recreated as AttributeDescriptorsImpls before serialization into the solr cache. */ @Test public void testAddFields() throws Exception { // Setup String metacardTypeName = "states"; Set<AttributeDescriptor> addtributeDescriptors = new HashSet<AttributeDescriptor>(1); String propertyName = "title"; String name = metacardTypeName + "." + propertyName; boolean indexed = true; boolean stored = true; boolean tokenized = false; boolean multiValued = false; addtributeDescriptors.add(new AttributeDescriptorImplTest(name, propertyName, indexed, stored, tokenized, multiValued, BasicTypes.OBJECT_TYPE)); Serializable mockValue = mock(Serializable.class); Attribute mockAttribute = mock(Attribute.class); when(mockAttribute.getValue()).thenReturn(mockValue); Metacard mockMetacard = mock(Metacard.class, RETURNS_DEEP_STUBS); when(mockMetacard.getMetacardType() .getName()).thenReturn(metacardTypeName); when(mockMetacard.getMetacardType() .getAttributeDescriptors()).thenReturn(addtributeDescriptors); when(mockMetacard.getAttribute(name)).thenReturn(mockAttribute); ArgumentCaptor<byte[]> metacardTypeBytes = ArgumentCaptor.forClass(byte[].class); SolrInputDocument mockSolrInputDocument = mock(SolrInputDocument.class); DynamicSchemaResolver resolver = new DynamicSchemaResolver(); // Perform Test resolver.addFields(mockMetacard, mockSolrInputDocument); // Verify: Verify that TestAttributeDescritorImpl has been recreated as a AttributeDescriptorImpl. verify(mockSolrInputDocument).addField(eq(SchemaFields.METACARD_TYPE_OBJECT_FIELD_NAME), metacardTypeBytes.capture()); byte[] serializedMetacardType = metacardTypeBytes.getValue(); MetacardType metacardType = deserializeMetacardType(serializedMetacardType); for (AttributeDescriptor attributeDescriptor : metacardType.getAttributeDescriptors()) { assertThat(attributeDescriptor.getClass() .getName(), is(AttributeDescriptorImpl.class.getName())); } } private MetacardType deserializeMetacardType(byte[] serializedMetacardType) throws ClassNotFoundException, IOException { ByteArrayInputStream bais = new ByteArrayInputStream((byte[]) serializedMetacardType); ObjectInputStream in = new ObjectInputStream(bais); MetacardType metacardType = (MetacardType) in.readObject(); IOUtils.closeQuietly(bais); IOUtils.closeQuietly(in); return metacardType; } }