package ecologylab.bigsemantics.documentparsers; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Node; import ecologylab.bigsemantics.BaseMmdTest; import ecologylab.bigsemantics.actions.SemanticActionHandler; import ecologylab.bigsemantics.collecting.SemanticsSessionScope; import ecologylab.bigsemantics.cyberneko.CybernekoWrapper; import ecologylab.bigsemantics.downloadcontrollers.DefaultDownloadController; import ecologylab.bigsemantics.generated.library.RepositoryMetadataTypesScope; import ecologylab.bigsemantics.html.dom.IDOMProvider; import ecologylab.bigsemantics.metadata.MetadataFieldDescriptor; import ecologylab.bigsemantics.metadata.builtins.Document; import ecologylab.bigsemantics.metametadata.MetaMetadata; import ecologylab.bigsemantics.metametadata.MetaMetadataCompositeField; import ecologylab.bigsemantics.metametadata.MetaMetadataField; import ecologylab.bigsemantics.metametadata.MetaMetadataRepository; import ecologylab.bigsemantics.metametadata.MetaMetadataTranslationScope; import ecologylab.collections.Scope; import ecologylab.serialization.ClassDescriptor; import ecologylab.serialization.FieldDescriptor; import ecologylab.serialization.SIMPLTranslationException; import ecologylab.serialization.SimplTypesScope; import ecologylab.serialization.SimplTypesScope.GRAPH_SWITCH; import ecologylab.serialization.annotations.simpl_collection; import ecologylab.serialization.formatenums.StringFormat; /** * Unit test for extracting scalar collections. * * @author quyin */ public class TestParserBase { static class FakeParserBase extends ParserBase<Document> { @Override public Document populateMetadata(Document document, MetaMetadataCompositeField metaMetadata, org.w3c.dom.Document dom, SemanticActionHandler handler) throws IOException { return null; } } static class TestProduct extends Document { @simpl_collection("spec") List<String> specs; } private SimplTypesScope mmdScope; private SemanticsSessionScope semanticsSessionScope; private FakeParserBase parser; @Before public void setUp() { SimplTypesScope.graphSwitch = GRAPH_SWITCH.ON; MetaMetadataRepository.initializeTypes(); mmdScope = MetaMetadataTranslationScope.get(); semanticsSessionScope = new SemanticsSessionScope(RepositoryMetadataTypesScope.get(), CybernekoWrapper.class); parser = new FakeParserBase(); parser.setSemanticsScope(semanticsSessionScope); } @Test public void testExtractScalarCollection() throws SIMPLTranslationException, IOException { String mmdXml = "<meta_metadata name=\"test_product\">" + " <collection name=\"specs\" child_scalar_type=\"String\"" + " xpath=\"//ul[@id='specs-list']/li\"/>" + "</meta_metadata>"; MetaMetadata mmd = (MetaMetadata) mmdScope.deserialize(mmdXml, StringFormat.XML); assertNotNull(mmd); MetaMetadataField field = mmd.getChildrenMap().get("specs"); assertNotNull(field); ClassDescriptor classDescriptor = ClassDescriptor.getClassDescriptor(TestProduct.class); FieldDescriptor fieldDescriptor = classDescriptor.getFieldDescriptorByFieldName("specs"); assertTrue(fieldDescriptor instanceof MetadataFieldDescriptor); BaseMmdTest.setMetadataFieldDescriptor(field, (MetadataFieldDescriptor) fieldDescriptor); TestProduct testProduct = new TestProduct(); IDOMProvider domProvider = semanticsSessionScope.constructDOMProvider(); InputStream testDocStream = getClass().getResourceAsStream("/ecologylab/bigsemantics/documentparsers/testProduct.html"); assertNotNull(testDocStream); Node docNode = domProvider.parseDOM(testDocStream, null); Map<String, String> fieldParserContext = new HashMap<String, String>(); Scope<Object> params = new Scope<Object>(); parser.setDownloadController(new DefaultDownloadController()); parser.handler = new SemanticActionHandler(semanticsSessionScope, parser); boolean success = parser.recursiveExtraction(mmd, testProduct, docNode, fieldParserContext, params); assertTrue(success); assertNotNull(testProduct.specs); System.out.println(testProduct.specs); } }