KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > ws > axis2 > ManagementService


1 package com.jaspersoft.jasperserver.ws.axis2;
2
3 import com.jaspersoft.jasperserver.api.metadata.common.domain.Query;
4 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.InputControlImpl;
5 import java.awt.Dimension JavaDoc;
6 import java.io.ByteArrayOutputStream JavaDoc;
7 import java.io.IOException JavaDoc;
8 import java.io.StringReader JavaDoc;
9 import java.io.StringWriter JavaDoc;
10 import java.util.ArrayList JavaDoc;
11 import java.util.HashMap JavaDoc;
12 import java.util.HashSet JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.List JavaDoc;
15 import java.util.Map JavaDoc;
16 import java.util.Set JavaDoc;
17
18 import javax.activation.DataHandler JavaDoc;
19 import javax.activation.DataSource JavaDoc;
20 import javax.xml.stream.XMLStreamException;
21
22 import net.sf.jasperreports.engine.JRException;
23 import net.sf.jasperreports.engine.JRExporter;
24 import net.sf.jasperreports.engine.JRExporterParameter;
25 import net.sf.jasperreports.engine.JRImage;
26 import net.sf.jasperreports.engine.JRImageRenderer;
27 import net.sf.jasperreports.engine.JRPrintImage;
28 import net.sf.jasperreports.engine.JRRenderable;
29 import net.sf.jasperreports.engine.JRWrappingSvgRenderer;
30 import net.sf.jasperreports.engine.JasperPrint;
31 import net.sf.jasperreports.engine.export.JRCsvExporter;
32 import net.sf.jasperreports.engine.export.JRHtmlExporter;
33 import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
34 import net.sf.jasperreports.engine.export.JRPdfExporter;
35 import net.sf.jasperreports.engine.export.JRRtfExporter;
36 import net.sf.jasperreports.engine.export.JRXlsExporter;
37 import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
38 import net.sf.jasperreports.engine.export.JRXmlExporter;
39 import net.sf.jasperreports.engine.util.JRSaver;
40 import net.sf.jasperreports.engine.util.JRTypeSniffer;
41
42 import org.apache.axiom.attachments.ByteArrayDataSource;
43 import org.apache.axiom.om.OMAbstractFactory;
44 import org.apache.axiom.om.OMElement;
45 import org.apache.axiom.om.OMFactory;
46 import org.apache.axiom.om.OMNamespace;
47 import org.apache.axiom.om.OMText;
48 import org.apache.axis2.context.MessageContext;
49 import org.apache.commons.logging.Log;
50 import org.apache.commons.logging.LogFactory;
51 import org.exolab.castor.xml.Marshaller;
52 import org.exolab.castor.xml.Unmarshaller;
53
54 import com.jaspersoft.jasperserver.api.engine.jasperreports.domain.impl.ReportUnitRequest;
55 import com.jaspersoft.jasperserver.api.engine.jasperreports.domain.impl.ReportUnitResult;
56 import com.jaspersoft.jasperserver.api.metadata.common.domain.DataType;
57 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource;
58 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResourceData;
59 import com.jaspersoft.jasperserver.api.metadata.common.domain.Folder;
60 import com.jaspersoft.jasperserver.api.metadata.common.domain.InputControl;
61 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValues;
62 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValuesItem;
63 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource;
64 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceReference;
65 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FolderImpl;
66 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.ListOfValuesItemImpl;
67 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.BeanReportDataSource;
68 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JdbcReportDataSource;
69 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JndiJdbcReportDataSource;
70 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportDataSource;
71 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportUnit;
72 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria;
73 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.Argument;
74 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.ListItem;
75 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.OperationResult;
76 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.Request;
77 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.ResourceDescriptor;
78
79 public class ManagementService {
80
81         protected static final Log log = LogFactory.getLog(ManagementService.class);
82         protected static final String JavaDoc START_TOKEN = "img SRC=\"images/";
83         protected static final String JavaDoc END_TOKEN = "\"";
84         protected static final String JavaDoc REPORT_UNIT = "ReportUnit";
85      
86         protected static final String JavaDoc WS_VERSION = "1.1.0";
87         /**
88          * In Axis2 MessageContext can be obtained using the method
89          * init(MessageContext inMessge, MessageContext outMessage)
90          * The following attributes will store this two contexts.
91          */

92     private MessageContext inMessge = null;
93         private MessageContext outMessage = null;
94         
95         public void init(MessageContext inMessge, MessageContext outMessage) {
96             // store the message contexts
97
this.inMessge = inMessge;
98             this.outMessage = outMessage;
99         }
100         /**
101          * This method marshal the OperationResult. If a FileResourceData is passed,
102          * this will be added as attachemnt to the response...
103          */

104         private static OMElement marshalResponse( OperationResult or, FileResourceData frd)
105         {
106             ResourceDataSource rds = null;
107             if (frd != null)
108             {
109                 rds = new ResourceDataSource("", frd);
110             }
111             return marshalResponse(or, rds);
112         }
113         
114         private static OMElement marshalResponse( OperationResult or, DataSource JavaDoc datasource)
115         {
116             Map JavaDoc attachments = new HashMap JavaDoc();
117             if (datasource != null)
118             {
119                 attachments.put("attachment", datasource);
120             }
121             return marshalResponse( or, attachments);
122             
123         }
124         
125         private static OMElement marshalResponse( OperationResult or)
126         {
127             return marshalResponse( or, new HashMap JavaDoc());
128         }
129         
130         private static OMElement marshalResponse( OperationResult or, Map JavaDoc datasources)
131         {
132             OMFactory fac = OMAbstractFactory.getOMFactory();
133             OMNamespace namespace = fac.createOMNamespace("http://jasperserver/ws2/namespace1","ns1");
134             OMElement resultElem = fac.createOMElement("result",namespace);
135
136             try {
137                 StringWriter JavaDoc xmlStringWriter = new StringWriter JavaDoc();
138                 Marshaller.marshal(or, xmlStringWriter);
139                 if (log.isDebugEnabled()) {
140                     log.debug("Has descriptors: " +
141                             ((or.getResourceDescriptors() == null || or.getResourceDescriptors().size() == 0) ?
142                                     0 : or.getResourceDescriptors().size())
143                             );
144                     log.debug("marshalled response");
145                     log.debug(xmlStringWriter.toString());
146                 }
147                 resultElem.setText(xmlStringWriter.toString());
148                 
149             } catch (Exception JavaDoc ex)
150             {
151                 log.error("caught exception marshalling an OperationResult: " + ex.getMessage(), ex);
152                 // What to do?
153
}
154             
155             if (datasources != null)
156             {
157                 for (Iterator JavaDoc it = datasources.entrySet().iterator(); it.hasNext(); )
158                 {
159                      try {
160                          Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
161                          String JavaDoc name = (String JavaDoc) entry.getKey();
162                          DataSource JavaDoc datasource = (DataSource JavaDoc) entry.getValue();
163                          
164                          log.debug("Adding attachment: " + name + ", type: " + datasource.getContentType());
165                          
166                         DataHandler JavaDoc expectedDH = new DataHandler JavaDoc( datasource );
167                         OMText textData = fac.createOMText(expectedDH, true);
168                         OMElement dataElement = fac.createOMElement(name, namespace);
169                         textData.setOptimize(true);
170                         dataElement.addChild(textData);
171                         resultElem.addChild(dataElement);
172                         
173                     } catch (Exception JavaDoc ex)
174                     {
175                         log.error("caught exception marshalling an OperationResult: " + ex.getMessage(), ex);
176                         // What to do?
177
}
178                 }
179             }
180             return resultElem;
181         }
182         
183     public OMElement list(OMElement element) throws XMLStreamException {
184         
185         // The incoming parameter will be a
186
// com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.Request
187
//
188
// The outgoing response object will be a
189
// com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.OperationResult
190
//
191

192         // The task of each of these methods is to look inside the incoming
193
// Request object in order to see what needs to be done. For instance,
194
// in this method (list), the client will typically want a list of the
195
// contents of a particular directory (uri) path. The Request object
196
// will contain inside of it a ResourceDescriptor that would of type
197
// "folder". This folder would have a uri such as /reports/samples.
198

199         // So, the method needs to contact the repository and get a list
200
// of files and folders inside the given directory.
201

202         
203         // In order to build the OperationResult response, there are the
204
// ResourceDescriptor and OperationResult classes. These are java beans.
205
// The first is specifically designed to allow for the collection of
206
// all relevant information about a Resource that JasperServer (currently)
207
// can provide. The ResourceDescriptor is quite flat, so it has different
208
// information updated depending on which type of JS Resource object is
209
// being populated. In the case of files and folders in the context of
210
// a "list" request, it only contains the level of detail one would expect
211
// from an "ls -l" sort of command. Ie. file names, files types, etc.
212

213         // OMElement is the axis2 Axiom way of handling xml.
214

215         // I have an example of using the Castor tool package (in
216
// metadata-impl ... HibernateRepositorySimpleTest) in order to
217
// go from a populated ResourceDescriptor object to xml. This xml
218
// can be used to make the OMElement object that is the axis response
219
// to the client.
220
OperationResult or = new OperationResult();
221                 or.setVersion( this.WS_VERSION);
222                 or.setReturnCode( or.SUCCESS );
223                 try {
224
225                     Iterator JavaDoc iter = element.getChildElements();
226                     String JavaDoc requestXmlString = ((OMElement) iter.next()).getText();
227
228                     // Unmarshall xmlDescriptor request...
229
StringReader JavaDoc xmlStringReader = new StringReader JavaDoc(requestXmlString);
230                     Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader);
231
232                     List JavaDoc list = null;
233                     String JavaDoc error = null;
234
235                     if (request.getResourceDescriptor() == null)
236                     {
237                         list = new java.util.ArrayList JavaDoc();
238                         log.debug("Null resourceDescriptor");
239                         // Look for specific list requests...
240
if (getArgumentValue(Argument.LIST_DATASOURCES, request.getArguments()) != null &&
241                             getArgumentValue(Argument.LIST_DATASOURCES, request.getArguments()).equals(Argument.VALUE_TRUE))
242                         {
243                             // List all datasources...
244
FilterCriteria criteria = FilterCriteria.createFilter(ReportDataSource.class);
245                             log.debug("Listing datasources...");
246                             
247                             // This filters with object level security
248
// Will only get resources the user has access to
249

250                             List JavaDoc lookups = RepositoryHelper.getInstance().getRepo().loadClientResources(criteria);
251                             if (lookups != null && !lookups.isEmpty()) {
252                                 
253                                 for (Iterator JavaDoc it = lookups.iterator(); it.hasNext(); ) {
254                                     list.add( RepositoryHelper.getInstance().createResourceDescriptor( (Resource) it.next()) );
255                                 }
256                             }
257                         }
258                     }
259                     else if (request.getResourceDescriptor().getWsType().equals( ResourceDescriptor.TYPE_FOLDER))
260                     {
261                         log.debug("List folders");
262                         list = RepositoryHelper.getInstance().list( request.getResourceDescriptor().getUriString() );
263                     }
264                     else if (request.getResourceDescriptor().getWsType().equals( ResourceDescriptor.TYPE_REPORTUNIT))
265                     {
266                         log.debug("List report units");
267                         list = RepositoryHelper.getInstance().getResourceDescriptor( request.getResourceDescriptor().getUriString()).getChildren();
268                     } else {
269                         log.debug("Listed nothing");
270                     }
271
272                     if (log.isDebugEnabled()) {
273                         log.debug("Found " + list.size() + " things");
274                         for (Iterator JavaDoc it = list.iterator(); it.hasNext(); ) {
275                             ResourceDescriptor rd = (ResourceDescriptor) it.next();
276                             log.debug( rd != null ? rd.getName() : "rd was null");
277                         }
278                     }
279
280                     or.setResourceDescriptors( list );
281                     
282                 } catch (Exception JavaDoc e) {
283                     log.error("caught exception: " + e.getMessage(), e);
284                         
285                     or.setReturnCode( 1 );
286                     or.setMessage(e.getMessage());
287                 }
288                 log.debug("Marshalling response");
289                 
290                 return marshalResponse( or );
291     }
292     
293         
294         /**
295          * This method get a resource identified by an URI.
296          * If the resource is a FileResource, the data is attached to the response
297          * as attachment.
298          * Only one attachment is permitted by now.
299          *
300          * WS Input:
301          * A resourceDescriptor in XML format. Only the uri is really used.
302          *
303          * WS output:
304          * The WS returns the complete descriptor for the resource (incapsulated in
305          * an OperationResult).
306          * The resource data can be in attachment. In this case the resourceDescriptor
307          * has the attrobute HasData set to true.
308          *
309          * To get a control filled with the query data, call this WS with the argument
310          * IC_GET_QUERY_DATA set to the datasource URI used to get the data.
311          *
312          * Operation result Codes:
313          * 0 - Success
314          * 1 - Generic error
315          * 2 - Resource not found
316          *
317          */

318     public OMElement get(OMElement element) throws XMLStreamException {
319         
320                 OperationResult or = new OperationResult();
321                 or.setVersion( this.WS_VERSION);
322                 or.setReturnCode( or.SUCCESS );
323                   
324                 
325                 try {
326
327                     Iterator JavaDoc iter = element.getChildElements();
328                     String JavaDoc requestXmlString = ((OMElement) iter.next()).getText();
329                     
330                     // Unmarshall xmlDescriptor request...
331
StringReader JavaDoc xmlStringReader = new StringReader JavaDoc(requestXmlString);
332                     Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader);
333                     
334                     List JavaDoc args = request.getArguments();
335  
336                     HashMap JavaDoc specialOptions = new HashMap JavaDoc();
337                     if (args != null)
338                     {
339                         for (int i=0; i<args.size(); ++i)
340                         {
341                             Argument arg = null;
342    
343                             if (args.get(i) instanceof Argument)
344                             {
345                                 arg = (Argument)args.get(i);
346                             }
347                             if (arg != null)
348                             {
349                                 specialOptions.put(arg.getName(), arg.getValue());
350                             }
351                         }
352                     }
353                     
354                     ResourceDescriptor rd = RepositoryHelper.getInstance().getResourceDescriptor( request.getResourceDescriptor().getUriString(), specialOptions );
355                     if (rd == null)
356                     {
357                         log.warn("Get: null resourceDescriptor for " + request.getResourceDescriptor().getUriString());
358                         or.setReturnCode(2);
359                         or.setMessage("Resource not found");
360                     }
361                     else
362                     {
363                         log.debug("Get: " + request.getResourceDescriptor().getUriString() +
364                                 ", wsType: " + rd.getWsType() + ", resourceType: " + rd.getResourceType());
365                         or.getResourceDescriptors().add(rd);
366                         
367                         if (rd.getWsType().equals(ResourceDescriptor.TYPE_FOLDER))
368                         {
369                              rd.setHasData(false);
370                              return marshalResponse( or);
371                         }
372                         else if (rd.getResourceType().equals("com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource"))
373                         {
374                             //Retrieve resource data...
375
FileResourceData frd = null;
376                             rd.setHasData(false);
377                             if (!request.getArguments().contains("NO_ATTACHMENT"))
378                             {
379                                 rd.setHasData(true);
380                                 frd = RepositoryHelper.getInstance().getRepo().getResourceData(null, rd.getUriString() );
381                             }
382                             return marshalResponse( or, frd);
383                         }
384                     }
385                 } catch (Exception JavaDoc e) {
386                     
387                     log.error("caught exception: " + e.getMessage(), e);
388                     or.setReturnCode( 1 );
389                     or.setMessage(e.getMessage());
390                 }
391                 log.debug("Marshalling response");
392                 
393                 return marshalResponse( or );
394     }
395     
396         
397         /**
398          * This method put a resource identified by an URI.
399          * If the resource is a FileResource, the data should be attached to the response
400          * as attachment (if hasData is set to true).
401          * Only one attachment is permitted by now.
402          *
403          * If the resource is new, the isNew flag must be set.
404          * otherwise the put is trated as a modify.
405          * To modify a resource that belong to REPORT_UNIT, you need to specify the argument
406          * Argument.MODIFY_REPORTUNIT with the URI of the reportUnit parent.
407          * If the resource is not local to the reportUnit, this URI is ignored but still
408          * mandatory.
409          *
410          * WS Input:
411          * A resourceDescriptor in XML format.
412          * The modify affect by now only label, description and file data if present.
413          *
414          * WS output:
415          * The WS returns the complete new descriptor for the resource (incapsulated in
416          * an OperationResult).
417          * No data is attachment.
418          *
419          * Operation result Codes:
420          * 0 - Success
421          * 1 - Generic error
422          * 2 - Resource not found (in case of a modify)
423          *
424          */

425     public OMElement put(OMElement element) throws XMLStreamException {
426         
427         OperationResult or = new OperationResult();
428                 or.setVersion( this.WS_VERSION);
429                 or.setReturnCode( or.SUCCESS );
430                                             
431                 try {
432
433                     Iterator JavaDoc iter = element.getChildElements();
434                     OMElement requestElement = (OMElement) iter.next();
435                     String JavaDoc requestXmlString = requestElement.getText();
436 /*
437                     if (log.isDebugEnabled()) {
438                         log.debug("Put XML");
439                         log.debug(requestXmlString);
440                     }
441 */

442                     // Unmarshall xmlDescriptor request...
443
StringReader JavaDoc xmlStringReader = new StringReader JavaDoc(requestXmlString);
444                     Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader);
445                     
446                     ResourceDescriptor newDescriptor = request.getResourceDescriptor();
447                     
448                     log.debug("Put: for " + newDescriptor.getUriString());
449                     
450                     if (newDescriptor.getUriString() == null || newDescriptor.getUriString().length() == 0) {
451                         throw new WSException(WSException.GENERAL_REQUEST_ERROR, "No URI given");
452                     }
453                     
454                     if (newDescriptor.getWsType() == null || newDescriptor.getWsType().length() == 0) {
455                         throw new WSException(WSException.GENERAL_REQUEST_ERROR, "No type given");
456                     }
457
458                     if (newDescriptor.getIsNew()) // ADD
459
{
460                         
461                         log.debug("Put: adding");
462                             // Report unit modification....
463
ReportUnit reportUnit = null;
464                             String JavaDoc reportUnitUrl = getArgumentValue(Argument.MODIFY_REPORTUNIT, request.getArguments());
465                             if (reportUnitUrl != null)
466                             {
467                                 log.debug("Put: getting reportUnit: " + reportUnitUrl);
468                                 reportUnit = (ReportUnit)RepositoryHelper.getInstance().getRepo().getResource(null,reportUnitUrl);
469                                 if (reportUnit == null)
470                                 {
471                                     throw new WSException(WSException.REFERENCED_RESOURCE_NOT_FOUND, "ReportUnit not found");
472                                 }
473                             }
474                                                         
475                             log.debug("Put: for type: " + newDescriptor.getWsType());
476                             
477                             if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_FOLDER))
478                             {
479                                 Folder folder = new FolderImpl();
480                                 folder.setName( newDescriptor.getName() );
481                                 folder.setLabel( newDescriptor.getLabel() );
482                                 folder.setDescription( newDescriptor.getDescription());
483                                 folder.setParentFolder(newDescriptor.getParentFolder());
484                                 folder.setVersion(FileResource.VERSION_NEW);
485                                 RepositoryHelper.getInstance().getRepo().saveFolder(null, folder);
486                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().getResourceDescriptor(folder.getURIString()));
487                             }
488                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_REPORTUNIT))
489                             {
490                                 ReportUnit newReportUnit=(ReportUnit)RepositoryHelper.getInstance().getRepo().newResource(null,ReportUnit.class);
491                                 newReportUnit.setName( newDescriptor.getName() );
492                                 newReportUnit.setLabel( newDescriptor.getLabel() );
493                                 newReportUnit.setDescription( newDescriptor.getDescription());
494                                 newReportUnit.setParentFolder(newDescriptor.getParentFolder());
495                                 newReportUnit.setVersion(ReportUnit.VERSION_NEW);
496                                 
497                                 // 1. Processing children...
498
List JavaDoc children = newDescriptor.getChildren();
499                                 for (int i=0; i<children.size(); ++i)
500                                 {
501                                     ResourceDescriptor childResource = (ResourceDescriptor)children.get(i);
502                                     if (childResource.getWsType().equals( childResource.TYPE_DATASOURCE ) ||
503                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC) ||
504                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI) ||
505                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN) )
506                                     {
507                                         if (childResource.getIsReference())
508                                         {
509                                             newReportUnit.setDataSourceReference(childResource.getReferenceUri());
510                                         }
511                                         else
512                                         {
513                                             if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC))
514                                             {
515                                                 JdbcReportDataSource jdbcReportDataSource = (JdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JdbcReportDataSource.class);
516                                                 jdbcReportDataSource.setParentFolder(childResource.getParentFolder());
517                                                 jdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
518                                                 jdbcReportDataSource.setName( childResource.getName() );
519                                 
520                                                 updateDataSource(jdbcReportDataSource, childResource);
521                                                 
522                                                 newReportUnit.setDataSource(jdbcReportDataSource);
523                                             }
524                                             else if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI))
525                                             {
526                                                 JndiJdbcReportDataSource jndiJdbcReportDataSource = (JndiJdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JndiJdbcReportDataSource.class);
527                                                 jndiJdbcReportDataSource.setParentFolder(childResource.getParentFolder());
528                                                 jndiJdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
529                                                 jndiJdbcReportDataSource.setName( childResource.getName() );
530
531                                                 updateDataSource(jndiJdbcReportDataSource, childResource);
532                                                 newReportUnit.setDataSource(jndiJdbcReportDataSource);
533                                             }
534                                             else if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN))
535                                             {
536                                                 BeanReportDataSource beanReportDataSource = (BeanReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,BeanReportDataSource.class);
537                                                 beanReportDataSource.setParentFolder(childResource.getParentFolder());
538                                                 beanReportDataSource.setVersion(BeanReportDataSource.VERSION_NEW);
539                                                 beanReportDataSource.setName( childResource.getName() );
540
541                                                 updateDataSource(beanReportDataSource, childResource);
542                                                 newReportUnit.setDataSource(beanReportDataSource);
543                                             }
544                                         }
545                                     }
546                                     else if (childResource.getWsType().equals( childResource.TYPE_JRXML))
547                                     {
548                                         if (childResource.isMainReport() && childResource.getReferenceUri() != null &&
549                                                 childResource.getReferenceUri().trim().length() > 0)
550                                         {
551                                             newReportUnit.setMainReportReference( childResource.getReferenceUri() );
552                                         }
553                                         else
554                                         {
555                                             FileResource fileResource=(FileResource)RepositoryHelper.getInstance().getRepo().newResource(null,FileResource.class);
556                                             fileResource.setName( childResource.getName() );
557                                             fileResource.setLabel( childResource.getLabel() );
558                                             fileResource.setDescription( childResource.getDescription());
559                                             fileResource.setVersion(FileResource.VERSION_NEW);
560                                             fileResource.setFileType( fileResource.TYPE_JRXML );
561
562                                             //fileResource.setParentFolder(newDescriptor.getUriString());
563

564                                             if (childResource.getHasData())
565                                             {
566                                                 // Save the temporary file....
567
OMElement attachmentElement = (OMElement) iter.next();//requestElement.getFirstElement();
568
OMText binaryNode = (OMText)attachmentElement.getFirstOMChild();
569                                                 DataHandler JavaDoc actualDH;
570                                                 actualDH = (DataHandler JavaDoc)binaryNode.getDataHandler();
571
572                                                 // Save the content in the file...
573
fileResource.readData( actualDH.getInputStream());
574                                             }
575                                             if (childResource.isMainReport())
576                                             {
577                                                 newReportUnit.setMainReport(fileResource);
578                                             }
579                                         }
580                                     }
581                                 }
582                                 
583                                 RepositoryHelper.getInstance().getRepo().saveResource(null,newReportUnit);
584                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().getResourceDescriptor(newReportUnit.getURIString()));
585                             }
586                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC))
587                             {
588                                 JdbcReportDataSource jdbcReportDataSource = (JdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JdbcReportDataSource.class);
589                                 jdbcReportDataSource.setParentFolder(newDescriptor.getParentFolder());
590                                 jdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
591                                 jdbcReportDataSource.setName( newDescriptor.getName() );
592                                 
593                                 updateDataSource(jdbcReportDataSource, newDescriptor);
594                                 
595                                 if (reportUnit != null)
596                                 {
597                                     reportUnit.setDataSource(jdbcReportDataSource);
598                                     RepositoryHelper.getInstance().getRepo().saveResource(null,jdbcReportDataSource);
599                                 }
600                                 else
601                                 {
602                                     RepositoryHelper.getInstance().getRepo().saveResource(null,jdbcReportDataSource);
603                                 }
604                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(jdbcReportDataSource));
605                             }
606                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI))
607                             {
608                                 JndiJdbcReportDataSource jndiJdbcReportDataSource = (JndiJdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JndiJdbcReportDataSource.class);
609                                 jndiJdbcReportDataSource.setParentFolder(newDescriptor.getParentFolder());
610                                 jndiJdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
611                                 jndiJdbcReportDataSource.setName( newDescriptor.getName() );
612                                 
613                                 updateDataSource(jndiJdbcReportDataSource, newDescriptor);
614                                 
615                                 if (reportUnit != null)
616                                 {
617                                     reportUnit.setDataSource(jndiJdbcReportDataSource);
618                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
619                                 }
620                                 else
621                                 {
622                                     RepositoryHelper.getInstance().getRepo().saveResource(null,jndiJdbcReportDataSource);
623                                 }
624                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(jndiJdbcReportDataSource));
625                             }
626                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN))
627                             {
628                                 BeanReportDataSource beanReportDataSource = (BeanReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,BeanReportDataSource.class);
629                                 beanReportDataSource.setParentFolder(newDescriptor.getParentFolder());
630                                 beanReportDataSource.setVersion(BeanReportDataSource.VERSION_NEW);
631                                 beanReportDataSource.setName( newDescriptor.getName() );
632                                 
633                                 updateDataSource(beanReportDataSource, newDescriptor);
634                                 
635                                 if (reportUnit != null)
636                                 {
637                                     reportUnit.setDataSource(beanReportDataSource);
638                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
639                                 }
640                                 else
641                                 {
642                                     RepositoryHelper.getInstance().getRepo().saveResource(null,beanReportDataSource);
643                                 }
644                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(beanReportDataSource));
645                             }
646                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_REFERENCE))
647                             {
648                                 FileResource fileResource=(FileResource)RepositoryHelper.getInstance().getRepo().newResource(null,FileResource.class);
649                                 fileResource.setParentFolder(newDescriptor.getParentFolder());
650                                 fileResource.setVersion(FileResource.VERSION_NEW);
651                                 fileResource.setName( newDescriptor.getName() );
652                                 fileResource.setLabel( newDescriptor.getLabel() );
653                                 fileResource.setDescription( newDescriptor.getDescription());
654                                 fileResource.setReferenceURI( newDescriptor.getReferenceUri() );
655                                 
656                                 // check if the reference uri is valid...
657
try {
658                                     Resource refRes = RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getReferenceUri());
659                                 } catch (Exception JavaDoc ex)
660                                 {
661                                     throw new WSException(WSException.GENERAL_ERROR2,"Resource " + newDescriptor.getReferenceUri() + " not found or invalid.");
662                                 }
663                            
664                                 if (reportUnit != null)
665                                 {
666                                     reportUnit.addResource(fileResource);
667                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
668                                 }
669                                 else
670                                 {
671                                     throw new WSException(WSException.GENERAL_ERROR2, "You can create a link only inside a ReportUnit");
672                                 }
673                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
674                             }
675                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATA_TYPE))
676                             {
677                                 DataType fileResource=(DataType)RepositoryHelper.getInstance().getRepo().newResource(null,DataType.class);
678                                 fileResource.setParentFolder(newDescriptor.getParentFolder());
679                                 fileResource.setVersion(FileResource.VERSION_NEW);
680                                 fileResource.setName( newDescriptor.getName() );
681                                 
682                                 updateDataType(fileResource, newDescriptor);
683                                 
684                                 if (reportUnit == null)
685                                 {
686                                     RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
687                                 }
688                                 else
689                                 {
690                                     throw new WSException(WSException.GENERAL_ERROR2, "You can not add a datatype to a ReportUnit!");
691                                 }
692                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
693                             }
694                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_LOV))
695                             {
696                                 ListOfValues fileResource=(ListOfValues)RepositoryHelper.getInstance().getRepo().newResource(null,ListOfValues.class);
697                                 fileResource.setParentFolder(newDescriptor.getParentFolder());
698                                 fileResource.setVersion(ListOfValues.VERSION_NEW);
699                                 fileResource.setName( newDescriptor.getName() );
700                                 updateListOfValues(fileResource, newDescriptor);
701                                 
702                                 if (reportUnit == null)
703                                 {
704                                     RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
705                                 }
706                                 else
707                                 {
708                                     throw new WSException(WSException.GENERAL_ERROR2, "You can not add a list of values to a ReportUnit!");
709                                 }
710                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
711                             }
712                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_QUERY))
713                             {
714                                 Query fileResource=(Query)RepositoryHelper.getInstance().getRepo().newResource(null,Query.class);
715                                 fileResource.setParentFolder(newDescriptor.getParentFolder());
716                                 fileResource.setVersion(ListOfValues.VERSION_NEW);
717                                 fileResource.setName( newDescriptor.getName() );
718                                 updateQuery(fileResource, newDescriptor);
719                                 
720                                 if (reportUnit == null)
721                                 {
722                                     RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
723                                 }
724                                 else
725                                 {
726                                     throw new WSException(WSException.GENERAL_ERROR2, "You can not add a query resource to a ReportUnit!");
727                                 }
728                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
729                             }
730                             else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_INPUT_CONTROL))
731                             {
732                                
733                                 if (newDescriptor.getIsReference())
734                                 {
735                                     if (reportUnit == null)
736                                     {
737                                         throw new WSException(WSException.GENERAL_ERROR2, "You can create a link of a control only inside a ReportUnit!");
738                                     }
739                                     log.info("Adding control to RU: " + newDescriptor.getReferenceUri());
740                                     reportUnit.addInputControlReference( newDescriptor.getReferenceUri() );
741                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
742                                     or.getResourceDescriptors().add( RepositoryHelper.getInstance().getResourceDescriptor( newDescriptor.getReferenceUri() ));
743                                 }
744                                 else
745                                 {
746                                     
747                                     InputControl fileResource=(InputControl)RepositoryHelper.getInstance().getRepo().newResource(null,InputControl.class);
748                                     fileResource.setParentFolder(newDescriptor.getParentFolder());
749                                     fileResource.setVersion(InputControl.VERSION_NEW);
750                                     fileResource.setName( newDescriptor.getName() );
751                                     updateInputControl( fileResource, newDescriptor);
752                                     
753                                      if (reportUnit != null)
754                                      {
755                                         reportUnit.addInputControl( fileResource );
756                                         RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
757                                      }
758                                      else
759                                      {
760                                         RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
761                                      }
762                                      or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
763                                 }
764                                 
765                             }
766                             else
767                             {
768                                 FileResource fileResource=(FileResource)RepositoryHelper.getInstance().getRepo().newResource(null,FileResource.class);
769                                 fileResource.setParentFolder(newDescriptor.getParentFolder());
770                                 fileResource.setVersion(FileResource.VERSION_NEW);
771
772                                 String JavaDoc wsType = newDescriptor.getWsType();
773                                 if (wsType.equals( ResourceDescriptor.TYPE_IMAGE )) fileResource.setFileType(FileResource.TYPE_IMAGE);
774                                 else if (wsType.equals( ResourceDescriptor.TYPE_FONT )) fileResource.setFileType(FileResource.TYPE_FONT);
775                                 else if (wsType.equals( ResourceDescriptor.TYPE_CLASS_JAR )) fileResource.setFileType(FileResource.TYPE_JAR);
776                                 else if (wsType.equals( ResourceDescriptor.TYPE_JRXML )) fileResource.setFileType(FileResource.TYPE_JRXML);
777                                 else if (wsType.equals( ResourceDescriptor.TYPE_RESOURCE_BUNDLE )) fileResource.setFileType(FileResource.TYPE_RESOURCE_BUNDLE);
778
779                                 fileResource.setName( newDescriptor.getName() );
780                                 fileResource.setLabel( newDescriptor.getLabel() );
781                                 fileResource.setDescription( newDescriptor.getDescription());
782                              
783                                 if (newDescriptor.getHasData())
784                                 {
785                                     // Save the temporary file....
786
OMElement attachmentElement = (OMElement) iter.next();//requestElement.getFirstElement();
787
OMText binaryNode = (OMText)attachmentElement.getFirstOMChild();
788                                     DataHandler JavaDoc actualDH;
789                                     actualDH = (DataHandler JavaDoc)binaryNode.getDataHandler();
790
791                                     // Save the content in the file...
792
fileResource.readData( actualDH.getInputStream());
793                                 }
794                                 
795                                 if (reportUnit != null)
796                                 {
797                                     reportUnit.addResource(fileResource);
798                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
799                                 }
800                                 else
801                                 {
802                                     RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
803                                 }
804                                 
805                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
806                             }
807                     }
808                     else // MODIFY
809
{
810                         log.debug("Put: modifying");
811                         String JavaDoc reportUnitUrl = getArgumentValue(Argument.MODIFY_REPORTUNIT, request.getArguments());
812                         if (reportUnitUrl != null)
813                         {
814                             log.debug("Put: modifying resource in reportUnit " + reportUnitUrl);
815                             // Report unit modification....
816
ReportUnit reportUnit = (ReportUnit)RepositoryHelper.getInstance().getRepo().getResource(null,reportUnitUrl);
817                             if (reportUnit == null)
818                             {
819                                 throw new WSException( WSException.REFERENCED_RESOURCE_NOT_FOUND, "ReportUnit not found");
820                             }
821                             
822                             // We assume the resource is a FileResource...
823
FileResource resource = (FileResource)getReportUnitResource( newDescriptor, reportUnit);
824                              
825                             if (resource != null)
826                             {
827                                 if (resource.getLabel() == null || !resource.getLabel().equals( newDescriptor.getLabel()))
828                                 {
829                                     resource.setLabel( newDescriptor.getLabel() );
830                                 }
831
832                                 if (resource.getDescription() == null || !resource.getDescription().equals( newDescriptor.getDescription()))
833                                 {
834                                     resource.setDescription( newDescriptor.getDescription());
835                                 }
836
837                                 if (resource.isReference() && newDescriptor.getIsReference())
838                                 {
839                                     if (!resource.getURIString().equals(newDescriptor.getReferenceUri()))
840                                     {
841                                         // check if the reference uri is valid...
842
// check if the reference uri is valid...
843
try {
844                                             Resource refRes = RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getReferenceUri());
845                                         } catch (Exception JavaDoc ex)
846                                         {
847                                             throw new WSException( WSException.REFERENCED_RESOURCE_NOT_FOUND, "The resource " + newDescriptor.getReferenceUri() + " was not found or is invalid.");
848                                         }
849                                             
850                                         resource.setReferenceURI( newDescriptor.getReferenceUri() );
851                                     }
852                                 }
853                                 
854                                 if (!resource.isReference() && newDescriptor.getHasData())
855                                 {
856                                     // Save the temporary file....
857

858                                     OMElement attachmentElement = (OMElement) iter.next();//requestElement.getFirstElement();
859
OMText binaryNode = (OMText)attachmentElement.getFirstOMChild();
860                                     DataHandler JavaDoc actualDH;
861                                     actualDH = (DataHandler JavaDoc)binaryNode.getDataHandler();
862
863                                     // Save the content in the file...
864
resource.readData(actualDH.getInputStream());
865                                 }
866
867                                 if (newDescriptor.isMainReport() && reportUnit.getMainReport().isLocal())
868                                 {
869                                     reportUnit.setMainReport(resource);
870                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
871                                 }
872                                 else
873                                 {
874                                     RepositoryHelper.getInstance().getRepo().saveResource(null,resource);
875                                 }
876                                 or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(resource));
877                             }
878                             else
879                             {
880                                 or.setReturnCode(2);
881                                 or.setMessage("Resource not found");
882                             }
883                         }
884                         else
885                         {
886                             log.debug("Put: modifying " + newDescriptor.getWsType());
887                                 if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_REPORTUNIT))
888                                 {
889                                     ReportUnit reportUnit = (ReportUnit)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
890                                     reportUnit.setLabel( newDescriptor.getLabel() );
891                                     reportUnit.setDescription( newDescriptor.getDescription());
892                                     
893                                     // Look for additional changes.
894
// Possible changes:
895
// - jrxml file
896
// - DataSource
897

898                                     for (int i=0; i<newDescriptor.getChildren().size(); ++i)
899                                     {
900                                         ResourceDescriptor childResource = (ResourceDescriptor)newDescriptor.getChildren().get(i);
901                                         
902                                         if (childResource.getWsType().equals(ResourceDescriptor.TYPE_JRXML) &&
903                                             childResource.isMainReport())
904                                         {
905                                             if (childResource.getReferenceUri() != null &&
906                                                 childResource.getReferenceUri().trim().length() > 0)
907                                             {
908                                                 reportUnit.setMainReportReference( childResource.getReferenceUri() );
909                                             }
910                                             else
911                                             {
912                                                 FileResource fileResource=(FileResource)RepositoryHelper.getInstance().getRepo().newResource(null,FileResource.class);
913                                                 fileResource.setName( childResource.getName() );
914                                                 fileResource.setLabel( childResource.getLabel() );
915                                                 fileResource.setDescription( childResource.getDescription());
916                                                 fileResource.setVersion(FileResource.VERSION_NEW);
917                                                 fileResource.setFileType( fileResource.TYPE_JRXML );
918
919                                                 //fileResource.setParentFolder(newDescriptor.getUriString());
920

921                                                 if (childResource.getHasData())
922                                                 {
923                                                     // Save the temporary file....
924
OMElement attachmentElement = (OMElement) iter.next();//requestElement.getFirstElement();
925
OMText binaryNode = (OMText)attachmentElement.getFirstOMChild();
926                                                     DataHandler JavaDoc actualDH;
927                                                     actualDH = (DataHandler JavaDoc)binaryNode.getDataHandler();
928
929                                                     // Save the content in the file...
930
fileResource.readData( actualDH.getInputStream());
931                                                 }
932                                                 reportUnit.setMainReport(fileResource);
933                                             }
934                                         }
935                                         else if (childResource.getWsType().equals( childResource.TYPE_DATASOURCE ) ||
936                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC) ||
937                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI) ||
938                                         childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN) )
939                                         {
940                                             if (childResource.getIsReference())
941                                             {
942                                                 reportUnit.setDataSourceReference(childResource.getReferenceUri());
943                                             }
944                                             else
945                                             {
946                                                 if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC))
947                                                 {
948                                                     JdbcReportDataSource jdbcReportDataSource = (JdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JdbcReportDataSource.class);
949                                                     jdbcReportDataSource.setParentFolder(childResource.getParentFolder());
950                                                     jdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
951                                                     jdbcReportDataSource.setName( childResource.getName() );
952
953                                                     updateDataSource(jdbcReportDataSource, childResource);
954
955                                                     reportUnit.setDataSource(jdbcReportDataSource);
956                                                 }
957                                                 else if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI))
958                                                 {
959                                                     JndiJdbcReportDataSource jndiJdbcReportDataSource = (JndiJdbcReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,JndiJdbcReportDataSource.class);
960                                                     jndiJdbcReportDataSource.setParentFolder(childResource.getParentFolder());
961                                                     jndiJdbcReportDataSource.setVersion(JdbcReportDataSource.VERSION_NEW);
962                                                     jndiJdbcReportDataSource.setName( childResource.getName() );
963
964                                                     updateDataSource(jndiJdbcReportDataSource, childResource);
965                                                     reportUnit.setDataSource(jndiJdbcReportDataSource);
966                                                 }
967                                                 else if (childResource.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN))
968                                                 {
969                                                     BeanReportDataSource beanReportDataSource = (BeanReportDataSource)RepositoryHelper.getInstance().getRepo().newResource(null,BeanReportDataSource.class);
970                                                     beanReportDataSource.setParentFolder(newDescriptor.getParentFolder());
971                                                     beanReportDataSource.setVersion(BeanReportDataSource.VERSION_NEW);
972                                                     beanReportDataSource.setName( newDescriptor.getName() );
973
974                                                     updateDataSource(beanReportDataSource, childResource);
975                                                     reportUnit.setDataSource(beanReportDataSource);
976                                                 }
977                                             }
978                                         }
979                                     } // End children for
980

981                                     RepositoryHelper.getInstance().getRepo().saveResource(null,reportUnit);
982                                     or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(reportUnit, true));
983                                 }
984                                 else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_FOLDER))
985                                 {
986                                     Folder res = RepositoryHelper.getInstance().getRepo().getFolder(null, newDescriptor.getUriString());
987                                     
988                                     if (res != null)
989                                     {
990                                         if (res.getLabel() == null || !res.getLabel().equals( newDescriptor.getLabel()))
991                                         {
992                                             res.setLabel( newDescriptor.getLabel() );
993                                         }
994
995                                         if (res.getDescription() == null || !res.getDescription().equals( newDescriptor.getDescription()))
996                                         {
997                                             res.setDescription( newDescriptor.getDescription());
998                                         }
999                                         
1000                                        RepositoryHelper.getInstance().getRepo().saveFolder(null,res);
1001                                        or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(res));
1002                                    }
1003                                    else
1004                                    {
1005                                        or.setReturnCode(2);
1006                                        or.setMessage("Folder not found");
1007                                    }
1008                                }
1009                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JDBC))
1010                                {
1011                                    JdbcReportDataSource jdbcReportDataSource = (JdbcReportDataSource)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1012                                    
1013                                    updateDataSource(jdbcReportDataSource, newDescriptor);
1014
1015                                    RepositoryHelper.getInstance().getRepo().saveResource(null,jdbcReportDataSource);
1016                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(jdbcReportDataSource));
1017                                }
1018                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_JNDI))
1019                                {
1020                                    JndiJdbcReportDataSource jndiJdbcReportDataSource = (JndiJdbcReportDataSource)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1021                                        
1022                                    updateDataSource(jndiJdbcReportDataSource, newDescriptor);
1023                                    
1024
1025                                    RepositoryHelper.getInstance().getRepo().saveResource(null,jndiJdbcReportDataSource);
1026                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(jndiJdbcReportDataSource));
1027                                }
1028                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATASOURCE_BEAN))
1029                                {
1030                                    BeanReportDataSource beanReportDataSource = (BeanReportDataSource)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1031                                        
1032                                    updateDataSource(beanReportDataSource, newDescriptor);
1033                                    
1034
1035                                    RepositoryHelper.getInstance().getRepo().saveResource(null,beanReportDataSource);
1036                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(beanReportDataSource));
1037                                }
1038                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_DATA_TYPE))
1039                                {
1040                                    DataType fileResource=(DataType)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1041                                    updateDataType(fileResource, newDescriptor);
1042
1043                                    RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
1044                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
1045                                }
1046                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_LOV))
1047                                {
1048                                    ListOfValues fileResource=(ListOfValues)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1049                                    updateListOfValues(fileResource, newDescriptor);
1050
1051                                    RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
1052                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
1053                                }
1054                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_QUERY))
1055                                {
1056                                    Query fileResource=(Query)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1057                                    updateQuery(fileResource, newDescriptor);
1058
1059                                    RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
1060                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
1061                                }
1062                                else if (newDescriptor.getWsType().equals(ResourceDescriptor.TYPE_INPUT_CONTROL))
1063                                {
1064                                    InputControl fileResource=(InputControl)RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1065                                    updateInputControl(fileResource, newDescriptor);
1066
1067                                    RepositoryHelper.getInstance().getRepo().saveResource(null,fileResource);
1068                                    or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(fileResource));
1069                                }
1070                                else
1071                                {
1072                                        Resource res = RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getUriString());
1073                                        
1074                                        if (res != null)
1075                                        {
1076                                            if (res.getLabel() == null || !res.getLabel().equals( newDescriptor.getLabel()))
1077                                            {
1078                                                res.setLabel( newDescriptor.getLabel() );
1079                                            }
1080
1081                                            //System.out.println("Resource type: " + res);
1082
//System.out.println("Resource has data: " + newDescriptor.getHasData());
1083
//System.out.flush();
1084
if (res instanceof FileResource && newDescriptor.getHasData())
1085                                            {
1086                                                // Save the temporary file....
1087

1088                                                OMElement attachmentElement = (OMElement) iter.next();//requestElement.getFirstElement();
1089
OMText binaryNode = (OMText)attachmentElement.getFirstOMChild();
1090                                                DataHandler JavaDoc actualDH;
1091                                                actualDH = (DataHandler JavaDoc)binaryNode.getDataHandler();
1092
1093                                                // Save the content in the file...
1094
((FileResource)res).readData(actualDH.getInputStream());
1095                                            }
1096                                            
1097                                            if (res.getDescription() == null || !res.getDescription().equals( newDescriptor.getDescription()))
1098                                            {
1099                                                res.setDescription( newDescriptor.getDescription());
1100                                            }
1101                                            RepositoryHelper.getInstance().getRepo().saveResource(null,res);
1102                                            or.getResourceDescriptors().add( RepositoryHelper.getInstance().createResourceDescriptor(res));
1103                                        }
1104                                        else
1105                                        {
1106                                            or.setReturnCode(2);
1107                                            or.setMessage("Resource not found");
1108                                        }
1109                                }
1110                        }
1111                    }
1112                } catch (WSException e)
1113                {
1114                    log.error("caught exception: " + e.getMessage(), e);
1115                        
1116                    or.setReturnCode( e.getErrorCode() );
1117                    or.setMessage(e.getMessage());
1118                
1119                } catch (Exception JavaDoc e) {
1120                    
1121                    //e.printStackTrace();
1122
log.error("caught exception: " + e.getMessage(), e);
1123                        
1124                    or.setReturnCode( 1 );
1125                    or.setMessage(e.getMessage());
1126                }
1127                log.debug("Marshalling response");
1128                
1129                return marshalResponse( or );
1130    }
1131    
1132    public OMElement checkForRequiredResources(OMElement element) throws XMLStreamException {
1133        
1134        return element;
1135    }
1136    
1137    
1138        private String JavaDoc getArgumentValue(String JavaDoc argumentName, List JavaDoc arguments)
1139        {
1140            for (int i=0; i < arguments.size(); ++i)
1141            {
1142                Argument a = (Argument) arguments.get(i);
1143                if (a.getName() == null ? a.getName() == argumentName : a.getName().equals(argumentName))
1144                {
1145                    return a.getValue();
1146                }
1147            }
1148            
1149            return null;
1150        }
1151        
1152        
1153        /**
1154         * Look for a resource pointed by the ResourceDescriptor in a report unit.
1155         *
1156         */

