blob: 001e50f6a750cb0900c670cfe4733ecd91902d5b [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.netbeans.modules.xml.axi.sync;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import junit.framework.*;
import org.netbeans.modules.xml.axi.ContentModel;
import org.netbeans.modules.xml.axi.Element;
import org.netbeans.modules.xml.schema.model.AnyAttribute;
import org.netbeans.modules.xml.schema.model.AttributeGroupReference;
import org.netbeans.modules.xml.schema.model.AttributeReference;
import org.netbeans.modules.xml.schema.model.ComplexContent;
import org.netbeans.modules.xml.schema.model.ComplexExtension;
import org.netbeans.modules.xml.schema.model.ComplexTypeDefinition;
import org.netbeans.modules.xml.schema.model.ElementReference;
import org.netbeans.modules.xml.schema.model.GlobalAttribute;
import org.netbeans.modules.xml.schema.model.GlobalAttributeGroup;
import org.netbeans.modules.xml.schema.model.GlobalComplexType;
import org.netbeans.modules.xml.schema.model.GlobalElement;
import org.netbeans.modules.xml.schema.model.GlobalGroup;
import org.netbeans.modules.xml.schema.model.GlobalType;
import org.netbeans.modules.xml.schema.model.GroupReference;
import org.netbeans.modules.xml.schema.model.LocalAttribute;
import org.netbeans.modules.xml.schema.model.LocalAttributeContainer;
import org.netbeans.modules.xml.schema.model.SchemaComponent;
import org.netbeans.modules.xml.schema.model.SchemaComponentFactory;
import org.netbeans.modules.xml.schema.model.SchemaModel;
import org.netbeans.modules.xml.xam.dom.NamedComponentReference;
import org.netbeans.modules.xml.schema.model.Sequence;
/**
* The unit test covers various use cases of sync on Element
* and ElementRef.
*
* @author Samaresh (Samaresh.Panda@Sun.Com)
*/
public class SyncElementTest extends AbstractSyncTestCase {
public static final String TEST_XSD = "resources/address.xsd";
public static final String GLOBAL_ELEMENT = "address";
/**
* SyncElementTest
*/
public SyncElementTest(String testName) {
super(testName, TEST_XSD, GLOBAL_ELEMENT);
}
public static Test suite() {
TestSuite suite = new TestSuite();
// Disabled as referenced XSD file were partly not donated by oracle to apache
// suite.addTest(new SyncElementTest("testRemoveElementFromType"));
// suite.addTest(new SyncElementTest("testRemoveAttributeFromAttrGroup"));
// suite.addTest(new SyncElementTest("testChangeType"));
// suite.addTest(new SyncElementTest("testChangeAttributeRef"));
// suite.addTest(new SyncElementTest("testChangeTypeContent"));
// suite.addTest(new SyncElementTest("testChangeNameOfElement"));
// suite.addTest(new SyncElementTest("testRemoveGlobalElement"));
// suite.addTest(new SyncElementTest("testAddGlobalElement"));
// suite.addTest(new SyncElementTest("testChangeElementRef"));
// suite.addTest(new SyncElementTest("testChangeBase"));
return suite;
}
/**
* Removes an element from type "USAddress".
* Element count should be one less.
*/
public void testRemoveElementFromType() throws Exception {
Element address = findAXIGlobalElement("address");
int childCount = address.getChildElements().size();
assert(childCount == 3);
GlobalComplexType gct = findGlobalComplexType("USAddress");
getSchemaModel().startTransaction();
Sequence s = (Sequence)gct.getChildren().get(0);
s.removeContent(s.getContent().get(0));
getSchemaModel().endTransaction();
getAXIModel().sync();
childCount = address.getChildElements().size();
assert(childCount == 2);
}
/**
* Removes an attribute from attribute group.
* child count should be one less.
*/
public void testRemoveAttributeFromAttrGroup() throws Exception {
Element address = findAXIGlobalElement("address");
int childCount = address.getChildren().size();
assert(childCount == 4);
GlobalAttributeGroup gag = findGlobalAttributeGroup("attr-group");
getSchemaModel().startTransaction();
LocalAttribute attr = (LocalAttribute)gag.getChildren().get(1);
gag.removeLocalAttribute(attr);
getSchemaModel().endTransaction();
getAXIModel().sync();
childCount = address.getChildren().size();
assert(childCount == 3);
}
/**
* Change the type of element "address" from
* "USAddress" to "USAddress1".
*/
public void testChangeType() throws Exception {
PropertyListener l = new PropertyListener();
getAXIModel().addPropertyChangeListener(l);
Element address = findAXIGlobalElement("address");
int childCount = address.getChildElements().size();
assert(childCount == 2);
GlobalElement ge = (GlobalElement)globalElement.getPeer();
getSchemaModel().startTransaction();
setType(ge, "USAddress1");
getSchemaModel().endTransaction();
getAXIModel().sync();
getAXIModel().removePropertyChangeListener(l);
childCount = address.getChildElements().size();
assert(childCount == 5);
}
/**
* Change the content of "USAddress1".
*/
public void testChangeTypeContent() throws Exception {
PropertyListener l = new PropertyListener();
getAXIModel().addPropertyChangeListener(l);
Element address = findAXIGlobalElement("address");
int childCount = address.getChildElements().size();
assert(childCount == 5);
getSchemaModel().startTransaction();
GlobalGroup gg = findGlobalGroup("group2");
GroupReference gr = (GroupReference)(findGlobalComplexType("USAddress1").getChildren().get(0));
NamedComponentReference ref = getSchemaModel().getFactory().
createGlobalReference(gg, GlobalGroup.class, gr);
gr.setRef(ref);
getSchemaModel().endTransaction();
getAXIModel().sync();
getAXIModel().removePropertyChangeListener(l);
childCount = address.getChildElements().size();
assert(childCount == 3);
}
public void testChangeNameOfElement() throws Exception {
Element address = findAXIGlobalElement("address");
int childCount = address.getChildElements().size();
GlobalElement e = findGlobalElement("address");
getSchemaModel().startTransaction();
e.setName("NewAddress");
getSchemaModel().endTransaction();
getAXIModel().sync();
assert(childCount == address.getChildElements().size());
assert(address.getName().equals("NewAddress"));
}
public void testChangeNameOfType() throws Exception {
Element address = findAXIGlobalElement("address");
int childCount = address.getChildElements().size();
GlobalComplexType type = findGlobalComplexType("USAddress1");
getSchemaModel().startTransaction();
type.setName("USAddress2");
getSchemaModel().endTransaction();
getAXIModel().sync();
assert(childCount == address.getChildElements().size());
}
public void testChangeElementRef() throws Exception {
getSchemaModel().startTransaction();
GlobalGroup group = findGlobalGroup("group1");
ElementReference ref = (ElementReference)group.getChildren().get(0).getChildren().get(0);
GlobalElement ge = findGlobalElement("fullName");
NamedComponentReference ncr = getSchemaModel().getFactory().
createGlobalReference(ge, GlobalElement.class, ref);
ref.setRef(ncr);
getSchemaModel().endTransaction();
getAXIModel().sync();
}
/**
* Remove a global element.
*/
public void testRemoveGlobalElement() throws Exception {
int elementCount = getAXIModel().getRoot().getElements().size();
Element address = findAXIGlobalElement("NewAddress");
GlobalElement ge = (GlobalElement)address.getPeer();
getSchemaModel().startTransaction();
getSchemaModel().getSchema().removeElement(ge);
getSchemaModel().endTransaction();
getAXIModel().sync();
int newCount = getAXIModel().getRoot().getElements().size();
assert( (elementCount-1) == newCount);
}
public void testAddGlobalElement() throws Exception {
int elementCount = getAXIModel().getRoot().getElements().size();
getSchemaModel().startTransaction();
GlobalElement ge = getSchemaModel().getFactory().createGlobalElement();
ge.setName("address");
setType(ge, "USAddress1");
getSchemaModel().getSchema().addElement(ge);
getSchemaModel().endTransaction();
getAXIModel().sync();
int newCount = getAXIModel().getRoot().getElements().size();
assert( (elementCount+1) == newCount);
}
private void setType(GlobalElement ge, String globalComplexType) {
for(GlobalComplexType type : getSchemaModel().getSchema().getComplexTypes()) {
if(type.getName().equals(globalComplexType)) {
NamedComponentReference ref = getSchemaModel().getFactory().
createGlobalReference(type, GlobalType.class, ge);
ge.setType(ref);
}
}
}
public void testRenameGlobalElement() throws Exception {
getSchemaModel().startTransaction();
GlobalElement ge = (GlobalElement)globalElement.getPeer();
ge.setName("address1");
getSchemaModel().endTransaction();
getAXIModel().sync();
assert(globalElement.getName().equals("address1"));
}
public void testChangeAttributeRef() throws Exception {
getSchemaModel().startTransaction();
GlobalAttributeGroup group = findGlobalAttributeGroup("attr-group");
AttributeReference ref = (AttributeReference)group.getChildren().get(0);
GlobalAttribute ga = findGlobalAttribute("countryString");
NamedComponentReference ncr = getSchemaModel().getFactory().
createGlobalReference(ga, GlobalAttribute.class, ref);
ref.setRef(ncr);
getSchemaModel().endTransaction();
getAXIModel().sync();
}
/**
* Remove a GCT "USAddress1", even tho it is being used by "address".
*/
public void testDeleteGlobalType() throws Exception {
Element address = findAXIGlobalElement("NewAddress");
int childCount = address.getChildElements().size();
assert(childCount == 3);
GlobalComplexType gct = findGlobalComplexType("USAddress1");
getSchemaModel().startTransaction();
getSchemaModel().getSchema().removeComplexType(gct);
getSchemaModel().endTransaction();
getAXIModel().sync();
childCount = address.getChildElements().size();
assert(childCount == 0);
}
/**
* Changes the base for a complex type.
*/
public void testChangeBase() throws Exception {
PropertyListener l = new PropertyListener();
getAXIModel().addPropertyChangeListener(l);
ContentModel cm1 = findContentModel("CT1");
assert(cm1.getChildElements().size() == 1);
GlobalComplexType ct1 = findGlobalComplexType("CT1");
GlobalComplexType ct2 = findGlobalComplexType("CT2");
ComplexTypeDefinition def = ct1.getDefinition();
LocalAttributeContainer lac = ct1;
SchemaComponentFactory factory = def.getModel().getFactory();
getSchemaModel().startTransaction();
ComplexContent cc = factory.createComplexContent();
ComplexExtension ce = factory.createComplexExtension();
moveComplexContents(lac,ce);
cc.setLocalDefinition(ce);
ct1.setDefinition(cc);
ce.setBase(ce.createReferenceTo(ct2, GlobalType.class));
getSchemaModel().endTransaction();
getAXIModel().sync();
assert(cm1.getChildElements().size() == 2);
}
private void moveComplexContents(final LocalAttributeContainer oldParent,
final LocalAttributeContainer newParent) {
if(oldParent==null || newParent==null) return;
SchemaModel model = getSchemaModel();
ArrayList<Class<? extends SchemaComponent>> childTypes =
new ArrayList<Class<? extends SchemaComponent>>(4);
childTypes.add(LocalAttribute.class);
childTypes.add(AttributeReference.class);
childTypes.add(AttributeGroupReference.class);
childTypes.add(AnyAttribute.class);
childTypes.add(ComplexTypeDefinition.class);
for(SchemaComponent child :oldParent.getChildren(childTypes)) {
if(newParent.canPaste(child))
model.addChildComponent(newParent,child.copy(newParent),-1);
model.removeChildComponent(child);
}
}
static class PropertyListener implements PropertyChangeListener {
List<PropertyChangeEvent> events = new ArrayList<PropertyChangeEvent>();
public void propertyChange(PropertyChangeEvent evt) {
events.add(evt);
}
public List<PropertyChangeEvent> getEvents() {
return events;
}
public void clearEvents() { events.clear();}
}
}