/************************************************************** * * 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 ifc.util; import com.sun.star.beans.XPropertySet; import com.sun.star.container.XNameReplace; import com.sun.star.util.XChangesBatch; import com.sun.star.util.XChangesListener; import com.sun.star.util.XChangesNotifier; import java.io.PrintWriter; import lib.StatusException; import lib.MultiMethodTest; /** * Test the XChangesNotifier interface. To produce some changes, * XChangesBatch is used. * @see com.sun.star.util.XChangesNotifier * @see com.sun.star.util.XChangesBatch */ public class _XChangesNotifier extends MultiMethodTest { public XChangesNotifier oObj = null; private XChangesBatch xBatch = null; private Object changeElement = null; private Object originalElement = null; private String elementName = null; private XPropertySet xProp = null; private XNameReplace xNameReplace = null; private _XChangesNotifier.MyChangesListener xListener = null; /** * Own implementation of the XChangesListener interface * @see com.sun.star.util.XChangesListener */ private static class MyChangesListener implements XChangesListener { /** Just lo a call of the listener **/ boolean bChangesOccured = false; /** A change did occur * @param changesEvent The event. **/ public void changesOccurred(com.sun.star.util.ChangesEvent changesEvent) { bChangesOccured = true; } /** Disposing of the listener * @param eventObject The event. **/ public void disposing(com.sun.star.lang.EventObject eventObject) { bChangesOccured = true; } /** * Reset the listener */ public void reset() { bChangesOccured = false; } /** * Has the listener been called? * @return True, if the listener has been called. */ public boolean didChangesOccur() { return bChangesOccured; } } /** * Before the test: get the 'XChangesNotifier.ChangesBatch' object relation * and create the listener. */ protected void before() { xBatch = (XChangesBatch)tEnv.getObjRelation("XChangesNotifier.ChangesBatch"); changeElement = tEnv.getObjRelation("XChangesNotifier.ChangeElement"); originalElement = tEnv.getObjRelation("XChangesNotifier.OriginalElement"); elementName = (String)tEnv.getObjRelation("XChangesNotifier.PropertyName"); xProp = (XPropertySet)tEnv.getObjRelation("XChangesNotifier.PropertySet"); try { if (originalElement == null && xProp != null) originalElement = xProp.getPropertyValue(elementName); } catch(com.sun.star.uno.Exception e) { throw new StatusException("Could not get property '" + elementName + "'.", e); } // or get an XNameReplace xNameReplace = (XNameReplace)tEnv.getObjRelation("XChangesNotifier.NameReplace"); try { if (originalElement == null && xNameReplace != null) originalElement = xNameReplace.getByName(elementName); } catch(com.sun.star.uno.Exception e) { throw new StatusException("Could not get element by name '" + elementName + "'.", e); } if (changeElement == null || originalElement == null || elementName == null || (xProp == null && xNameReplace == null) || xBatch == null) { log.println( changeElement == null?"Missing property 'XChangesNotifier.ChangeElement'\n":"" + originalElement == null?"Missing property 'XChangesNotifier.OriginalElement'\n":"" + elementName == null?"Missing property 'XChangesNotifier.PropertyName'\n":"" + xProp == null?"Missing property 'XChangesNotifier.PropertySet'":"" + xNameReplace == null?"Missing property 'XChangesNotifier.NameReplace'":"" + xBatch == null?"Missing property 'XChangesNotifier.ChangesBatch'":"" ); throw new StatusException("Some needed object relations are missing.", new Exception()); } xListener = new _XChangesNotifier.MyChangesListener(); } /** test addChangesListener **/ public void _addChangesListener() { oObj.addChangesListener(xListener); tRes.tested("addChangesListener()", true); } /** test removeChangesListener **/ public void _removeChangesListener() { requiredMethod("addChangesListener()"); boolean result = true; result &= commitChanges(); result &= xListener.didChangesOccur(); if (!result) log.println("Listener has not been called."); oObj.removeChangesListener(xListener); xListener.reset(); result &= redoChanges(); boolean result2 = xListener.didChangesOccur(); if (result2) log.println("Removed listener has been called."); tRes.tested("removeChangesListener()", result && !result2); } /** * Commit a change, using an implementation of the XChangesBatch interface. * @return true, if changing worked. */ private boolean commitChanges() { if (!executeChange(changeElement)) return false; if (!xBatch.hasPendingChanges()) return false; try { xBatch.commitChanges(); } catch(com.sun.star.lang.WrappedTargetException e) { e.printStackTrace((PrintWriter)log); return false; } return true; } /** * Redo the change, using an implementation of the XChangesBatch interface. * @return true, if changing worked. */ private boolean redoChanges() { if (!executeChange(originalElement)) return false; if (!xBatch.hasPendingChanges()) return false; try { xBatch.commitChanges(); } catch(com.sun.star.lang.WrappedTargetException e) { e.printStackTrace((PrintWriter)log); return false; } return true; } /** * Execute the change, use XPropertySet or XNameReplace * @return False, if changing did throw an exception. */ private boolean executeChange(Object element) throws StatusException { if (xProp != null) { try { xProp.setPropertyValue(elementName, element); } catch(com.sun.star.uno.Exception e) { e.printStackTrace((PrintWriter)log); return false; } } else if (xNameReplace != null) { try { xNameReplace.replaceByName(elementName, element); } catch(com.sun.star.uno.Exception e) { e.printStackTrace((PrintWriter)log); return false; } } return true; } }