1157        private Resource getReportUnitResource( ResourceDescriptor descriptor, ReportUnit reportUnit)
1158        {
1159            if (descriptor.isMainReport())
1160            {
1161                ResourceReference resRef = reportUnit.getMainReport();
1162                Resource jrxmlResource = null;
1163                if (resRef.isLocal())
1164                {
1165                    jrxmlResource = (Resource)resRef.getLocalResource();
1166                }
1167                else
1168                {
1169                    jrxmlResource = (Resource)RepositoryHelper.getInstance().getRepo().getResource(null, resRef.getReferenceURI());
1170                }
1171                
1172                return jrxmlResource;
1173            }
1174            else
1175            {
1176                List JavaDoc resources = reportUnit.getResources();
1177                for (int i=0; i<resources.size(); ++i)
1178                {
1179                    ResourceReference resRef = (ResourceReference)resources.get(i);
1180                    Resource genericResource = null;
1181                    if (resRef.isLocal())
1182                    {
1183                        genericResource = (FileResource)resRef.getLocalResource();
1184                    }
1185                    else
1186                    {
1187                        genericResource = (FileResource)RepositoryHelper.getInstance().getRepo().getResource(null, resRef.getReferenceURI());
1188                    }
1189                    if (genericResource.getURIString().equals(descriptor.getUriString()))
1190                    {
1191                        return genericResource;
1192                    }
1193                }
1194            }
1195            
1196            return null;
1197        }
1198    
1199        /**
1200         * This method delete a resource identified by an URI.
1201         *
1202         * To delete a resource that belongs to a REPORT_UNIT, you need to specify the argument
1203         * Argument.MODIFY_REPORTUNIT with the URI of the reportUnit parent.
1204         * If the resource is not local to the reportUnit, this URI is ignored but still
1205         * mandatory.
1206         * You can not delete a MainReport
1207         *
1208         *
1209         * Operation result Codes:
1210         * 0 - Success
1211         * 1 - Generic error
1212         *
1213         */

