/*
 * 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)!");

 	}

}



