blob: c8e55ffb78f30da4e4ce8148f1b11265db0851da [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
package com.sun.star.report.pentaho;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lib.uno.helper.ComponentBase;
import com.sun.star.report.meta.XFunctionCategory;
import com.sun.star.report.meta.XFunctionDescription;
import com.sun.star.report.meta.XFunctionManager;
import com.sun.star.uno.XComponentContext;
import org.pentaho.reporting.libraries.formula.DefaultFormulaContext;
import org.pentaho.reporting.libraries.formula.function.FunctionCategory;
import org.pentaho.reporting.libraries.formula.function.FunctionDescription;
import org.pentaho.reporting.libraries.formula.function.FunctionRegistry;
/**
* This class capsulates the class, that implements the minimal component, a factory for creating the service
* (<CODE>__getComponentFactory</CODE>) and a method, that writes the information into the given registry key
* (<CODE>__writeRegistryServiceInfo</CODE>).
*/
public final class SOFunctionManager extends ComponentBase implements XFunctionManager, XServiceInfo
{
private final XComponentContext m_xContext;
/**
* The service name, that must be used to get an instance of this service.
*/
private static final String __serviceName =
"com.sun.star.report.meta.FunctionManager";
final private FunctionCategory[] categories;
final private FunctionRegistry functionRegistry;
final private DefaultFormulaContext defaultContext;
public SOFunctionManager(XComponentContext context)
{
m_xContext = context;
final ClassLoader cl = java.lang.Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
defaultContext = new DefaultFormulaContext();
functionRegistry = defaultContext.getFunctionRegistry();
categories = functionRegistry.getCategories();
Thread.currentThread().setContextClassLoader(cl);
}
/**
* 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.
* @return
*/
public static String[] getServiceNames()
{
return new String[]
{
__serviceName
};
}
/**
* 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(final String sServiceName)
{
return sServiceName.equals(__serviceName);
}
/**
* Return the class name of the component.
*
* @return Class name of the component.
*/
public String getImplementationName()
{
return SOFunctionManager.class.getName();
}
// com.sun.star.container.XElementAccess:
public com.sun.star.uno.Type getElementType()
{
return new com.sun.star.uno.Type(XFunctionCategory.class);
}
public boolean hasElements()
{
return categories.length != 0;
}
// com.sun.star.container.XIndexAccess:
public int getCount()
{
return categories.length;
}
public Object getByIndex(int Index) throws com.sun.star.lang.IndexOutOfBoundsException, com.sun.star.lang.WrappedTargetException
{
return getCategory(Index);
}
// com.sun.star.report.meta.XFunctionManager:
public com.sun.star.report.meta.XFunctionCategory getCategory(int position) throws com.sun.star.lang.IndexOutOfBoundsException, com.sun.star.lang.WrappedTargetException
{
if (position >= categories.length)
{
throw new com.sun.star.lang.IndexOutOfBoundsException();
}
return new StarFunctionCategory(defaultContext, m_xContext, functionRegistry, position, categories[position]);
}
public XFunctionDescription getFunctionByName(String arg0) throws NoSuchElementException
{
final FunctionDescription func = functionRegistry.getMetaData(arg0);
if (func == null)
{
throw new NoSuchElementException();
}
int i = 0;
for (; i < categories.length; i++)
{
if (categories[i] == func.getCategory())
{
break;
}
}
try
{
return new StarFunctionDescription(defaultContext, m_xContext, getCategory(i), func);
}
catch (Exception ex)
{
}
return null;
}
}