1214    public OMElement delete(OMElement element) throws XMLStreamException {
1215        
1216                OperationResult or = new OperationResult();
1217                or.setVersion( this.WS_VERSION);
1218                or.setReturnCode( or.SUCCESS );
1219                                            
1220                try {
1221
1222                    Iterator JavaDoc iter = element.getChildElements();
1223                    String JavaDoc requestXmlString = ((OMElement) iter.next()).getText();
1224                
1225                    // Unmarshall xmlDescriptor request...
1226
StringReader JavaDoc xmlStringReader = new StringReader JavaDoc(requestXmlString);
1227                    Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader);
1228                    
1229                    String JavaDoc reportUnitUrl = getArgumentValue(Argument.MODIFY_REPORTUNIT, request.getArguments());
1230                    
1231                    if (reportUnitUrl != null)
1232                    {
1233                        log.debug("Delete: resource in reportUnit: " + reportUnitUrl);
1234                        
1235                        // Report unit modification....
1236
ReportUnit reportUnit = (ReportUnit)RepositoryHelper.getInstance().getRepo().getResource(null,reportUnitUrl);
1237                        if (reportUnit == null)
1238                        {
1239                            throw new WSException( WSException.REFERENCED_RESOURCE_NOT_FOUND, "ReportUnit not found");
1240                        }
1241                        
1242                        // 1. Find the resource...
1243
ResourceReference resRef = null;
1244                            // We assume the resource is a FileResource...
1245
ResourceDescriptor rd = request.getResourceDescriptor();
1246                            //FileResource resource = (FileResource)getReportUnitResource( request.getResourceDescriptor(), reportUnit);
1247

1248                            if (!rd.isMainReport())
1249                            {
1250                                
1251                                log.debug("Delete: resource in reportUnit: " + rd.getWsType());
1252                                if (rd.getWsType().equals(ResourceDescriptor.TYPE_INPUT_CONTROL))
1253                                {
1254                                    List JavaDoc resources = reportUnit.getInputControls();
1255                                    for (int i=0; i<resources.size(); ++i)
1256                                    {
1257                                        resRef = (ResourceReference)resources.get(i);
1258                                        Resource genericResource = null;
1259                                        if (resRef.isLocal() && rd.getUriString().equals( resRef.getLocalResource().getURIString() ))
1260                                        {
1261                                            //reportUnit.removeResourceLocal( resRef.getLocalResource().getName() );
1262
reportUnit.removeInputControl(i);
1263                                            break;
1264                                        }
1265                                        else if (!resRef.isLocal() && rd.getUriString().equals( resRef.getReferenceLookup().getURIString() ))
1266                                        {
1267                                            reportUnit.removeInputControl(i);
1268                                            break;
1269                                        }
1270                                    }
1271                                }
1272                                else
1273                                {
1274                                    List JavaDoc resources = reportUnit.getResources();
1275                                    for (int i=0; i<resources.size(); ++i)
1276                                    {
1277                                        resRef = (ResourceReference)resources.get(i);
1278                                        Resource genericResource = null;
1279                                        if (resRef.isLocal() && rd.getName().equals( resRef.getLocalResource().getName() ))
1280                                        {
1281                                            reportUnit.removeResourceLocal( resRef.getLocalResource().getName() );
1282                                            //reportUnit.removeResource(i);
1283
break;
1284                                        }
1285                                        else if (!resRef.isLocal() && rd.getUriString().equals( resRef.getReferenceLookup().getURIString() ))
1286                                        {
1287                                            reportUnit.removeResourceReference(rd.getUriString());
1288                                            break;
1289                                        }
1290                                    }
1291                                }
1292                                //eportUnit. removeResourceReference(rd.getUriString());
1293
//RepositoryHelper.getInstance().getRepo().deleteResource(null, rd.getUriString());
1294
RepositoryHelper.getInstance().getRepo().saveResource(null, reportUnit);
1295                            }
1296                            else
1297                            {
1298                                throw new Exception JavaDoc("The main JRXML can not be deleted!");
1299                            }
1300                    }
1301                    else
1302                    {
1303                        ResourceDescriptor rd = RepositoryHelper.getInstance().getResourceDescriptor( request.getResourceDescriptor().getUriString() );
1304                        if (rd == null)
1305                        {
1306                            log.error("Delete: no resource : " + request.getResourceDescriptor().getUriString());
1307                            //or.setReturnCode(2);
1308
//or.setMessage("Resource not found");
1309
}
1310                        else
1311                        {
1312                            log.debug("Delete: resource : " + rd.getWsType());
1313                            if (rd.getWsType().equals(ResourceDescriptor.TYPE_FOLDER))
1314                            {
1315                                RepositoryHelper.getInstance().getRepo().deleteFolder(null, rd.getUriString());
1316                            }
1317                            else
1318                            {
1319                                RepositoryHelper.getInstance().getRepo().deleteResource(null, rd.getUriString());
1320                            }
1321                        }
1322                    }
1323                } catch (WSException e) {
1324                    
1325                    e.printStackTrace();
1326            log.error("caught WSException: " + e.getMessage(), e);
1327                        
1328                    or.setReturnCode( e.getErrorCode() );
1329                    or.setMessage( e.getMessage() );
1330                    
1331                } catch (Exception JavaDoc e) {
1332                    
1333                    e.printStackTrace();
1334            log.error("caught exception: " + e.getMessage(), e);
1335                        
1336                        or.setReturnCode( 1 );
1337                        or.setMessage(e.getMessage());
1338        }
1339                
1340                log.debug("Marshalling response");
1341                return marshalResponse( or );
1342    }
1343       
1344        
1345        private void updateDataType(DataType dataTypeResource, ResourceDescriptor newDescriptor) throws WSException
1346        {
1347            dataTypeResource.setLabel( newDescriptor.getLabel() );
1348            dataTypeResource.setDescription( newDescriptor.getDescription());
1349            // Validations shoule be done in the save method...
1350
dataTypeResource.setType( newDescriptor.getDataType());
1351            dataTypeResource.setRegularExpr( newDescriptor.getPattern() );
1352            dataTypeResource.setMaxValue( newDescriptor.getMaxValue() );
1353            dataTypeResource.setStrictMax( newDescriptor.isStrictMax() );
1354            dataTypeResource.setMinValue( newDescriptor.getMinValue() );
1355            dataTypeResource.setStrictMin(newDescriptor.isStrictMin() );
1356        }
1357        
1358        private void updateDataSource(JdbcReportDataSource jdbcReportDataSource, ResourceDescriptor newDescriptor) throws WSException
1359        {
1360            jdbcReportDataSource.setLabel( newDescriptor.getLabel() );
1361            jdbcReportDataSource.setDescription( newDescriptor.getDescription());
1362            jdbcReportDataSource.setConnectionUrl( newDescriptor.getConnectionUrl() );
1363            jdbcReportDataSource.setDriverClass( newDescriptor.getDriverClass() );
1364            jdbcReportDataSource.setUsername( newDescriptor.getUsername() );
1365            jdbcReportDataSource.setPassword( newDescriptor.getPassword() );
1366        }
1367        
1368        private void updateDataSource(JndiJdbcReportDataSource jndiJdbcReportDataSource, ResourceDescriptor newDescriptor) throws WSException
1369        {
1370            jndiJdbcReportDataSource.setLabel( newDescriptor.getLabel() );
1371            jndiJdbcReportDataSource.setDescription( newDescriptor.getDescription());
1372            jndiJdbcReportDataSource.setJndiName( newDescriptor.getJndiName() );
1373        }
1374        
1375        private void updateDataSource(BeanReportDataSource beanReportDataSource, ResourceDescriptor newDescriptor) throws WSException
1376        {
1377            beanReportDataSource.setLabel( newDescriptor.getLabel() );
1378            beanReportDataSource.setDescription( newDescriptor.getDescription());
1379            beanReportDataSource.setBeanName( newDescriptor.getBeanName() );
1380            beanReportDataSource.setBeanMethod(
1381                    (newDescriptor.getBeanMethod() != null &&
1382                     newDescriptor.getBeanMethod().trim().length()>0) ?
1383                        newDescriptor.getBeanMethod() : null );
1384        }
1385        
1386        
1387        private void updateListOfValues(ListOfValues resource, ResourceDescriptor newDescriptor) throws WSException
1388        {
1389            resource.setLabel( newDescriptor.getLabel() );
1390            resource.setDescription( newDescriptor.getDescription());
1391            // Validations shoule be done in the save method...
1392
// Remove current items...
1393
ListOfValuesItem[] items = resource.getValues();
1394            for (int k=0; k<items.length; ++k)
1395            {
1396                resource.removeValue(items[k]);
1397            }
1398            List JavaDoc list = newDescriptor.getListOfValues();
1399            for (int k=0; k<list.size(); ++k)
1400            {
1401                ListItem litem = (ListItem)list.get(k);
1402                ListOfValuesItem item = new ListOfValuesItemImpl();
1403                item.setLabel(litem.getLabel());
1404                item.setValue(litem.getValue());
1405                resource.addValue(item);
1406            }
1407        }
1408        
1409        private void updateInputControl(InputControl resource, ResourceDescriptor newDescriptor) throws WSException
1410        {
1411            resource.setLabel( newDescriptor.getLabel() );
1412            resource.setDescription( newDescriptor.getDescription());
1413
1414            
1415            resource.setMandatory( newDescriptor.isMandatory());
1416            resource.setReadOnly( newDescriptor.isReadOnly());
1417            resource.setType( newDescriptor.getControlType());
1418            
1419            String JavaDoc parent = resource.getParentFolder() + "/" + resource.getName();
1420            // Look in children...
1421
if (resource.getType() == ResourceDescriptor.IC_TYPE_SINGLE_VALUE)
1422            {
1423                // We have to set the datatype...
1424
if (newDescriptor.getChildren().size() == 0)
1425                {
1426                    throw new WSException(WSException.GENERAL_ERROR2, "Data Type definition or reference is missing");
1427                }
1428                ResourceDescriptor rd = (ResourceDescriptor)newDescriptor.getChildren().get(0);
1429                if (rd.getWsType().equals( ResourceDescriptor.TYPE_REFERENCE))
1430                {
1431                    resource.setDataTypeReference( rd.getReferenceUri() );
1432                }
1433                else
1434                {
1435                    DataType dataTypeResource=(DataType)RepositoryHelper.getInstance().getRepo().newResource(null,DataType.class);
1436                    dataTypeResource.setParentFolder(parent);
1437                    dataTypeResource.setVersion(DataType.VERSION_NEW);
1438                    dataTypeResource.setName( rd.getName() );
1439                    updateDataType(dataTypeResource,rd);
1440                    resource.setDataType(dataTypeResource);
1441                }
1442            }
1443            // Look in children...
1444
else if (resource.getType() == ResourceDescriptor.IC_TYPE_SINGLE_SELECT_LIST_OF_VALUES)
1445            {
1446
1447                // We have to set the datatype...
1448
if (newDescriptor.getChildren().size() == 0)
1449                {
1450                    throw new WSException(WSException.GENERAL_ERROR2, "List of values definition or reference is missing");
1451                }
1452                ResourceDescriptor rd = (ResourceDescriptor)newDescriptor.getChildren().get(0);
1453                if (rd.getWsType().equals( ResourceDescriptor.TYPE_REFERENCE))
1454                {
1455                    resource.setListOfValuesReference( rd.getReferenceUri() );
1456                }
1457                else
1458                {
1459                    ListOfValues lovResource=(ListOfValues)RepositoryHelper.getInstance().getRepo().newResource(null,ListOfValues.class);
1460                    lovResource.setParentFolder(parent);
1461                    lovResource.setVersion(DataType.VERSION_NEW);
1462                    lovResource.setName( rd.getName() );
1463                    updateListOfValues(lovResource,rd);
1464                    resource.setListOfValues(lovResource);
1465                }
1466            }
1467            else if (resource.getType() == ResourceDescriptor.IC_TYPE_SINGLE_SELECT_QUERY)
1468            {
1469
1470                // We have to set the datatype...
1471
if (newDescriptor.getChildren().size() == 0)
1472                {
1473                    throw new WSException(WSException.GENERAL_ERROR2, "Query definition or reference is missing");
1474                }
1475                ResourceDescriptor rd = (ResourceDescriptor)newDescriptor.getChildren().get(0);
1476                
1477                resource.setQueryValueColumn( newDescriptor.getQueryValueColumn() );
1478                String JavaDoc[] visibleColumns = newDescriptor.getQueryVisibleColumns();
1479                
1480                // remove all old visible columns first...
1481
String JavaDoc[] oldColumns = resource.getQueryVisibleColumns();
1482                if (oldColumns != null)
1483                {
1484                    for (int i=0; i<oldColumns.length; ++i)
1485                    {
1486                        resource.removeQueryVisibleColumn(oldColumns[i]);
1487                    }
1488                }
1489                
1490                for (int i=0; i<visibleColumns.length; ++i)
1491                {
1492                    resource.addQueryVisibleColumn( visibleColumns[i]);
1493                }
1494
1495                if (rd.getWsType().equals( ResourceDescriptor.TYPE_REFERENCE))
1496                {
1497                    resource.setQueryReference( rd.getReferenceUri() );
1498                }
1499                else
1500                {
1501                    Query queryResource=(Query)RepositoryHelper.getInstance().getRepo().newResource(null,Query.class);
1502                    queryResource.setParentFolder(parent);
1503                    queryResource.setVersion(DataType.VERSION_NEW);
1504                    queryResource.setName( rd.getName() );
1505                    updateQuery(queryResource,rd);
1506                    resource.setQuery(queryResource);
1507                }
1508            }
1509        }
1510        
1511        private void updateQuery(Query resource, ResourceDescriptor newDescriptor) throws WSException
1512        {
1513            resource.setLabel( newDescriptor.getLabel() );
1514            resource.setDescription( newDescriptor.getDescription());
1515
1516            resource.setSql( newDescriptor.getSql() );
1517        }
1518        
1519        
1520        
1521        /**
1522         * This method run a report. The return is an OperationResult.
1523         * If the result is succesfull, the message contains a set of strings
1524         * (one for each row) with the list of files attached complete of the
1525         * relative path. I.e.
1526         *
1527         * main_report.html
1528         * images/logo1.jpg
1529         * images/chartxyz.jpg
1530         *
1531         * Arguments:
1532         *
1533         *
1534         *
1535         * The request must contains the descriptor of the report to execute
1536         * (only the URI is used).
1537         * Arguments can be attached to the descriptor as childs. Each argument
1538         * is a ListItem, with the parameter name as Name and the object
1539         * rapresenting the value as Value.
1540         *
1541         * Operation result Codes:
1542         * 0 - Success
1543         * 1 - Generic error
1544         *
1545         */

