/* -*- 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. * *************************************************************************/ package FilterDevelopment.AsciiFilter; import com.sun.star.lib.uno.helper.WeakBase; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.lang.XSingleComponentFactory; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.AnyConverter; import com.sun.star.lang.XInitialization; import com.sun.star.lang.XServiceInfo; import com.sun.star.container.XNamed; import com.sun.star.document.XImporter; import com.sun.star.document.XExporter; import com.sun.star.document.XFilter; /*-************************************************************************ @title implements a filter to import pure ascii text files @description This filter can use an existing In/OutputStream of given MediaDescriptor or use an existing URL instead of that to open the file directly. But for second case the local file system will be used only. There is no support for remote. During import/export special functionality can be used to e.g. to change some characters inside the file content or replace some strings (no using of regular expressions!). User can decide at runtime which functionality really should be used by selecting it in an extra filter property dialog. So we show how a filter works for import/export, use or create streams and how a filter can offer properties for filtering which can be edit by the user. ************************************************************************-*/ public class AsciiReplaceFilter { public static class _AsciiReplaceFilter extends WeakBase implements XInitialization , XServiceInfo , XNamed , XImporter , XExporter , XFilter { // the supported service names, the first one being the service name of the component itself private static final String[] m_serviceNames = { "com.sun.star.comp.ansifilter.AsciiReplaceFilter" , "com.sun.star.document.ImportFilter", "com.sun.star.document.ExportFilter" }; // filterprocess states private static final int FILTERPROC_RUNS = 0; private static final int FILTERPROC_BREAK = 1; private static final int FILTERPROC_STOPPED = 2; // member /// The initial component context, that gives access to the service manager, supported singletons, ... private XComponentContext m_Ctx; /// The service manager, that gives access to all registered services and which is passed to the FilterOptions class for instantiating a ucb service private XMultiComponentFactory m_xMCF; /// we must provide our name private String m_sInternalName; /// saved document reference for import or export (depends on other member m_bImport!) private com.sun.star.text.XTextDocument m_xDocument; /// because we implement an import AND an export filter, we must know which one is required private boolean m_bImport; // we need a flag to cancel any running filter operation private int m_nFilterProcState; // native interface /** * special debug helper to get an idea how expensive * the implemented filter operations are really. * May be useful for own purposes. * * To see the output inside an office environment * use "soffice ...params... >output.txt" */ private final long m_nStart; private long m_nLast ; private void measure( String sText ) { long nNow = System.currentTimeMillis(); System.err.println(sText+"\t"+(nNow-m_nStart)+"\t"+(nNow-m_nLast)); m_nLast = nNow; } // native interface /** * The constructor to initialize every instance * * @param Context * the component context of the office */ public _AsciiReplaceFilter(XComponentContext Context ) { measure("ctor started"); try { m_Ctx = Context ; m_xMCF = m_Ctx.getServiceManager() ; } catch( Exception e ) { e.printStackTrace(); } // these are safe, thus no errorhandling needed: m_sInternalName = "" ; m_xDocument = null ; m_bImport = true ; m_nFilterProcState = FILTERPROC_STOPPED ; m_nLast = System.currentTimeMillis(); m_nStart = m_nLast; } // interface XInitialization /** * used for initializing after creation * If an instance of this service is created by UNO we will be called * automatically after that to get optional parameters of this creation call. * E.g.: The service com.sun.star.document.FilterFactory use such mechanism * to pass our own configuration data to this instance. * * @param lArguments * This array of arbitrary objects represent our own filter configuration * and may optional given parameters of the createWithArguments() call. * * @throws com.sun.star.uno.Exception * Every exception will not be handled, but will be * passed to the caller. */ public void initialize( Object[] lArguments ) throws com.sun.star.uno.Exception { measure("initialize {"); if (lArguments.length<1) return; // lArguments[0] = own configuration data com.sun.star.beans.PropertyValue[] lConfig = (com.sun.star.beans.PropertyValue[])lArguments[0]; /* // lArguments[1..n] = optional arguments of create request for (int n=1; n0 && !bBreaked) { // copy data from stream to temp. buffer sBuffer.append( new String(lData[0]) ); measure("buffer append ["+nRead+"]"); nRead = aOptions.m_xInput.readBytes( lData, 2048 ); measure("read next bytes"); // check for cancelled filter proc on every loop! synchronized(this) { if (m_nFilterProcState==FILTERPROC_BREAK) { m_nFilterProcState = FILTERPROC_STOPPED; return false; } } measure("break check"); } // Make some replacements inside the buffer. String sText = implts_replace( sBuffer, aOptions ); measure("replace"); // copy current buffer to the document model. // Create a new paragraph for every line inside original file. // May not all data could be read - but that doesn't matter here. // Reason: somewhere cancelled this function. // But check for optional replace request before... int nStart = 0; int nEnd = -1; int nLength = sText.length(); com.sun.star.text.XTextRange xCursor = UnoRuntime.queryInterface( com.sun.star.text.XTextRange.class, xText.createTextCursor()); while (true) { nEnd = sText.indexOf('\n',nStart); if (nEnd==-1 && nStartJavaLoader * * @param sImplName * The implementation name of the component. * * @return Returns a XSingleComponentFactory for * creating the component. * * @see com.sun.star.comp.loader.JavaLoader */ public static XSingleComponentFactory __getComponentFactory(String sImplName) { XSingleComponentFactory xFactory = null; if ( sImplName.equals( _AsciiReplaceFilter.class.getName() ) ) xFactory = com.sun.star.lib.uno.helper.Factory.createComponentFactory(_AsciiReplaceFilter.class, _AsciiReplaceFilter.m_serviceNames); return xFactory; } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */