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 ; 6 import java.io.ByteArrayOutputStream ; 7 import java.io.IOException ; 8 import java.io.StringReader ; 9 import java.io.StringWriter ; 10 import java.util.ArrayList ; 11 import java.util.HashMap ; 12 import java.util.HashSet ; 13 import java.util.Iterator ; 14 import java.util.List ; 15 import java.util.Map ; 16 import java.util.Set ; 17 18 import javax.activation.DataHandler ; 19 import javax.activation.DataSource ; 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 START_TOKEN = "img SRC=\"images/"; 83 protected static final String END_TOKEN = "\""; 84 protected static final String REPORT_UNIT = "ReportUnit"; 85 86 protected static final String WS_VERSION = "1.1.0"; 87 92 private MessageContext inMessge = null; 93 private MessageContext outMessage = null; 94 95 public void init(MessageContext inMessge, MessageContext outMessage) { 96 this.inMessge = inMessge; 98 this.outMessage = outMessage; 99 } 100 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 datasource) 115 { 116 Map attachments = new HashMap (); 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 ()); 128 } 129 130 private static OMElement marshalResponse( OperationResult or, Map 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 xmlStringWriter = new StringWriter (); 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 ex) 150 { 151 log.error("caught exception marshalling an OperationResult: " + ex.getMessage(), ex); 152 } 154 155 if (datasources != null) 156 { 157 for (Iterator it = datasources.entrySet().iterator(); it.hasNext(); ) 158 { 159 try { 160 Map.Entry entry = (Map.Entry ) it.next(); 161 String name = (String ) entry.getKey(); 162 DataSource datasource = (DataSource ) entry.getValue(); 163 164 log.debug("Adding attachment: " + name + ", type: " + datasource.getContentType()); 165 166 DataHandler expectedDH = new DataHandler ( 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 ex) 174 { 175 log.error("caught exception marshalling an OperationResult: " + ex.getMessage(), ex); 176 } 178 } 179 } 180 return resultElem; 181 } 182 183 public OMElement list(OMElement element) throws XMLStreamException { 184 185 192 199 202 203 213 215 OperationResult or = new OperationResult(); 221 or.setVersion( this.WS_VERSION); 222 or.setReturnCode( or.SUCCESS ); 223 try { 224 225 Iterator iter = element.getChildElements(); 226 String requestXmlString = ((OMElement) iter.next()).getText(); 227 228 StringReader xmlStringReader = new StringReader (requestXmlString); 230 Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader); 231 232 List list = null; 233 String error = null; 234 235 if (request.getResourceDescriptor() == null) 236 { 237 list = new java.util.ArrayList (); 238 log.debug("Null resourceDescriptor"); 239 if (getArgumentValue(Argument.LIST_DATASOURCES, request.getArguments()) != null && 241 getArgumentValue(Argument.LIST_DATASOURCES, request.getArguments()).equals(Argument.VALUE_TRUE)) 242 { 243 FilterCriteria criteria = FilterCriteria.createFilter(ReportDataSource.class); 245 log.debug("Listing datasources..."); 246 247 250 List lookups = RepositoryHelper.getInstance().getRepo().loadClientResources(criteria); 251 if (lookups != null && !lookups.isEmpty()) { 252 253 for (Iterator 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 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 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 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 iter = element.getChildElements(); 328 String requestXmlString = ((OMElement) iter.next()).getText(); 329 330 StringReader xmlStringReader = new StringReader (requestXmlString); 332 Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader); 333 334 List args = request.getArguments(); 335 336 HashMap specialOptions = new HashMap (); 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 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 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 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 iter = element.getChildElements(); 434 OMElement requestElement = (OMElement) iter.next(); 435 String requestXmlString = requestElement.getText(); 436 442 StringReader xmlStringReader = new StringReader (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()) { 460 461 log.debug("Put: adding"); 462 ReportUnit reportUnit = null; 464 String 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 List 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 564 if (childResource.getHasData()) 565 { 566 OMElement attachmentElement = (OMElement) iter.next(); OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 569 DataHandler actualDH; 570 actualDH = (DataHandler )binaryNode.getDataHandler(); 571 572 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 try { 658 Resource refRes = RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getReferenceUri()); 659 } catch (Exception 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 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 OMElement attachmentElement = (OMElement) iter.next(); OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 788 DataHandler actualDH; 789 actualDH = (DataHandler )binaryNode.getDataHandler(); 790 791 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 { 810 log.debug("Put: modifying"); 811 String reportUnitUrl = getArgumentValue(Argument.MODIFY_REPORTUNIT, request.getArguments()); 812 if (reportUnitUrl != null) 813 { 814 log.debug("Put: modifying resource in reportUnit " + reportUnitUrl); 815 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 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 try { 844 Resource refRes = RepositoryHelper.getInstance().getRepo().getResource(null, newDescriptor.getReferenceUri()); 845 } catch (Exception 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 858 OMElement attachmentElement = (OMElement) iter.next(); OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 860 DataHandler actualDH; 861 actualDH = (DataHandler )binaryNode.getDataHandler(); 862 863 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 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 921 if (childResource.getHasData()) 922 { 923 OMElement attachmentElement = (OMElement) iter.next(); OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 926 DataHandler actualDH; 927 actualDH = (DataHandler )binaryNode.getDataHandler(); 928 929 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 } 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 if (res instanceof FileResource && newDescriptor.getHasData()) 1085 { 1086 1088 OMElement attachmentElement = (OMElement) iter.next(); OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 1090 DataHandler actualDH; 1091 actualDH = (DataHandler )binaryNode.getDataHandler(); 1092 1093 ((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 e) { 1120 1121 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 getArgumentValue(String argumentName, List 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 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 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 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 iter = element.getChildElements(); 1223 String requestXmlString = ((OMElement) iter.next()).getText(); 1224 1225 StringReader xmlStringReader = new StringReader (requestXmlString); 1227 Request request = (Request)Unmarshaller.unmarshal(Request.class, xmlStringReader); 1228 1229 String reportUnitUrl = getArgumentValue(Argument.MODIFY_REPORTUNIT, request.getArguments()); 1230 1231 if (reportUnitUrl != null) 1232 { 1233 log.debug("Delete: resource in reportUnit: " + reportUnitUrl); 1234 1235 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 ResourceReference resRef = null; 1244 ResourceDescriptor rd = request.getResourceDescriptor(); 1246 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 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.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 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 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 RepositoryHelper.getInstance().getRepo().saveResource(null, reportUnit); 1295 } 1296 else 1297 { 1298 throw new Exception ("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 } 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 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 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 ListOfValuesItem[] items = resource.getValues(); 1394 for (int k=0; k<items.length; ++k) 1395 { 1396 resource.removeValue(items[k]); 1397 } 1398 List 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 parent = resource.getParentFolder() + "/" + resource.getName(); 1420 if (resource.getType() == ResourceDescriptor.IC_TYPE_SINGLE_VALUE) 1422 { 1423 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 else if (resource.getType() == ResourceDescriptor.IC_TYPE_SINGLE_SELECT_LIST_OF_VALUES) 1445 { 1446 1447 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 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 [] visibleColumns = newDescriptor.getQueryVisibleColumns(); 1479 1480 String [] 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 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 attachments = new HashMap (); 1552 1553 try { 1554 1555 Iterator iter = element.getChildElements(); 1556 String requestXmlString = ((OMElement) iter.next()).getText(); 1557 1558 StringReader xmlStringReader = new StringReader (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 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 Map parameters = new HashMap (); 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 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 ByteArrayOutputStream bos = new ByteArrayOutputStream (); 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 pageIndexStr = getArgumentValue(Argument.RUN_OUTPUT_PAGE, request.getArguments()); 1616 1617 List jasperPrintList = new ArrayList (); 1618 jasperPrintList.add(jasperPrint); 1619 1620 StringBuffer reportContent = new StringBuffer (); 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 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 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 type, String pageIndexStr, StringBuffer 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 (pageIndexStr)); 1690 } 1691 1692 return exporter; 1693 1694 } 1695 1696 public String getContentType(String type) { 1697 String 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 1726 private void addAdditionalAttachmentsForReport(JasperPrint jasperPrint, 1727 Map attachments, String format, StringBuffer reportContent) throws WSException { 1728 1729 if (!format.equals(Argument.RUN_OUTPUT_FORMAT_HTML)) { 1730 return; 1731 } 1732 1733 1734 try { 1735 List images = collectImages(jasperPrint, reportContent); 1736 1737 for (Iterator 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 1772 private List collectImages(JasperPrint jasperPrint, StringBuffer sBuf) throws JRException { 1773 1774 int indexEndOfName = 0; 1775 1776 1778 Set imageNames = new HashSet (); 1779 1780 while (true) { 1781 int indexNext = sBuf.indexOf(START_TOKEN, indexEndOfName); 1783 1784 if (indexNext < 0) { break; 1786 } 1787 1788 int indexStartOfName = indexNext + START_TOKEN.length(); 1789 indexEndOfName = sBuf.indexOf(END_TOKEN, indexStartOfName); 1790 1791 String imageName = sBuf.substring(indexStartOfName, indexEndOfName); 1792 1793 imageNames.add(imageName); 1794 1795 1797 indexEndOfName++; 1798 } 1799 1800 List jasperPrintList = new ArrayList (); 1801 jasperPrintList.add(jasperPrint); byte[] imageData = null; 1803 String imageMimeType = null; 1804 1805 List contents = new ArrayList (imageNames.size()); 1806 1807 for (Iterator it = imageNames.iterator(); it.hasNext();) { 1808 1809 String imageName = (String ) 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 (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 |