blob: 132d3dcc4eb086a7d849c2706fbdec9edd8d253a [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.
*/
/*
* TestAttr - test the attribute features
*
* TestAttr.dtd and TestAttr.xml has to be kept in sync with this test.
*/
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.netbeans.modules.schema2beans.*;
import java.beans.*;
import book.*;
public class TestAttr extends BaseTest
{
public static void main(String[] argv) {
BaseTest o = new TestAttr();
if (argv.length > 0)
o.setDocumentDir(argv[0]);
try {
o.run();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
public class MyListener implements PropertyChangeListener
{
GraphManager gm;
String listenerName;
Object oldValue;
Object newValue;
String propertyName;
Object source;
boolean mute;
boolean remove;
public MyListener(BaseBean bean)
{
this.listenerName = bean.name();
gm = bean.graphManager();
this.remove = false;
this.mute = false;
out("new listener for " + this.listenerName);
}
public void reset()
{
this.oldValue = null;
this.newValue = null;
this.propertyName = null;
this.source = null;
}
public void propertyChange(PropertyChangeEvent e)
{
if (this.mute)
return;
String k;
this.oldValue = e.getOldValue();
this.newValue = e.getNewValue();
this.propertyName = e.getPropertyName();
this.source = e.getSource();
String n = this.propertyName;
int i = gm.getPropertyIndex(n);
String pn;
if (gm.isAttribute(n))
{
pn = "Attr:" + gm.getPropertyName(n);
if (i != -1)
pn += "[" + i + "]";
pn += "." + gm.getAttributeName(n);
}
else
{
pn = "Prop:" + gm.getPropertyName(n);
if (i != -1)
pn += "[" + i + "]";
}
if (this.newValue == null)
k = "Rmv";
else
if (this.oldValue == null)
k = "Add";
else
k = "Chg";
out("<" + k + " Lnr:" + this.listenerName + " Evt:" + n +
" Src:" + this.source.getClass().getName() + ">");
if (remove)
{
out("<" + pn + " - ParentName: " +
gm.getPropertyParentName(n) + ">");
}
else
{
BaseBean bb = gm.getPropertyParent(n);
String nm = "<no class>";
if (bb != null)
nm = bb.getClass().getName();
out("<" + pn + " - ParentName: " +
gm.getPropertyParentName(n) +
" - ParentClass:" + nm + ">");
}
//out("received " + this.oldValue + "/" + this.newValue + "/" +
// this.propertyName);
}
public void removeMode()
{
this.remove = true;
}
public Object oldValue()
{
return this.oldValue;
}
public String stringOldValue()
{
if (this.oldValue == null)
return "<null>";
else
return this.oldValue.toString();
}
public Object newValue()
{
return this.newValue;
}
public String stringNewValue()
{
if (this.newValue == null)
return "<null>";
else
return this.newValue.toString();
}
public String name()
{
return this.propertyName;
}
public void mute(boolean mute)
{
this.mute = mute;
}
public String toString()
{
return this.name() + " raised from source " +
this.source.getClass().getName();
}
}
private MyListener l1;
public void run()
throws Exception
{
Book book;
this.readDocument();
out("creating the bean graph");
//out(DDFactory.XmlToString(doc));
book = Book.createGraph(doc);
out("bean graph created");
l1 = new MyListener(book);
book.addPropertyChangeListener(l1);
l1.mute(true);
//out(book.dumpBeanNode());
//out(((BaseBean)book.clone()).dumpBeanNode());
//((BaseBean)book.clone()).write(System.out);
// Get/Change an enum attribute on the root
{
String s1, s2;
setTest("get enum attribute from root");
s1 = book.getAttributeValue("Good");
check(s1.equals("no"));
out("Changing to another value - should get an event");
s2 = "yes";
l1.mute(false);
book.setAttributeValue("good", s2);
l1.mute(false);
s1 = book.getAttributeValue("good");
check(s1.equals(s2));
out("Book DOM content should be yes", book.dumpDomNode(0));
out("Changing to a non-enum value (should get an exception)");
boolean gotException = false;
try
{
book.setAttributeValue("good", "maybe");
}
catch(IllegalArgumentException e)
{
check(true, "got the proper exception");
gotException = true;
}
catch(Exception e)
{
check(false, "got the wrong exception type: " +
e.getClass().getName() + ", it should be " +
"IllegalArgumentException");
gotException = true;
}
if (!gotException)
check(false, "didnt' get any exception");
}
// Get/Change attributes on a non-root element
{
String s1, s2;
setTest("get #REQUIRED attribute");
s1 = book.getAttributeValue("Summary", "length");
check(s1.equals("132"));
out("Changing to another value");
s2 = "133";
book.setAttributeValue("Summary", "length", s2);
s1 = book.getAttributeValue("Summary", "length");
check(s1.equals(s2));
setTest("get #IMPLIED attribute");
s1 = book.getAttributeValue("Summary", "lang");
check(s1.equals("en"));
out("Setting a new value");
s2 = "fr";
book.setAttributeValue("Summary", "lang", s2);
s1 = book.getAttributeValue("Summary", "lang");
check(s1.equals(s2));
s2 = "";
book.setAttributeValue("Summary", "lang", s2);
s1 = book.getAttributeValue("Summary", "lang");
check(s1.equals(s2));
book.setAttributeValue("Summary", "lang", null);
s1 = book.getAttributeValue("Summary", "lang");
check(s1 == null);
s2 = "fr";
book.setAttributeValue("Summary", "lang", s2);
setTest("get #FIXED attribute");
s1 = book.getAttributeValue("Summary", "size");
check(s1.equals("12"));
out("Summary DOM content should be 133/fr/12",
book.dumpDomNode(1));
out("Setting a new value (should get an exception)");
s2 = "15";
boolean gotException = false;
try
{
book.setAttributeValue("Summary", "size", s2);
}
catch(IllegalStateException e)
{
check(true, "got the proper exception");
gotException = true;
}
catch(Exception e)
{
check(false, "got the wrong exception type: " +
e.getClass().getName() + ", it should be " +
"IllegalStateException");
gotException = true;
}
if (!gotException)
check(false, "didnt' get any exception");
}
// Set from non defined
{
String s1, s2, s3, s4;
setTest("get/set non set #IMPLIED attribute");
Chapter c = book.getChapter(0);
out("Chapter DOM should have no attribute",
c.dumpDomNode(0));
s1 = c.getAttributeValue("title");
check(s1 == null);
s2 = "My chapter";
c.setAttributeValue("title", s2);
s1 = c.getAttributeValue("title");
check(s1.equals(s2));
out("Chapter DOM should have one title attribute",
c.dumpDomNode(0));
// Check that we access the same from the bean itself
// and from the parent that contains the attribute.
setTest("access from parent & current bean");
s1 = book.getAttributeValue("Chapter", 0, "title");
s2 = c.getAttributeValue("title");
check(s1.equals(s2));
// Mix the elements, the attributes should follow
setTest("attribute stick with elt when mixing");
s1 = book.getAttributeValue("Chapter", 0, "title");
s2 = book.getAttributeValue("Chapter", 1, "title");
check(s1 != null);
check(s2 == null);
Chapter[] ac = book.getChapter();
c = ac[1];
ac[1] = ac[0];
ac[0] = c;
book.setChapter(ac);
// Attribute of 0 should be what 1 was, and 1 what 0 was
s3 = book.getAttributeValue("Chapter", 0, "title");
s4 = book.getAttributeValue("Chapter", 1, "title");
check(s3 == null);
check(s4.equals(s1));
setTest("get/set non set #IMPLIED attribute (idx != 0)");
c = book.getChapter(2);
out("Chapter DOM should have no attribute",
c.dumpDomNode(0));
s1 = c.getAttributeValue("title");
check(s1 == null);
s2 = "My chapter2";
c.setAttributeValue("title", s2);
s1 = c.getAttributeValue("title");
check(s1.equals(s2));
out("Chapter DOM should have one title attribute",
c.dumpDomNode(0));
}
// Test unknown attribute
{
String s1;
setTest("get unknown attribute");
boolean gotException = false;
try
{
s1 = book.getAttributeValue("Summary", "Splash");
}
catch(IllegalArgumentException e)
{
check(true, "got the proper exception");
gotException = true;
}
catch(Exception e)
{
check(false, "got the wrong exception type: " +
e.getClass().getName() + ", it should be " +
"IllegalArgumentException");
gotException = true;
}
if (!gotException)
check(false, "didnt' get any exception");
}
// Add a brand new element with attributes
{
l1.mute(true);
String s1, s2;
setTest("add a brand new element with default attributes");
Index idx = new Index();
int i = book.addIndex(idx);
s1 = idx.getAttributeValue("cross-ref");
s2 = book.getAttributeValue("Index", i, "CrossRef");
check(s1.equals(s2));
out("should have created: cross-ref & glossary, and not color",
book.dumpDomNode(1));
// Add a brand new element, setting attributes
setTest("add a brand new element, setting attributes");
idx = new Index();
idx.setAttributeValue(Index.CROSSREF, "yes");
idx.setAttributeValue("color", "blue");
idx.setWord("my word");
idx.setAttributeValue("word", "freq", "123");
book.setIndex(i, idx);
out("should have created: cross-ref (yes), glossary (nope) " +
"and color (blue)", book.dumpDomNode(3));
}
// Dynamic parsing of the graph of beans
{
BaseBean root = book.graphManager().getBeanRoot();
this.parseGraph(root, "\t");
}
out("Make sure that default attributes get set.");
Book anotherBook = Book.createGraph();
anotherBook.setSummary("This is my summary.");
out(anotherBook);
setTest("attributes as properties");
book.setGood("no");
check("no".equals(book.getGood()));
out("Checking chapter title");
Chapter chap0 = book.getChapter(0);
chap0.setTitle("My title");
out(chap0.getTitle());
/*setTest("get non set attribute");
book.setAttributeValue("Summary", "lang", "");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
book.write(bout);
out("--------------------");
out(bout.toString());
book.setAttributeValue("Summary", "lang", null);
String s1 = book.getAttributeValue("Summary", "lang");
check(s1 == null);
bout = new ByteArrayOutputStream();
book.write(bout);
out("---- 222 ----------------");
out(bout.toString());
*/
// Test cloned attributes
Chapter tca = new Chapter();
tca.setTitle("Dolly: A Good Clone & A Day");
out("Title before cloning:");
out(tca.getTitle());
Chapter theClone = (Chapter) tca.clone();
out("Title after cloning:");
out(theClone.getTitle());
Book fullGraph = Book.createGraph();
fullGraph.addChapter(theClone);
out("And here is the clone in it's own graph");
out(fullGraph);
}
void parseGraph(BaseBean bean, String indent)
{
if (bean == null)
return;
out(indent + "[" + bean.name() + "]");
BaseProperty[] props = bean.listProperties();
for (int i=0; i<props.length; i++)
{
BaseProperty p = props[i];
String name = p.getName();
// Prop name & size
String str = "<" + name;
if (p.isIndexed())
str += "[" + p.size() + "]";
str += "> - " + p.getPropertyClass();
out(indent + str);
// Prop attributes
String[] attrs = p.getAttributeNames();
for (int j=0; j<attrs.length; j++)
out(indent + " a:" + attrs[j]);
// recurse
if (p.isBean() && p.isIndexed())
{
BaseBean[] ba = (BaseBean[])bean.getValues(name);
for (int k=0; k<ba.length; k++)
this.parseGraph(ba[k], indent + "\t");
}
else
if (p.isBean())
{
BaseBean b = (BaseBean)bean.getValue(name);
this.parseGraph(b, indent + "\t");
}
}
}
}