ReportObject.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. /**
  2. Licensed Materials - Property of IBM
  3. IBM Cognos Products: DOCS
  4. (C) Copyright IBM Corp. 2005, 2008
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with
  6. IBM Corp.
  7. */
  8. /**
  9. * ReportObject.java
  10. *
  11. * Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
  12. * Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
  13. *
  14. * This class contains methods for creating different types of reports.
  15. *
  16. */
  17. import java.io.ByteArrayInputStream;
  18. import java.io.InputStream;
  19. import java.util.Vector;
  20. import org.dom4j.Document;
  21. import org.dom4j.DocumentHelper;
  22. import org.dom4j.Element;
  23. import org.dom4j.io.SAXReader;
  24. import com.cognos.developer.schemas.bibus._3.AddOptions;
  25. import com.cognos.developer.schemas.bibus._3.AnyTypeProp;
  26. import com.cognos.developer.schemas.bibus._3.AsynchDetailReportMetadata;
  27. import com.cognos.developer.schemas.bibus._3.AsynchDetailReportOutput;
  28. import com.cognos.developer.schemas.bibus._3.AsynchOptionEnum;
  29. import com.cognos.developer.schemas.bibus._3.AsynchOptionInt;
  30. import com.cognos.developer.schemas.bibus._3.AsynchReply;
  31. import com.cognos.developer.schemas.bibus._3.AsynchReplyStatusEnum;
  32. import com.cognos.developer.schemas.bibus._3.AsynchRequest;
  33. import com.cognos.developer.schemas.bibus._3.BaseClass;
  34. import com.cognos.developer.schemas.bibus._3.FormFieldVar;
  35. import com.cognos.developer.schemas.bibus._3.FormatEnum;
  36. import com.cognos.developer.schemas.bibus._3.Option;
  37. import com.cognos.developer.schemas.bibus._3.ParameterValue;
  38. import com.cognos.developer.schemas.bibus._3.PropEnum;
  39. import com.cognos.developer.schemas.bibus._3.QueryOptions;
  40. import com.cognos.developer.schemas.bibus._3.Report;
  41. import com.cognos.developer.schemas.bibus._3.ReportServiceMetadataSpecification;
  42. import com.cognos.developer.schemas.bibus._3.RunOptionAnyURI;
  43. import com.cognos.developer.schemas.bibus._3.RunOptionBoolean;
  44. import com.cognos.developer.schemas.bibus._3.RunOptionEnum;
  45. import com.cognos.developer.schemas.bibus._3.RunOptionStringArray;
  46. import com.cognos.developer.schemas.bibus._3.SearchPathMultipleObject;
  47. import com.cognos.developer.schemas.bibus._3.SearchPathSingleObject;
  48. import com.cognos.developer.schemas.bibus._3.Sort;
  49. import com.cognos.developer.schemas.bibus._3.Specification;
  50. import com.cognos.developer.schemas.bibus._3.TokenProp;
  51. import com.cognos.developer.schemas.bibus._3.UpdateActionEnum;
  52. public class ReportObject
  53. {
  54. public API oAPI;
  55. private String sModel;
  56. public ReportObject(
  57. CRNConnect connection,
  58. String p_sModelConnectionName,
  59. String reportSpec)
  60. {
  61. if (p_sModelConnectionName != null)
  62. {
  63. sModel = p_sModelConnectionName;
  64. }
  65. if (reportSpec != null)
  66. {
  67. oAPI = new API(reportSpec);
  68. }
  69. }
  70. /**
  71. * This function returns a boolean that reflect the fact that this user's session is
  72. * ready to interface with the servers.
  73. */
  74. public boolean createReport(String p_sModelConnectionName)
  75. {
  76. sModel = p_sModelConnectionName;
  77. return createReport(sModel, true);
  78. }
  79. public void setModel(String p_sModelConnectionName)
  80. {
  81. sModel = p_sModelConnectionName;
  82. }
  83. public boolean createReport(String p_sModelConnectionName, boolean isList)
  84. {
  85. sModel = p_sModelConnectionName;
  86. try
  87. {
  88. oAPI = new API();
  89. oAPI.addModelPath(p_sModelConnectionName);
  90. oAPI.addQueries();
  91. oAPI.addQuery("Query1");
  92. oAPI.addLayouts();
  93. oAPI.addLayout();
  94. oAPI.addReportPages();
  95. oAPI.addPage("Page1");
  96. oAPI.addPageBody();
  97. oAPI.addPageBodyContents();
  98. if (isList)
  99. {
  100. oAPI.addList("Query1");
  101. oAPI.addCSS("border-collapse:collapse");
  102. oAPI.addListColumns();
  103. }
  104. else
  105. {
  106. return false;
  107. }
  108. }
  109. catch (Exception e)
  110. {
  111. e.printStackTrace();
  112. return false;
  113. }
  114. return true;
  115. }
  116. private void addDataItem(
  117. String p_sColumnTitle,
  118. String p_sExpression)
  119. {
  120. boolean bAggregate = false;
  121. oAPI.addDataItem(p_sColumnTitle, p_sExpression, bAggregate);
  122. }
  123. // sn_dg_prm_smpl_modifyreport_P3_start_0
  124. public void addColumn(
  125. String p_sColumnTitle,
  126. String p_sExpression,
  127. int position)
  128. {
  129. addDataItem(p_sColumnTitle, p_sExpression);
  130. oAPI.addListColumn(p_sColumnTitle, position);
  131. }
  132. // sn_dg_prm_smpl_modifyreport_P3_end_0
  133. public void addColumns(Vector columnsTitle, Vector columnExpression)
  134. {
  135. for (int i = 0; i < columnsTitle.size(); i++)
  136. {
  137. String sColumnTitle = (String)columnsTitle.elementAt(i);
  138. String sExpression = (String)columnExpression.elementAt(i);
  139. addDataItem(sColumnTitle, sExpression);
  140. oAPI.addListColumn(sColumnTitle, 0);
  141. }
  142. }
  143. public void modifyColumnTitles(
  144. Vector columnTitleToChange,
  145. Vector columnTitleNewName)
  146. {
  147. // modify any column names that were changed.
  148. for (int k = 0; k < columnTitleToChange.size(); k++)
  149. {
  150. modifyColumnTitle(
  151. (String)columnTitleToChange.elementAt(k),
  152. (String)columnTitleNewName.elementAt(k));
  153. }
  154. }
  155. public void modifyColumns(
  156. Vector originalColumnExpression,
  157. Vector originalColumns,
  158. Vector originalColumnTitle,
  159. Vector columnExpression,
  160. Vector columnsTitle)
  161. {
  162. // check to see which columns need to be removed from the report
  163. for (int i = 0; i < originalColumns.size(); i++)
  164. {
  165. String sOriginalColumnReference =
  166. (String)originalColumns.elementAt(i);
  167. String sOriginalColumnExpression =
  168. (String)originalColumnExpression.elementAt(i);
  169. String sOriginalColumnTitle =
  170. (String)originalColumnTitle.elementAt(i);
  171. boolean columnFound = false;
  172. for (int j = 0; j < columnExpression.size(); j++)
  173. {
  174. if (sOriginalColumnExpression
  175. .equals(columnExpression.elementAt(j)))
  176. {
  177. columnFound = true;
  178. break;
  179. }
  180. else
  181. {
  182. columnFound = false;
  183. }
  184. }
  185. if (columnFound == false) // we have a column to remove here.
  186. {
  187. System.out.println(
  188. "remove the column \"" + sOriginalColumnExpression + "\"");
  189. removeColumn(
  190. sOriginalColumnExpression,
  191. sOriginalColumnReference,
  192. sOriginalColumnTitle);
  193. }
  194. }
  195. // check to see which columns need to be added to the report
  196. for (int i = 0; i < columnExpression.size(); i++)
  197. {
  198. String sColumnExpression = (String)columnExpression.elementAt(i);
  199. String sColumnTitle = (String)columnsTitle.elementAt(i);
  200. boolean columnFound = false;
  201. for (int j = 0; j < originalColumnExpression.size(); j++)
  202. {
  203. if (sColumnExpression
  204. .equals(originalColumnExpression.elementAt(j)))
  205. {
  206. columnFound = true;
  207. break;
  208. }
  209. else
  210. {
  211. columnFound = false;
  212. }
  213. }
  214. if (columnFound == false)
  215. {
  216. // we have a column to add here.
  217. System.out.println("add the column = " + sColumnExpression);
  218. addColumn(sColumnTitle, sColumnExpression, 0);
  219. }
  220. }
  221. }
  222. public void modifyColumnTitle(String oldTitle, String newTitle)
  223. {
  224. oAPI.modifyTitle(oldTitle, newTitle);
  225. }
  226. public void removeColumn(
  227. String colExpression,
  228. String colRef,
  229. String colTitle)
  230. {
  231. oAPI.removeColumn(colRef, colExpression, colTitle);
  232. }
  233. public void addFilter(String filter)
  234. {
  235. oAPI.addFilterExpression(filter);
  236. }
  237. public void sortOn(String p_sColumns[], String p_sSorts[])
  238. {
  239. String sColumns[] = p_sColumns;
  240. String sSorts[] = p_sSorts;
  241. if (sColumns.length == 0)
  242. {
  243. return;
  244. }
  245. for (int i = 0; i < sColumns.length; i++)
  246. {
  247. oAPI.addDataItemSort(sColumns[i], sSorts[i]);
  248. }
  249. }
  250. public String getXML()
  251. {
  252. return oAPI.getXML();
  253. }
  254. public Document getMetadata(CRNConnect connection, String p_sModel)
  255. {
  256. Option[] options = new Option[2];
  257. AsynchOptionInt primaryThreshold = new AsynchOptionInt();
  258. AsynchOptionInt secondaryThreshold = new AsynchOptionInt();
  259. String sModel = p_sModel;
  260. String sXML =
  261. "<metadataRequest connection=\""
  262. + sModel
  263. + "\">"
  264. + "<Metadata Depth='' "
  265. + "no_collections='1'>"
  266. + "<Properties>"
  267. + "<Property name='*/@name'/>"
  268. + "<Property name='*/@datatype'/>"
  269. + "<Property name='*/@_path'/>"
  270. + "<Property name='*/@_ref'/>"
  271. + "<Property name='*/@usage'/>"
  272. + "<Property name='./folder'/>"
  273. + "<Property name='./querySubject'/>"
  274. + "<Property name='./queryItem'/>"
  275. + "</Properties>"
  276. + "</Metadata>"
  277. + "</metadataRequest>";
  278. primaryThreshold.setName(AsynchOptionEnum.primaryWaitThreshold);
  279. primaryThreshold.setValue(0);
  280. secondaryThreshold.setName(AsynchOptionEnum.secondaryWaitThreshold);
  281. secondaryThreshold.setValue(0);
  282. options[0] = primaryThreshold;
  283. options[1] = secondaryThreshold;
  284. Document oDom = null;
  285. try
  286. {
  287. boolean foundMetadata = false;
  288. AsynchReply runResponse;
  289. String sMetaData = "";
  290. ReportServiceMetadataSpecification metadataSpec = new ReportServiceMetadataSpecification();
  291. AsynchDetailReportMetadata reportMetadata = new AsynchDetailReportMetadata();
  292. metadataSpec.setValue(new Specification(sXML));
  293. //Since both primary and secondary wait thresholds are 0,
  294. //this request will not return until it is complete.
  295. // sn_dg_sdk_method_reportService_runSpecification_metadata_start_1
  296. runResponse = connection.getReportService().runSpecification(metadataSpec, new ParameterValue[] {}, options);
  297. for (int i = 0; i < runResponse.getDetails().length && !foundMetadata; i++)
  298. {
  299. if (runResponse.getDetails()[i] instanceof AsynchDetailReportMetadata)
  300. {
  301. foundMetadata = true;
  302. reportMetadata = (AsynchDetailReportMetadata) runResponse.getDetails()[i];
  303. sMetaData = reportMetadata.getMetadata().toString();
  304. }
  305. }
  306. // sn_dg_sdk_method_reportService_runSpecification_metadata_end_1
  307. // sn_dg_prm_smpl_modifyreport_P2_start_0
  308. //This strips out the leading XML declaration
  309. sMetaData = sMetaData.substring(sMetaData.indexOf("?>") + 2);
  310. SAXReader xmlReader = new SAXReader();
  311. ByteArrayInputStream bais =
  312. new ByteArrayInputStream(sMetaData.getBytes("UTF-8"));
  313. oDom = xmlReader.read((InputStream)bais);
  314. // sn_dg_prm_smpl_modifyreport_P2_end_0
  315. }
  316. catch (Exception e)
  317. {
  318. e.printStackTrace();
  319. }
  320. return oDom;
  321. }
  322. private static FormFieldVar[] makeFormFieldVars(String[] pairs)
  323. {
  324. Vector allffv = new Vector();
  325. for (int i = 0; i < pairs.length - 1; i++)
  326. {
  327. FormFieldVar ffv = new FormFieldVar();
  328. ffv.setName(pairs[i]);
  329. ffv.setValue(pairs[++i]);
  330. ffv.setFormat(FormatEnum.not_encrypted);
  331. allffv.add(ffv);
  332. }
  333. FormFieldVar[] ffv = new FormFieldVar[allffv.size()];
  334. allffv.copyInto(ffv);
  335. return ffv;
  336. }
  337. public String renderReport(CRNConnect connection, String reportSearchPath)
  338. {
  339. // Provide the appropriate run options
  340. // - do not save output
  341. // - request for XHTML output format
  342. // - request that the null.xsl be used to process the raw data
  343. AsynchReply rsr = null;
  344. RunOptionBoolean saveOutput = new RunOptionBoolean();
  345. saveOutput.setName(RunOptionEnum.saveOutput);
  346. saveOutput.setValue(false);
  347. RunOptionStringArray outputFormat = new RunOptionStringArray();
  348. outputFormat.setName(RunOptionEnum.outputFormat);
  349. outputFormat.setValue(new String[] { "XHTML" });
  350. RunOptionAnyURI xslURL = new RunOptionAnyURI();
  351. xslURL.setName(RunOptionEnum.xslURL);
  352. xslURL.setValue("null.xsl");
  353. try
  354. {
  355. SearchPathSingleObject reportPath =
  356. new SearchPathSingleObject(reportSearchPath);
  357. rsr = connection.getReportService().run(
  358. reportPath,
  359. new ParameterValue[] {},
  360. new Option[] { saveOutput, outputFormat, xslURL });
  361. AsynchRequest rsq = null;
  362. while ( (rsr.getStatus() != AsynchReplyStatusEnum.complete)
  363. && (rsr.getStatus() != AsynchReplyStatusEnum.conversationComplete) )
  364. {
  365. rsq = rsr.getPrimaryRequest();
  366. rsr = connection.getReportService().wait(rsq, new ParameterValue[] {}, new Option[] {});
  367. }
  368. AsynchDetailReportOutput reportOutput = null;
  369. for (int i = 0; i < rsr.getDetails().length; i++)
  370. {
  371. if ( AsynchDetailReportOutput.class.isInstance(rsr.getDetails()[i]) )
  372. {
  373. reportOutput = (AsynchDetailReportOutput) rsr.getDetails()[i];
  374. }
  375. }
  376. return reportOutput.getOutputPages()[0];
  377. }
  378. catch (Exception e)
  379. {
  380. e.printStackTrace();
  381. System.out.println("Error during report execution");
  382. return null;
  383. }
  384. }
  385. public void updateReportNS()
  386. {
  387. // add the xmlns back into the modified report spec
  388. oAPI.updateXMLNS();
  389. }
  390. public Vector getColumnNames()
  391. {
  392. Vector items = oAPI.getDataItemReferences();
  393. return items;
  394. }
  395. public Vector getColumnExpressions()
  396. {
  397. Vector items = oAPI.getDataItemExpressions();
  398. return items;
  399. }
  400. public Vector getColumnTitles()
  401. {
  402. Vector items = oAPI.getColumnTitles();
  403. return items;
  404. }
  405. public boolean saveReport(CRNConnect connection, BaseClass parent, String reportName)
  406. {
  407. // sn_dg_prm_smpl_modifyreport_P4_start_0
  408. Report rpt = new Report();
  409. AddOptions addOpts = new AddOptions();
  410. TokenProp rptDefaultName = new TokenProp();
  411. AnyTypeProp ap = new AnyTypeProp();
  412. rptDefaultName.setValue(reportName);
  413. String reportXML = getXML();
  414. int iStartReport = reportXML.indexOf("<report");
  415. String reportOut = reportXML.substring(iStartReport);
  416. ap.setValue(reportOut);
  417. rpt.setDefaultName(rptDefaultName);
  418. rpt.setSpecification(ap);
  419. addOpts.setUpdateAction(UpdateActionEnum.replace);
  420. String parentPath = parent.getSearchPath().getValue();
  421. try
  422. {
  423. connection.getReportService().add(new SearchPathSingleObject(parentPath), rpt, addOpts);
  424. }
  425. // sn_dg_prm_smpl_modifyreport_P4_end_0
  426. catch (Exception e)
  427. {
  428. System.out.println("error during save " + e);
  429. return false;
  430. }
  431. return true;
  432. }
  433. public boolean updateReport(CRNConnect connection, String parentSearchPath, String p_sName)
  434. {
  435. String sName = p_sName;
  436. Report rpt = new Report();
  437. AddOptions opt = new AddOptions();
  438. TokenProp sp = new TokenProp();
  439. AnyTypeProp ap = new AnyTypeProp();
  440. sp.setValue(sName);
  441. String reportXML = getXML();
  442. int iStartReport = reportXML.indexOf("<report");
  443. String reportOut = reportXML.substring(iStartReport);
  444. ap.setValue(reportOut);
  445. rpt.setDefaultName(sp);
  446. rpt.setSpecification(ap);
  447. opt.setUpdateAction(UpdateActionEnum.replace);
  448. try
  449. {
  450. connection.getReportService().add(new SearchPathSingleObject(parentSearchPath), rpt, opt);
  451. }
  452. catch (Exception e)
  453. {
  454. System.out.println("error during update " + e);
  455. }
  456. return true;
  457. }
  458. public Document getPackages(CRNConnect connection, String sPath)
  459. {
  460. Document oDom = null;
  461. Element packagesElement;
  462. try
  463. {
  464. com.cognos.developer.schemas.bibus._3.BaseClass oBase[];
  465. oBase =
  466. connection.getCMService().query(
  467. new SearchPathMultipleObject(sPath),
  468. new PropEnum[] {
  469. PropEnum.defaultName,
  470. PropEnum.source,
  471. PropEnum.dispatcherPath,
  472. PropEnum.searchPath },
  473. new Sort[] {},
  474. new QueryOptions());
  475. packagesElement = DocumentHelper.createElement("packages");
  476. oDom = DocumentHelper.createDocument(packagesElement);
  477. for (int i = 0; i < oBase.length; i++)
  478. {
  479. if (oBase[i]
  480. .getClass()
  481. .getName()
  482. .toString()
  483. .equals("com.cognos.developer.schemas.bibus._3._package"))
  484. {
  485. Element oElement = DocumentHelper.createElement("package");
  486. String oBaseName = oBase[i].getDefaultName().getValue();
  487. String oBaseSearchPath =
  488. oBase[i].getSearchPath().getValue();
  489. oElement.addElement("name").setText(oBaseName);
  490. oElement.addElement("searchPath").setText(oBaseSearchPath);
  491. oDom.getRootElement().add(oElement);
  492. }
  493. }
  494. }
  495. catch (Exception e)
  496. {
  497. e.printStackTrace();
  498. }
  499. return oDom;
  500. }
  501. }