2 * ============LICENSE_START==========================================
4 * ===================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * ===================================================================
8 * Unless otherwise specified, all software contained herein is licensed
9 * under the Apache License, Version 2.0 (the "License");
10 * you may not use this software except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
21 * Unless otherwise specified, all documentation contained herein is licensed
22 * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
23 * you may not use this documentation except in compliance with the License.
24 * You may obtain a copy of the License at
26 * https://creativecommons.org/licenses/by/4.0/
28 * Unless required by applicable law or agreed to in writing, documentation
29 * distributed under the License is distributed on an "AS IS" BASIS,
30 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31 * See the License for the specific language governing permissions and
32 * limitations under the License.
34 * ============LICENSE_END============================================
38 package org.onap.portalsdk.analytics.model.definition;
40 import java.io.Serializable;
41 import java.sql.Connection;
42 import java.util.Calendar;
43 import java.util.Collections;
44 import java.util.Iterator;
45 import java.util.List;
46 import java.util.StringTokenizer;
47 import java.util.Vector;
48 import java.util.regex.Matcher;
49 import java.util.regex.Pattern;
51 import javax.servlet.http.HttpServletRequest;
52 import javax.xml.bind.JAXBException;
53 import javax.xml.datatype.DatatypeConfigurationException;
54 import javax.xml.datatype.DatatypeFactory;
56 import org.onap.portalsdk.analytics.controller.WizardSequence;
57 import org.onap.portalsdk.analytics.controller.WizardSequenceCrossTab;
58 import org.onap.portalsdk.analytics.controller.WizardSequenceDashboard;
59 import org.onap.portalsdk.analytics.controller.WizardSequenceLinear;
60 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedCrossTab;
61 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedHive;
62 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedLinear;
63 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedLinearDatamining;
64 import org.onap.portalsdk.analytics.error.RaptorException;
65 import org.onap.portalsdk.analytics.model.DataCache;
66 import org.onap.portalsdk.analytics.model.ReportLoader;
67 import org.onap.portalsdk.analytics.model.base.OrderBySeqComparator;
68 import org.onap.portalsdk.analytics.model.base.OrderSeqComparator;
69 import org.onap.portalsdk.analytics.model.base.ReportWrapper;
70 import org.onap.portalsdk.analytics.model.runtime.FormField;
71 import org.onap.portalsdk.analytics.system.AppUtils;
72 import org.onap.portalsdk.analytics.system.DbUtils;
73 import org.onap.portalsdk.analytics.system.Globals;
74 import org.onap.portalsdk.analytics.util.AppConstants;
75 import org.onap.portalsdk.analytics.util.DataSet;
76 import org.onap.portalsdk.analytics.util.Utils;
77 import org.onap.portalsdk.analytics.xmlobj.ChartAdditionalOptions;
78 import org.onap.portalsdk.analytics.xmlobj.ChartDrillOptions;
79 import org.onap.portalsdk.analytics.xmlobj.ColFilterType;
80 import org.onap.portalsdk.analytics.xmlobj.CustomReportType;
81 import org.onap.portalsdk.analytics.xmlobj.DataColumnList;
82 import org.onap.portalsdk.analytics.xmlobj.DataColumnType;
83 import org.onap.portalsdk.analytics.xmlobj.DataSourceType;
84 import org.onap.portalsdk.analytics.xmlobj.DataminingOptions;
85 import org.onap.portalsdk.analytics.xmlobj.FormFieldList;
86 import org.onap.portalsdk.analytics.xmlobj.FormFieldType;
87 import org.onap.portalsdk.analytics.xmlobj.FormatList;
88 import org.onap.portalsdk.analytics.xmlobj.FormatType;
89 import org.onap.portalsdk.analytics.xmlobj.JavascriptItemType;
90 import org.onap.portalsdk.analytics.xmlobj.ObjectFactory;
91 import org.onap.portalsdk.analytics.xmlobj.PredefinedValueList;
92 import org.onap.portalsdk.analytics.xmlobj.SemaphoreType;
93 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
96 * This class is part of <B><I>RAPTOR (Rapid Application Programming Tool for OLAP Reporting)</I></B><BR/>
99 * --------------------------------------------------------------------------------------------------<BR/>
100 * <B>ReportDefinition.java</B> - This involves in creating and modifying RAPTOR reports.
101 * --------------------------------------------------------------------------------------------------<BR/>
104 * <U>Change Log</U><BR/><BR/>
106 * 18-Aug-2009 : Version 8.5.1 (Sundar);<UL><LI> request Object is passed to prevent caching user/roles - Datamining/Hosting. </LI></UL>
107 * 27-Jul-2009 : Version 8.4 (Sundar); <UL><LI>userIsAuthorizedToSeeLog is checked for Admin User instead of Super User.</LI></UL>
108 * 22-Jun-2009 : Version 8.4 (Sundar); <UL><LI>A new type ChartAdditionalOptions is introduced in RAPTOR XSD.
109 * For this type a create procedure is added to this class.</LI></UL>
113 public class ReportDefinition extends ReportWrapper implements Serializable {
115 private static transient final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ReportDefinition.class);
117 private ReportSchedule reportSchedule = null;
119 private WizardSequence wizardSequence = null;
122 private boolean reportUpdateLogged = false; // Used to avoid multiple
123 // entries in the report log
124 // when persisting report on
127 private ReportDefinition(CustomReportType crType, String reportID, String ownerID,
128 String createID, String createDate, String updateID, String updateDate,
129 String menuID, boolean menuApproved, HttpServletRequest request) throws RaptorException {
130 super(crType, reportID, ownerID, createID, createDate, updateID, updateDate, menuID,
132 if("-1".equals(reportID))
133 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), false, request);
135 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), true, request);
136 generateWizardSequence(null);
137 } // ReportDefinition
139 public ReportDefinition(ReportWrapper rw, HttpServletRequest request)throws RaptorException {
142 reportSchedule = new ReportSchedule(reportID, rw.getOwnerID(),false, request);
143 generateWizardSequence(null);
144 } // ReportDefinition
146 private void setReportID(String reportID) {
147 this.reportID = reportID;
148 reportSchedule.setReportID(reportID);
149 reportSchedule.setScheduleUserID(getOwnerID());
152 public ReportSchedule getReportSchedule() {
153 return reportSchedule;
156 public static ReportDefinition unmarshal(String reportXML, String reportID, HttpServletRequest request)
157 throws RaptorException {
158 ReportDefinition rn = null;
159 CustomReportType crType = ReportWrapper.unmarshalCR(reportXML);
161 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] Report [" + reportID + "]: XML unmarshalled"));
163 rn = new ReportDefinition(crType, reportID, null, null, null, null, null, null, false, request);
167 public static ReportDefinition createBlank(HttpServletRequest request) throws RaptorException {
168 String curTime = Utils.getCurrentDateTime();
169 String userID = AppUtils.getUserID(request);
170 return new ReportDefinition(ReportWrapper.createBlankCR(userID), "-1",
171 userID, userID, curTime, userID, curTime, "", false, request);
172 } // ReportDefinition
174 public void setAsCopy(HttpServletRequest request) throws RaptorException {
175 verifySQLBasedReportAccess(request);
177 replaceCustomReportWithClone();
180 setReportName("Copy: " + getReportName());
183 public WizardSequence getWizardSequence() {
184 return wizardSequence;
185 } // getWizardSequence
187 public void generateWizardSequence(HttpServletRequest request) throws RaptorException {
188 boolean userIsAuthorizedToSeeLog = false;
189 String userId = null;
191 userId = AppUtils.getUserID(request);
193 userIsAuthorizedToSeeLog = AppUtils.isAdminUser(request);
195 if (getReportType().equals(AppConstants.RT_LINEAR)){
196 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
197 wizardSequence = new WizardSequenceSQLBasedLinear(userIsAuthorizedToSeeLog);
198 else if (getReportDefType().equals(AppConstants.RD_SQL_BASED_DATAMIN))
199 wizardSequence = new WizardSequenceSQLBasedLinearDatamining(userIsAuthorizedToSeeLog);
201 wizardSequence = new WizardSequenceLinear(userIsAuthorizedToSeeLog);
202 } else if (getReportType().equals(AppConstants.RT_CROSSTAB)) {
203 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
204 wizardSequence = new WizardSequenceSQLBasedCrossTab(userIsAuthorizedToSeeLog);
206 wizardSequence = new WizardSequenceCrossTab(userIsAuthorizedToSeeLog);
207 } else if (getReportType().equals(AppConstants.RT_DASHBOARD)) {
208 wizardSequence = new WizardSequenceDashboard(userIsAuthorizedToSeeLog);
209 } else if (getReportType().equals(AppConstants.RT_HIVE)) {
210 wizardSequence = new WizardSequenceSQLBasedHive(userIsAuthorizedToSeeLog);
212 wizardSequence = new WizardSequence();
213 } // generateWizardSequence
215 private boolean canPersistDashboard() {
217 return nvl(getDashboardLayoutHTML()).length() > 0;
218 } //canPersistDashboard
220 private boolean canPersistLinearReport() {
221 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& canPersistLinearReport");
222 boolean visibleColExist = false;
224 if (!getDataSourceList().getDataSource().isEmpty()) {
225 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
226 DataColumnType dct = (DataColumnType) iter.next();
228 if (dct.isVisible()) {
229 visibleColExist = true;
235 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& visibleColExist " + visibleColExist);
236 return visibleColExist;
237 } // canPersistLinearReport
239 private boolean canPersistCrossTabReport() {
240 boolean rowColExist = false;
241 boolean colColExist = false;
242 boolean valColExist = false;
244 if (!getDataSourceList().getDataSource().isEmpty()) {
245 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
246 DataColumnType dct = (DataColumnType) iter.next();
248 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_ROW))
250 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_COLUMN))
252 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_VALUE))
257 return rowColExist && colColExist && valColExist;
258 } // canPersistCrossTabReport
260 private boolean canPersistReport() {
261 return getReportType().equals(AppConstants.RT_CROSSTAB) ? canPersistCrossTabReport()
262 : (getReportType().equals(AppConstants.RT_LINEAR)? canPersistLinearReport()
263 :(getReportType().equals(AppConstants.RT_HIVE)? canPersistLinearReport()
264 :canPersistDashboard()));
265 } // canPersistReport
267 public void persistReport(HttpServletRequest request) throws RaptorException {
268 if (!canPersistReport()) {
269 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& In !canPersistReport ReportType: " + getReportType());
272 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& Not In !canPersistReport");
275 Connection connection = null;
277 String userID = AppUtils.getUserID(request);
278 String reportXML = marshal();
279 logger.debug(EELFLoggerDelegate.debugLogger, ("Ocurring during Schedule "));
280 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& Report ID " + reportID);
281 if ("-1".equals(nvl(reportID, "-1"))) {
282 connection = DbUtils.startTransaction();
285 if (nvl(Globals.getAdhocReportSequence()).length()> 0 && nvl(Globals.getAdhocUserRoldId()).length() > 0 && AppUtils.isUserInRole(request, Globals.getAdhocUserRoldId()) && !AppUtils.isAdminUser(request)) {
286 sql = Globals.getPersistReportAdhoc();
287 sql = sql.replace("[Globals.getAdhocReportSequence()]", Globals.getAdhocReportSequence());
290 sql = Globals.getNewReportData();
292 DataSet ds = DbUtils.executeQuery(connection,sql);
293 setReportID(ds.getString(0, 0));
295 reportSecurity.reportCreate(reportID, userID, isPublic());
296 ReportLoader.createCustomReportRec(connection, this, reportXML);
297 ReportLoader.createReportLogEntry(connection, reportID, userID,
298 AppConstants.RLA_CREATE, "", "");
299 reportUpdateLogged = true;
300 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB insert report " + reportID + " succesfull"));
303 verifySQLBasedReportAccess(request);
304 reportSecurity.reportUpdate(request);
305 connection = DbUtils.startTransaction();
306 ReportLoader.updateCustomReportRec(connection, this, reportXML);
307 if (!reportUpdateLogged) {
308 ReportLoader.createReportLogEntry(connection, reportID, userID,
309 AppConstants.RLA_UPDATE,"","");
310 reportUpdateLogged = true;
312 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB update report " + reportID + " succesfull"));
315 getReportSchedule().persistScheduleData(connection, request);
317 DbUtils.commitTransaction(connection);
318 } catch (RaptorException e) {
320 DbUtils.rollbackTransaction(connection);
323 DbUtils.clearConnection(connection);
327 public String getCrossTabDisplayValue(String crossTabValue) {
328 return nvl(crossTabValue).equals(AppConstants.CV_ROW) ? "Row headings" : (nvl(
329 crossTabValue).equals(AppConstants.CV_COLUMN) ? "Column headings" : (nvl(
330 crossTabValue).equals(AppConstants.CV_VALUE) ? "Report values" : "Invisible/Filter"));
331 } // getCrossTabDisplayValue
333 public String getCrossTabDisplayValue(DataColumnType dct) {
334 return getCrossTabDisplayValue(dct.getCrossTabValue());
335 } // getCrossTabDisplayValue
337 public String getColumnLabel(DataColumnType dct) throws Exception {
338 String tableName = getTableById(dct.getTableId()).getTableName();
339 Vector dbColumns = null;
340 dbColumns = DataCache.getReportTableDbColumns(tableName, cr.getDbInfo());
341 if (dbColumns != null)
342 for (int i = 0; i < dbColumns.size(); i++) {
343 DBColumnInfo dbCol = (DBColumnInfo) dbColumns.get(i);
344 if (dct.getDbColName().equals(dbCol.getColName()))
345 return dbCol.getLabel();
349 } // getCrossTabDisplayValue
351 public String getFilterLabel(ColFilterType cft) {
352 StringBuffer fLabel = new StringBuffer();
354 fLabel.append(cft.getExpression());
356 if (cft.getArgType() != null)
357 if (cft.getArgType().equals(AppConstants.AT_FORMULA)) {
358 fLabel.append("[" + cft.getArgValue() + "]");
359 } else if (cft.getArgType().equals(AppConstants.AT_VALUE)) {
360 fLabel.append(cft.getArgValue());
361 } else if (cft.getArgType().equals(AppConstants.AT_LIST)) {
362 fLabel.append("(" + cft.getArgValue() + ")");
363 } else if (cft.getArgType().equals(AppConstants.AT_COLUMN)) {
364 DataColumnType dctFilter = getColumnById(cft.getArgValue());
365 fLabel.append("[" + dctFilter.getDisplayName() + "]");
366 } else if (cft.getArgType().equals(AppConstants.AT_FORM)) {
367 fLabel.append("[Form Field]");
370 return fLabel.toString();
373 public Vector getReportUsers(HttpServletRequest request) throws RaptorException {
374 return reportSecurity.getReportUsers(request);
377 public Vector getReportRoles(HttpServletRequest request) throws RaptorException {
378 return reportSecurity.getReportRoles(request);
381 /** ************************************************************************************************* */
383 public void clearAllDrillDowns() {
384 List reportCols = getAllColumns();
385 for (int i = 0; i < reportCols.size(); i++) {
386 DataColumnType dct = (DataColumnType) reportCols.get(i);
387 dct.setDrillDownURL(null);
388 dct.setDrillDownParams(null);
389 dct.setDrillDownType(null);
391 } // clearAllDrillDowns
393 public void setOuterJoin(DataSourceType curTable, String joinType) {
394 String refDefinition = nvl(curTable.getRefDefinition());
395 int outerJoinIdx = refDefinition.indexOf(" (+)");
396 if (outerJoinIdx >= 0)
397 // Clear existing outer join
398 if (outerJoinIdx == (refDefinition.length() - 4))
399 refDefinition = refDefinition.substring(0, outerJoinIdx);
401 refDefinition = refDefinition.substring(0, outerJoinIdx)
402 + refDefinition.substring(outerJoinIdx + 4);
404 int equalSignIdx = refDefinition.indexOf("=");
405 if (equalSignIdx < 0)
406 // Ref. definition not present
409 if (refDefinition.indexOf(curTable.getTableId()) < equalSignIdx) {
410 // Cur. table is on the left side
411 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
412 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
413 + refDefinition.substring(equalSignIdx);
414 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
415 refDefinition = refDefinition + " (+)";
417 // Joined table is on the left side
418 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
419 refDefinition = refDefinition + " (+)";
420 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
421 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
422 + refDefinition.substring(equalSignIdx);
425 curTable.setRefDefinition(refDefinition);
428 public void addDataSourceType(ObjectFactory objFactory, String tableId, String tableName,
429 String tablePK, String displayName, String refTableId, String refDefinition,
430 String comment) throws RaptorException {
431 DataSourceType dst = objFactory.createDataSourceType();
433 dst.setTableId(tableId);
434 dst.setTableName(tableName);
435 dst.setTablePK(tablePK);
436 dst.setDisplayName(displayName);
437 if (nvl(refTableId).length() > 0)
438 dst.setRefTableId(refTableId);
439 if (nvl(refDefinition).length() > 0)
440 dst.setRefDefinition(refDefinition);
441 if (nvl(comment).length() > 0)
442 dst.setComment(comment);
444 DataColumnList dataColumnList = objFactory.createDataColumnList();
445 dst.setDataColumnList(dataColumnList);
447 getDataSourceList().getDataSource().add(dst);
450 } // addDataSourceType
452 public void deleteDataSourceType(String tableId) {
453 super.deleteDataSourceType(tableId);
454 } // deleteDataSourceType
456 public String getUniqueColumnId(String colName) {
459 int colIdN = getAllColumns().size() + 1;
461 colId = colName.substring(0, 2).toLowerCase() + (colIdN++);
462 } while (getColumnById(colId) != null);
465 } // getUniqueColumnId
467 public DataColumnType addDataColumnType(ObjectFactory objFactory, String colId,
468 String tableId, // Table to which the new column belongs
469 String dbColName, String crossTabValue, String colName, String displayName,
470 int displayWidth, String displayAlignment, int orderSeq, boolean visible,
471 boolean calculated, String colType, String colFormat, boolean groupBreak,
472 int orderBySeq, String orderByAscDesc, String displayTotal, String colOnChart,
473 int chartSeq, String drillDownType, String drillDownURL, String drillDownParams,
474 String semaphoreId, String comment) throws RaptorException {
475 DataColumnType dct = null;
476 dct = objFactory.createDataColumnType();
479 dct.setTableId(tableId);
480 dct.setDbColName(dbColName);
481 if (nvl(crossTabValue).length() > 0)
482 dct.setCrossTabValue(crossTabValue);
483 dct.setColName(colName);
484 dct.setDisplayName(displayName);
485 if (displayWidth > 0)
486 dct.setDisplayWidth(displayWidth);
487 if (nvl(displayAlignment).length() > 0)
488 dct.setDisplayAlignment(displayAlignment);
490 dct.setOrderSeq(orderSeq);
492 dct.setOrderSeq(getAllColumns().size() + 1);
493 dct.setVisible(visible);
494 dct.setCalculated(calculated);
495 // dct.setColType(colType);
496 if (nvl(colFormat).length() > 0)
497 dct.setColFormat(colFormat);
498 dct.setGroupBreak(groupBreak);
500 dct.setOrderBySeq(orderBySeq);
501 if (nvl(orderByAscDesc).length() > 0)
502 dct.setOrderByAscDesc(orderByAscDesc);
503 if (nvl(displayTotal).length() > 0)
504 dct.setDisplayTotal(displayTotal);
505 if (nvl(colOnChart).length() > 0)
506 dct.setColOnChart(colOnChart);
508 dct.setChartSeq(chartSeq);
509 if (nvl(drillDownType).length() > 0)
510 dct.setDrillDownType(drillDownType);
511 if (nvl(drillDownURL).length() > 0)
512 dct.setDrillDownURL(drillDownURL);
513 if (nvl(drillDownParams).length() > 0)
514 dct.setDrillDownParams(drillDownParams);
515 if (nvl(semaphoreId).length() > 0)
516 dct.setSemaphoreId(semaphoreId);
517 if (nvl(comment).length() > 0)
518 dct.setComment(comment);
520 dct.setDbColType(colType);
521 adjustColumnType(dct);
523 // ColFilterList colFilterList = objFactory.createColFilterList();
524 // dct.setColFilterList(colFilterList);
526 getTableById(tableId).getDataColumnList().getDataColumn().add(dct);
531 } // addDataColumnType
533 public void deleteDataColumnType(String colId) {
534 int colOrder = getColumnById(colId).getOrderSeq();
536 List dcList = getColumnTableById(colId).getDataColumnList().getDataColumn();
537 for (Iterator iterC = dcList.iterator(); iterC.hasNext();) {
538 DataColumnType dct = (DataColumnType) iterC.next();
540 if (dct.getColId().equals(colId) && dct.getOrderSeq() == colOrder)
542 else if (dct.getOrderSeq() > colOrder)
543 dct.setOrderSeq(dct.getOrderSeq() - 1);
546 if (getFormFieldList() != null)
547 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
548 FormFieldType fft = (FormFieldType) iter.next();
549 if (nvl(fft.getColId()).equals(colId)) {
551 fft.setFieldType(FormField.FFT_TEXT);
552 if (nvl(fft.getDefaultValue()).equals(AppConstants.FILTER_MAX_VALUE)
553 || nvl(fft.getDefaultValue())
554 .equals(AppConstants.FILTER_MIN_VALUE))
555 fft.setDefaultValue("");
560 resetColumnOrderValues();
561 } // deleteDataColumnType
563 public void shiftColumnOrderUp(String colId) {
564 List reportCols = getAllColumns();
565 for (int i = 0; i < reportCols.size(); i++) {
566 DataColumnType dct = (DataColumnType) reportCols.get(i);
568 if (dct.getColId().equals(colId) && (i > 0)) {
569 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
570 dctUp.setOrderSeq(dctUp.getOrderSeq() + 1);
571 dct.setOrderSeq(dct.getOrderSeq() - 1);
576 Collections.sort(reportCols, new OrderSeqComparator());
578 resetColumnOrderValues();
579 } // shiftColumnOrderUp
581 public void shiftColumnOrderDown(String colId) {
582 List reportCols = getAllColumns();
583 for (int i = 0; i < reportCols.size(); i++) {
584 DataColumnType dct = (DataColumnType) reportCols.get(i);
586 if (dct.getColId().equals(colId) && (i < reportCols.size() - 1)) {
587 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
588 dctDown.setOrderSeq(dctDown.getOrderSeq() - 1);
589 dct.setOrderSeq(dct.getOrderSeq() + 1);
594 Collections.sort(reportCols, new OrderSeqComparator());
596 resetColumnOrderValues();
597 } // shiftColumnOrderDown
599 public void resetColumnOrderValues() {
600 List reportCols = getAllColumns();
603 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
604 DataColumnType dct = (DataColumnType) iter.next();
605 dct.setOrderSeq(++colOrder);
608 Collections.sort(reportCols, new OrderSeqComparator());
609 } // resetColumnOrderValues
611 public void addColFilterType(ObjectFactory objFactory, String colId, // Column
618 String joinCondition, String openBrackets, String expression, String argType,
619 String argValue, String closeBrackets, String comment) throws RaptorException {
620 ColFilterType cft = objFactory.createColFilterType();
623 cft.setJoinCondition(nvl(joinCondition, "AND"));
624 if (nvl(openBrackets).length() > 0)
625 cft.setOpenBrackets(openBrackets);
626 cft.setExpression(expression);
627 if (nvl(argType).length() > 0)
628 cft.setArgType(argType);
629 if (nvl(argValue).length() > 0)
630 cft.setArgValue(argValue);
631 if (nvl(closeBrackets).length() > 0)
632 cft.setCloseBrackets(closeBrackets);
633 if (nvl(comment).length() > 0)
634 cft.setComment(comment);
636 DataColumnType dct = getColumnById(colId);
638 if (dct.getColFilterList() == null)
639 dct.setColFilterList(objFactory.createColFilterList());
641 cft.setFilterSeq(dct.getColFilterList().getColFilter().size());
642 dct.getColFilterList().getColFilter().add(cft);
646 } // addColFilterType
648 public void removeColumnFilter(String colId, int filterPos) {
649 DataColumnType dct = getColumnById(colId);
651 if (dct.getColFilterList() != null)
653 dct.getColFilterList().getColFilter().remove(filterPos);
654 } catch (IndexOutOfBoundsException e) {
658 } // removeColumnFilter
660 public void addColumnSort(String colId, String ascDesc) {
661 addColumnSort(colId, ascDesc, -1);
664 public void addColumnSort(String colId, String ascDesc, int sortOrder) {
665 if (sortOrder <= 0) {
667 List reportCols = getAllColumns();
668 for (Iterator iter = reportCols.iterator(); iter.hasNext();)
669 if (((DataColumnType) iter.next()).getOrderBySeq() > 0)
673 DataColumnType dct = getColumnById(colId);
674 dct.setOrderBySeq(sortOrder);
675 dct.setOrderByAscDesc(ascDesc);
680 public void removeColumnSort(String colId) {
681 DataColumnType dct = getColumnById(colId);
682 int sortOrder = dct.getOrderBySeq();
684 dct.setOrderBySeq(0);
685 dct.setOrderByAscDesc(null);
688 List reportCols = getAllColumns();
689 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
690 DataColumnType dct2 = (DataColumnType) iter.next();
692 if (dct2.getOrderBySeq() > sortOrder)
693 dct2.setOrderBySeq(dct2.getOrderBySeq() - 1);
698 } // removeColumnSort
700 public void shiftColumnSortUp(String colId) {
701 List reportCols = getAllColumns();
702 Collections.sort(reportCols, new OrderBySeqComparator());
704 for (int i = 0; i < reportCols.size(); i++) {
705 DataColumnType dct = (DataColumnType) reportCols.get(i);
707 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
708 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
709 if (dctUp.getOrderBySeq() > 0)
710 dctUp.setOrderBySeq(dctUp.getOrderBySeq() + 1);
711 dct.setOrderBySeq(dct.getOrderBySeq() - 1);
716 Collections.sort(reportCols, new OrderSeqComparator());
718 } // shiftColumnSortUp
720 public void shiftColumnSortDown(String colId) {
721 List reportCols = getAllColumns();
722 Collections.sort(reportCols, new OrderBySeqComparator());
724 for (int i = 0; i < reportCols.size(); i++) {
725 DataColumnType dct = (DataColumnType) reportCols.get(i);
727 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
728 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
729 if (dctDown.getOrderBySeq() > 0)
730 dctDown.setOrderBySeq(dctDown.getOrderBySeq() - 1);
731 dct.setOrderBySeq(dct.getOrderBySeq() + 1);
736 Collections.sort(reportCols, new OrderSeqComparator());
738 } // shiftColumnSortDown
740 /** ************************************************************************************************* */
742 public String generateNewSemaphoreId() {
743 if (getSemaphoreList() == null)
746 String semaphoreId = null;
747 boolean idExists = true;
748 for (int i = 1; idExists; i++) {
749 semaphoreId = "sem" + i;
751 for (Iterator iter = getSemaphoreList().getSemaphore().iterator(); iter.hasNext();)
752 if (semaphoreId.equals(((SemaphoreType) iter.next()).getSemaphoreId())) {
759 } // generateNewSemaphoreId
761 public SemaphoreType addSemaphore(ObjectFactory objFactory, SemaphoreType semaphoreType)
762 throws RaptorException {
763 SemaphoreType sem = null;
765 if (getSemaphoreList() == null)
766 setSemaphoreList(objFactory.createSemaphoreList());
768 String semaphoreName = null;
769 boolean nameExists = true;
770 for (int i = 1; nameExists; i++) {
771 semaphoreName = semaphoreType.getSemaphoreName() + ((i > 1) ? (" v" + i) : "");
773 for (Iterator iter2 = getSemaphoreList().getSemaphore().iterator(); iter2
775 if (semaphoreName.equals(((SemaphoreType) iter2.next()).getSemaphoreName())) {
781 sem = cloneSemaphoreType(objFactory, semaphoreType);
782 getSemaphoreList().getSemaphore().add(sem);
784 sem.setSemaphoreId(generateNewSemaphoreId());
785 sem.setSemaphoreName(semaphoreName);
786 } catch (JAXBException ex) {
787 throw new RaptorException(ex.getMessage(), ex.getCause());
793 public SemaphoreType addSemaphoreType(ObjectFactory objFactory, String semaphoreName,
794 String semaphoreType, String comment) throws RaptorException {
795 SemaphoreType sem = null;
796 if (getSemaphoreList() == null)
797 setSemaphoreList(objFactory.createSemaphoreList());
799 sem = objFactory.createSemaphoreType();
800 getSemaphoreList().getSemaphore().add(sem);
802 sem.setSemaphoreId(generateNewSemaphoreId());
803 sem.setSemaphoreName(semaphoreName);
804 sem.setSemaphoreType(nvl(semaphoreType));
805 if (nvl(comment).length() > 0)
806 sem.setComment(comment);
808 FormatList formatList = objFactory.createFormatList();
809 sem.setFormatList(formatList);
811 } // addSemaphoreType
814 public String getNextIdForJavaScriptElement (ObjectFactory objFactory, String fieldId) throws RaptorException {
816 JavascriptItemType jit = null;
818 if (getJavascriptList() == null) {
819 setJavascriptList(objFactory.createJavascriptList());
820 return fieldId + "|1";
822 if(getJavascriptList().getJavascriptItem().iterator().hasNext()) {
823 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
824 jit = (JavascriptItemType) iter.next();
825 logger.debug(EELFLoggerDelegate.debugLogger, ("^^^^^JAVASCRIPTITEMTYPE " + jit.getFieldId() + " " + fieldId + " " + id));
826 if(nvl(jit.getFieldId()).length()>0 && jit.getFieldId().equals(fieldId)) {
830 return fieldId + "|"+incr;
832 return fieldId + "|1";
839 public JavascriptItemType addJavascriptType(ObjectFactory objFactory, String id) throws RaptorException {
840 JavascriptItemType javascriptItemType = null;
841 int flag = 0; // checking whether id existing in the list
842 if (getJavascriptList() == null) {
843 setJavascriptList(objFactory.createJavascriptList());
844 javascriptItemType = objFactory.createJavascriptItemType();
845 getJavascriptList().getJavascriptItem().add(javascriptItemType);
846 return javascriptItemType;
849 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
850 javascriptItemType = (JavascriptItemType)iter.next();
851 if(javascriptItemType.getId().equals(id) && !id.startsWith("-1")) {
856 if(flag == 1) return javascriptItemType;
858 javascriptItemType = objFactory.createJavascriptItemType();
859 getJavascriptList().getJavascriptItem().add(javascriptItemType);
860 return javascriptItemType;
864 } // addSemaphoreType
866 public boolean deleteJavascriptType(String id) throws RaptorException {
867 JavascriptItemType javascriptType = null;
868 if (getJavascriptList() == null)
870 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
871 javascriptType = (JavascriptItemType)iter.next();
872 if(javascriptType.getId().equals(id)) {
878 } // addSemaphoreType
880 public static FormatType addEmptyFormatType(ObjectFactory objFactory,
881 SemaphoreType semaphore) throws RaptorException {
882 FormatType fmt = null;
883 fmt = objFactory.createFormatType();
884 semaphore.getFormatList().getFormat().add(fmt);
886 String formatId = null;
887 boolean idExists = true;
888 for (int i = 1; idExists; i++) {
889 formatId = semaphore.getSemaphoreId() + "_fmt" + i;
891 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter
893 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
898 fmt.setFormatId(formatId);
900 } // addEmptyFormatType
902 public static void deleteFormatType(SemaphoreType semaphore, String formatId) {
903 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter.hasNext();)
904 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
908 } // deleteFormatType
910 public FormFieldType addFormFieldType(ObjectFactory objFactory, String fieldName,
911 String colId, String fieldType, String validationType, String mandatory,
912 String defaultValue, String fieldSQL, String comment, Calendar rangeStartDate, Calendar rangeEndDate,
913 String rangeStartDateSQL, String rangeEndDateSQL) throws RaptorException {
914 FormFieldType fft = null;
915 fft = objFactory.createFormFieldType();
917 fft.setFieldName(fieldName);
919 fft.setFieldType(fieldType);
920 fft.setValidationType(validationType);
921 fft.setMandatory(nvl(mandatory, "N"));
922 fft.setDefaultValue(nvl(defaultValue));
923 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
925 fft.setFieldSQL(fieldSQL);
926 //fft.setRangeStartDate(rangeStartDate);
927 //fft.setRangeEndDate(rangeEndDate);
930 fft.setRangeStartDate(DatatypeFactory.newInstance()
931 .newXMLGregorianCalendar(rangeStartDate.YEAR, rangeStartDate.MONTH, rangeStartDate.DAY_OF_WEEK, rangeStartDate.HOUR, rangeStartDate.MINUTE, rangeStartDate.SECOND, rangeStartDate.MILLISECOND, rangeStartDate.ZONE_OFFSET));
932 fft.setRangeStartDate(DatatypeFactory.newInstance()
933 .newXMLGregorianCalendar(rangeEndDate.YEAR, rangeEndDate.MONTH, rangeEndDate.DAY_OF_WEEK, rangeEndDate.HOUR, rangeEndDate.MINUTE, rangeEndDate.SECOND, rangeEndDate.MILLISECOND, rangeEndDate.ZONE_OFFSET));
934 /*currField.setRangeEndDate(DatatypeFactory.newInstance()
935 .newXMLGregorianCalendar(end));*/
936 } catch (DatatypeConfigurationException ex) {
940 fft.setRangeStartDateSQL(rangeStartDateSQL);
941 fft.setRangeEndDateSQL(rangeEndDateSQL);
942 if (nvl(comment).length() > 0)
943 fft.setComment(comment);
945 String fieldId = null;
946 boolean idExists = true;
947 for (int i = 1; idExists; i++) {
950 if (getFormFieldList() != null)
951 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
953 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
958 fft.setFieldId(fieldId);
960 if (getFormFieldList() == null) {
961 FormFieldList formFieldList = objFactory.createFormFieldList();
962 setFormFieldList(formFieldList);
965 getFormFieldList().getFormField().add(fft);
967 } // addFormFieldType
969 //addCustomizedTextForParameters
970 public void addCustomizedTextForParameters(String comment) throws RaptorException {
971 getFormFieldList().setComment(comment);
974 public FormFieldType addFormFieldBlank(ObjectFactory objFactory) throws RaptorException {
975 FormFieldType fft = null;
976 fft = objFactory.createFormFieldType();
978 fft.setFieldName("BLANK");
980 fft.setFieldType(FormField.FFT_BLANK);
981 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
983 String fieldId = null;
984 boolean idExists = true;
985 for (int i = 1; idExists; i++) {
988 if (getFormFieldList() != null)
989 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
991 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
996 fft.setFieldId(fieldId);
998 if (getFormFieldList() == null) {
999 FormFieldList formFieldList = objFactory.createFormFieldList();
1000 setFormFieldList(formFieldList);
1003 getFormFieldList().getFormField().add(fft);
1005 } // addFormFieldBlank
1007 public void replaceFormFieldReferences(String fieldName, String replaceWith) {
1008 if (fieldName.equals(replaceWith))
1011 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
1012 DataColumnType dct = (DataColumnType) iter.next();
1014 if (dct.isCalculated() && dct.getColName().indexOf(fieldName) >= 0)
1015 dct.setColName(Utils.replaceInString(dct.getColName(), fieldName, nvl(
1016 replaceWith, "NULL")));
1018 if (dct.getColFilterList() != null)
1019 for (Iterator iter2 = dct.getColFilterList().getColFilter().iterator(); iter2
1021 ColFilterType cft = (ColFilterType) iter2.next();
1023 if (nvl(cft.getArgType()).equals(AppConstants.AT_FORM)
1024 && nvl(cft.getArgValue()).equals(fieldName))
1025 cft.setArgValue(replaceWith);
1028 } // replaceFormFieldReferences
1030 public void deleteFormField(String fieldId) {
1031 String fieldDisplayName = null;
1033 int orderBySeq = Integer.MAX_VALUE;
1034 if (getFormFieldList() != null)
1035 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
1036 FormFieldType fft = (FormFieldType) iter.next();
1038 if (fieldId.equals(fft.getFieldId())) {
1039 //orderBySeq = fft.getOrderBySeq();
1040 fieldDisplayName = getFormFieldDisplayName(fft);
1042 } else if (fft.getOrderBySeq()!=null && (fft.getOrderBySeq().intValue() > orderBySeq))
1043 fft.setOrderBySeq(fft.getOrderBySeq() - 1);
1046 if (fieldDisplayName != null)
1047 replaceFormFieldReferences(fieldDisplayName, "");
1048 } // deleteFormField
1050 public void shiftFormFieldUp(String fieldId) {
1051 if (getFormFieldList() == null)
1054 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1055 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1057 if (fft.getFieldId().equals(fieldId) && (i > 0)) {
1058 FormFieldType prevFft = (FormFieldType) getFormFieldList().getFormField().get(
1060 prevFft.setOrderBySeq(prevFft.getOrderBySeq() + 1);
1061 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() - 1);
1063 getFormFieldList().getFormField().remove(i);
1064 getFormFieldList().getFormField().add(i - 1, fft);
1068 } // shiftFormFieldUp
1070 public void shiftFormFieldDown(String fieldId) {
1071 if (getFormFieldList() == null)
1074 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1075 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1077 if (fft.getFieldId().equals(fieldId)
1078 && (i < getFormFieldList().getFormField().size() - 1)) {
1079 FormFieldType nextFft = (FormFieldType) getFormFieldList().getFormField().get(
1081 nextFft.setOrderBySeq((nextFft.getOrderBySeq() == null)?0:nextFft.getOrderBySeq() - 1);
1082 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() + 1);
1084 getFormFieldList().getFormField().remove(i + 1);
1085 getFormFieldList().getFormField().add(i, nextFft);
1089 } // shiftFormFieldDown
1091 public static void addFormFieldPredefinedValue(ObjectFactory objFactory,
1092 FormFieldType formField, String predefinedValue) throws RaptorException {
1093 if (formField.getPredefinedValueList() == null) {
1094 PredefinedValueList predefinedValueList = objFactory.createPredefinedValueList();
1095 formField.setPredefinedValueList(predefinedValueList);
1098 if (predefinedValue.length() > 0) {
1099 formField.getPredefinedValueList().getPredefinedValue().add(predefinedValue);
1100 Collections.sort(formField.getPredefinedValueList().getPredefinedValue());
1102 } // addFormFieldPredefinedValue
1104 public static void deleteFormFieldPredefinedValue(FormFieldType formField,
1105 String predefinedValue) {
1106 if (formField != null && formField.getPredefinedValueList() != null
1107 && predefinedValue.length() > 0)
1108 for (Iterator iter = formField.getPredefinedValueList().getPredefinedValue()
1109 .iterator(); iter.hasNext();)
1110 if (predefinedValue.equals((String) iter.next())) {
1114 } // deleteFormFieldPredefinedValue
1116 /** ************************************************************************************************* */
1118 private int curSQLParsePos = 0;
1120 private String getNextSQLParseToken(String sql, boolean updateParsePos) {
1121 int braketCount = 0;
1122 boolean isInsideQuote = false;
1123 StringBuffer nextToken = new StringBuffer();
1124 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1125 char ch = sql.charAt(idxNext);
1127 if (Character.isWhitespace(ch) || ch == ',') {
1129 nextToken.append(ch);
1131 if (nextToken.length() == 0)
1133 else if (braketCount == 0 && (!isInsideQuote)) {
1135 curSQLParsePos = idxNext + ((ch == ',') ? 1 : 0);
1137 } else if (ch != ',' && nextToken.charAt(nextToken.length() - 1) != ' ')
1138 nextToken.append(' ');
1140 nextToken.append(ch);
1142 if (ch == '(' || ch == '[')
1144 else if (ch == ')' || ch == ']')
1146 else if (ch == '\''/* ||ch=='\"' */)
1147 isInsideQuote = (!isInsideQuote);
1151 return nextToken.toString();
1152 } // getNextSQLParseToken
1154 private boolean isParseSQLColID(String token) {
1155 if (nvl(token).length() == 0)
1158 for (int i = 0; i < token.length(); i++) {
1159 char ch = token.charAt(i);
1161 if (i == 0 && ch == '_')
1164 if (!(Character.isLetterOrDigit(ch) || ch == '_'))
1169 } // isParseSQLColID
1171 private DataColumnType getParseSQLDataColumn(String sqlExpression, String colId,
1172 StringBuffer parsedSQL, Vector updatedReportCols, boolean isCYMBALScript) throws RaptorException {
1173 DataColumnType dct = null;
1175 if (colId != null) {
1176 if (!isParseSQLColID(colId))
1177 throw new org.onap.portalsdk.analytics.error.ValidationException(
1180 + "] must either be a valid column id consisting only of letters, numbers, and underscores, or there must be a comma in front of it.");
1182 dct = getColumnById(colId);
1184 // Getting unique column id
1187 for (int i = 0; (i < sqlExpression.length()) && (colIdN < 2); i++)
1188 if (Character.isLetter(sqlExpression.charAt(i))) {
1189 colId += sqlExpression.toLowerCase().charAt(i);
1193 colIdN = getAllColumns().size() + updatedReportCols.size();
1194 for (boolean idAlreadyUsed = true; idAlreadyUsed; colIdN++) {
1195 String newColId = colId + colIdN;
1196 idAlreadyUsed = false;
1198 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();)
1199 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1200 idAlreadyUsed = true;
1205 for (Iterator iter = updatedReportCols.iterator(); iter.hasNext();)
1206 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1207 idAlreadyUsed = true;
1212 colId += (colIdN - 1);
1216 dct = (new ObjectFactory()).createDataColumnType();
1217 dct.setColId(colId);
1218 dct.setDisplayWidth(10);
1219 dct.setDisplayAlignment("Left");
1220 dct.setVisible(true);
1221 dct.setGroupBreak(false); // ???
1222 if(!isCYMBALScript) {
1223 boolean isValidIdentifier = Character.isLetterOrDigit(sqlExpression.charAt(0));
1224 for (int i = 0; i < sqlExpression.length(); i++)
1225 if (!(Character.isLetterOrDigit(sqlExpression.charAt(i))
1226 || (sqlExpression.charAt(i) == '_') || (sqlExpression.charAt(i) == '$'))) {
1227 isValidIdentifier = false;
1231 if (isValidIdentifier) {
1232 dct.setDisplayName(sqlExpression);
1234 dct.setDisplayName(colId);
1236 } else dct.setDisplayName(colId);
1239 sqlExpression = sqlExpression.replaceAll(", '", ",'");
1240 dct.setDbColName(sqlExpression);
1241 dct.setColName(sqlExpression);
1242 dct.setCalculated(true);
1243 dct.setColType(AppConstants.CT_CHAR);
1244 dct.setDbColType(AppConstants.CT_CHAR);
1245 adjustColumnType(dct); // ???
1246 if(!isCYMBALScript) {
1247 if (parsedSQL.toString().equals("SELECT ")
1248 || parsedSQL.toString().equals("SELECT DISTINCT "))
1249 parsedSQL.append("\n\t");
1251 parsedSQL.append(", \n\t");
1252 parsedSQL.append(sqlExpression);
1253 parsedSQL.append(" ");
1254 parsedSQL.append(colId);
1258 } // getParseSQLDataColumn
1260 public void parseReportSQL(String sql) throws RaptorException {
1261 StringBuffer parsedSQL = new StringBuffer();
1263 Vector updatedReportCols = new Vector();
1266 int lastParsePos = curSQLParsePos;
1267 String lastToken = null;
1268 String nextToken = getNextSQLParseToken(sql, true);
1270 String dbInfo = getDBInfo();
1271 boolean isCYMBALScript = false;
1272 if (!isNull(dbInfo) && (!dbInfo.equals(AppConstants.DB_LOCAL))) {
1274 org.onap.portalsdk.analytics.util.RemDbInfo remDbInfo = new org.onap.portalsdk.analytics.util.RemDbInfo();
1275 String dbType = remDbInfo.getDBType(dbInfo);
1276 if (dbType.equals("DAYTONA") && !(nextToken.toUpperCase().equals("SELECT"))) {
1277 isCYMBALScript = true;
1279 } catch (Exception ex) {
1280 throw new RaptorException(ex);
1283 if ( isCYMBALScript == false ) {
1284 while (nextToken.length() > 0) {
1285 if (parsedSQL.length() == 0) {
1286 if (nextToken.toUpperCase().equals("SELECT"))
1287 parsedSQL.append("SELECT ");
1289 throw new org.onap.portalsdk.analytics.error.ValidationException(
1290 "The SQL must start with the SELECT keyword.");
1291 } else if (nextToken.toUpperCase().equals("DISTINCT")
1292 && parsedSQL.toString().equals("SELECT ")) {
1293 parsedSQL.append("DISTINCT ");
1294 } else if (nextToken.equals("*")
1295 && (parsedSQL.toString().equals("SELECT ") || parsedSQL.toString().equals(
1296 "SELECT DISTINCT "))) {
1297 throw new org.onap.portalsdk.analytics.error.ValidationException(
1298 "You cannot use \"SELECT *\". Please specify select columns/expressions.");
1299 } else if (nextToken.toUpperCase().equals("FROM")) {
1300 if (lastToken != null) {
1301 updatedReportCols.add(getParseSQLDataColumn(lastToken, null, parsedSQL,
1302 updatedReportCols, false));
1306 parsedSQL.append(" \n");
1307 while (lastParsePos < sql.length()
1308 && Character.isWhitespace(sql.charAt(lastParsePos)))
1310 parsedSQL.append(sql.substring(lastParsePos));
1313 if (nextToken.charAt(nextToken.length() - 1) == ',') {
1314 // The token ends with ,
1315 nextToken = nextToken.substring(0, nextToken.length() - 1);
1317 if (nextToken.length() == 0) {
1318 if (lastToken != null) {
1319 updatedReportCols.add(getParseSQLDataColumn(lastToken, null,
1320 parsedSQL, updatedReportCols, false));
1322 } // else just comma => ignore it
1324 if (lastToken != null) {
1325 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1326 parsedSQL, updatedReportCols, false));
1329 updatedReportCols.add(getParseSQLDataColumn(nextToken, null,
1330 parsedSQL, updatedReportCols, false));
1333 // The token doesn't end with ,
1334 if (lastToken == null)
1335 lastToken = nextToken;
1337 String token = getNextSQLParseToken(sql, false);
1338 if (!token.toUpperCase().equals("FROM"))
1339 throw new org.onap.portalsdk.analytics.error.ValidationException(
1340 "|FROM keyword or a comma expected after [" + nextToken
1343 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1344 parsedSQL, updatedReportCols, false));
1350 lastParsePos = curSQLParsePos;
1351 nextToken = getNextSQLParseToken(sql, true);
1353 } else { // if CYMBAL Script
1356 Matcher matcher = null;
1357 String extracted = null;
1358 nextToken = getNextCYMBALSQLParseToken(sql,true);
1359 while (nextToken.length() > 0) {
1360 if (lastToken == null) lastToken = nextToken;
1362 if( lastToken.toUpperCase().startsWith("DO DISPLAY")) {
1363 re = Pattern.compile("each(.*)\\[.(.*?)\\]"); //\\[(.*?)\\]
1364 matcher = re.matcher(nextToken);
1365 if (matcher.find()) {
1366 extracted = matcher.group();
1367 re = Pattern.compile("\\[(.*?)\\]");
1368 matcher = re.matcher(nextToken);
1369 if(matcher.find()) {
1370 extracted = matcher.group();
1371 extracted = extracted.substring(1,extracted.length()-1);
1372 StringTokenizer sToken = new StringTokenizer(extracted, ",");
1373 while(sToken.hasMoreTokens()) {
1374 String str1 = sToken.nextToken().trim().substring(1);
1375 updatedReportCols.add(getParseSQLDataColumn("", str1,
1376 new StringBuffer(""), updatedReportCols, true));
1383 lastToken = nextToken;
1384 nextToken = getNextCYMBALSQLParseToken(sql, true);
1388 if (updatedReportCols.size() == 0)
1389 throw new org.onap.portalsdk.analytics.error.ValidationException(
1390 "The SQL statement must have at least one column in the SELECT clause.");
1391 if (getDataSourceList().getDataSource().size() == 0)
1392 addDataSourceType(new ObjectFactory(), "du0", "DUAL", "", "DUAL", null, null, null);
1393 DataSourceType dst = (DataSourceType) getDataSourceList().getDataSource().get(0);
1394 dst.getDataColumnList().getDataColumn().clear();
1396 for (int i = 0; i < updatedReportCols.size(); i++) {
1397 DataColumnType dct = (DataColumnType) updatedReportCols.get(i);
1398 dct.setTableId(dst.getTableId());
1399 dct.setOrderSeq(i + 1);
1400 dst.getDataColumnList().getDataColumn().add(dct);
1402 setReportSQL(parsedSQL.toString());
1406 public void parseReportSQL(String sql, boolean storeInSession) throws RaptorException {
1407 StringBuffer parsedSQL = new StringBuffer();
1409 Vector updatedReportCols = new Vector();
1412 int lastParsePos = curSQLParsePos;
1413 String lastToken = null;
1414 String nextToken = getNextSQLParseToken(sql, true);
1416 String dbInfo = getDBInfo();
1417 boolean isCYMBALScript = false;
1418 if (!isNull(dbInfo) && (!dbInfo.equals(AppConstants.DB_LOCAL))) {
1420 org.onap.portalsdk.analytics.util.RemDbInfo remDbInfo = new org.onap.portalsdk.analytics.util.RemDbInfo();
1421 String dbType = remDbInfo.getDBType(dbInfo);
1422 if (dbType.equals("DAYTONA") && !(nextToken.toUpperCase().equals("SELECT"))) {
1423 isCYMBALScript = true;
1425 } catch (Exception ex) {
1426 throw new RaptorException(ex);
1429 if ( isCYMBALScript == false ) {
1430 while (nextToken.length() > 0) {
1431 if (parsedSQL.length() == 0) {
1432 if (nextToken.toUpperCase().equals("SELECT"))
1433 parsedSQL.append("SELECT ");
1435 throw new org.onap.portalsdk.analytics.error.ValidationException(
1436 "The SQL must start with the SELECT keyword.");
1437 } else if (nextToken.toUpperCase().equals("DISTINCT")
1438 && parsedSQL.toString().equals("SELECT ")) {
1439 parsedSQL.append("DISTINCT ");
1440 } else if (nextToken.equals("*")
1441 && (parsedSQL.toString().equals("SELECT ") || parsedSQL.toString().equals(
1442 "SELECT DISTINCT "))) {
1443 throw new org.onap.portalsdk.analytics.error.ValidationException(
1444 "You cannot use \"SELECT *\". Please specify select columns/expressions.");
1445 } else if (nextToken.toUpperCase().equals("FROM")) {
1446 if (lastToken != null) {
1447 updatedReportCols.add(getParseSQLDataColumn(lastToken, null, parsedSQL,
1448 updatedReportCols, false));
1452 parsedSQL.append(" \n");
1453 while (lastParsePos < sql.length()
1454 && Character.isWhitespace(sql.charAt(lastParsePos)))
1456 parsedSQL.append(sql.substring(lastParsePos));
1459 if (nextToken.charAt(nextToken.length() - 1) == ',') {
1460 // The token ends with ,
1461 nextToken = nextToken.substring(0, nextToken.length() - 1);
1463 if (nextToken.length() == 0) {
1464 if (lastToken != null) {
1465 updatedReportCols.add(getParseSQLDataColumn(lastToken, null,
1466 parsedSQL, updatedReportCols, false));
1468 } // else just comma => ignore it
1470 if (lastToken != null) {
1471 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1472 parsedSQL, updatedReportCols, false));
1475 updatedReportCols.add(getParseSQLDataColumn(nextToken, null,
1476 parsedSQL, updatedReportCols, false));
1479 // The token doesn't end with ,
1480 if (lastToken == null)
1481 lastToken = nextToken;
1483 String token = getNextSQLParseToken(sql, false);
1484 if (!token.toUpperCase().equals("FROM"))
1485 throw new org.onap.portalsdk.analytics.error.ValidationException(
1486 "|FROM keyword or a comma expected after [" + nextToken
1489 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1490 parsedSQL, updatedReportCols, false));
1496 lastParsePos = curSQLParsePos;
1497 nextToken = getNextSQLParseToken(sql, true);
1499 } else { // if CYMBAL Script
1502 Matcher matcher = null;
1503 String extracted = null;
1504 nextToken = getNextCYMBALSQLParseToken(sql,true);
1505 while (nextToken.length() > 0) {
1506 if (lastToken == null) lastToken = nextToken;
1508 if( lastToken.toUpperCase().startsWith("DO DISPLAY")) {
1509 re = Pattern.compile("each(.*)\\[.(.*?)\\]"); //\\[(.*?)\\]
1510 matcher = re.matcher(nextToken);
1511 if (matcher.find()) {
1512 extracted = matcher.group();
1513 re = Pattern.compile("\\[(.*?)\\]");
1514 matcher = re.matcher(nextToken);
1515 if(matcher.find()) {
1516 extracted = matcher.group();
1517 extracted = extracted.substring(1,extracted.length()-1);
1518 StringTokenizer sToken = new StringTokenizer(extracted, ",");
1519 while(sToken.hasMoreTokens()) {
1520 String str1 = sToken.nextToken().trim().substring(1);
1521 updatedReportCols.add(getParseSQLDataColumn("", str1,
1522 new StringBuffer(""), updatedReportCols, true));
1529 lastToken = nextToken;
1530 nextToken = getNextCYMBALSQLParseToken(sql, true);
1534 if (updatedReportCols.size() == 0)
1535 throw new org.onap.portalsdk.analytics.error.ValidationException(
1536 "The SQL statement must have at least one column in the SELECT clause.");
1537 if (getDataSourceList().getDataSource().size() == 0)
1538 addDataSourceType(new ObjectFactory(), "du0", "DUAL", "", "DUAL", null, null, null);
1539 DataSourceType dst = (DataSourceType) getDataSourceList().getDataSource().get(0);
1540 dst.getDataColumnList().getDataColumn().clear();
1542 for (int i = 0; i < updatedReportCols.size(); i++) {
1543 DataColumnType dct = (DataColumnType) updatedReportCols.get(i);
1544 dct.setTableId(dst.getTableId());
1545 dct.setOrderSeq(i + 1);
1546 dst.getDataColumnList().getDataColumn().add(dct);
1549 setReportSQL(parsedSQL.toString());
1553 private String getNextCYMBALSQLParseToken(String sql, boolean updateParsePos) {
1554 int braketCount = 0;
1555 boolean isInsideQuote = false;
1556 StringBuffer nextToken = new StringBuffer();
1557 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1558 char ch = sql.charAt(idxNext);
1561 nextToken.append(ch);
1563 curSQLParsePos = idxNext;
1566 curSQLParsePos = idxNext+1;
1571 return nextToken.toString();
1572 } // getNextSQLParseToken
1574 public void addChartAdditionalOptions(ObjectFactory objFactory) throws RaptorException {
1575 ChartAdditionalOptions chartOptions = objFactory.createChartAdditionalOptions();
1576 cr.setChartAdditionalOptions(chartOptions);
1579 public void addChartDrillOptions(ObjectFactory objFactory) throws RaptorException {
1580 ChartDrillOptions chartOptions = objFactory.createChartDrillOptions();
1581 cr.setChartDrillOptions(chartOptions);
1584 public void addDataminingOptions(ObjectFactory objFactory) throws RaptorException {
1585 DataminingOptions dataminingOptions = objFactory.createDataminingOptions();
1586 cr.setDataminingOptions(dataminingOptions);
1588 /*public void addChartAdditionalOptions(ObjectFactory objFactory, String chartType, String chartMultiplePieOrder, String chartMultiplePieLabelDisplay,
1589 String chartOrientation, String secondaryChartRenderer, String chartDisplay, String legendPosition,
1590 String labelAngle) throws RaptorException {
1592 ChartAdditionalOptions chartOptions = objFactory.createChartAdditionalOptions();
1594 if (nvl(chartMultiplePieOrder).length() > 0)
1595 chartOptions.setChartMultiplePieOrder(chartMultiplePieOrder);
1596 if (nvl(chartMultiplePieLabelDisplay).length() > 0)
1597 chartOptions.setChartMultiplePieLabelDisplay(chartMultiplePieLabelDisplay);
1598 if (nvl(chartOrientation).length() > 0)
1599 chartOptions.setChartOrientation(chartOrientation);
1600 if (nvl(secondaryChartRenderer).length() > 0)
1601 chartOptions.setSecondaryChartRenderer(secondaryChartRenderer);
1602 if (nvl(chartDisplay).length() > 0)
1603 chartOptions.setChartDisplay(chartDisplay);
1604 if (nvl(legendPosition).length() > 0)
1605 chartOptions.setLegendPosition(legendPosition);
1606 if (nvl(labelAngle).length() > 0)
1607 chartOptions.setLabelAngle(labelAngle);
1609 cr.setChartAdditionalOptions(chartOptions);
1610 } catch (JAXBException ex) {
1611 throw new RaptorException(ex.getMessage(), ex.getCause());
1613 } // addChartAdditionalOptions*/
1616 } // ReportDefinition