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 complex.writer; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 27*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextDocument; 28*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 29*b1cdbd2cSJim Jagielski import org.junit.After; 30*b1cdbd2cSJim Jagielski import org.junit.AfterClass; 31*b1cdbd2cSJim Jagielski import org.junit.Before; 32*b1cdbd2cSJim Jagielski import org.junit.BeforeClass; 33*b1cdbd2cSJim Jagielski import org.junit.Test; 34*b1cdbd2cSJim Jagielski import org.openoffice.test.OfficeConnection; 35*b1cdbd2cSJim Jagielski import static org.junit.Assert.*; 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski /** 38*b1cdbd2cSJim Jagielski * 39*b1cdbd2cSJim Jagielski * @author od138299 40*b1cdbd2cSJim Jagielski */ 41*b1cdbd2cSJim Jagielski public class CheckCrossReferences { 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski private com.sun.star.container.XEnumeration xParaEnum; 44*b1cdbd2cSJim Jagielski private com.sun.star.container.XEnumeration xPortionEnum; 45*b1cdbd2cSJim Jagielski private com.sun.star.util.XRefreshable xFldsRefresh; 46*b1cdbd2cSJim Jagielski getNextField()47*b1cdbd2cSJim Jagielski public com.sun.star.text.XTextField getNextField() 48*b1cdbd2cSJim Jagielski throws com.sun.star.uno.Exception 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski if ( xPortionEnum != null ) { 51*b1cdbd2cSJim Jagielski while ( xPortionEnum.hasMoreElements() ) { 52*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xPortionProps = 53*b1cdbd2cSJim Jagielski (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( 54*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet.class , xPortionEnum.nextElement()); 55*b1cdbd2cSJim Jagielski final String sPortionType = 56*b1cdbd2cSJim Jagielski xPortionProps.getPropertyValue( "TextPortionType" ).toString(); 57*b1cdbd2cSJim Jagielski if ( sPortionType.equals( "TextField") ) { 58*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField xField = (com.sun.star.text.XTextField)UnoRuntime.queryInterface( 59*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField.class, 60*b1cdbd2cSJim Jagielski xPortionProps.getPropertyValue( "TextField" ) ); 61*b1cdbd2cSJim Jagielski assertNotNull("Cannot retrieve next field.", xField); 62*b1cdbd2cSJim Jagielski return xField; 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski } 65*b1cdbd2cSJim Jagielski } 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski while ( xParaEnum.hasMoreElements() ) { 68*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess aPara = 69*b1cdbd2cSJim Jagielski (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( 70*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess.class, xParaEnum.nextElement()); 71*b1cdbd2cSJim Jagielski xPortionEnum = aPara.createEnumeration(); 72*b1cdbd2cSJim Jagielski while ( xPortionEnum.hasMoreElements() ) { 73*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xPortionProps = 74*b1cdbd2cSJim Jagielski (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( 75*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet.class , xPortionEnum.nextElement()); 76*b1cdbd2cSJim Jagielski final String sPortionType = 77*b1cdbd2cSJim Jagielski xPortionProps.getPropertyValue( "TextPortionType" ).toString(); 78*b1cdbd2cSJim Jagielski if ( sPortionType.equals( "TextField") ) { 79*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField xField = (com.sun.star.text.XTextField)UnoRuntime.queryInterface( 80*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField.class, 81*b1cdbd2cSJim Jagielski xPortionProps.getPropertyValue( "TextField" ) ); 82*b1cdbd2cSJim Jagielski assertNotNull("Cannot retrieve next field.", xField); 83*b1cdbd2cSJim Jagielski return xField; 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski fail("Cannot retrieve next field."); 89*b1cdbd2cSJim Jagielski return null; // unreachable 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski getFieldProps( com.sun.star.text.XTextField xField )92*b1cdbd2cSJim Jagielski public com.sun.star.beans.XPropertySet getFieldProps( 93*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField xField ) { 94*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xProps = 95*b1cdbd2cSJim Jagielski (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( 96*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet.class, xField ); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski assertNotNull("Cannot retrieve field properties.", xProps); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski return xProps; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski checkField( com.sun.star.text.XTextField xField, com.sun.star.beans.XPropertySet xProps, short nFormat, String aExpectedFldResult )103*b1cdbd2cSJim Jagielski public void checkField( com.sun.star.text.XTextField xField, 104*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xProps, 105*b1cdbd2cSJim Jagielski short nFormat, 106*b1cdbd2cSJim Jagielski String aExpectedFldResult ) 107*b1cdbd2cSJim Jagielski throws com.sun.star.uno.Exception 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski // set requested format 110*b1cdbd2cSJim Jagielski xProps.setPropertyValue("ReferenceFieldPart", new Short(nFormat)); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski // refresh fields in order to get new format applied 113*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski String aFldResult = xField.getPresentation( false ); 116*b1cdbd2cSJim Jagielski assertEquals( "set reference field format doesn't result in correct field result", 117*b1cdbd2cSJim Jagielski aExpectedFldResult, aFldResult); 118*b1cdbd2cSJim Jagielski } 119*b1cdbd2cSJim Jagielski checkCrossReferences()120*b1cdbd2cSJim Jagielski @Test public void checkCrossReferences() throws com.sun.star.uno.Exception { 121*b1cdbd2cSJim Jagielski // setup paragraph enumeration 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess xParaEnumAccess = 124*b1cdbd2cSJim Jagielski (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( 125*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess.class, document.getText()); 126*b1cdbd2cSJim Jagielski xParaEnum = xParaEnumAccess.createEnumeration(); 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski // get field refresher 130*b1cdbd2cSJim Jagielski { 131*b1cdbd2cSJim Jagielski com.sun.star.text.XTextFieldsSupplier xFieldSupp = 132*b1cdbd2cSJim Jagielski (com.sun.star.text.XTextFieldsSupplier)UnoRuntime.queryInterface( 133*b1cdbd2cSJim Jagielski com.sun.star.text.XTextFieldsSupplier.class, document); 134*b1cdbd2cSJim Jagielski xFldsRefresh = (com.sun.star.util.XRefreshable)UnoRuntime.queryInterface( 135*b1cdbd2cSJim Jagielski com.sun.star.util.XRefreshable.class, xFieldSupp.getTextFields()); 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski // check first reference field 139*b1cdbd2cSJim Jagielski { 140*b1cdbd2cSJim Jagielski // strings for checking 141*b1cdbd2cSJim Jagielski final String FldResult1 = "*i*"; 142*b1cdbd2cSJim Jagielski final String FldResult2 = "+b+*i*"; 143*b1cdbd2cSJim Jagielski final String FldResult3 = "-1-+b+*i*"; 144*b1cdbd2cSJim Jagielski final String FldResult4 = "1."; 145*b1cdbd2cSJim Jagielski final String FldResult5 = " 1."; 146*b1cdbd2cSJim Jagielski final String FldResult6 = "A. 1."; 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski // variables for current field 149*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField xField = null; 150*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xProps = null; 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski xField = getNextField(); 153*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 154*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult2 ); 155*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); 156*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski xField = getNextField(); 159*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 160*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult1 ); 161*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); 162*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski xField = getNextField(); 165*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 166*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult3 ); 167*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); 168*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski xField = getNextField(); 171*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 172*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult5 ); 173*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); 174*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski xField = getNextField(); 177*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 178*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult4 ); 179*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); 180*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski xField = getNextField(); 183*b1cdbd2cSJim Jagielski xProps = getFieldProps( xField ); 184*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult6 ); 185*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); 186*b1cdbd2cSJim Jagielski checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski // insert a certain cross-reference bookmark and a reference field to this bookmark 190*b1cdbd2cSJim Jagielski { 191*b1cdbd2cSJim Jagielski // restart paragraph enumeration 192*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess xParaEnumAccess = 193*b1cdbd2cSJim Jagielski (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( 194*b1cdbd2cSJim Jagielski com.sun.star.container.XEnumerationAccess.class, document.getText()); 195*b1cdbd2cSJim Jagielski xParaEnum = xParaEnumAccess.createEnumeration(); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski // iterate on the paragraphs to find certain paragraph to insert the bookmark 198*b1cdbd2cSJim Jagielski com.sun.star.text.XTextRange xParaTextRange = null; 199*b1cdbd2cSJim Jagielski while ( xParaEnum.hasMoreElements() ) { 200*b1cdbd2cSJim Jagielski xParaTextRange = (com.sun.star.text.XTextRange)UnoRuntime.queryInterface( 201*b1cdbd2cSJim Jagielski com.sun.star.text.XTextRange.class, xParaEnum.nextElement()); 202*b1cdbd2cSJim Jagielski if ( xParaTextRange.getString().equals( "J" ) ) { 203*b1cdbd2cSJim Jagielski break; 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski else { 206*b1cdbd2cSJim Jagielski xParaTextRange = null; 207*b1cdbd2cSJim Jagielski } 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski assertNotNull( 210*b1cdbd2cSJim Jagielski "Cannot find paragraph to insert cross-reference bookmark.", 211*b1cdbd2cSJim Jagielski xParaTextRange); 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski // insert bookmark 214*b1cdbd2cSJim Jagielski XMultiServiceFactory xFac = (XMultiServiceFactory)UnoRuntime.queryInterface( 215*b1cdbd2cSJim Jagielski XMultiServiceFactory.class, document); 216*b1cdbd2cSJim Jagielski final String cBookmarkName = "__RefNumPara__47114711"; 217*b1cdbd2cSJim Jagielski com.sun.star.text.XTextContent xBookmark = 218*b1cdbd2cSJim Jagielski (com.sun.star.text.XTextContent)UnoRuntime.queryInterface( 219*b1cdbd2cSJim Jagielski com.sun.star.text.XTextContent.class, 220*b1cdbd2cSJim Jagielski xFac.createInstance( "com.sun.star.text.Bookmark" ) ); 221*b1cdbd2cSJim Jagielski if ( xBookmark != null ) { 222*b1cdbd2cSJim Jagielski com.sun.star.container.XNamed xName = 223*b1cdbd2cSJim Jagielski (com.sun.star.container.XNamed)UnoRuntime.queryInterface( 224*b1cdbd2cSJim Jagielski com.sun.star.container.XNamed.class, xBookmark ); 225*b1cdbd2cSJim Jagielski xName.setName( cBookmarkName ); 226*b1cdbd2cSJim Jagielski xBookmark.attach(xParaTextRange.getStart()); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski // insert reference field, which references the inserted bookmark 230*b1cdbd2cSJim Jagielski com.sun.star.text.XTextContent xNewField = 231*b1cdbd2cSJim Jagielski (com.sun.star.text.XTextContent)UnoRuntime.queryInterface( 232*b1cdbd2cSJim Jagielski com.sun.star.text.XTextContent.class, 233*b1cdbd2cSJim Jagielski xFac.createInstance( "com.sun.star.text.TextField.GetReference" ) ); 234*b1cdbd2cSJim Jagielski if ( xNewField != null ) { 235*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet xFieldProps = 236*b1cdbd2cSJim Jagielski (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( 237*b1cdbd2cSJim Jagielski com.sun.star.beans.XPropertySet.class, xNewField ); 238*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue( "ReferenceFieldPart", new Short(com.sun.star.text.ReferenceFieldPart.TEXT) ); 239*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue( "ReferenceFieldSource", new Short(com.sun.star.text.ReferenceFieldSource.BOOKMARK) ); 240*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue( "SourceName", cBookmarkName ); 241*b1cdbd2cSJim Jagielski com.sun.star.text.XTextRange xFieldTextRange = 242*b1cdbd2cSJim Jagielski (com.sun.star.text.XTextRange)UnoRuntime.queryInterface( 243*b1cdbd2cSJim Jagielski com.sun.star.text.XTextRange.class, xParaEnum.nextElement()); 244*b1cdbd2cSJim Jagielski xNewField.attach(xFieldTextRange.getEnd()); 245*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 246*b1cdbd2cSJim Jagielski } 247*b1cdbd2cSJim Jagielski 248*b1cdbd2cSJim Jagielski // check inserted reference field 249*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField xField = 250*b1cdbd2cSJim Jagielski (com.sun.star.text.XTextField)UnoRuntime.queryInterface( 251*b1cdbd2cSJim Jagielski com.sun.star.text.XTextField.class, xNewField ); 252*b1cdbd2cSJim Jagielski assertEquals( "inserted reference field doesn't has correct field result", 253*b1cdbd2cSJim Jagielski "J", xField.getPresentation( false ) ); 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski xParaTextRange.getStart().setString( "Hallo new bookmark: " ); 256*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 257*b1cdbd2cSJim Jagielski assertEquals( "inserted reference field doesn't has correct field result", 258*b1cdbd2cSJim Jagielski "Hallo new bookmark: J", xField.getPresentation( false ) ); 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski setUpDocument()262*b1cdbd2cSJim Jagielski @Before public void setUpDocument() throws com.sun.star.uno.Exception { 263*b1cdbd2cSJim Jagielski document = util.WriterTools.loadTextDoc( 264*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface( 265*b1cdbd2cSJim Jagielski XMultiServiceFactory.class, 266*b1cdbd2cSJim Jagielski connection.getComponentContext().getServiceManager()), 267*b1cdbd2cSJim Jagielski TestDocument.getUrl("CheckCrossReferences.odt")); 268*b1cdbd2cSJim Jagielski } 269*b1cdbd2cSJim Jagielski tearDownDocument()270*b1cdbd2cSJim Jagielski @After public void tearDownDocument() { 271*b1cdbd2cSJim Jagielski util.DesktopTools.closeDoc(document); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski private XTextDocument document = null; 275*b1cdbd2cSJim Jagielski setUpConnection()276*b1cdbd2cSJim Jagielski @BeforeClass public static void setUpConnection() throws Exception { 277*b1cdbd2cSJim Jagielski connection.setUp(); 278*b1cdbd2cSJim Jagielski } 279*b1cdbd2cSJim Jagielski tearDownConnection()280*b1cdbd2cSJim Jagielski @AfterClass public static void tearDownConnection() 281*b1cdbd2cSJim Jagielski throws InterruptedException, com.sun.star.uno.Exception 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski connection.tearDown(); 284*b1cdbd2cSJim Jagielski } 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski private static final OfficeConnection connection = new OfficeConnection(); 287*b1cdbd2cSJim Jagielski } 288