1546    public OMElement runReport(OMElement element) throws XMLStreamException {
1547        
1548            OperationResult or = new OperationResult();
1549            or.setVersion( this.WS_VERSION);
1550            or.setReturnCode( or.SUCCESS );
1551            Map JavaDoc attachments = new HashMap JavaDoc();
1552                                        
1553            try {
1554
1555                Iterator JavaDoc iter = element.getChildElements();
1556                String JavaDoc requestXmlString = ((OMElement) iter.next()).getText();
1557            
1558                // Unmarshall xmlDescriptor request...
1559
StringReader JavaDoc xmlStringReader = new StringReader JavaDoc(requestXmlString);
1560                Request request = (Request) Unmarshaller.unmarshal(Request.class, xmlStringReader);
1561                
1562                ResourceDescriptor reportUnit = request.getResourceDescriptor();
1563                log.debug("Run report: resource : " + reportUnit.getUriString());
1564                
1565                String JavaDoc format = getArgumentValue(Argument.RUN_OUTPUT_FORMAT, request.getArguments());
1566                if (format == null) format = Argument.RUN_OUTPUT_FORMAT_PDF;
1567                
1568                Resource reportResource = RepositoryHelper.getInstance().getRepo().getResource(null, reportUnit.getUriString());
1569                
1570                if (reportResource == null || !(reportResource instanceof ReportUnit)) {
1571                    throw new WSException(2, reportUnit.getUriString() + " is not a valid report unit");
1572                }
1573
1574                // Load parameters...
1575
Map JavaDoc parameters = new HashMap JavaDoc();
1576                
1577                for (int i = 0; i < reportUnit.getChildren().size(); ++i)
1578                {
1579                    ListItem param = (ListItem)reportUnit.getChildren().get(i);
1580                    if (log.isDebugEnabled()) {
1581                        log.debug("Parameter: " + param.getLabel() + ", value: " + param.getValue());
1582                    }
1583                    parameters.put(param.getLabel(), param.getValue());
1584                }
1585                
1586                parameters = RepositoryHelper.getInstance().convertParameterValues(reportUnit.getUriString(), parameters);
1587    
1588                // run the report
1589
ReportUnitResult result = (ReportUnitResult)RepositoryHelper.getInstance().getEngine().execute(
1590                                null,
1591                                new ReportUnitRequest(reportUnit.getUriString(), parameters));
1592                                
1593                
1594                if (result == null) {
1595                    
1596                        throw new WSException(WSException.FILL_ERROR, "Error executing the report: " + reportUnit.getUriString());
1597                    
1598                } else {
1599                    JasperPrint jasperPrint = result.getJasperPrint();
1600        
1601                    // Export...
1602
ByteArrayOutputStream JavaDoc bos = new ByteArrayOutputStream JavaDoc();
1603                    ByteArrayDataSource bads = null;
1604                    
1605                    if (format.equals(Argument.RUN_OUTPUT_FORMAT_JRPRINT))
1606                    {
1607                        log.debug("Returning JasperPrint");
1608                        JRSaver.saveObject(jasperPrint, bos);
1609                        bads = new ByteArrayDataSource(bos.toByteArray());
1610                        
1611                        attachments.put("jasperPrint", bads);
1612                    }
1613                    else
1614                    {
1615                        String JavaDoc pageIndexStr = getArgumentValue(Argument.RUN_OUTPUT_PAGE, request.getArguments());
1616
1617                        List JavaDoc jasperPrintList = new ArrayList JavaDoc();
1618                        jasperPrintList.add(jasperPrint);
1619                        
1620                        StringBuffer JavaDoc reportContent = new StringBuffer JavaDoc();
1621                        
1622                        log.debug("Returning:" + format);
1623                        
1624                        JRExporter exporter = getExporter(format, pageIndexStr, reportContent);
1625                        exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
1626                        
1627                        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bos);
1628
1629                        try {
1630                            exporter.exportReport();
1631                            
1632                        } catch (JRException e) {
1633                            log.error(e);
1634                            throw new WSException(WSException.EXPORT_ERROR, "Error exporting report :" + e.getMessage());
1635                            
1636                        } finally {
1637                            if (bos != null) {
1638                                try {
1639                                    bos.close();
1640                                } catch (IOException JavaDoc ex) {
1641                                }
1642                            }
1643                        }
1644                        bads = new ByteArrayDataSource(bos.toByteArray(), getContentType(format));
1645                        
1646                        attachments.put("report", bads);
1647                        addAdditionalAttachmentsForReport(jasperPrint, attachments, format, reportContent);
1648                    }
1649
1650                }
1651                
1652            } catch (WSException e) {
1653                log.error("caught exception: " + e.getMessage(), e);
1654                or.setReturnCode( e.getErrorCode() );
1655                or.setMessage(e.getMessage());
1656            
1657            } catch (Exception JavaDoc e) {
1658                log.error("caught exception: " + e.getMessage(), e);
1659                or.setReturnCode( 1 );
1660                or.setMessage(e.getMessage());
1661            }
1662
1663            log.debug("Marshalling response");
1664           
1665            return marshalResponse( or, attachments);
1666        }
1667    
1668    public JRExporter getExporter(String JavaDoc type, String JavaDoc pageIndexStr, StringBuffer JavaDoc reportContent) {
1669        JRExporter exporter = null;
1670        if (type.equals(Argument.RUN_OUTPUT_FORMAT_PDF)) {
1671            exporter = new JRPdfExporter();
1672        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_HTML)) {
1673            exporter = new JRHtmlExporter();
1674            exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images/");
1675            exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.TRUE);
1676            exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, reportContent);
1677        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_XLS)) {
1678            exporter = new JRXlsExporter();
1679            exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
1680            exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
1681        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_CSV)) {
1682            exporter = new JRCsvExporter();
1683        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_XML)) {
1684            exporter = new JRXmlExporter();
1685        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_RTF)) {
1686            exporter = new JRRtfExporter();
1687        }
1688        if (exporter != null && pageIndexStr != null) {
1689            exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer JavaDoc(pageIndexStr));
1690        }
1691        
1692        return exporter;
1693        
1694    }
1695    
1696    public String JavaDoc getContentType(String JavaDoc type) {
1697        String JavaDoc contentType = null;
1698        if (type.equals(Argument.RUN_OUTPUT_FORMAT_PDF)) {
1699            contentType = "application/pdf";
1700        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_HTML)) {
1701            contentType = "text/html";
1702        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_XLS)) {
1703            contentType = "application/xls";
1704        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_CSV)) {
1705            contentType = "application/vnd.ms-excel";
1706        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_XML)) {
1707            contentType = "text/xml";
1708        } else if (type.equals(Argument.RUN_OUTPUT_FORMAT_RTF)) {
1709            contentType = "application/rtf";
1710        }
1711        
1712        return contentType;
1713        
1714    }
1715    
1716    /**
1717     * Create additional Web Services attachments for the content. At this stage, HTML reports
1718     * have their images as attachments
1719     *
1720     * @param jasperPrint
1721     * @param attachments
1722     * @param format
1723     * @param reportContent
1724     * @throws WSException
1725     */

