282 lines
11 KiB
Java
282 lines
11 KiB
Java
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* The Contents of this file are made available subject to the terms of
|
|
* the BSD license.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of Sun Microsystems, Inc. nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*************************************************************************/
|
|
|
|
// 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;
|
|
|
|
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.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 args 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 \"<Domino Host>\" \"<User>\" " +
|
|
"\"<Password>\" \"<Database>\"" );
|
|
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( notesaccess );
|
|
}
|
|
else {
|
|
// Extracting the host, user, and password.
|
|
NotesAccess notesaccess = new NotesAccess();
|
|
|
|
// Allowing remote calls to the Domino classes.
|
|
thread = new Thread( notesaccess );
|
|
}
|
|
|
|
// Starting the thread.
|
|
thread.start();
|
|
}
|
|
|
|
/** 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 instantiate within
|
|
frames. */
|
|
XComponentLoader xLoader = UnoRuntime.queryInterface(XComponentLoader.class,
|
|
xMCF.createInstanceWithContext(
|
|
"com.sun.star.frame.Desktop", xContext));
|
|
|
|
// Load a Writer document, which will be automatically displayed
|
|
XComponent xComponent = xLoader.loadComponentFromURL(
|
|
"private:factory/scalc", "_blank", 0,
|
|
new PropertyValue[0] );
|
|
|
|
// Querying for the interface XSpreadsheetDocument
|
|
XSpreadsheetDocument xSpreadsheetDoc =
|
|
UnoRuntime.queryInterface(
|
|
XSpreadsheetDocument.class, xComponent);
|
|
|
|
// Getting all sheets from the spreadsheet document.
|
|
XSpreadsheets xSpreadsheets = xSpreadsheetDoc.getSheets() ;
|
|
|
|
// Querying for the interface XIndexAccess.
|
|
XIndexAccess xIndexAccess = UnoRuntime.queryInterface(
|
|
XIndexAccess.class, xSpreadsheets);
|
|
|
|
// Getting the first spreadsheet.
|
|
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"
|
|
+ ( intRow + 1 )
|
|
+ "*C" + (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"
|
|
+ ( intRowToStart + 1 ) + ":D"
|
|
+ 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((Float.valueOf(stringValue)).floatValue());
|
|
}
|
|
else {
|
|
xCell.setFormula(stringValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|