1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski package com.sun.star.report.pentaho;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.beans.NamedValue;
26*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyVetoException;
27*b1cdbd2cSJim Jagielski import com.sun.star.beans.UnknownPropertyException;
28*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertyChangeListener;
29*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet;
30*b1cdbd2cSJim Jagielski import com.sun.star.beans.XVetoableChangeListener;
31*b1cdbd2cSJim Jagielski import com.sun.star.container.XChild;
32*b1cdbd2cSJim Jagielski import com.sun.star.embed.XStorage;
33*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel;
34*b1cdbd2cSJim Jagielski import com.sun.star.lang.IllegalArgumentException;
35*b1cdbd2cSJim Jagielski import com.sun.star.lang.WrappedTargetException;
36*b1cdbd2cSJim Jagielski import com.sun.star.lang.XInitialization;
37*b1cdbd2cSJim Jagielski import com.sun.star.lang.XServiceInfo;
38*b1cdbd2cSJim Jagielski import com.sun.star.lang.XSingleComponentFactory;
39*b1cdbd2cSJim Jagielski import com.sun.star.lib.uno.helper.Factory;
40*b1cdbd2cSJim Jagielski import com.sun.star.lib.uno.helper.PropertySetMixin;
41*b1cdbd2cSJim Jagielski import com.sun.star.lib.uno.helper.WeakBase;
42*b1cdbd2cSJim Jagielski import com.sun.star.registry.InvalidRegistryException;
43*b1cdbd2cSJim Jagielski import com.sun.star.registry.InvalidValueException;
44*b1cdbd2cSJim Jagielski import com.sun.star.registry.XRegistryKey;
45*b1cdbd2cSJim Jagielski import com.sun.star.registry.XSimpleRegistry;
46*b1cdbd2cSJim Jagielski import com.sun.star.report.DataSourceFactory;
47*b1cdbd2cSJim Jagielski import com.sun.star.report.JobProperties;
48*b1cdbd2cSJim Jagielski import com.sun.star.report.ReportEngineParameterNames;
49*b1cdbd2cSJim Jagielski import com.sun.star.report.ReportExecutionException;
50*b1cdbd2cSJim Jagielski import com.sun.star.report.ReportJob;
51*b1cdbd2cSJim Jagielski import com.sun.star.report.ReportJobDefinition;
52*b1cdbd2cSJim Jagielski import com.sun.star.report.ReportJobFactory;
53*b1cdbd2cSJim Jagielski import com.sun.star.report.SDBCReportDataFactory;
54*b1cdbd2cSJim Jagielski import com.sun.star.report.SOImageService;
55*b1cdbd2cSJim Jagielski import com.sun.star.report.StorageRepository;
56*b1cdbd2cSJim Jagielski import com.sun.star.report.XReportDefinition;
57*b1cdbd2cSJim Jagielski import com.sun.star.sdb.XDocumentDataSource;
58*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.XConnection;
59*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.XRowSet;
60*b1cdbd2cSJim Jagielski import com.sun.star.task.XJob;
61*b1cdbd2cSJim Jagielski import com.sun.star.uno.Exception;
62*b1cdbd2cSJim Jagielski import com.sun.star.uno.Type;
63*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
64*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski import java.util.logging.Level;
67*b1cdbd2cSJim Jagielski import java.util.logging.Logger;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski import org.apache.commons.logging.Log;
70*b1cdbd2cSJim Jagielski import org.apache.commons.logging.LogFactory;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski /**
73*b1cdbd2cSJim Jagielski  * This class capsulates the class, that implements the minimal component, a factory for creating the service
74*b1cdbd2cSJim Jagielski  * (<CODE>__getComponentFactory</CODE>) and a method, that writes the information into the given registry key
75*b1cdbd2cSJim Jagielski  * (<CODE>__writeRegistryServiceInfo</CODE>).
76*b1cdbd2cSJim Jagielski  */
77*b1cdbd2cSJim Jagielski public class SOReportJobFactory
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski 
SOReportJobFactory()80*b1cdbd2cSJim Jagielski     private SOReportJobFactory()
81*b1cdbd2cSJim Jagielski     {
82*b1cdbd2cSJim Jagielski     }
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     public static class _SOReportJobFactory extends WeakBase implements XInitialization, XServiceInfo, XJob, XPropertySet, ReportJobFactory
85*b1cdbd2cSJim Jagielski     {
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski         private static final Log LOGGER = LogFactory.getLog(_SOReportJobFactory.class);
88*b1cdbd2cSJim Jagielski         /**
89*b1cdbd2cSJim Jagielski          * The service name, that must be used to get an instance of this service.
90*b1cdbd2cSJim Jagielski          */
91*b1cdbd2cSJim Jagielski         private static final String __serviceName =
92*b1cdbd2cSJim Jagielski                 "com.sun.star.report.pentaho.SOReportJobFactory";
93*b1cdbd2cSJim Jagielski         private final PropertySetMixin m_prophlp;
94*b1cdbd2cSJim Jagielski         /**
95*b1cdbd2cSJim Jagielski          * The initial component contextr, that gives access to the service manager, supported singletons, ... It's
96*b1cdbd2cSJim Jagielski          * often later used
97*b1cdbd2cSJim Jagielski          */
98*b1cdbd2cSJim Jagielski         private final XComponentContext m_cmpCtx;
99*b1cdbd2cSJim Jagielski         private XConnection activeConnection;
100*b1cdbd2cSJim Jagielski         private XReportDefinition report;
101*b1cdbd2cSJim Jagielski 
_SOReportJobFactory(final XComponentContext xCompContext)102*b1cdbd2cSJim Jagielski         public _SOReportJobFactory(final XComponentContext xCompContext)
103*b1cdbd2cSJim Jagielski         {
104*b1cdbd2cSJim Jagielski             m_cmpCtx = xCompContext;
105*b1cdbd2cSJim Jagielski             m_prophlp = new PropertySetMixin(m_cmpCtx, this,
106*b1cdbd2cSJim Jagielski                     new Type(XJob.class),
107*b1cdbd2cSJim Jagielski                     null); // no optionals
108*b1cdbd2cSJim Jagielski         }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski         /**
111*b1cdbd2cSJim Jagielski          * This method is a member of the interface for initializing an object directly after its creation.
112*b1cdbd2cSJim Jagielski          *
113*b1cdbd2cSJim Jagielski          * @param object This array of arbitrary objects will be passed to the component after its creation.
114*b1cdbd2cSJim Jagielski          * @throws Exception Every exception will not be handled, but will be passed to the caller.
115*b1cdbd2cSJim Jagielski          */
initialize(final Object[] object)116*b1cdbd2cSJim Jagielski         public void initialize(final Object[] object)
117*b1cdbd2cSJim Jagielski                 throws com.sun.star.uno.Exception
118*b1cdbd2cSJim Jagielski         {
119*b1cdbd2cSJim Jagielski             /* The component describes what arguments its expected and in which
120*b1cdbd2cSJim Jagielski              * order!At this point you can read the objects and can intialize
121*b1cdbd2cSJim Jagielski              * your component using these objects.
122*b1cdbd2cSJim Jagielski              */
123*b1cdbd2cSJim Jagielski         }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         /**
126*b1cdbd2cSJim Jagielski          * This method returns an array of all supported service names.
127*b1cdbd2cSJim Jagielski          *
128*b1cdbd2cSJim Jagielski          * @return Array of supported service names.
129*b1cdbd2cSJim Jagielski          */
getSupportedServiceNames()130*b1cdbd2cSJim Jagielski         public String[] getSupportedServiceNames()
131*b1cdbd2cSJim Jagielski         {
132*b1cdbd2cSJim Jagielski             return getServiceNames();
133*b1cdbd2cSJim Jagielski         }
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski         /**
136*b1cdbd2cSJim Jagielski          * This method is a simple helper function to used in the static component initialisation functions as well as
137*b1cdbd2cSJim Jagielski          * in getSupportedServiceNames.
138*b1cdbd2cSJim Jagielski          * @return
139*b1cdbd2cSJim Jagielski          */
getServiceNames()140*b1cdbd2cSJim Jagielski         public static String[] getServiceNames()
141*b1cdbd2cSJim Jagielski         {
142*b1cdbd2cSJim Jagielski             return new String[]
143*b1cdbd2cSJim Jagielski                     {
144*b1cdbd2cSJim Jagielski                         __serviceName
145*b1cdbd2cSJim Jagielski                     };
146*b1cdbd2cSJim Jagielski         }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski         /**
149*b1cdbd2cSJim Jagielski          * This method returns true, if the given service will be supported by the component.
150*b1cdbd2cSJim Jagielski          *
151*b1cdbd2cSJim Jagielski          * @param sServiceName Service name.
152*b1cdbd2cSJim Jagielski          * @return True, if the given service name will be supported.
153*b1cdbd2cSJim Jagielski          */
supportsService(final String sServiceName)154*b1cdbd2cSJim Jagielski         public boolean supportsService(final String sServiceName)
155*b1cdbd2cSJim Jagielski         {
156*b1cdbd2cSJim Jagielski             return sServiceName.equals(__serviceName);
157*b1cdbd2cSJim Jagielski         }
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski         /**
160*b1cdbd2cSJim Jagielski          * Return the class name of the component.
161*b1cdbd2cSJim Jagielski          *
162*b1cdbd2cSJim Jagielski          * @return Class name of the component.
163*b1cdbd2cSJim Jagielski          */
getImplementationName()164*b1cdbd2cSJim Jagielski         public String getImplementationName()
165*b1cdbd2cSJim Jagielski         {
166*b1cdbd2cSJim Jagielski             return SOReportJobFactory.class.getName();
167*b1cdbd2cSJim Jagielski         }
168*b1cdbd2cSJim Jagielski 
getLocaleFromRegistry(final XSimpleRegistry simpleReg, final String path, final String value)169*b1cdbd2cSJim Jagielski         private String getLocaleFromRegistry(final XSimpleRegistry simpleReg, final String path, final String value)
170*b1cdbd2cSJim Jagielski         {
171*b1cdbd2cSJim Jagielski             String currentLocale = null;
172*b1cdbd2cSJim Jagielski             try
173*b1cdbd2cSJim Jagielski             {
174*b1cdbd2cSJim Jagielski                 simpleReg.open(path, true, false);
175*b1cdbd2cSJim Jagielski                 final XRegistryKey xRegistryRootKey = simpleReg.getRootKey();
176*b1cdbd2cSJim Jagielski                 // read locale
177*b1cdbd2cSJim Jagielski                 final XRegistryKey locale = xRegistryRootKey.openKey(value);
178*b1cdbd2cSJim Jagielski                 if (locale != null)
179*b1cdbd2cSJim Jagielski                 {
180*b1cdbd2cSJim Jagielski                     final String newLocale = locale.getStringValue();
181*b1cdbd2cSJim Jagielski                     if (newLocale != null)
182*b1cdbd2cSJim Jagielski                     {
183*b1cdbd2cSJim Jagielski                         currentLocale = newLocale.replace('-', '_');
184*b1cdbd2cSJim Jagielski                     }
185*b1cdbd2cSJim Jagielski                 }
186*b1cdbd2cSJim Jagielski             }
187*b1cdbd2cSJim Jagielski             catch (InvalidValueException ex)
188*b1cdbd2cSJim Jagielski             {
189*b1cdbd2cSJim Jagielski                 Logger.getLogger(SOReportJobFactory.class.getName()).log(Level.SEVERE, null, ex);
190*b1cdbd2cSJim Jagielski             }
191*b1cdbd2cSJim Jagielski             catch (InvalidRegistryException ex)
192*b1cdbd2cSJim Jagielski             {
193*b1cdbd2cSJim Jagielski                 Logger.getLogger(SOReportJobFactory.class.getName()).log(Level.SEVERE, null, ex);
194*b1cdbd2cSJim Jagielski             }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski             return currentLocale;
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski 
execute(final NamedValue[] namedValue)199*b1cdbd2cSJim Jagielski         public Object execute(final NamedValue[] namedValue)
200*b1cdbd2cSJim Jagielski                 throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception
201*b1cdbd2cSJim Jagielski         {
202*b1cdbd2cSJim Jagielski             final ClassLoader cl = java.lang.Thread.currentThread().getContextClassLoader();
203*b1cdbd2cSJim Jagielski             Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
204*b1cdbd2cSJim Jagielski             try
205*b1cdbd2cSJim Jagielski             {
206*b1cdbd2cSJim Jagielski                 final XSimpleRegistry simpleReg = (XSimpleRegistry) UnoRuntime.queryInterface(XSimpleRegistry.class,
207*b1cdbd2cSJim Jagielski                         m_cmpCtx.getServiceManager().createInstanceWithContext("com.sun.star.configuration.ConfigurationRegistry", m_cmpCtx));
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski                 String currentLocale = getLocaleFromRegistry(simpleReg, "org.openoffice.Setup", "L10N/ooSetupSystemLocale");
210*b1cdbd2cSJim Jagielski                 if (currentLocale == null || "".equals(currentLocale))
211*b1cdbd2cSJim Jagielski                 {
212*b1cdbd2cSJim Jagielski                     currentLocale = getLocaleFromRegistry(simpleReg, "org.openoffice.Office.Linguistic", "General/DefaultLocale");
213*b1cdbd2cSJim Jagielski                 }
214*b1cdbd2cSJim Jagielski                 if (currentLocale != null && !"".equals(currentLocale))
215*b1cdbd2cSJim Jagielski                 {
216*b1cdbd2cSJim Jagielski                     System.setProperty("org.pentaho.reporting.libraries.formula.locale", currentLocale);
217*b1cdbd2cSJim Jagielski                 }
218*b1cdbd2cSJim Jagielski                 final ReportJob job = createReportJob(namedValue);
219*b1cdbd2cSJim Jagielski                 job.execute();
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski             }
222*b1cdbd2cSJim Jagielski             catch (java.lang.Exception e)
223*b1cdbd2cSJim Jagielski             {
224*b1cdbd2cSJim Jagielski                 LOGGER.error("ReportProcessing failed", e);
225*b1cdbd2cSJim Jagielski                 throw new com.sun.star.lang.WrappedTargetException(e.getMessage(), this, null);
226*b1cdbd2cSJim Jagielski             }
227*b1cdbd2cSJim Jagielski             catch (java.lang.IncompatibleClassChangeError e2)
228*b1cdbd2cSJim Jagielski             {
229*b1cdbd2cSJim Jagielski                 LOGGER.error("Detected an IncompatibleClassChangeError");
230*b1cdbd2cSJim Jagielski                 throw new com.sun.star.lang.WrappedTargetException("caught a " + e2.getClass().getName(), this, new com.sun.star.uno.Exception(e2.getLocalizedMessage()));
231*b1cdbd2cSJim Jagielski             }
232*b1cdbd2cSJim Jagielski             Thread.currentThread().setContextClassLoader(cl);
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski             return null;
235*b1cdbd2cSJim Jagielski         }
236*b1cdbd2cSJim Jagielski 
createReportJob(final NamedValue[] namedValue)237*b1cdbd2cSJim Jagielski         public ReportJob createReportJob(final NamedValue[] namedValue) throws IllegalArgumentException, ReportExecutionException, Exception
238*b1cdbd2cSJim Jagielski         {
239*b1cdbd2cSJim Jagielski             XStorage input = null;
240*b1cdbd2cSJim Jagielski             XStorage output = null;
241*b1cdbd2cSJim Jagielski             XRowSet rowSet = null;
242*b1cdbd2cSJim Jagielski             String mimetype = null;
243*b1cdbd2cSJim Jagielski             String author = null;
244*b1cdbd2cSJim Jagielski             String title = null;
245*b1cdbd2cSJim Jagielski             Integer maxRows = null;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski             for (int i = 0; i < namedValue.length; ++i)
248*b1cdbd2cSJim Jagielski             {
249*b1cdbd2cSJim Jagielski                 final NamedValue aProps = namedValue[i];
250*b1cdbd2cSJim Jagielski                 if ("ActiveConnection".equalsIgnoreCase(aProps.Name))
251*b1cdbd2cSJim Jagielski                 {
252*b1cdbd2cSJim Jagielski                     activeConnection = (XConnection) UnoRuntime.queryInterface(XConnection.class, aProps.Value);
253*b1cdbd2cSJim Jagielski                 }
254*b1cdbd2cSJim Jagielski                 else if ("ReportDefinition".equalsIgnoreCase(aProps.Name))
255*b1cdbd2cSJim Jagielski                 {
256*b1cdbd2cSJim Jagielski                     report = (XReportDefinition) UnoRuntime.queryInterface(XReportDefinition.class, aProps.Value);
257*b1cdbd2cSJim Jagielski                 }
258*b1cdbd2cSJim Jagielski                 else if ("InputStorage".equalsIgnoreCase(aProps.Name))
259*b1cdbd2cSJim Jagielski                 {
260*b1cdbd2cSJim Jagielski                     input = (XStorage) UnoRuntime.queryInterface(XStorage.class, aProps.Value);
261*b1cdbd2cSJim Jagielski                 }
262*b1cdbd2cSJim Jagielski                 else if ("OutputStorage".equalsIgnoreCase(aProps.Name))
263*b1cdbd2cSJim Jagielski                 {
264*b1cdbd2cSJim Jagielski                     output = (XStorage) UnoRuntime.queryInterface(XStorage.class, aProps.Value);
265*b1cdbd2cSJim Jagielski                 }
266*b1cdbd2cSJim Jagielski                 else if ("RowSet".equalsIgnoreCase(aProps.Name))
267*b1cdbd2cSJim Jagielski                 {
268*b1cdbd2cSJim Jagielski                     rowSet = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, aProps.Value);
269*b1cdbd2cSJim Jagielski                 }
270*b1cdbd2cSJim Jagielski                 else if ("mimetype".equalsIgnoreCase(aProps.Name))
271*b1cdbd2cSJim Jagielski                 {
272*b1cdbd2cSJim Jagielski                     mimetype = (String) aProps.Value;
273*b1cdbd2cSJim Jagielski                 }
274*b1cdbd2cSJim Jagielski                 else if ("MaxRows".equalsIgnoreCase(aProps.Name))
275*b1cdbd2cSJim Jagielski                 {
276*b1cdbd2cSJim Jagielski                     maxRows = (Integer) aProps.Value;
277*b1cdbd2cSJim Jagielski                 }
278*b1cdbd2cSJim Jagielski                 else if (ReportEngineParameterNames.AUTHOR.equalsIgnoreCase(aProps.Name))
279*b1cdbd2cSJim Jagielski                 {
280*b1cdbd2cSJim Jagielski                     author = (String) aProps.Value;
281*b1cdbd2cSJim Jagielski                 }
282*b1cdbd2cSJim Jagielski                 else if (ReportEngineParameterNames.TITLE.equalsIgnoreCase(aProps.Name))
283*b1cdbd2cSJim Jagielski                 {
284*b1cdbd2cSJim Jagielski                     title = (String) aProps.Value;
285*b1cdbd2cSJim Jagielski                 }
286*b1cdbd2cSJim Jagielski             }
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski             if (input == null || output == null)
289*b1cdbd2cSJim Jagielski             {
290*b1cdbd2cSJim Jagielski                 throw new com.sun.star.lang.IllegalArgumentException();
291*b1cdbd2cSJim Jagielski             }
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski             if (rowSet == null)
294*b1cdbd2cSJim Jagielski             {
295*b1cdbd2cSJim Jagielski                 if (report == null || activeConnection == null)
296*b1cdbd2cSJim Jagielski                 {
297*b1cdbd2cSJim Jagielski                     throw new com.sun.star.lang.IllegalArgumentException();
298*b1cdbd2cSJim Jagielski                 }
299*b1cdbd2cSJim Jagielski                 mimetype = report.getMimeType();
300*b1cdbd2cSJim Jagielski             }
301*b1cdbd2cSJim Jagielski             else
302*b1cdbd2cSJim Jagielski             {
303*b1cdbd2cSJim Jagielski                 final XPropertySet set = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, rowSet);
304*b1cdbd2cSJim Jagielski                 if (set == null)
305*b1cdbd2cSJim Jagielski                 {
306*b1cdbd2cSJim Jagielski                     throw new com.sun.star.lang.IllegalArgumentException();
307*b1cdbd2cSJim Jagielski                 }
308*b1cdbd2cSJim Jagielski                 activeConnection = (XConnection) UnoRuntime.queryInterface(XConnection.class, set.getPropertyValue("ActiveConnection"));
309*b1cdbd2cSJim Jagielski             }
310*b1cdbd2cSJim Jagielski             if (mimetype == null)
311*b1cdbd2cSJim Jagielski             {
312*b1cdbd2cSJim Jagielski                 mimetype = PentahoReportEngineMetaData.OPENDOCUMENT_TEXT;
313*b1cdbd2cSJim Jagielski             }
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski             final XChild child = UnoRuntime.queryInterface(XChild.class, activeConnection);
316*b1cdbd2cSJim Jagielski             final XDocumentDataSource docSource = UnoRuntime.queryInterface(XDocumentDataSource.class, child.getParent());
317*b1cdbd2cSJim Jagielski             final XModel model = UnoRuntime.queryInterface(XModel.class, docSource.getDatabaseDocument());
318*b1cdbd2cSJim Jagielski             final DataSourceFactory dataFactory = new SDBCReportDataFactory(m_cmpCtx, activeConnection);
319*b1cdbd2cSJim Jagielski             final StorageRepository storageRepository = new StorageRepository(input, output, model.getURL());
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski             final String inputName = "content.xml";
322*b1cdbd2cSJim Jagielski             final String outputName = "content.xml";
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski             final PentahoReportEngine engine = new PentahoReportEngine();
325*b1cdbd2cSJim Jagielski             final ReportJobDefinition definition = engine.createJobDefinition();
326*b1cdbd2cSJim Jagielski             final JobProperties procParms = definition.getProcessingParameters();
327*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.INPUT_REPOSITORY, storageRepository);
328*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.OUTPUT_REPOSITORY, storageRepository);
329*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.INPUT_NAME, inputName);
330*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.OUTPUT_NAME, outputName);
331*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.CONTENT_TYPE, mimetype);
332*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.INPUT_DATASOURCE_FACTORY, dataFactory);
333*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.IMAGE_SERVICE, new SOImageService(m_cmpCtx));
334*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.INPUT_REPORTJOB_FACTORY, this);
335*b1cdbd2cSJim Jagielski             procParms.setProperty(ReportEngineParameterNames.MAXROWS, maxRows);
336*b1cdbd2cSJim Jagielski             if (author != null)
337*b1cdbd2cSJim Jagielski             {
338*b1cdbd2cSJim Jagielski                 procParms.setProperty(ReportEngineParameterNames.AUTHOR, author);
339*b1cdbd2cSJim Jagielski             }
340*b1cdbd2cSJim Jagielski             if (title != null)
341*b1cdbd2cSJim Jagielski             {
342*b1cdbd2cSJim Jagielski                 procParms.setProperty(ReportEngineParameterNames.TITLE, title);
343*b1cdbd2cSJim Jagielski             }
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski             return engine.createJob(definition);
346*b1cdbd2cSJim Jagielski         }
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski         // com.sun.star.beans.XPropertySet:
getPropertySetInfo()349*b1cdbd2cSJim Jagielski         public com.sun.star.beans.XPropertySetInfo getPropertySetInfo()
350*b1cdbd2cSJim Jagielski         {
351*b1cdbd2cSJim Jagielski             return m_prophlp.getPropertySetInfo();
352*b1cdbd2cSJim Jagielski         }
353*b1cdbd2cSJim Jagielski 
setPropertyValue(final String aPropertyName, final Object aValue)354*b1cdbd2cSJim Jagielski         public void setPropertyValue(final String aPropertyName, final Object aValue)
355*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, PropertyVetoException, com.sun.star.lang.IllegalArgumentException,
356*b1cdbd2cSJim Jagielski                 WrappedTargetException
357*b1cdbd2cSJim Jagielski         {
358*b1cdbd2cSJim Jagielski             m_prophlp.setPropertyValue(aPropertyName, aValue);
359*b1cdbd2cSJim Jagielski         }
360*b1cdbd2cSJim Jagielski 
getPropertyValue(final String aPropertyName)361*b1cdbd2cSJim Jagielski         public Object getPropertyValue(final String aPropertyName)
362*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, WrappedTargetException
363*b1cdbd2cSJim Jagielski         {
364*b1cdbd2cSJim Jagielski             return m_prophlp.getPropertyValue(aPropertyName);
365*b1cdbd2cSJim Jagielski         }
366*b1cdbd2cSJim Jagielski 
addPropertyChangeListener(final String aPropertyName, final XPropertyChangeListener xListener)367*b1cdbd2cSJim Jagielski         public void addPropertyChangeListener(final String aPropertyName, final XPropertyChangeListener xListener)
368*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, WrappedTargetException
369*b1cdbd2cSJim Jagielski         {
370*b1cdbd2cSJim Jagielski             m_prophlp.addPropertyChangeListener(aPropertyName, xListener);
371*b1cdbd2cSJim Jagielski         }
372*b1cdbd2cSJim Jagielski 
removePropertyChangeListener(final String aPropertyName, final XPropertyChangeListener xListener)373*b1cdbd2cSJim Jagielski         public void removePropertyChangeListener(final String aPropertyName, final XPropertyChangeListener xListener)
374*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, WrappedTargetException
375*b1cdbd2cSJim Jagielski         {
376*b1cdbd2cSJim Jagielski             m_prophlp.removePropertyChangeListener(aPropertyName, xListener);
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski 
addVetoableChangeListener(final String aPropertyName, final XVetoableChangeListener xListener)379*b1cdbd2cSJim Jagielski         public void addVetoableChangeListener(final String aPropertyName, final XVetoableChangeListener xListener)
380*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, WrappedTargetException
381*b1cdbd2cSJim Jagielski         {
382*b1cdbd2cSJim Jagielski             m_prophlp.addVetoableChangeListener(aPropertyName, xListener);
383*b1cdbd2cSJim Jagielski         }
384*b1cdbd2cSJim Jagielski 
removeVetoableChangeListener(final String aPropertyName, final XVetoableChangeListener xListener)385*b1cdbd2cSJim Jagielski         public void removeVetoableChangeListener(final String aPropertyName, final XVetoableChangeListener xListener)
386*b1cdbd2cSJim Jagielski                 throws UnknownPropertyException, WrappedTargetException
387*b1cdbd2cSJim Jagielski         {
388*b1cdbd2cSJim Jagielski             m_prophlp.removeVetoableChangeListener(aPropertyName, xListener);
389*b1cdbd2cSJim Jagielski         }
390*b1cdbd2cSJim Jagielski     }
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     /**
393*b1cdbd2cSJim Jagielski      * Gives a factory for creating the service. This method is called by the <code>JavaLoader</code>
394*b1cdbd2cSJim Jagielski      * <p/>
395*b1cdbd2cSJim Jagielski      *
396*b1cdbd2cSJim Jagielski      * @param sImplName the name of the implementation for which a service is desired
397*b1cdbd2cSJim Jagielski      * @return returns a <code>XSingleComponentFactory</code> for creating the component
398*b1cdbd2cSJim Jagielski      * @see com.sun.star.comp.loader.JavaLoader
399*b1cdbd2cSJim Jagielski      */
__getComponentFactory(final String sImplName)400*b1cdbd2cSJim Jagielski     public static XSingleComponentFactory __getComponentFactory(final String sImplName)
401*b1cdbd2cSJim Jagielski     {
402*b1cdbd2cSJim Jagielski         XSingleComponentFactory xFactory = null;
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski         try
405*b1cdbd2cSJim Jagielski         {
406*b1cdbd2cSJim Jagielski             if (sImplName.equals(_SOReportJobFactory.class.getName()))
407*b1cdbd2cSJim Jagielski             {
408*b1cdbd2cSJim Jagielski                 xFactory = Factory.createComponentFactory(_SOReportJobFactory.class, _SOReportJobFactory.getServiceNames());
409*b1cdbd2cSJim Jagielski             }
410*b1cdbd2cSJim Jagielski             else if (sImplName.equals(SOFunctionManager.class.getName()))
411*b1cdbd2cSJim Jagielski             {
412*b1cdbd2cSJim Jagielski                 xFactory = Factory.createComponentFactory(SOFunctionManager.class, SOFunctionManager.getServiceNames());
413*b1cdbd2cSJim Jagielski             }
414*b1cdbd2cSJim Jagielski             else if (sImplName.equals(SOFormulaParser.class.getName()))
415*b1cdbd2cSJim Jagielski             {
416*b1cdbd2cSJim Jagielski                 xFactory = Factory.createComponentFactory(SOFormulaParser.class, SOFormulaParser.getServiceNames());
417*b1cdbd2cSJim Jagielski             }
418*b1cdbd2cSJim Jagielski         }
419*b1cdbd2cSJim Jagielski         catch (java.lang.IncompatibleClassChangeError e2)
420*b1cdbd2cSJim Jagielski         {
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski         return xFactory;
424*b1cdbd2cSJim Jagielski     }
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski     /**
427*b1cdbd2cSJim Jagielski      * Writes the service information into the given registry key. This method is called by the <code>JavaLoader</code>
428*b1cdbd2cSJim Jagielski      * <p/>
429*b1cdbd2cSJim Jagielski      *
430*b1cdbd2cSJim Jagielski      * @param regKey the registryKey
431*b1cdbd2cSJim Jagielski      * @return returns true if the operation succeeded
432*b1cdbd2cSJim Jagielski      * @see com.sun.star.comp.loader.JavaLoader
433*b1cdbd2cSJim Jagielski      */
__writeRegistryServiceInfo(final XRegistryKey regKey)434*b1cdbd2cSJim Jagielski     public static boolean __writeRegistryServiceInfo(final XRegistryKey regKey)
435*b1cdbd2cSJim Jagielski     {
436*b1cdbd2cSJim Jagielski         return Factory.writeRegistryServiceInfo(SOFunctionManager.class.getName(),
437*b1cdbd2cSJim Jagielski                 SOFunctionManager.getServiceNames(),
438*b1cdbd2cSJim Jagielski                 regKey) && Factory.writeRegistryServiceInfo(_SOReportJobFactory.class.getName(),
439*b1cdbd2cSJim Jagielski                 _SOReportJobFactory.getServiceNames(),
440*b1cdbd2cSJim Jagielski                 regKey) && Factory.writeRegistryServiceInfo(SOFormulaParser.class.getName(),
441*b1cdbd2cSJim Jagielski                 SOFormulaParser.getServiceNames(),
442*b1cdbd2cSJim Jagielski                 regKey);
443*b1cdbd2cSJim Jagielski     }
444*b1cdbd2cSJim Jagielski }
445