1726    private void addAdditionalAttachmentsForReport(JasperPrint jasperPrint,
1727            Map JavaDoc attachments, String JavaDoc format, StringBuffer JavaDoc reportContent) throws WSException {
1728        
1729        if (!format.equals(Argument.RUN_OUTPUT_FORMAT_HTML)) {
1730            return;
1731        }
1732        
1733        
1734        try {
1735            List JavaDoc images = collectImages(jasperPrint, reportContent);
1736            
1737            for (Iterator JavaDoc it = images.iterator(); it.hasNext(); ) {
1738
1739                FileContent content = (FileContent) it.next();
1740                
1741                log.debug("Adding image: " + content.getName() + ", type: " + content.getMimeType());
1742                
1743                ByteArrayDataSource bads = new ByteArrayDataSource(content.getData(), content.getMimeType());
1744                
1745                attachments.put(content.getName(), bads);
1746            }
1747        } catch (JRException e) {
1748            log.error(e);
1749            throw new WSException(WSException.EXPORT_ERROR, "Error adding an image to the result: " + e.getMessage());
1750        }
1751    }
1752
1753    /**
1754     * Get the image names from the html that will be sent back to the client. Getting images directly from
1755     * the JRHtmlExport object is not possible. So, we must jump through some hoops and essentially
1756     * pretend to be the image servlet where some key code was taken from.
1757     *
1758     * There is an enhancement request to open up JRHtmlExport at which time this routine will be
1759     * removed.
1760     *
1761     * Get image names from html. Skip over "px" named images. There are many of these if the report
1762     * is using single pixel images for formatting. Get each image from the JasperPrint object by
1763     * using the static utility method on JRHtmlExport. Load images in FileContent object.
1764     *
1765     * TODO break into two helper methods for readability
1766     *
1767     * @param jasperPrint
1768     * @param sBuf
1769     * @param page
1770     * @return
1771     */

1772    private List JavaDoc collectImages(JasperPrint jasperPrint, StringBuffer JavaDoc sBuf) throws JRException {
1773
1774        int indexEndOfName = 0;
1775        
1776        // Using a set will make the set of names unique
1777

1778        Set JavaDoc imageNames = new HashSet JavaDoc();
1779        
1780        while (true) {
1781            // loop through the html looking for images (img SRC=)
1782
int indexNext = sBuf.indexOf(START_TOKEN, indexEndOfName);
1783            
1784            if (indexNext < 0) { // no match, so break
1785
break;
1786            }
1787            
1788            int indexStartOfName = indexNext + START_TOKEN.length();
1789            indexEndOfName = sBuf.indexOf(END_TOKEN, indexStartOfName);
1790            
1791            String JavaDoc imageName = sBuf.substring(indexStartOfName, indexEndOfName);
1792            
1793            imageNames.add(imageName);
1794            
1795            // Go past this point in the string and try again
1796

1797            indexEndOfName++;
1798        }
1799        
1800        List JavaDoc jasperPrintList = new ArrayList JavaDoc();
1801        jasperPrintList.add(jasperPrint); // JRHtmlExporter wants the JasperPrint to be in a List
1802
byte[] imageData = null;
1803        String JavaDoc imageMimeType = null;
1804        
1805        List JavaDoc contents = new ArrayList JavaDoc(imageNames.size());
1806        
1807        for (Iterator JavaDoc it = imageNames.iterator(); it.hasNext();) {
1808             
1809            String JavaDoc imageName = (String JavaDoc) it.next();
1810            
1811            if ("px".equals(imageName)) {
1812                JRRenderable pxRenderer =
1813                    JRImageRenderer.getInstance(
1814                        "net/sf/jasperreports/engine/images/pixel.GIF",
1815                        JRImage.ON_ERROR_TYPE_ERROR
1816                        );
1817                imageData = pxRenderer.getImageData();
1818                imageMimeType = "image/gif";
1819                
1820            } else {
1821                JRPrintImage image = JRHtmlExporter.getImage(jasperPrintList, imageName);
1822                
1823                JRRenderable renderer = image.getRenderer();
1824                if (renderer.getType() == JRRenderable.TYPE_SVG)
1825                {
1826                    renderer =
1827                        new JRWrappingSvgRenderer(
1828                            renderer,
1829                            new Dimension JavaDoc(image.getWidth(), image.getHeight()),
1830                            image.getBackcolor()
1831                            );
1832                }
1833                imageMimeType = JRTypeSniffer.getImageMimeType(renderer.getImageType());
1834                imageData = renderer.getImageData();
1835            }
1836            
1837            FileContent content = new FileContent();
1838            content.setData(imageData);
1839            content.setMimeType(imageMimeType);
1840            content.setName(imageName);
1841            
1842            contents.add(content);
1843        }
1844        return contents;
1845    }
1846
1847
1848}
1849
Popular Tags