/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library 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 2.1 of the License, or (at your option) any later version. * * This library 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. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.processor.xml; import java.util.Properties; import junit.framework.TestCase; import org.teiid.common.buffer.BufferManagerFactory; import org.teiid.common.buffer.FileStore; import org.teiid.core.TeiidComponentException; import org.teiid.core.types.Streamable; import org.teiid.core.util.ObjectConverterUtil; import org.teiid.query.mapping.xml.MappingNodeConstants; import org.teiid.query.sql.symbol.ElementSymbol; import org.teiid.query.sql.util.VariableContext; /** * Unit tests {@link AddNodeInstruction} class */ public class TestAddNodeInstruction extends TestCase { public TestAddNodeInstruction(String name) { super(name); } private static final String RESULT_SET_NAME = "rsName".toUpperCase(); //$NON-NLS-1$ private static final String STRING_COLUMN = ".stringValue"; //$NON-NLS-1$ private static final String NULL_COLUMN = ".nullValue"; //$NON-NLS-1$ public void testAddEmptyElement() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String fixedValue = null; Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, fixedValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><test/></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testDontAddEmptyElement() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String fixedValue = null; Properties namespaceDeclarations = null; boolean isOptional = true; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, fixedValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddElementWithContent() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = null; Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><test>Lamp</test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddElementWithDefault() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String rsColumn = NULL_COLUMN; String defaultValue = "default"; //$NON-NLS-1$ Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null,isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><test>default</test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddElementWithFixed() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String fixedValue = "fixed"; //$NON-NLS-1$ Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, fixedValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><test>fixed</test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddContentElementWithNamespacePrefix() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = "yyz"; //$NON-NLS-1$ boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = null; boolean isOptional = false; Properties rootNamespaceDeclarations = new Properties(); rootNamespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, rootNamespaceDeclarations, null,isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction, rootNamespaceDeclarations); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root xmlns:yyz=\"http://my.namespace/\"><yyz:test>Lamp</yyz:test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddContentElementWithNamespaces() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = null; Properties namespaceDeclarations = new Properties(); namespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null,isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><test xmlns:yyz=\"http://my.namespace/\">Lamp</test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddContentElementWithNamespaces2() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = "yyz"; //$NON-NLS-1$ boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = null; Properties namespaceDeclarations = new Properties(); namespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null,isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root><yyz:test xmlns:yyz=\"http://my.namespace/\">Lamp</yyz:test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddContentElementWithNamespaces3() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = "yyz"; //$NON-NLS-1$ boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = "shouldn't see"; //$NON-NLS-1$ Properties namespaceDeclarations = new Properties(); namespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); Properties rootNamespaceDeclarations = new Properties(); rootNamespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ String actualDoc = helpGetDocument(addNodeInstruction, rootNamespaceDeclarations); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root xmlns:yyz=\"http://my.namespace/\"><yyz:test>Lamp</yyz:test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddContentElementWithConflictingNamespaces() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = "yyz"; //$NON-NLS-1$ boolean isElement = true; String rsColumn = STRING_COLUMN; String defaultValue = "shouldn't see"; //$NON-NLS-1$ Properties namespaceDeclarations = new Properties(); namespaceDeclarations.setProperty("yyz", "http://myother.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); Properties rootNamespaceDeclarations = new Properties(); rootNamespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ String actualDoc = helpGetDocument(addNodeInstruction, rootNamespaceDeclarations); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root xmlns:yyz=\"http://my.namespace/\"><yyz:test xmlns:yyz=\"http://myother.namespace/\">Lamp</yyz:test></root>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddAttributeWithContent() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = false; String rsColumn = STRING_COLUMN; String defaultValue = null; Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root test=\"Lamp\"/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testDontAddEmptyAttribute() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = false; String rsColumn = NULL_COLUMN; String defaultValue = null; Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddAttributeWithDefaultValue() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = false; String rsColumn = NULL_COLUMN; String defaultValue = "default"; //$NON-NLS-1$ Properties namespaceDeclarations = null; boolean isOptional = false; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root test=\"default\"/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddAttributeWithFixedValue() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = null; boolean isElement = false; String fixedValue = "fixed"; //$NON-NLS-1$ Properties namespaceDeclarations = null; boolean isOptional = true; NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, fixedValue, namespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor); String actualDoc = helpGetDocument(addNodeInstruction); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root test=\"fixed\"/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } public void testAddAttributeWithNamespacePrefix() throws Exception { String tag = "test"; //$NON-NLS-1$ String namespacePrefix = "yyz"; //$NON-NLS-1$ boolean isElement = false; String rsColumn = STRING_COLUMN; String defaultValue = "shouldn't see"; //$NON-NLS-1$ boolean isOptional = false; Properties rootNamespaceDeclarations = new Properties(); rootNamespaceDeclarations.setProperty("yyz", "http://my.namespace/"); //$NON-NLS-1$ //$NON-NLS-2$ NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor(tag, namespacePrefix, isElement, defaultValue, rootNamespaceDeclarations, null, isOptional, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); AddNodeInstruction addNodeInstruction = new AddNodeInstruction(descriptor, new ElementSymbol(RESULT_SET_NAME + rsColumn)); String actualDoc = helpGetDocument(addNodeInstruction, rootNamespaceDeclarations); String expectedDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + //$NON-NLS-1$ "<root xmlns:yyz=\"http://my.namespace/\" yyz:test=\"Lamp\"/>"; //$NON-NLS-1$ assertEquals("XML doc mismatch: ", expectedDoc, actualDoc); //$NON-NLS-1$ } // =============================================================== // TEST HELPERS // =============================================================== /** * Take instruction, make a Program out of it, instantiate a * FakeEnvironment and XMLPlan, process instruction, and return result * doc * @throws TeiidComponentException */ private String helpGetDocument(AddNodeInstruction addNodeInstruction) throws Exception{ return helpGetDocument(addNodeInstruction, null); } /** * Take instruction, make a Program out of it, instantiate a * FakeEnvironment and XMLPlan, process instruction, and return result * doc * @throws TeiidComponentException */ private String helpGetDocument(ProcessorInstruction addNodeInstruction, Properties namespaceDeclarations) throws Exception{ XMLContext context = new XMLContext(); FakeXMLProcessorEnvironment env = new FakeXMLProcessorEnvironment(); VariableContext varContext = context.getVariableContext(); varContext.setValue(new ElementSymbol(RESULT_SET_NAME + STRING_COLUMN), "Lamp"); //$NON-NLS-1$ varContext.setValue(new ElementSymbol(RESULT_SET_NAME + NULL_COLUMN), null); Program program = new Program(); program.addInstruction(addNodeInstruction); env.pushProgram(program); FileStore fs = BufferManagerFactory.getStandaloneBufferManager().createFileStore("test"); //$NON-NLS-1$ DocumentInProgress doc = new DocumentInProgress(fs, Streamable.ENCODING); env.setDocumentInProgress(doc); //add fake root, move to child NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor("root", null, true, null, namespaceDeclarations, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE); //$NON-NLS-1$ doc.addElement(descriptor, (NodeDescriptor)null); doc.moveToLastChild(); addNodeInstruction.process(env, context); doc.moveToParent(); doc.markAsFinished(); String actualDoc = ObjectConverterUtil.convertToString(doc.getSQLXML().getCharacterStream()); return actualDoc; } }