/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* David McCann - 2.3 - Initial implementation | |
******************************************************************************/ | |
package org.eclipse.persistence.testing.sdo.helper.typehelper; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import javax.xml.namespace.QName; | |
import javax.xml.parsers.DocumentBuilderFactory; | |
import javax.xml.parsers.ParserConfigurationException; | |
import junit.textui.TestRunner; | |
import org.eclipse.persistence.oxm.XMLConstants; | |
import org.eclipse.persistence.sdo.SDOConstants; | |
import org.eclipse.persistence.sdo.SDODataObject; | |
import org.eclipse.persistence.sdo.SDOProperty; | |
import org.eclipse.persistence.sdo.SDOType; | |
import org.eclipse.persistence.sdo.helper.DefaultSchemaLocationResolver; | |
import org.eclipse.persistence.sdo.helper.SDOHelperContext; | |
import org.eclipse.persistence.sdo.helper.SDOXSDHelper; | |
import org.w3c.dom.Document; | |
import org.w3c.dom.Element; | |
import commonj.sdo.helper.DataFactory; | |
import commonj.sdo.helper.HelperContext; | |
import commonj.sdo.helper.TypeHelper; | |
import commonj.sdo.helper.XSDHelper; | |
import commonj.sdo.impl.HelperProvider; | |
public class SDOTypeHelperAppInfoTestCases extends junit.framework.TestCase { | |
private boolean customContext; | |
protected DocumentBuilderFactory dbf; | |
protected Document doc; | |
protected HelperContext aHelperContext; | |
protected XSDHelper xsdHelper; | |
protected DataFactory dataFactory; | |
protected TypeHelper typeHelper; | |
protected Element aiElement; | |
protected Element aiElementProp; | |
protected SDOType sdoTypeType; | |
private static final String CUSTOM_CTX = "customContext"; | |
private static final String APP_INFO = "xsd:appinfo"; | |
private static final String NAME = "name"; | |
private static final String URI = "uri"; | |
private static final String TYPE = "type"; | |
private static final String ATT = "attribute"; | |
private static final String TYPENO = "Typeno"; | |
private static final String PROPNO = "Propno"; | |
private static final String XMLNS = "xmlns"; | |
private static final String KEY = "key"; | |
private static final String PROPERTY = "property"; | |
private static final String MYDO = "myDO"; | |
private static final String MYPROP = "myProperty"; | |
private static final String MYURI = "myUri"; | |
private static final String TYPE_APP_INFO = "http://xmlns.oracle.com/adf/svc/metadata/type"; | |
private static final String PROPERTY_APP_INFO = "http://xmlns.oracle.com/adf/svc/metadata/property"; | |
private static final String TYPE_APP_INFO_STRING = "<xsd:appinfo source=\"http://xmlns.oracle.com/adf/svc/metadata/type\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><key xmlns=\"http://xmlns.oracle.com/adf/svc/metadata/type\"><attribute>Typeno</attribute></key></xsd:appinfo>"; | |
private static final String PROPERTY_APP_INFO_STRING = "<xsd:appinfo source=\"http://xmlns.oracle.com/adf/svc/metadata/property\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><key xmlns=\"http://xmlns.oracle.com/adf/svc/metadata/property\"><attribute>Propno</attribute></key></xsd:appinfo>"; | |
public SDOTypeHelperAppInfoTestCases(String name) { | |
super(name); | |
customContext = Boolean.getBoolean(CUSTOM_CTX); | |
} | |
public static void main(String[] args) { | |
String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.helper.typehelper.SDOTypeHelperAppInfoTestCases" }; | |
TestRunner.main(arguments); | |
} | |
public void setUp() { | |
HelperContext aHelperContext; | |
if (customContext) { | |
// default to instance of a HelperContext | |
aHelperContext = new SDOHelperContext(); | |
} else { | |
// default to static context (Global) | |
aHelperContext = HelperProvider.getDefaultContext(); | |
} | |
typeHelper = aHelperContext.getTypeHelper(); | |
dbf = DocumentBuilderFactory.newInstance(); | |
try { | |
doc = dbf.newDocumentBuilder().newDocument(); | |
} catch (ParserConfigurationException e) { | |
fail("setUp failed: \n" + e.getMessage()); | |
} | |
xsdHelper = aHelperContext.getXSDHelper(); | |
typeHelper = aHelperContext.getTypeHelper(); | |
dataFactory = aHelperContext.getDataFactory(); | |
// setup AppInfoElement for Type: | |
// <xsd:appinfo source="http://xmlns.oracle.com/adf/svc/metadata/type"> | |
// <key xmlns="http://xmlns.oracle.com/adf/svc/metadata/type"> | |
// <attribute>Typeno</attribute> | |
// </key> | |
// </xsd:appinfo> | |
Element attElement = doc.createElementNS(TYPE_APP_INFO, ATT); | |
attElement.appendChild(doc.createTextNode(TYPENO)); | |
Element keyElement = doc.createElementNS(TYPE_APP_INFO, KEY); | |
keyElement.setAttribute(XMLNS, TYPE_APP_INFO); | |
keyElement.appendChild(attElement); | |
aiElement = doc.createElementNS(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI, APP_INFO); | |
aiElement.setAttribute(SDOConstants.APPINFO_SOURCE_ATTRIBUTE, TYPE_APP_INFO); | |
aiElement.appendChild(keyElement); | |
// setup AppInfoElement for Property: | |
// <xsd:appinfo source="http://xmlns.oracle.com/adf/svc/metadata/property"> | |
// <key xmlns="http://xmlns.oracle.com/adf/svc/metadata/property"> | |
// <attribute>Propno</attribute> | |
// </key> | |
// </xsd:appinfo> | |
Element attElementProp = doc.createElementNS(PROPERTY_APP_INFO, ATT); | |
attElementProp.appendChild(doc.createTextNode(PROPNO)); | |
Element keyElementProp = doc.createElementNS(PROPERTY_APP_INFO, KEY); | |
keyElementProp.setAttribute(XMLNS, PROPERTY_APP_INFO); | |
keyElementProp.appendChild(attElementProp); | |
aiElementProp = doc.createElementNS(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI, APP_INFO); | |
aiElementProp.setAttribute(SDOConstants.APPINFO_SOURCE_ATTRIBUTE, PROPERTY_APP_INFO); | |
aiElementProp.appendChild(keyElementProp); | |
sdoTypeType = (SDOType) typeHelper.getType(SDOConstants.SDO_URL, SDOConstants.TYPE); | |
} | |
/** | |
* Tests setting appinfo elements on a Type and Property via | |
* dataObject.set(Property, Object) API. | |
* | |
* Positive test. | |
*/ | |
public void testAppInfoElements() { | |
List<Element> aieList = new ArrayList<Element>(); | |
aieList.add(aiElement); | |
List<Element> aiePropList = new ArrayList<Element>(); | |
aiePropList.add(aiElementProp); | |
// create the data object | |
SDODataObject dataObject = (SDODataObject) dataFactory.create(sdoTypeType); | |
dataObject.set(NAME, MYDO); | |
dataObject.set(URI, MYURI); | |
dataObject.set(SDOConstants.APPINFO_PROPERTY, aieList); | |
// create a property | |
SDODataObject prop = (SDODataObject) dataObject.createDataObject(PROPERTY); | |
prop.set(NAME, MYPROP); | |
prop.set(TYPE, SDOConstants.SDO_STRING); | |
prop.set(SDOConstants.APPINFO_PROPERTY, aiePropList); | |
// create the type | |
SDOType newType = (SDOType) typeHelper.define(dataObject); | |
//====== | |
//DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>()); | |
//List<Object> types = new ArrayList<Object>(); | |
//types.add(newType); | |
//String generatedSchema = ((SDOXSDHelper)xsdHelper).generate(types, resolver); | |
//System.out.println(generatedSchema); | |
//====== | |
// validate that AppInfoElements were handled correctly on Type and Property | |
// Type | |
assertNotNull("Type [newType] is null", newType); | |
assertTrue("Type does not have AppInfoElements set as expected", newType.getAppInfoElements() != null); | |
assertTrue("Expected AppInfoElements list of size [1] on Type, but was [" + newType.getAppInfoElements().size() + "]", newType.getAppInfoElements().size() == 1); | |
String val = ((Element)newType.getAppInfoElements().get(0)).getAttribute(SDOConstants.APPINFO_SOURCE_ATTRIBUTE); | |
assertNotNull("AppInfoElement source on Type is empty/null", val != null && val.length() > 0); | |
assertTrue("Expected AppInfoElement source ["+TYPE_APP_INFO+"] on Type but was [" + val + "]", val.equals(TYPE_APP_INFO)); | |
String appInfoString = xsdHelper.getAppinfo(newType, TYPE_APP_INFO); | |
assertEquals("Expected getAppInfo() to return ["+TYPE_APP_INFO_STRING+"] but was ["+appInfoString+"]", TYPE_APP_INFO_STRING, appInfoString); | |
// Property | |
SDOProperty myProp = newType.getProperty(MYPROP); | |
assertNotNull("Property [myProperty] is null", myProp); | |
assertTrue("Property does not have AppInfoElements set as expected", myProp.getAppInfoElements() != null); | |
assertTrue("Expected AppInfoElements list of size [1] on Property, but was [" + myProp.getAppInfoElements().size() + "]", myProp.getAppInfoElements().size() == 1); | |
val = ((Element)myProp.getAppInfoElements().get(0)).getAttribute(SDOConstants.APPINFO_SOURCE_ATTRIBUTE); | |
assertNotNull("AppInfoElement source on Property is empty/null", val != null && val.length() > 0); | |
assertTrue("Expected AppInfoElement source ["+PROPERTY_APP_INFO+"] on Property but was [" + val + "]", val.equals(PROPERTY_APP_INFO)); | |
appInfoString = xsdHelper.getAppinfo(myProp, PROPERTY_APP_INFO); | |
assertEquals("Expected getAppInfo() to return ["+PROPERTY_APP_INFO_STRING+"] but was ["+appInfoString+"]", PROPERTY_APP_INFO_STRING, appInfoString); | |
} | |
/** | |
* Test error handling by setting a single Element as opposed to the | |
* expected List<Element>. | |
* | |
* Negative test. | |
*/ | |
public void testSingleAppInfoElement() { | |
// create the data object | |
SDODataObject dataObject = (SDODataObject) dataFactory.create(sdoTypeType); | |
dataObject.set(NAME, MYDO); | |
dataObject.set(URI, MYURI); | |
// the following should cause an IllegalArgumentException | |
try { | |
dataObject.set(SDOConstants.APPINFO_PROPERTY, aiElement); | |
} catch (IllegalArgumentException iaex) { | |
// success | |
} catch (Exception x) { | |
fail("An unexpected exception occurred: \n" + x.getMessage()); | |
} | |
} | |
} |