/************************************************************** * * 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. * *************************************************************/ // Lotus Notes Domino API import lotus.domino.NotesThread; import lotus.domino.Session; import lotus.domino.Database; import lotus.domino.DocumentCollection; import lotus.domino.Document; import lotus.domino.NotesFactory; // OpenOffice.org API import com.sun.star.bridge.XUnoUrlResolver; import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.uno.XComponentContext; import com.sun.star.uno.UnoRuntime; import com.sun.star.frame.XComponentLoader; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.sheet.XSpreadsheets; import com.sun.star.sheet.XSpreadsheet; import com.sun.star.container.XIndexAccess; import com.sun.star.table.XCell; /** This class creates an OpenOffice.org Calc spreadsheet document and fills it * with existing values of documents from a Lotus Notes database. */ public class NotesAccess implements Runnable { /** Host server of the Domino Directory. */ static String stringHost = ""; /** User in the host's Domino Directory. */ static String stringUser = ""; /** Password for the user in the host's Domino Directory. */ static String stringPassword = ""; /** Database with documents to get data from. */ static String stringDatabase = ""; /** Reading the arguments and constructing the thread. * @param argv Holding values for the host, user, and the password of the user. */ public static void main( String args[] ) { Thread thread; if ( args.length < 4 ) { System.out.println( "usage: java -jar NotesAccess.jar \"\" \"\" " + "\"\" \"\"" ); System.out.println( "\ne.g.:" ); System.out.println( "java -jar NotesAccess.jar \"\" \"\" \"\" \"Stocks.nsf\"" ); System.exit( 1 ); } if ( !args[ 0 ].trim().equals( "" ) ) { stringHost = args[ 0 ].trim(); } if ( !args[ 1 ].trim().equals( "" ) ) { stringUser = args[ 1 ].trim(); } stringPassword = args[ 2 ].trim(); try { java.io.File sourceFile = new java.io.File(args[ 3 ].trim()); stringDatabase = sourceFile.getCanonicalPath(); } catch (java.io.IOException e) { System.out.println("Error: Please check the name or path to your database file."); e.printStackTrace(); System.exit( 1 ); } if ( stringHost.equals( "" ) ) { // Initializing. NotesAccess notesaccess = new NotesAccess(); // Allowing only local calls to the Domino classes. thread = new NotesThread( ( Runnable ) notesaccess ); } else { // Extracting the host, user, and password. NotesAccess notesaccess = new NotesAccess(); // Allowing remote calls to the Domino classes. thread = new Thread( ( Runnable ) notesaccess ); } // Starting the thread. thread.start(); } /** This is the default constructor without arguments. */ public NotesAccess() { } /** Reading all documents from the given database and writing the data to * an OpenOffice.org Calc spreadsheet document. */ public void run() { try { // get the remote office component context XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); System.out.println("Connected to a running office ..."); XMultiComponentFactory xMCF = xContext.getServiceManager(); /* A desktop environment contains tasks with one or more frames in which components can be loaded. Desktop is the environment for components which can instanciate within frames. */ XComponentLoader xLoader = ( XComponentLoader ) UnoRuntime.queryInterface(XComponentLoader.class, xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext)); // Load a Writer document, which will be automaticly displayed XComponent xComponent = xLoader.loadComponentFromURL( "private:factory/scalc", "_blank", 0, new PropertyValue[0] ); // Querying for the interface XSpreadsheetDocument XSpreadsheetDocument xSpreadsheetDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface( XSpreadsheetDocument.class, xComponent); // Getting all sheets from the spreadsheet document. XSpreadsheets xSpreadsheets = xSpreadsheetDoc.getSheets() ; // Querying for the interface XIndexAccess. XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface( XIndexAccess.class, xSpreadsheets); // Getting the first spreadsheet. XSpreadsheet xSpreadsheet = (XSpreadsheet) UnoRuntime.queryInterface( XSpreadsheet.class, xIndexAccess.getByIndex(0)); Session session; if ( !stringHost.equals( "" ) ) { // Creating a Notes session for remote calls to the Domino classes. session = NotesFactory.createSession(stringHost, stringUser, stringPassword); } else { // Creating a Notes session for only local calls to the // Domino classes. session = NotesFactory.createSession(); } // Getting the specified Notes database. Database database = session.getDatabase( "", stringDatabase ); // Getting a collection of all documents from the database. DocumentCollection documentCollection = database.getAllDocuments(); // Getting the first document from the database Document document = documentCollection.getFirstDocument(); // Start to write to cells at this row. int intRowToStart = 0; // The current row. int intRow = intRowToStart; // The current column. int intColumn = 0; // Process all documents while ( document != null ) { // Getting the name of the stock. String stringName = document.getItemValueString("Name"); // Inserting the name to a specified cell. insertIntoCell(intColumn, intRow, stringName, xSpreadsheet, ""); // Getting the number of stocks. double intNumber = document.getItemValueInteger( "Number" ); // Inserting the number of stocks to a specified cell. insertIntoCell( intColumn + 1, intRow, String.valueOf(intNumber), xSpreadsheet, "V" ); // Getting current share price. double doubleSharePrice = document.getItemValueDouble("SharePrice"); // Inserting the current share price to a specified cell. insertIntoCell(intColumn + 2, intRow, String.valueOf(doubleSharePrice), xSpreadsheet, "V"); // Inserting the total value. insertIntoCell(intColumn + 3, intRow, "=B" + String.valueOf( intRow + 1 ) + "*C" + String.valueOf(intRow + 1), xSpreadsheet, ""); // Increasing the current row. intRow++; // Getting the next document from the collection. document = documentCollection.getNextDocument(); } // Summing all specific amounts. insertIntoCell(intColumn + 3, intRow, "=sum(D" + String.valueOf( intRowToStart + 1 ) + ":D" + String.valueOf( intRow ), xSpreadsheet, ""); xContext = null; // Leaving the program. System.exit(0); } catch (Exception e) { e.printStackTrace(); } } /** Inserting a value or formula to a cell defined by the row and column. * @param intCellX Row. * @param intCellY Column. * @param stringValue This value will be written to the cell. * @param xSpreadsheet Write the value to the cells of this spreadsheet. * @param stringFlag If this string contains "V", the value will be written, * otherwise the formula. */ public static void insertIntoCell(int intCellX, int intCellY, String stringValue, XSpreadsheet xSpreadsheet, String stringFlag) { XCell xCell = null; try { xCell = xSpreadsheet.getCellByPosition( intCellX, intCellY ); } catch ( com.sun.star.lang.IndexOutOfBoundsException exception ) { System.out.println( "Could not get Cell" ); } if ( stringFlag.equals( "V" )) { xCell.setValue((new Float(stringValue)).floatValue()); } else { xCell.setFormula(stringValue); } } }