blob: ace509d1b4fe345fb671c7d08598435a782e44ab [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tuscany.sdo.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URL;
import java.util.List;
import junit.framework.TestCase;
import org.apache.tuscany.sdo.util.SDOUtil;
import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Sequence;
import commonj.sdo.Type;
import commonj.sdo.helper.DataFactory;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;
public class ChangeSummaryPropertyTestCase extends TestCase {
private final String TEST_MODEL = "/simpleWithChangeSummary.xsd";
private final String TEST_NAMESPACE = "http://www.example.com/simpleCS";
private final String TEST_DATA_BEFORE_UNDO = "/simpleWithChangeSummary.xml";
private final String TEST_DATA_AFTER_UNDO = "/simpleWithChangeSummaryUndone.xml";
HelperContext hc;
DataFactory dataFactory;
XMLHelper xmlHelper;
void verify(ChangeSummary cs, DataObject quote, String nameSpace, String element, String beforeUndo, String afterUndo) throws IOException {
// Stop logging changes and serialize the resulting data graph
//
cs.endLogging();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
xmlHelper.save(quote, nameSpace, element, baos);
//xmlHelper.save(quote, nameSpace, element, System.out);
byte[] bytes = baos.toByteArray();
URL url = getClass().getResource(beforeUndo);
assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(bytes), url));
DataObject loaded = xmlHelper.load(new ByteArrayInputStream(bytes)).getRootObject();
baos.reset();
xmlHelper.save(loaded, nameSpace, element, baos);
//xmlHelper.save(loaded, nameSpace, element, System.out);
assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), url));
// Undo all changes and then serialize the resulting data graph again
//
cs.undoChanges();
baos.reset();
xmlHelper.save(quote, nameSpace, element, baos);
//xmlHelper.save(quote, nameSpace, element, System.out);
assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(afterUndo)));
}
/**
* ChangeSummary property test.
*/
protected final void change(String nameSpace, String beforeUndo, String afterUndo) throws Exception {
Type quoteType = hc.getTypeHelper().getType(nameSpace, "RootQuote");
DataObject quote = dataFactory.create(quoteType);
ChangeSummary cs = quote.getChangeSummary();
ChangeSummary csp = (ChangeSummary)quote.get("changes");
assertSame(cs, csp);
quote.setString("symbol", "fbnt");
quote.setString("companyName", "FlyByNightTechnology");
quote.setBigDecimal("price", new BigDecimal("1000.0"));
DataObject child = quote.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("1500.0"));
child = quote.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("2000.0"));
child = child.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("2000.99"));
child = quote.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("2500.0"));
// Begin logging changes
//
cs.beginLogging();
// Modify the data graph in various ways
//
quote.setString("symbol", "FBNT");
quote.setBigDecimal("price", new BigDecimal("999.0"));
quote.setDouble("volume", 1000);
child = quote.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("3000.0"));
child = quote.createDataObject("quotes");
child.setBigDecimal("price", new BigDecimal("4000.0"));
quote.getDataObject("quotes[2]").delete();
verify(cs, quote, nameSpace, "stockQuote", beforeUndo, afterUndo);
}
/**
* Simple ChangeSummary property test.
*/
public void testChangeSummary() throws Exception {
change(TEST_NAMESPACE, TEST_DATA_BEFORE_UNDO, TEST_DATA_AFTER_UNDO);
}
static final String SequenceTest_NameSpace = "http://www.example.com/sequenceCS";
/**
* Mixed ChangeSummary property test.
*/
public void testMixedChangeSummary() throws Exception {
change(SequenceTest_NameSpace, "/mixedChangeSummary.xml", "/mixedChangeSummaryUndone.xml");
}
protected final DataObject createDataObject(Type quoteType, Object value, Sequence sequence, Property property) {
DataObject child = dataFactory.create(quoteType);
child.set("symbol", value);
sequence.add(property, child);
return child;
}
static final String SequenceTest_ELEMENT = "openQuote";
private XSDHelper xsdHelper;
/**
* Open/any ChangeSummary property test.
*/
public void testOpenChangeSummary() throws Exception {
DataObject quote = dataFactory.create(xsdHelper.getGlobalProperty(SequenceTest_NameSpace, SequenceTest_ELEMENT, true).getType());
ChangeSummary cs = quote.getChangeSummary();
ChangeSummary csp = (ChangeSummary)quote.get("changes");
assertSame(cs, csp);
quote.set("symbol", "fbnt");
Property property = xsdHelper.getGlobalProperty("http://www.example.com/open", "openStockQuote", true);
Type quoteType = property.getType();
List openStockQuotes = ((DataObject)quote).getList(property);
addQuote(openStockQuotes, quoteType, "1500.0");
DataObject osq2 = addQuote(openStockQuotes, quoteType, "2000.0");
addQuote(osq2.getList(property), quoteType, "2000.99");
addQuote(openStockQuotes, quoteType, "2500.0");
// Begin logging changes
//
cs.beginLogging();
// Modify the data graph in various ways
//
quote.set("symbol", "FBNT");
addQuote(openStockQuotes, quoteType, "3000.0");
addQuote(openStockQuotes, quoteType, "4000.0");
openStockQuotes.remove(osq2);
verify(cs, quote, SequenceTest_NameSpace, SequenceTest_ELEMENT, "/openChangeSummary.xml", "/openChangeSummaryUndone.xml");
}
private DataObject addQuote(List openStockQuotes, Type quoteType,
Object value) {
DataObject osq = dataFactory.create(quoteType);
osq.set("symbol", value);
openStockQuotes.add(osq);
return osq;
}
void define(String model) throws Exception {
// Populate the meta data for the test model
URL url = getClass().getResource(model);
xsdHelper.define(url.openStream(), url.toString());
}
protected void setUp() throws Exception {
super.setUp();
hc = SDOUtil.createHelperContext();
xsdHelper = hc.getXSDHelper();
dataFactory = hc.getDataFactory();
xmlHelper = hc.getXMLHelper();
// Populate the meta data for the test (Stock Quote) model
define(TEST_MODEL);
define("/SequenceChangeSummary.xsd");
}
}