1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski package ifc.util; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet; 27*b1cdbd2cSJim Jagielski import com.sun.star.container.XNameReplace; 28*b1cdbd2cSJim Jagielski import com.sun.star.util.XChangesBatch; 29*b1cdbd2cSJim Jagielski import com.sun.star.util.XChangesListener; 30*b1cdbd2cSJim Jagielski import com.sun.star.util.XChangesNotifier; 31*b1cdbd2cSJim Jagielski import java.io.PrintWriter; 32*b1cdbd2cSJim Jagielski import lib.StatusException; 33*b1cdbd2cSJim Jagielski import lib.MultiMethodTest; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski /** 36*b1cdbd2cSJim Jagielski * Test the XChangesNotifier interface. To produce some changes, 37*b1cdbd2cSJim Jagielski * XChangesBatch is used. 38*b1cdbd2cSJim Jagielski * @see com.sun.star.util.XChangesNotifier 39*b1cdbd2cSJim Jagielski * @see com.sun.star.util.XChangesBatch 40*b1cdbd2cSJim Jagielski */ 41*b1cdbd2cSJim Jagielski public class _XChangesNotifier extends MultiMethodTest { 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski public XChangesNotifier oObj = null; 44*b1cdbd2cSJim Jagielski private XChangesBatch xBatch = null; 45*b1cdbd2cSJim Jagielski private Object changeElement = null; 46*b1cdbd2cSJim Jagielski private Object originalElement = null; 47*b1cdbd2cSJim Jagielski private String elementName = null; 48*b1cdbd2cSJim Jagielski private XPropertySet xProp = null; 49*b1cdbd2cSJim Jagielski private XNameReplace xNameReplace = null; 50*b1cdbd2cSJim Jagielski private _XChangesNotifier.MyChangesListener xListener = null; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski /** 53*b1cdbd2cSJim Jagielski * Own implementation of the XChangesListener interface 54*b1cdbd2cSJim Jagielski * @see com.sun.star.util.XChangesListener 55*b1cdbd2cSJim Jagielski */ 56*b1cdbd2cSJim Jagielski private static class MyChangesListener implements XChangesListener { 57*b1cdbd2cSJim Jagielski /** Just lo a call of the listener **/ 58*b1cdbd2cSJim Jagielski boolean bChangesOccured = false; 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski /** A change did occur 61*b1cdbd2cSJim Jagielski * @param changesEvent The event. 62*b1cdbd2cSJim Jagielski **/ changesOccurred(com.sun.star.util.ChangesEvent changesEvent)63*b1cdbd2cSJim Jagielski public void changesOccurred(com.sun.star.util.ChangesEvent changesEvent) { 64*b1cdbd2cSJim Jagielski bChangesOccured = true; 65*b1cdbd2cSJim Jagielski } 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski /** Disposing of the listener 68*b1cdbd2cSJim Jagielski * @param eventObject The event. 69*b1cdbd2cSJim Jagielski **/ disposing(com.sun.star.lang.EventObject eventObject)70*b1cdbd2cSJim Jagielski public void disposing(com.sun.star.lang.EventObject eventObject) { 71*b1cdbd2cSJim Jagielski bChangesOccured = true; 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski /** 75*b1cdbd2cSJim Jagielski * Reset the listener 76*b1cdbd2cSJim Jagielski */ reset()77*b1cdbd2cSJim Jagielski public void reset() { 78*b1cdbd2cSJim Jagielski bChangesOccured = false; 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski /** 82*b1cdbd2cSJim Jagielski * Has the listener been called? 83*b1cdbd2cSJim Jagielski * @return True, if the listener has been called. 84*b1cdbd2cSJim Jagielski */ didChangesOccur()85*b1cdbd2cSJim Jagielski public boolean didChangesOccur() { 86*b1cdbd2cSJim Jagielski return bChangesOccured; 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski /** 91*b1cdbd2cSJim Jagielski * Before the test: get the 'XChangesNotifier.ChangesBatch' object relation 92*b1cdbd2cSJim Jagielski * and create the listener. 93*b1cdbd2cSJim Jagielski */ before()94*b1cdbd2cSJim Jagielski protected void before() { 95*b1cdbd2cSJim Jagielski xBatch = (XChangesBatch)tEnv.getObjRelation("XChangesNotifier.ChangesBatch"); 96*b1cdbd2cSJim Jagielski changeElement = tEnv.getObjRelation("XChangesNotifier.ChangeElement"); 97*b1cdbd2cSJim Jagielski originalElement = tEnv.getObjRelation("XChangesNotifier.OriginalElement"); 98*b1cdbd2cSJim Jagielski elementName = (String)tEnv.getObjRelation("XChangesNotifier.PropertyName"); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski xProp = (XPropertySet)tEnv.getObjRelation("XChangesNotifier.PropertySet"); 101*b1cdbd2cSJim Jagielski try { 102*b1cdbd2cSJim Jagielski if (originalElement == null && xProp != null) 103*b1cdbd2cSJim Jagielski originalElement = xProp.getPropertyValue(elementName); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski catch(com.sun.star.uno.Exception e) { 106*b1cdbd2cSJim Jagielski throw new StatusException("Could not get property '" + elementName + "'.", e); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski // or get an XNameReplace 110*b1cdbd2cSJim Jagielski xNameReplace = (XNameReplace)tEnv.getObjRelation("XChangesNotifier.NameReplace"); 111*b1cdbd2cSJim Jagielski try { 112*b1cdbd2cSJim Jagielski if (originalElement == null && xNameReplace != null) 113*b1cdbd2cSJim Jagielski originalElement = xNameReplace.getByName(elementName); 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski catch(com.sun.star.uno.Exception e) { 116*b1cdbd2cSJim Jagielski throw new StatusException("Could not get element by name '" + elementName + "'.", e); 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski if (changeElement == null || originalElement == null || elementName == null || (xProp == null && xNameReplace == null) || xBatch == null) { 120*b1cdbd2cSJim Jagielski log.println( 121*b1cdbd2cSJim Jagielski changeElement == null?"Missing property 'XChangesNotifier.ChangeElement'\n":"" + 122*b1cdbd2cSJim Jagielski originalElement == null?"Missing property 'XChangesNotifier.OriginalElement'\n":"" + 123*b1cdbd2cSJim Jagielski elementName == null?"Missing property 'XChangesNotifier.PropertyName'\n":"" + 124*b1cdbd2cSJim Jagielski xProp == null?"Missing property 'XChangesNotifier.PropertySet'":"" + 125*b1cdbd2cSJim Jagielski xNameReplace == null?"Missing property 'XChangesNotifier.NameReplace'":"" + 126*b1cdbd2cSJim Jagielski xBatch == null?"Missing property 'XChangesNotifier.ChangesBatch'":"" 127*b1cdbd2cSJim Jagielski ); 128*b1cdbd2cSJim Jagielski throw new StatusException("Some needed object relations are missing.", new Exception()); 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski xListener = new _XChangesNotifier.MyChangesListener(); 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski /** test addChangesListener **/ _addChangesListener()135*b1cdbd2cSJim Jagielski public void _addChangesListener() { 136*b1cdbd2cSJim Jagielski oObj.addChangesListener(xListener); 137*b1cdbd2cSJim Jagielski tRes.tested("addChangesListener()", true); 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski /** test removeChangesListener **/ _removeChangesListener()141*b1cdbd2cSJim Jagielski public void _removeChangesListener() { 142*b1cdbd2cSJim Jagielski requiredMethod("addChangesListener()"); 143*b1cdbd2cSJim Jagielski boolean result = true; 144*b1cdbd2cSJim Jagielski result &= commitChanges(); 145*b1cdbd2cSJim Jagielski result &= xListener.didChangesOccur(); 146*b1cdbd2cSJim Jagielski if (!result) 147*b1cdbd2cSJim Jagielski log.println("Listener has not been called."); 148*b1cdbd2cSJim Jagielski oObj.removeChangesListener(xListener); 149*b1cdbd2cSJim Jagielski xListener.reset(); 150*b1cdbd2cSJim Jagielski result &= redoChanges(); 151*b1cdbd2cSJim Jagielski boolean result2 = xListener.didChangesOccur(); 152*b1cdbd2cSJim Jagielski if (result2) 153*b1cdbd2cSJim Jagielski log.println("Removed listener has been called."); 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski tRes.tested("removeChangesListener()", result && !result2); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski /** 159*b1cdbd2cSJim Jagielski * Commit a change, using an implementation of the XChangesBatch interface. 160*b1cdbd2cSJim Jagielski * @return true, if changing worked. 161*b1cdbd2cSJim Jagielski */ commitChanges()162*b1cdbd2cSJim Jagielski private boolean commitChanges() { 163*b1cdbd2cSJim Jagielski if (!executeChange(changeElement)) return false; 164*b1cdbd2cSJim Jagielski if (!xBatch.hasPendingChanges()) return false; 165*b1cdbd2cSJim Jagielski try { 166*b1cdbd2cSJim Jagielski xBatch.commitChanges(); 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski catch(com.sun.star.lang.WrappedTargetException e) { 169*b1cdbd2cSJim Jagielski e.printStackTrace((PrintWriter)log); 170*b1cdbd2cSJim Jagielski return false; 171*b1cdbd2cSJim Jagielski } 172*b1cdbd2cSJim Jagielski return true; 173*b1cdbd2cSJim Jagielski } 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski /** 176*b1cdbd2cSJim Jagielski * Redo the change, using an implementation of the XChangesBatch interface. 177*b1cdbd2cSJim Jagielski * @return true, if changing worked. 178*b1cdbd2cSJim Jagielski */ redoChanges()179*b1cdbd2cSJim Jagielski private boolean redoChanges() { 180*b1cdbd2cSJim Jagielski if (!executeChange(originalElement)) return false; 181*b1cdbd2cSJim Jagielski if (!xBatch.hasPendingChanges()) return false; 182*b1cdbd2cSJim Jagielski try { 183*b1cdbd2cSJim Jagielski xBatch.commitChanges(); 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski catch(com.sun.star.lang.WrappedTargetException e) { 186*b1cdbd2cSJim Jagielski e.printStackTrace((PrintWriter)log); 187*b1cdbd2cSJim Jagielski return false; 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski return true; 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski /** 193*b1cdbd2cSJim Jagielski * Execute the change, use XPropertySet or XNameReplace 194*b1cdbd2cSJim Jagielski * @return False, if changing did throw an exception. 195*b1cdbd2cSJim Jagielski */ executeChange(Object element)196*b1cdbd2cSJim Jagielski private boolean executeChange(Object element) throws StatusException { 197*b1cdbd2cSJim Jagielski if (xProp != null) { 198*b1cdbd2cSJim Jagielski try { 199*b1cdbd2cSJim Jagielski xProp.setPropertyValue(elementName, element); 200*b1cdbd2cSJim Jagielski } 201*b1cdbd2cSJim Jagielski catch(com.sun.star.uno.Exception e) { 202*b1cdbd2cSJim Jagielski e.printStackTrace((PrintWriter)log); 203*b1cdbd2cSJim Jagielski return false; 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski } 206*b1cdbd2cSJim Jagielski else if (xNameReplace != null) { 207*b1cdbd2cSJim Jagielski try { 208*b1cdbd2cSJim Jagielski xNameReplace.replaceByName(elementName, element); 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski catch(com.sun.star.uno.Exception e) { 211*b1cdbd2cSJim Jagielski e.printStackTrace((PrintWriter)log); 212*b1cdbd2cSJim Jagielski return false; 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski } 215*b1cdbd2cSJim Jagielski return true; 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski } 219