office-gobmx/xmlhelp/source/com/sun/star/help/HelpSearch.java

329 lines
12 KiB
Java

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
package com.sun.star.help;
import com.sun.star.lib.uno.helper.Factory;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.uno.XComponentContext;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.uno.Type;
import com.sun.star.uno.Any;
import com.sun.star.uno.AnyConverter;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;
import com.sun.star.script.XInvocation;
import com.sun.star.beans.XIntrospectionAccess;
/** This class capsulates the class, that implements the minimal component and a
* factory for creating the service (<CODE>__getComponentFactory</CODE>).
*/
public class HelpSearch
{
/** This class implements the component. At least the interfaces XServiceInfo,
* XTypeProvider, and XInitialization should be provided by the service.
*/
public static class _HelpSearch extends WeakBase
implements XServiceInfo, XInvocation
{
/** The service name, that must be used to get an instance of this service.
*/
static private final String __serviceName =
"com.sun.star.help.HelpSearch";
static private final String aSearchMethodName = "search";
/** The initial component contextr, that gives access to
* the service manager, supported singletons, ...
* It's often later used
*/
private XComponentContext m_cmpCtx;
/** The service manager, that gives access to all registered services.
* It's often later used
*/
private XMultiComponentFactory m_xMCF;
/** The constructor of the inner class has a XMultiServiceFactory parameter.
* @param xmultiservicefactoryInitialization A special service factory
* could be introduced while initializing.
*/
public _HelpSearch(XComponentContext xCompContext)
{
try {
m_cmpCtx = xCompContext;
m_xMCF = m_cmpCtx.getServiceManager();
}
catch( Exception e ) {
e.printStackTrace();
}
}
/** This method returns an array of all supported service names.
* @return Array of supported service names.
*/
public String[] getSupportedServiceNames()
{
return getServiceNames();
}
/** This method is a simple helper function to used in the
* static component initialisation functions as well as in
* getSupportedServiceNames.
*/
public static String[] getServiceNames()
{
String[] sSupportedServiceNames = { __serviceName };
return sSupportedServiceNames;
}
/** This method returns true, if the given service will be
* supported by the component.
* @param sServiceName Service name.
* @return True, if the given service name will be supported.
*/
public boolean supportsService( String sServiceName )
{
return sServiceName.equals( __serviceName );
}
/** Return the class name of the component.
* @return Class name of the component.
*/
public String getImplementationName()
{
return _HelpSearch.class.getName();
}
//===================================================
// XInvocation
public XIntrospectionAccess getIntrospection()
{
return null;
}
public Object invoke( String aFunctionName, java.lang.Object[] aParams,
short[][] aOutParamIndex, java.lang.Object[][] aOutParam )
throws com.sun.star.lang.IllegalArgumentException,
com.sun.star.script.CannotConvertException,
com.sun.star.reflection.InvocationTargetException
{
String[] aRet = null;
if( !aFunctionName.equals( aSearchMethodName ) )
throw new com.sun.star.lang.IllegalArgumentException();
Object[] aScoreOutArray = new Object[1];
aScoreOutArray[0] = null;
try
{
aRet = doQuery( aParams, aScoreOutArray );
}
catch( Exception e )
{
aRet = null;
}
Object aScoreArray = aScoreOutArray[0];
if( aScoreArray == null )
{
aOutParamIndex[0] = new short[0];
aOutParam[0] = new Object[0];
}
else
{
short nInParamCount = (short)aParams.length;
aOutParamIndex[0] = new short[1];
aOutParamIndex[0][0] = nInParamCount;
aOutParam[0] = new Object[1];
aOutParam[0][0] = aScoreArray;
}
Any aRetAny = new Any( new Type( String[].class ), aRet );
return aRetAny;
}
public void setValue( String aPropertyName, java.lang.Object aValue )
throws com.sun.star.beans.UnknownPropertyException,
com.sun.star.script.CannotConvertException,
com.sun.star.reflection.InvocationTargetException {
throw new com.sun.star.beans.UnknownPropertyException();
}
public Object getValue( String aPropertyName )
throws com.sun.star.beans.UnknownPropertyException {
throw new com.sun.star.beans.UnknownPropertyException();
}
public boolean hasMethod( String aMethodName ) {
boolean bRet = (aMethodName.equals( aSearchMethodName ) );
return bRet;
}
public boolean hasProperty( String aName ) {
return false;
}
// Command line interface for testing
private static String[] doQuery( Object[] args, Object[] aScoreOutArray ) throws Exception
{
String aLanguageStr = "";
String aIndexStr = "";
String aQueryStr = "";
boolean bCaptionOnly = false;
int nParamCount = args.length;
String aStrs[] = new String[nParamCount];
for( int i = 0 ; i < nParamCount ; i++ )
{
try
{
aStrs[i] = AnyConverter.toString( args[i] );
}
catch( IllegalArgumentException e )
{
aStrs[i] = "";
}
}
// TODO: Error handling
for( int i = 0 ; i < nParamCount ; i++ )
{
if ("-lang".equals(aStrs[i]) )
{
aLanguageStr = aStrs[i + 1];
i++;
}
else if( "-index".equals(aStrs[i]) )
{
aIndexStr = aStrs[i+1];
i++;
}
else if( "-query".equals(aStrs[i]) )
{
aQueryStr = aStrs[i+1];
i++;
}
else if( "-caption".equals(aStrs[i]) )
{
bCaptionOnly = true;
}
}
String[] aDocs = queryImpl( aLanguageStr, aIndexStr, aQueryStr, bCaptionOnly, aScoreOutArray );
return aDocs;
}
private static String[] queryImpl( String aLanguageStr, String aIndexStr, String aQueryStr,
boolean bCaptionOnly, Object[] aScoreOutArray ) throws Exception
{
IndexReader reader = IndexReader.open( aIndexStr );
Searcher searcher = new IndexSearcher( reader );
Analyzer analyzer = aLanguageStr.equals("ja") ? (Analyzer)new CJKAnalyzer() : (Analyzer)new StandardAnalyzer();
String aField;
if( bCaptionOnly )
aField = "caption";
else
aField = "content";
Query aQuery;
if( aQueryStr.endsWith( "*" ) )
aQuery = new WildcardQuery( new Term( aField, aQueryStr ) );
else
aQuery = new TermQuery( new Term( aField, aQueryStr ) );
// Perform search
Hits aHits = searcher.search( aQuery );
int nHitCount = aHits.length();
String aDocs[] = new String[nHitCount];
float aScores[] = null;
aScores = new float[nHitCount];
for( int iHit = 0 ; iHit < nHitCount ; iHit++ )
{
Document aDoc = aHits.doc( iHit );
String aPath = aDoc.get( "path" );
aDocs[iHit] = ( aPath != null ) ? aPath : "";
aScores[iHit] = aHits.score( iHit );
}
aScoreOutArray[0] = aScores;
reader.close();
return aDocs;
}
}
/**
* Gives a factory for creating the service.
* This method is called by the <code>JavaLoader</code>
* <p>
* @return returns a <code>XSingleComponentFactory</code> for creating
* the component
* @param sImplName the name of the implementation for which a
* service is desired
* @see com.sun.star.comp.loader.JavaLoader
*/
public static XSingleComponentFactory __getComponentFactory(String sImplName)
{
XSingleComponentFactory xFactory = null;
if ( sImplName.equals( _HelpSearch.class.getName() ) )
xFactory = Factory.createComponentFactory(_HelpSearch.class,
_HelpSearch.getServiceNames());
return xFactory;
}
/** This method is a member of the interface for initializing an object
* directly after its creation.
* @param object This array of arbitrary objects will be passed to the
* component after its creation.
* @throws Exception Every exception will not be handled, but will be
* passed to the caller.
*/
public void initialize( Object[] object )
throws com.sun.star.uno.Exception {
/* The component describes what arguments its expected and in which
* order!At this point you can read the objects and can intialize
* your component using these objects.
*/
}
}