| /* |
| * 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. |
| */ |
| /* |
| * TestVeto - test the vetoable events |
| * |
| */ |
| |
| import java.io.*; |
| import java.util.*; |
| import org.w3c.dom.*; |
| |
| import java.beans.*; |
| |
| import org.netbeans.modules.schema2beans.*; |
| import book.*; |
| |
| |
| public class TestVeto extends BaseTest |
| { |
| public static void main(String[] argv) { |
| BaseTest o = new TestVeto(); |
| 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 VetoableChangeListener |
| { |
| GraphManager gm; |
| String listenerName; |
| String title; |
| Object oldValue; |
| Object newValue; |
| String propertyName; |
| Object source; |
| int index; |
| |
| boolean remove; |
| |
| // Used to check that the event is triggered once the changed are done |
| Chapter tracePara; |
| |
| boolean raise = false;; |
| boolean raised = false; |
| boolean printStringArray = false; |
| |
| public MyListener(String title, BaseBean bean) |
| { |
| this.listenerName = bean.name(); |
| gm = bean.graphManager(); |
| this.remove = false; |
| this.title = title; |
| out("new listener for " + this.title + " / " + this.listenerName); |
| } |
| |
| public void printStringValues(String[] ss, String str) |
| { |
| if (ss == null) |
| out(str + " is null"); |
| else |
| { |
| if (ss.length == 0) |
| out(str + ".length = 0"); |
| else |
| for(int i=0; i<ss.length; i++) |
| out(str + "[" + i + "]=" + ss[i]); |
| } |
| } |
| |
| public void reset() |
| { |
| this.oldValue = null; |
| this.newValue = null; |
| this.propertyName = null; |
| this.source = null; |
| this.index = -1; |
| this.raise = false; |
| this.raised = false; |
| this.printStringArray = false; |
| } |
| |
| public void printStringArray() |
| { |
| this.printStringArray = true; |
| } |
| |
| public void traceParagraphs(Chapter c) |
| { |
| this.tracePara = c; |
| } |
| |
| public void veto() |
| { |
| this.raise = true; |
| } |
| |
| public void vetoableChange(PropertyChangeEvent e) |
| throws PropertyVetoException |
| { |
| if (this.raised) |
| out(this.title+ " received an undo event:"); |
| else |
| out(this.title + " received veto event:"); |
| |
| this.oldValue = e.getOldValue(); |
| this.newValue = e.getNewValue(); |
| this.propertyName = e.getPropertyName(); |
| this.source = e.getSource(); |
| String n = this.propertyName; |
| this.index = gm.getPropertyIndex(n); |
| |
| out("<Lnr:" + this.listenerName + " Evt:" + n + |
| " Src:" + this.source.getClass().getName() + ">"); |
| if (remove) |
| { |
| out("<" + gm.getPropertyName(n) + "[" + this.index + |
| "]" + " - Parent: " + gm.getPropertyParentName(n) + ">"); |
| } |
| else |
| { |
| out("<" + gm.getPropertyName(n) + "[" + this.index + |
| "]" + " - Parent: " + gm.getPropertyParentName(n) + |
| "/" + gm.getPropertyParent(n).getClass().getName() + ">"); |
| } |
| |
| if (this.tracePara != null) |
| { |
| String[] p = this.tracePara.getParagraph(); |
| for (int i=0; i<p.length; i++) |
| out("From event listener: " + p[i]); |
| } |
| |
| if (this.printStringArray) |
| { |
| this.printStringValues((String[])this.oldValue, "oldValues"); |
| this.printStringValues((String[])this.newValue, "newValues"); |
| } |
| |
| if (this.raise && !this.raised) |
| { |
| out("Listener: raising PropertyVetoException"); |
| this.raised = true; |
| throw new PropertyVetoException("value rejected", e); |
| } |
| //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 String toString() |
| { |
| return this.name() + " raised from source " + |
| this.source.getClass().getName(); |
| } |
| } |
| |
| public void run() |
| throws Exception |
| { |
| Book book; |
| |
| this.readDocument(); |
| |
| out("creating the bean graph"); |
| book = Book.createGraph(this.doc); |
| GraphManager gm = book.graphManager(); |
| |
| out("bean graph created"); |
| //out(book.toString()); |
| |
| /* |
| * Book |
| * Index[1,n] |
| * Word - String |
| * Ref[1,n] |
| * Page - String |
| * Line - String |
| * Chapter[1,n] |
| * Comment? - String |
| * Paragraph[0,n] - String |
| * Summary? - String |
| * Author[1,n] - String |
| * Good - Boolean |
| * Available - Boolean |
| */ |
| |
| // |
| // Set a listener on the root |
| // |
| MyListener l = new MyListener("Book listener", book); |
| book.addVetoableChangeListener(l); |
| //GraphManager.debug(true); |
| setTest("simple change event on the root - no veto"); |
| l.reset(); |
| String s = "This book is about how to veto changes"; |
| // Change a property on the root - this should raises an event |
| book.setSummary(s); |
| // Check the received event |
| check(l.oldValue() == null, "(old value)"); |
| check(l.newValue().equals(s), "(new value)"); |
| check(book.getSummary().equals(s), "(new value)"); |
| |
| boolean gotException = false; |
| setTest("simple change event on the root - veto"); |
| l.reset(); |
| l.veto(); |
| String s2 = "this is the new value"; |
| s = book.getSummary(); |
| try { |
| book.setSummary(s2); |
| } catch(PropertyVetoException ve) { |
| check(book.getSummary().equals(s), "(got exception & same value)"); |
| gotException = true; |
| } |
| |
| if (!gotException) |
| check(false, " didn't get the veto exception (1)!"); |
| |
| setTest("Try to listen for a non vetoable property"); |
| gotException = false; |
| try { |
| book.addVetoableChangeListener("Reviews", l); |
| } catch(Exception e) { |
| check(true, "got exception:\n" + e.getMessage()); |
| gotException = true; |
| } |
| |
| if (!gotException) |
| check(false, " didn't get the runtime exception (2)!"); |
| |
| setTest("Indexed final property"); |
| l.reset(); |
| String [] ss = {"Author1", "Author2", "Author3"}; |
| l.printStringArray(); |
| book.setAuthor(ss); |
| |
| l.reset(); |
| l.veto(); |
| l.printStringArray(); |
| String [] ss2 = {"Author1_new", "Author2_new"}; |
| try { |
| book.setAuthor(ss2); |
| } catch(PropertyVetoException ve) { |
| check(true, "(got exception)"); |
| gotException = true; |
| } |
| |
| if (!gotException) |
| check(false, " didn't get the veto exception (3)!"); |
| |
| l.printStringValues(book.getAuthor(), "getAuthor()"); |
| |
| setTest("Set a second listener to get two events"); |
| MyListener l2 = new MyListener("Author listener", book); |
| l.reset(); |
| l2.reset(); |
| gotException = false; |
| try { |
| book.addVetoableChangeListener("author", l2); |
| } catch(Exception e) { |
| check(false, "got exception:\n" + e.getMessage()); |
| gotException = true; |
| } |
| |
| String [] ss3 = {"re-Author1_new", "re-Author2_new"}; |
| book.setAuthor(ss3); |
| l.printStringValues(book.getAuthor(), "getAuthor()"); |
| |
| l.reset(); |
| l2.reset(); |
| l.veto(); |
| String [] ss4 = {"only_one_author"}; |
| try { |
| book.setAuthor(ss4); |
| } catch(PropertyVetoException ve) { |
| check(true, "(got exception)"); |
| gotException = true; |
| } |
| |
| if (!gotException) |
| check(false, " didn't get the veto exception (4)!"); |
| |
| } |
| |
| } |
| |
| |
| |