1 21 package com.jaspersoft.jasperserver.util; 22 23 27 28 import java.io.File ; 29 import java.io.FileInputStream ; 30 import java.io.FileReader ; 31 import java.text.DateFormat ; 32 import java.text.SimpleDateFormat ; 33 import java.util.ArrayList ; 34 import java.util.Calendar ; 35 import java.util.Date ; 36 import java.util.HashMap ; 37 import java.util.HashSet ; 38 import java.util.List ; 39 import java.util.Iterator ; 40 import java.util.Map ; 41 import java.util.Set ; 42 43 import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext; 44 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJob; 45 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobMailNotification; 46 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobRepositoryDestination; 47 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobSimpleTrigger; 48 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobSource; 49 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobTrigger; 50 import com.jaspersoft.jasperserver.api.engine.scheduling.service.ReportJobsPersistenceService; 51 import com.jaspersoft.jasperserver.api.metadata.common.domain.ContentResource; 52 import com.jaspersoft.jasperserver.api.metadata.common.domain.DataSource; 53 import com.jaspersoft.jasperserver.api.metadata.common.domain.DataType; 54 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource; 55 import com.jaspersoft.jasperserver.api.metadata.common.domain.Folder; 56 import com.jaspersoft.jasperserver.api.metadata.common.domain.InputControl; 57 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValues; 58 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValuesItem; 59 import com.jaspersoft.jasperserver.api.metadata.common.domain.Query; 60 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource; 61 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceReference; 62 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.DataTypeImpl; 63 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FileResourceImpl; 64 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FolderImpl; 65 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.ListOfValuesImpl; 66 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.ListOfValuesItemImpl; 67 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.QueryImpl; 68 import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService; 69 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JdbcReportDataSource; 70 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JndiJdbcReportDataSource; 71 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportDataSource; 72 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportUnit; 73 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianConnection; 74 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianXMLADefinition; 75 import com.jaspersoft.jasperserver.api.metadata.olap.domain.OlapClientConnection; 76 import com.jaspersoft.jasperserver.api.metadata.olap.domain.OlapUnit; 77 import com.jaspersoft.jasperserver.api.metadata.olap.domain.XMLAConnection; 78 import com.jaspersoft.jasperserver.api.metadata.user.domain.Role; 79 import com.jaspersoft.jasperserver.api.metadata.user.domain.User; 80 import com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService; 81 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria; 82 import com.jaspersoft.jasperserver.util.FileResourceBean; 83 84 import org.apache.commons.logging.Log; 85 import org.apache.commons.logging.LogFactory; 86 87 import org.exolab.castor.xml.Unmarshaller; 88 89 import org.dom4j.Document; 90 import org.dom4j.Element; 91 import org.dom4j.io.SAXReader; 92 93 public class ImportResource { 94 95 private static final Log log = LogFactory.getLog(ImportResource.class); 96 private static final String PATH_SEP = "/"; 97 private static final String LABEL = "_label"; 98 private static final boolean TOP_LEVEL_OBJECT = true; 99 private static final boolean NOT_TOP_LEVEL_OBJECT = false; 100 101 private RepositoryService repo; 102 private UserAuthorityService auth; 103 private ReportJobsPersistenceService mSched; 104 private ExecutionContext context; 105 private String catalogPath; 106 private String catalogFileName; 107 private FileReader reader; 108 109 private String prependPath; 110 private String prependPathNoSlash; 111 private boolean usePrependPath; 112 113 private boolean failed = false; 114 115 118 public static void main(String [] args) { 119 120 } 121 122 public ImportResource(RepositoryService repo, 123 UserAuthorityService auth, 124 ReportJobsPersistenceService reportJobsPersistenceService, 125 ExecutionContext context, 126 String catalogPath, 127 String catalogFileName, 128 String prependPath) { 129 130 this.catalogPath = catalogPath; 131 this.catalogFileName = catalogFileName; 132 this.context = context; 133 this.repo = repo; 134 this.auth = auth; 135 this.mSched = reportJobsPersistenceService; 136 137 141 if (prependPath == null || prependPath.equals(PATH_SEP) || prependPath.equals("")) { 142 usePrependPath = false; 143 this.prependPath = ""; log.debug("not using prepend path"); 145 } else { 146 usePrependPath = true; 147 this.prependPath = setPrependPath(prependPath); 148 this.prependPathNoSlash = setPrependPathNoSlash(this.prependPath); 149 log.debug("using prepend path, path=" + this.prependPath); 150 } 151 } 152 153 154 157 public boolean process() { 158 log.debug("top of process()"); 159 160 loadCatalogFile(); 161 162 try { 163 164 Unmarshaller unmarshaller = new Unmarshaller(ExportImportBean.class); 165 unmarshaller.setMapping(MappingHelper.getExportImportBeanMapping()); 166 ExportImportBean bean = (ExportImportBean) unmarshaller.unmarshal(reader); 167 168 if (log.isDebugEnabled()) { 169 log.debug("Unmarshalled a " + bean.getVersion() + " exported bean"); 170 } 171 172 if (bean.getUserRoleHolder() != null) { 173 174 processUsersRoles( bean.getUserRoleHolder() ); 175 } 176 177 if (bean.getResource() != null) { 178 179 processResource( bean.getResource() ); 180 } 181 182 if (bean.getReportJobs() != null) { 183 184 processReportJobs( bean.getReportJobs()); 185 } 186 187 } catch (Exception e) { 188 log.error("ERROR: caught exception unmarshalling catalog, file=" + 189 catalogPath + PATH_SEP + ExportResource.CATALOG_FILE_NAME + 190 ", exception: " + e.getMessage()); 191 e.printStackTrace(); 192 failed = true; 193 } 194 return !failed; 195 } 196 197 198 public void processResource(ResourceBean bean) { 199 log.debug("top of processResource()"); 200 201 try { 202 203 if (bean instanceof FolderBean) { 204 205 process( (FolderBean) bean, TOP_LEVEL_OBJECT); 206 207 } else if (bean instanceof ReportUnitBean) { 208 209 process( (ReportUnitBean) bean, TOP_LEVEL_OBJECT); 210 211 } else if (bean instanceof OlapUnitBean) { 212 213 process( (OlapUnitBean) bean, TOP_LEVEL_OBJECT); 214 215 } else if (bean instanceof FileResourceBean) { 216 217 process( (FileResourceBean) bean, TOP_LEVEL_OBJECT); 218 219 } else if (bean instanceof ContentResourceBean) { 220 221 process( (ContentResourceBean) bean, TOP_LEVEL_OBJECT); 222 223 } else if (bean instanceof DataSourceBean) { 224 225 process( (DataSourceBean) bean, TOP_LEVEL_OBJECT); 226 227 } else if (bean instanceof OlapClientConnectionBean) { 228 229 process( (OlapClientConnectionBean) bean, TOP_LEVEL_OBJECT); 230 231 } else if (bean instanceof MondrianXmlaDefinitionBean) { 232 233 process( (MondrianXmlaDefinitionBean) bean, TOP_LEVEL_OBJECT); 234 235 } else if (bean instanceof InputControlBean) { 236 237 process( (InputControlBean) bean, TOP_LEVEL_OBJECT); 238 239 } else if (bean instanceof DataTypeBean) { 240 241 process( (DataTypeBean) bean, TOP_LEVEL_OBJECT); 242 243 } else if (bean instanceof ListOfValuesBean) { 244 245 process( (ListOfValuesBean) bean, TOP_LEVEL_OBJECT); 246 247 } else if (bean instanceof QueryBean) { 248 249 process( (QueryBean) bean, TOP_LEVEL_OBJECT); 250 251 } else { 252 log.error("ERROR: unknown node type"); 253 } 254 255 } catch (Exception e) { 256 log.error("ERROR: caught exception processing, uri=" + bean.getUriString() + 257 ", exception: " + e.getMessage()); 258 e.printStackTrace(); 259 failed = true; 260 } 261 } 262 263 264 public void processUsersRoles(UserRoleHolderBean bean) { 265 266 process(bean, NOT_TOP_LEVEL_OBJECT); 267 } 268 269 270 public void processReportJobs(ReportJobBean[] beans) { 271 272 ReportJob job = new ReportJob(); 273 274 for (int i = 0; i < beans.length; i++) { 275 276 process( beans[i], NOT_TOP_LEVEL_OBJECT); 277 } 278 } 279 280 281 public Folder process(FolderBean bean, boolean isTopLevel) { 282 log.debug("top of process(FolderBean)"); 283 284 Folder folder = new FolderImpl(); 285 286 fillData(folder, bean); 287 288 buildParentFolder(folder, bean); 289 290 System.out.println("ImportResource: check and/or save folder, uri=" + folder.getURIString()); 291 292 handleSaveFolder(folder); 293 294 297 if (bean.getResources() != null) { 298 299 ResourceBean[] resources = bean.getResources(); 300 301 for (int i = 0; i < resources.length; i++) { 302 303 if (resources[i] instanceof ReportUnitBean) { 304 305 ReportUnit res = process( (ReportUnitBean) resources[i], NOT_TOP_LEVEL_OBJECT); 306 307 buildParentFolder(res, resources[i]); 308 309 handleSaveResource(res); 310 311 } else if (resources[i] instanceof OlapUnitBean) { 312 313 OlapUnit res = process( (OlapUnitBean) resources[i], NOT_TOP_LEVEL_OBJECT); 314 315 buildParentFolder(res, resources[i]); 316 317 handleSaveResource(res); 318 319 } else if (resources[i] instanceof FileResourceBean) { 320 321 FileResource res = process( (FileResourceBean) resources[i], NOT_TOP_LEVEL_OBJECT); 322 323 buildParentFolder(res, resources[i]); 324 325 handleSaveResource(res); 326 327 } else if (resources[i] instanceof ContentResourceBean) { 328 329 ContentResource res = process( (ContentResourceBean) resources[i], NOT_TOP_LEVEL_OBJECT); 330 331 buildParentFolder(res, resources[i]); 332 333 handleSaveResource(res); 334 335 } else if (resources[i] instanceof DataSourceBean) { 336 337 DataSource res = process( (DataSourceBean)resources[i], NOT_TOP_LEVEL_OBJECT); 338 339 buildParentFolder(res, resources[i]); 340 341 handleSaveResource(res); 342 343 } else if (resources[i] instanceof OlapClientConnectionBean) { 344 345 OlapClientConnection res = process( (OlapClientConnectionBean)resources[i], NOT_TOP_LEVEL_OBJECT); 346 347 buildParentFolder(res, resources[i]); 348 349 handleSaveResource(res); 350 351 } else if (resources[i] instanceof MondrianXmlaDefinitionBean) { 352 353 MondrianXMLADefinition res = process( (MondrianXmlaDefinitionBean)resources[i], NOT_TOP_LEVEL_OBJECT); 354 355 buildParentFolder(res, resources[i]); 356 357 handleSaveResource(res); 358 359 } else if (resources[i] instanceof InputControlBean) { 360 361 InputControl res = process( (InputControlBean)resources[i], NOT_TOP_LEVEL_OBJECT); 362 363 buildParentFolder(res, resources[i]); 364 365 handleSaveResource(res); 366 367 } else if (resources[i] instanceof DataTypeBean) { 368 369 DataType res = process( (DataTypeBean)resources[i], NOT_TOP_LEVEL_OBJECT); 370 371 buildParentFolder(res, resources[i]); 372 373 handleSaveResource(res); 374 375 } else if (resources[i] instanceof ListOfValuesBean) { 376 377 ListOfValues res = process( (ListOfValuesBean)resources[i], NOT_TOP_LEVEL_OBJECT); 378 379 buildParentFolder(res, resources[i]); 380 381 handleSaveResource(res); 382 383 } else if (resources[i] instanceof QueryBean) { 384 385 Query res = process( (QueryBean)resources[i], NOT_TOP_LEVEL_OBJECT); 386 387 buildParentFolder(res, resources[i]); 388 389 handleSaveResource(res); 390 391 } else { 392 log.error("ERROR: unknown resource type, class=" + resources[i].getClass()); 393 } 394 } 395 } 396 397 399 402 if (bean.getFolders() != null) { 403 FolderBean[] folders = bean.getFolders(); 404 405 for (int j = 0; j < folders.length; j++) { 406 407 process(folders[j], NOT_TOP_LEVEL_OBJECT); } 409 } 410 411 return folder; 412 } 413 414 415 public ReportUnit process(ReportUnitBean bean, boolean isTopLevel) { 416 log.debug("top of processReportUnit()"); 417 418 ReportUnit unit = (ReportUnit) repo.newResource(context, ReportUnit.class); 419 420 fillData(bean, unit); 421 422 425 if (bean.getDataSource() != null) { 426 427 DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT); 428 429 if (bean.getDataSource().getIsUriReference()) { 430 431 unit.setDataSourceReference(ds.getURIString()); 432 433 } else { 434 unit.setDataSource((ReportDataSource) ds); 435 } 436 } 437 438 441 if (bean.getQuery() != null) { 442 Query query = process( bean.getQuery(), NOT_TOP_LEVEL_OBJECT); 443 if (bean.getQuery().getIsUriReference()) { 444 unit.setQuery(new ResourceReference(query.getURIString())); 445 } else { 446 unit.setQuery(new ResourceReference(query)); 447 } 448 } 449 450 453 if (bean.getMainReport() != null) { 454 455 FileResource repRes = process( (FileResourceBean) bean.getMainReport(), NOT_TOP_LEVEL_OBJECT); 456 457 if (bean.getMainReport().getIsUriReference()) { 458 459 unit.setMainReportReference(repRes.getURIString()); 460 461 } else { 462 unit.setMainReport(repRes); 463 } 464 } 465 466 469 if (bean.getInputControls() != null) { 470 471 InputControlBean[] icArray = bean.getInputControls(); 472 473 for (int i = 0; i < icArray.length; i++) { 474 475 InputControl ic = process( (InputControlBean) icArray[i], NOT_TOP_LEVEL_OBJECT); 476 477 if (icArray[i].getIsUriReference()) { 478 479 unit.addInputControlReference(ic.getURIString()); 480 481 } else { 482 unit.addInputControl(ic); 483 } 484 } 485 } 486 487 490 FileResourceBean[] frArray = bean.getResources(); 491 492 if (frArray != null) { 493 for (int j = 0; j < frArray.length; j++) { 494 495 FileResource res = (FileResource) repo.newResource(context, 496 FileResource.class); 497 498 if (frArray[j].getIsReference()) { 499 500 handleFileResourceRef(res, frArray[j]); 501 502 } else { 504 fillData(res, frArray[j]); 505 } 506 unit.addResource(res); 507 } 508 } 509 510 if (isTopLevel) { 511 512 buildParentFolder(unit, bean); 513 514 handleSaveResource(unit); 515 } 516 return unit; 517 } 518 519 520 public OlapUnit process(OlapUnitBean bean, boolean isTopLevel) { 521 log.debug("top of process(OlapUnit)"); 522 523 OlapUnit unit = (OlapUnit) repo.newResource(context, OlapUnit.class); 524 525 fillData(unit, bean); 526 527 530 531 if (bean.getOlapClientConnection() != null) { 532 533 OlapClientConnection oc = process( bean.getOlapClientConnection(), NOT_TOP_LEVEL_OBJECT); 534 535 if (bean.getOlapClientConnection().getIsUriReference()) { 536 537 unit.setOlapClientConnectionReference(oc.getURIString()); 538 539 } else { 540 unit.setOlapClientConnection(oc); 541 } 542 } 543 544 if (isTopLevel) { 545 546 buildParentFolder(unit, bean); 547 548 handleSaveResource(unit); 549 } 550 return unit; 551 } 552 553 554 559 public FileResource process(FileResourceBean bean, boolean isTopLevel) { 560 log.debug("top of process(FileResouceBean)"); 561 562 FileResource res = (FileResource) repo.newResource(context, FileResource.class); 563 564 fillData(res, bean); 565 566 if (isTopLevel || bean.getIsUriReference()) { 567 568 buildParentFolder(res, bean); 569 570 handleSaveResource(res); 571 } 572 return res; 573 } 574 575 public ContentResource process(ContentResourceBean bean, boolean isTopLevel) { 576 log.debug("top of process(ContentResourceBean)"); 577 578 ContentResource res = (ContentResource) repo.newResource(context, ContentResource.class); 579 580 fillData(res, bean); 581 582 585 586 if (bean.getResources() != null) { 587 588 ContentResourceBean[] childResources = bean.getResources(); 589 590 for (int i =0; i < childResources.length; i++) { 591 592 ContentResource childRes = process( childResources[i], NOT_TOP_LEVEL_OBJECT); 593 594 res.addChildResource(childRes); 595 } 596 } 597 598 if (isTopLevel || bean.getIsUriReference()) { 599 600 buildParentFolder(res, bean); 601 602 handleSaveResource(res); 603 } 604 return res; 605 } 606 607 608 public DataSource process(DataSourceBean bean, boolean isTopLevel) { 609 log.debug("top of process(DataSourceBean)"); 610 611 ReportDataSource ds = null; 612 613 if (repo.getResource(null, prependPath + bean.getUriString()) == null) { 614 615 if (bean.getDataSourceType().equals(DataSourceBean.DS_TYPE_JDBC)) { 616 617 ds = (JdbcReportDataSource) repo.newResource(null, JdbcReportDataSource.class); 618 619 fillData( (JdbcDataSourceBean) bean, (JdbcReportDataSource) ds); 620 621 } else if (bean.getDataSourceType().equals(DataSourceBean.DS_TYPE_JNDI_JDBC)) { 622 623 ds = (JndiJdbcReportDataSource) repo.newResource(null, JndiJdbcReportDataSource.class); 624 625 fillData( (JndiJdbcDataSourceBean) bean, (JndiJdbcReportDataSource) ds); 626 627 } else { 628 log.error("ERROR: unknown data source type, datasource=" + prependPath + bean.getUriString()); 629 } 630 631 if (isTopLevel || bean.getIsUriReference()) { 632 633 buildParentFolder(ds, bean); 634 635 handleSaveResource(ds); 636 } 637 638 } else { 639 log.warn("WARN: ReportDataSource already exists, skipping creation, using existing, uri=" + 640 prependPath + bean.getUriString()); 641 642 ds = (ReportDataSource) repo.getResource(context, prependPath + bean.getUriString()); 643 } 644 645 return ds; 646 } 647 648 public OlapClientConnection process(OlapClientConnectionBean bean, boolean isTopLevel) { 649 log.debug("top of process(OlapClientConnectionBean)"); 650 651 OlapClientConnection oc = null; 652 653 if (repo.getResource(context, prependPath + bean.getUriString()) == null) { 654 655 if (bean.getConnectionType().equals(OlapClientConnectionBean.CONN_TYPE_MONDRIAN)) { 656 657 oc = process( (MondrianConnectionBean) bean, NOT_TOP_LEVEL_OBJECT); 658 659 } else if (bean.getConnectionType().equals(OlapClientConnectionBean.CONN_TYPE_XMLA)) { 660 661 oc = (XMLAConnection) repo.newResource(null, XMLAConnection.class); 662 663 fillData( (XMLAConnection) oc, (XmlaConnectionBean) bean); 664 665 } else { 666 log.error("ERROR: unknown data source type, datasource=" + prependPath + bean.getUriString()); 667 } 668 669 if (isTopLevel || bean.getIsUriReference()) { 670 671 buildParentFolder(oc, bean); 672 673 handleSaveResource(oc); 674 } 675 676 } else { 677 log.warn("WARN: OlapClientConnection already exists, skipping creation, using existing, uri=" + 678 prependPath + bean.getUriString()); 679 680 oc = (OlapClientConnection) repo.getResource(context, prependPath + bean.getUriString()); 681 } 682 683 return oc; 684 } 685 686 public MondrianXMLADefinition process(MondrianXmlaDefinitionBean bean, boolean isTopLevel) { 687 log.debug("top of process(MondrianXmlaDefinitionBean)"); 688 689 MondrianXMLADefinition xDef = (MondrianXMLADefinition) repo.newResource(context, MondrianXMLADefinition.class); 690 691 fillData(xDef, bean); 692 693 696 697 if (bean.getMondrianConnection() != null) { 698 699 MondrianConnection mc = process(bean.getMondrianConnection(), NOT_TOP_LEVEL_OBJECT); 700 701 if (bean.getMondrianConnection().getIsUriReference()) { 702 703 xDef.setMondrianConnectionReference(mc.getURIString()); 704 705 } else { 706 xDef.setMondrianConnection(mc); 707 } 708 } 709 710 if (isTopLevel || bean.getIsUriReference()) { 711 712 buildParentFolder(xDef, bean); 713 714 handleSaveResource(xDef); 715 } 716 return xDef; 717 } 718 719 720 public MondrianConnection process(MondrianConnectionBean bean, boolean isTopLevel) { 721 log.debug("top of process(MondrianConnectionBean)"); 722 723 MondrianConnection conn = (MondrianConnection) repo.newResource(context, MondrianConnection.class); 724 725 fillData(conn, bean); 726 727 730 if (bean.getSchema() != null) { 731 732 FileResource schema = process(bean.getSchema(), NOT_TOP_LEVEL_OBJECT); 734 if (bean.getSchema().getIsUriReference()) { 735 736 conn.setSchemaReference(schema.getURIString()); 737 } else { 738 conn.setSchema(schema); 739 } 740 } 741 742 745 if (bean.getDataSource() != null) { 746 747 DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT); 748 749 if (bean.getDataSource().getIsUriReference()) { 750 751 conn.setDataSourceReference(ds.getURIString()); 752 753 } else { 754 755 conn.setDataSource((ReportDataSource) ds); 756 } 757 } 758 759 if (isTopLevel || bean.getIsUriReference()) { 760 761 buildParentFolder(conn, bean); 762 763 handleSaveResource(conn); 764 } 765 return conn; 766 } 767 768 public InputControl process(InputControlBean bean, boolean isTopLevel) { 769 log.debug("top of process(InputControlBean)"); 770 771 InputControl ic = (InputControl) repo.newResource(context, InputControl.class); 772 773 fillData(bean, ic); 774 775 778 779 if (bean.getDataType() != null) { 780 781 DataType dt = process(bean.getDataType(), NOT_TOP_LEVEL_OBJECT); 782 783 if (bean.getDataType().getIsUriReference()) { 784 785 ic.setDataTypeReference(dt.getURIString()); 786 787 } else { 788 ic.setDataType(dt); 789 } 790 } 791 792 795 796 if (bean.getListOfValues() != null) { 797 798 ListOfValues lov = process(bean.getListOfValues(), NOT_TOP_LEVEL_OBJECT); 799 800 if (bean.getListOfValues().getIsUriReference()) { 801 802 ic.setListOfValuesReference(lov.getURIString()); 803 804 } else { 805 ic.setListOfValues(lov); 806 } 807 } 808 809 812 813 if (bean.getQuery() != null) { 814 815 Query query = process(bean.getQuery(), NOT_TOP_LEVEL_OBJECT); 816 817 if (bean.getQuery().getIsUriReference()) { 818 819 ic.setQueryReference(query.getURIString()); 820 821 } else { 822 ic.setQuery(query); 823 } 824 } 825 826 if (isTopLevel || bean.getIsUriReference()) { 827 828 buildParentFolder(ic, bean); 829 830 handleSaveResource(ic); 831 } 832 return ic; 833 } 834 835 public DataType process(DataTypeBean bean, boolean isTopLevel) { 836 log.debug("top of process(DataTypeBean)"); 837 838 DataType dt = (DataType) repo.newResource(context, DataType.class); 839 840 fillData(bean, dt); 841 842 if (isTopLevel || bean.getIsUriReference()) { 843 844 buildParentFolder(dt, bean); 845 846 handleSaveResource(dt); 847 } 848 return dt; 849 } 850 851 public ListOfValues process(ListOfValuesBean bean, boolean isTopLevel) { 852 log.debug("top of process(ListOfValuesBean)"); 853 854 ListOfValues lov = null; 855 856 if (isTopLevel) { 857 lov = (ListOfValues) repo.newResource(context, ListOfValues.class); 858 } else { 859 lov = new ListOfValuesImpl(); 860 } 861 862 fillData(bean, lov); 863 864 if (isTopLevel || bean.getIsUriReference()) { 865 866 buildParentFolder(lov, bean); 867 868 handleSaveResource(lov); 869 } 870 return lov; 871 } 872 873 public Query process(QueryBean bean, boolean isTopLevel) { 874 log.debug("top of process(QueryBean)"); 875 876 Query query = null; 877 878 if (isTopLevel) { 879 query = (Query) repo.newResource(context, Query.class); 880 } else { 881 query = new QueryImpl(); 882 } 883 884 fillData(bean, query); 885 886 889 if (bean.getDataSource() != null) { 890 DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT); 891 if (bean.getDataSource().getIsUriReference()) { 892 query.setDataSourceReference(ds.getURIString()); 893 } else { 894 query.setDataSource((ReportDataSource) ds); 895 } 896 } 897 898 if (isTopLevel || bean.getIsUriReference()) { 899 900 buildParentFolder(query, bean); 901 902 handleSaveResource(query); 903 } 904 return query; 905 } 906 907 908 public void process(UserRoleHolderBean bean, boolean isTopLevel) { 909 log.debug("top of process(UsersRoleHolderBean)"); 910 911 Map allRolesMap = null; 912 913 916 if (bean.getRoles() != null) { 917 918 createRoles(bean.getRoles()); 919 } 920 921 924 if (bean.getUsers() != null) { 925 926 allRolesMap = getAllRoles(); 927 log.debug(" ### allRolesMap.size=" + allRolesMap.size()); 928 929 UserBean[] userBeans = bean.getUsers(); 930 931 for (int i = 0; i < userBeans.length; i++) { 932 933 if (auth.getUser(context, userBeans[i].getUsername()) == null) { 934 935 User user = auth.newUser(null); 936 user.setUsername(userBeans[i].getUsername()); 937 user.setPassword(userBeans[i].getPassword()); 938 user.setFullName(userBeans[i].getFullName()); 939 user.setEnabled(userBeans[i].getEnabled()); 940 user.setExternallyDefined(userBeans[i].getExternallyDefined()); 941 942 RoleBean[] roleBeans = userBeans[i].getRoleSet(); 943 944 947 for (int j = 0; j < roleBeans.length; j++) { 948 949 if (allRolesMap.containsKey(roleBeans[j].getRoleName())) { 950 951 user.addRole( (Role) allRolesMap.get(roleBeans[j].getRoleName())); 952 953 } else { 954 log.error("ERROR: no role matching role held by user" + 955 ", username=" + userBeans[i].getUsername() + ", rolename=" 956 + roleBeans[j].getRoleName()); 957 } 958 } 959 960 auth.putUser(context, user); 962 } else { 963 log.warn("WARN: user already exists, skipping, username=" + 964 userBeans[i].getUsername()); 965 } 966 } 967 } 968 } 969 970 971 public ReportJob process(ReportJobBean bean, boolean isTopLevel) { 972 973 ReportJob job = new ReportJob(); 974 975 job.setId(bean.getId()); 976 job.setLabel(bean.getLabel()); 978 job.setDescription(bean.getDescription()); 979 job.setBaseOutputFilename(bean.getBaseOutputFilename()); 980 981 if (bean.getTrigger() != null) { 983 984 try { 985 DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.S"); 986 987 ReportJobTriggerBean tb = bean.getTrigger(); 988 ReportJobTrigger trig = new ReportJobSimpleTrigger(); 989 990 trig.setId(tb.getId()); 991 trig.setStartType(tb.getStartType()); 993 994 if (tb.getStartDate() != null) { 996 Date startDate = dateFormat.parse(tb.getStartDate()); 997 trig.setStartDate(startDate); 998 } 999 1000 if (tb.getEndDate() != null) { 1001 Date endDate = dateFormat.parse(tb.getEndDate()); 1002 trig.setEndDate(endDate); 1003 } 1004 job.setTrigger(trig); 1005 1006 } catch (Exception e) { 1007 log.error("ERROR: parsing a date, exception=" + e.getMessage()); 1008 e.printStackTrace(); 1009 failed = true; 1010 } 1011 } 1012 1013 if (bean.getSource() != null) { 1014 ReportJobSourceBean sb = bean.getSource(); 1015 ReportJobSource src = new ReportJobSource(); 1016 1017 src.setReportUnitURI(sb.getReportUnitURI()); 1018 1019 Map params = new HashMap (); 1020 if (sb.getParameters() != null) { 1021 1022 ParameterBean[] pBeans = sb.getParameters(); 1023 for (int i = 0; i < pBeans.length; i++) { 1024 1025 params.put(pBeans[i].getKey(), pBeans[i].getValue()); 1026 } 1027 src.setParametersMap(params); 1028 } 1029 job.setSource(src); 1030 } 1031 1032 1033 if (bean.getOutputFormats() != null) { 1034 1035 byte[] formats = bean.getOutputFormats(); 1036 1037 for (int i = 0; i < formats.length; i++) { 1038 1039 job.addOutputFormat(formats[i]); 1040 } 1041 } 1042 1043 if (bean.getContentRepositoryDestination() != null) { 1044 ReportJobRepositoryDestinationBean rd = bean.getContentRepositoryDestination(); 1045 ReportJobRepositoryDestination dest = new ReportJobRepositoryDestination(); 1046 1047 dest.setId(rd.getId()); 1048 dest.setFolderURI(rd.getFolderURI()); 1050 dest.setSequentialFilenames(rd.isSequentialFilenames()); 1051 dest.setOverwriteFiles(rd.isOverwriteFiles()); 1052 1053 job.setContentRepositoryDestination(dest); 1054 } 1055 1056 if (bean.getMailNotification() != null) { 1057 ReportJobMailNotificationBean nBean = new ReportJobMailNotificationBean(); 1058 ReportJobMailNotification note = new ReportJobMailNotification(); 1059 1060 note.setId(nBean.getId()); 1061 1063 if (nBean.getToAddresses() != null) { 1064 1065 String [] toAddrs = new String [nBean.getToAddresses().length]; 1066 for (int i = 0; i < toAddrs.length; i++) { 1067 note.addTo(toAddrs[i]); 1068 } 1069 } 1070 1071 if (nBean.getCcAddresses() != null) { 1072 1073 String [] ccAddrs = new String [nBean.getBccAddresses().length]; 1074 for (int i = 0; i < nBean.getCcAddresses().length; i++) { 1075 note.addCc(ccAddrs[i]); 1076 } 1077 } 1078 1079 if (nBean.getBccAddresses() != null) { 1080 1081 String [] bccAddrs = new String [nBean.getBccAddresses().length]; 1082 for (int i = 0; i < nBean.getBccAddresses().length; i++) { 1083 note.addBcc(bccAddrs[i]); 1084 } 1085 } 1086 if (nBean.getSubject() != null) { 1087 note.setSubject(nBean.getSubject()); 1088 } else { 1089 note.setSubject("subject"); } 1091 if (nBean.getMessageText() != null) { 1092 note.setMessageText(nBean.getMessageText()); 1093 } else { 1094 note.setMessageText("message text"); 1095 } 1096 note.setResultSendType(nBean.getResultSendType()); 1097 1098 job.setMailNotification(note); 1099 } 1100 1101 mSched.saveJob(context, job); 1102 1103 return job; 1104 } 1105 1106 1107 1112 protected void createRoles(RoleBean[] roleBeans) { 1113 1114 for (int i = 0; i < roleBeans.length; i++) { 1115 1116 Role role = null; 1117 1118 if (auth.getRole(context, roleBeans[i].getRoleName()) == null) { 1119 1120 role = auth.newRole(context); 1121 role.setRoleName(roleBeans[i].getRoleName()); 1122 role.setExternallyDefined(roleBeans[i].getExternallyDefined()); 1123 auth.putRole(context, role); 1124 } else { 1125 log.debug("role already exists, not creating, rolename=" + roleBeans[i].getRoleName()); 1126 } 1127 } 1128 } 1129 1130 1133 protected Map getAllRoles() { 1134 1135 HashMap roleMap = new HashMap (); 1136 1137 List roleList = auth.getRoles(context, new FilterCriteria()); 1138 1139 for (Iterator it = roleList.iterator(); it.hasNext(); ) { 1140 1141 Role role = (Role) it.next(); 1142 1143 roleMap.put(role.getRoleName(), role); 1144 } 1145 return roleMap; 1146 } 1147 1148 1149 1153 protected void handleFileResourceRef(FileResource res, FileResourceBean bean) { 1154 1155 1158 FileResource targetRes = (FileResource) repo.newResource(context, FileResource.class); 1159 FileResourceBean targetBean = (FileResourceBean) bean.getLinkTarget(); 1160 1161 fillDataForRef(targetRes, targetBean); 1162 1163 handleSaveResource(targetRes); 1164 1165 1168 fillCommonData(res, bean); 1169 1170 res.setReferenceURI(bean.getReferenceUri()); 1171 } 1172 1173 1176 protected void handleSaveResource(Resource res) { 1177 1178 if (repo.getResource(context, res.getURIString()) == null) { 1179 1180 repo.saveResource(context, res); 1181 1182 } else { 1183 log.info("target resource already exists, leaving unchanged, uri=" + res.getURIString()); 1184 } 1185 } 1186 1187 1188 1191 protected void handleSaveFolder(Folder folder) { 1192 1193 if (repo.getFolder(context, folder.getURIString()) == null) { 1194 1195 repo.saveFolder(context, folder); 1196 1197 } else { 1198 log.info("folder already exists, leaving unchanged, uri=" + folder.getURIString()); 1199 } 1200 } 1201 1202 protected void fillCommonData(Resource res, ResourceBean bean) { 1203 1204 res.setName(bean.getName()); 1205 res.setLabel(bean.getLabel()); 1206 res.setDescription(bean.getDescription()); 1207 } 1208 1209 1210 protected void fillData(Folder folder, FolderBean bean) { 1211 1212 fillCommonData(folder, bean); 1213 } 1214 1215 1216 protected void fillData(ReportUnitBean bean, ReportUnit unit) { 1217 1218 fillCommonData(unit, bean); 1219 } 1220 1221 protected void fillData(OlapUnit unit, OlapUnitBean bean) { 1222 1223 fillCommonData(unit, bean); 1224 1225 unit.setMdxQuery(bean.getMdxQuery()); 1226 } 1227 1228 protected void fillData(JdbcDataSourceBean bean, JdbcReportDataSource ds) { 1229 1230 fillCommonData(ds, bean); 1231 1232 ds.setDriverClass(bean.getDriverClass()); 1233 ds.setConnectionUrl(bean.getConnectionUrl()); 1234 ds.setUsername(bean.getUsername()); 1235 ds.setPassword(bean.getPassword()); 1236 } 1237 1238 protected void fillData(JndiJdbcDataSourceBean bean, JndiJdbcReportDataSource ds) { 1239 1240 fillCommonData(ds, bean); 1241 1242 ds.setJndiName(bean.getJndiName()); 1243 } 1244 1245 protected void fillData(MondrianConnection conn, MondrianConnectionBean bean) { 1246 1247 fillCommonData(conn, bean); 1248 } 1249 1250 protected void fillData(XMLAConnection conn, XmlaConnectionBean bean) { 1251 1252 fillCommonData(conn, bean); 1253 1254 conn.setURI(bean.getUri()); 1255 conn.setDataSource(bean.getDataSource()); 1256 conn.setCatalog(bean.getCatalog()); 1257 conn.setUsername(bean.getUsername()); 1258 conn.setPassword(bean.getPassword()); 1259 } 1260 1261 protected void fillData(MondrianXMLADefinition mx, MondrianXmlaDefinitionBean bean) { 1262 1263 fillCommonData(mx, bean); 1264 1265 mx.setCatalog(bean.getCatalog()); 1266 } 1267 1268 protected void fillData(FileResource fr, FileResourceBean bean) { 1269 1270 fillCommonData(fr, bean); 1271 1272 fr.setFileType(bean.getFileType()); 1273 1274 1277 String fullPath = catalogPath + bean.getParentFolder() + PATH_SEP + bean.getName(); 1278 1279 fr.readData( getBinaryData(fullPath) ); 1280 } 1281 1282 protected void fillData(ContentResource res, ContentResourceBean bean) { 1283 1284 fillCommonData(res, bean); 1285 1286 res.setFileType(bean.getFileType()); 1287 1288 1291 String fullPath = catalogPath + bean.getParentFolder() + PATH_SEP + bean.getName(); 1292 1293 res.readData( getBinaryData(fullPath) ); 1294 } 1295 1296 protected void fillDataForRef(FileResource targetRes, FileResourceBean targetBean) { 1297 1298 fillCommonData(targetRes, targetBean); 1299 1300 targetRes.setFileType(targetBean.getFileType()); 1301 1302 buildRepoFolderPath(context, prependPath + targetBean.getParentFolder()); 1303 targetRes.setParentFolder(prependPath + targetBean.getParentFolder()); 1304 1305 String fullPath = 1306 catalogPath + targetBean.getParentFolder() + PATH_SEP + targetBean.getName(); 1307 1308 targetRes.readData( getBinaryData(fullPath) ); 1309 } 1310 1311 1312 protected void fillData(DataTypeBean bean, DataType dt) { 1313 1314 fillCommonData(dt, bean); 1315 1316 dt.setType(bean.getType()); 1317 dt.setMaxLength(bean.getMaxLength()); 1318 dt.setDecimals(bean.getDecimals()); 1319 dt.setRegularExpr(bean.getRegularExpr()); 1320 dt.setMinValue(bean.getMinValue()); 1321 dt.setMaxValue(bean.getMaxValue()); 1322 dt.setStrictMin(bean.getIsStrictMin()); 1323 dt.setStrictMax(bean.getIsStrictMax()); 1324 } 1325 1326 protected void fillData(ListOfValuesBean bean, ListOfValues lov) { 1327 1328 fillCommonData(lov, bean); 1329 1330 if (bean.getValues() != null) { 1331 1332 ListOfValuesItemBean[] items = bean.getValues(); 1333 1334 for (int i = 0; i < items.length; i++) { 1335 1336 ListOfValuesItem lovi = new ListOfValuesItemImpl(); lovi.setLabel(items[i].getLabel()); 1338 lovi.setValue(items[i].getValue()); 1339 lov.addValue(lovi); 1340 } 1341 } 1342 } 1343 1344 protected void fillData(QueryBean bean, Query query) { 1345 1346 fillCommonData(query, bean); 1347 1348 String queryLanguage = bean.getLanguage(); 1349 if (queryLanguage == null) { queryLanguage = QueryBean.DEFAULT_LANGUAGE; 1351 } 1352 query.setLanguage(queryLanguage); 1353 query.setSql(bean.getSql()); 1354 } 1355 1356 protected void fillData(InputControlBean bean, InputControl ic) { 1357 1358 fillCommonData(ic, bean); 1359 1360 ic.setType(bean.getType()); 1361 ic.setMandatory(bean.getIsMandatory()); 1362 ic.setReadOnly(bean.getIsReadOnly()); 1363 1364 if (bean.getQueryVisibleColumns() != null) { 1365 String [] visCols = bean.getQueryVisibleColumns(); 1366 1367 for (int i = 0; i < visCols.length; i++) { ic.addQueryVisibleColumn(visCols[i]); 1369 } 1370 } 1371 1372 ic.setQueryValueColumn(bean.getQueryValueColumn()); 1373 ic.setDefaultValue(bean.getDefaultValue()); 1374 1375 if (bean.getDefaultValues() != null) { 1377 List defValsList = new ArrayList (); 1378 String [] defVals = bean.getDefaultValues(); 1379 1380 for (int i = 0; i < defVals.length; i++) { 1381 defValsList.add(defVals[i]); 1382 } 1383 ic.setDefaultValues(defValsList); 1384 } 1385 } 1386 1387 protected FileInputStream getBinaryData(String fullPath) { 1388 1389 FileInputStream input = null; 1390 1391 try { 1392 input = new FileInputStream (fullPath); 1393 1394 log.debug("file=" + fullPath + ", fileInputStream.available()=" + input.available()); 1395 1396 } catch (Exception e) { 1397 log.error("ERROR: caught exception opening file, file=" 1398 + fullPath + ", e=" + e.getMessage()); 1399 e.printStackTrace(); 1400 failed = true; 1401 } 1402 return input; 1403 } 1404 1405 1406 protected void loadCatalogFile() { 1407 1408 try { 1409 this.reader = new FileReader (new File (catalogPath, catalogFileName)); 1410 1411 } catch (Exception e) { 1412 log.error("ERROR: problem opening catalog file, e: " + e.getMessage()); 1413 e.printStackTrace(); 1414 failed = true; 1415 } 1416 } 1417 1418 1419 protected void buildParentFolder(Resource res, ResourceBean bean) { 1420 1421 1424 1425 if (bean.getUriString().equals("/") && bean.getParentFolder() == null) { 1426 1427 if (prependPath == null || prependPath.equals("")) { 1429 buildRepoFolderPath(context, bean.getUriString()); 1431 } else { 1432 1433 res.setName(prependPathNoSlash); res.setParentFolder("/"); 1435 } 1436 1437 } else { 1438 1439 1444 1445 if (bean.getParentFolder().equals("/") && usePrependPath) { 1446 1447 buildRepoFolderPath(context, prependPath); res.setParentFolder(prependPath); 1449 1450 } else { 1451 1452 buildRepoFolderPath(context, prependPath + bean.getParentFolder()); res.setParentFolder(prependPath + bean.getParentFolder()); 1454 } 1455 } 1456 } 1457 1458 1459 1463 protected String setPrependPath(String inPath) { 1464 1465 if (inPath.indexOf('/') != 0) { 1466 return PATH_SEP + inPath; 1467 } else { 1468 return inPath; 1469 } 1470 } 1471 1472 1473 1477 protected String setPrependPathNoSlash(String inPath) { 1478 1479 if (inPath.indexOf('/') != 0) { 1480 return inPath; 1481 } else { 1482 return inPath.substring(1); 1483 } 1484 } 1485 1486 1487 1497 private Folder buildRepoFolderPath(ExecutionContext context, String path) { 1498 1499 log.debug("buildRepoFolderPath: build path=" + path); 1501 1502 String [] splitPath = path.split(Folder.SEPARATOR); 1504 String folderName = ""; Folder parentFolder = null; Folder folder = repo.getFolder(context, folderName); 1507 1508 for (int i = 0; i < splitPath.length; i++) { 1509 if ("".equals(splitPath[i])) { 1511 continue; } 1514 1515 folderName += ("/" + splitPath[i]); 1516 parentFolder = folder; folder = repo.getFolder(context, folderName); 1518 if (folder == null) { 1519 folder = new FolderImpl(); 1520 folder.setName(splitPath[i]); 1521 folder.setLabel(splitPath[i]); 1522 folder.setDescription(splitPath[i] + " folder"); 1523 folder.setParentFolder(parentFolder); 1524 repo.saveFolder(context, folder); 1525 } 1526 } 1527 1528 return folder; 1529 } 1530 1531} 1532 | Popular Tags |