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.RemDbInfo;
77 import org.onap.portalsdk.analytics.util.Utils;
78 import org.onap.portalsdk.analytics.xmlobj.ChartAdditionalOptions;
79 import org.onap.portalsdk.analytics.xmlobj.ChartDrillOptions;
80 import org.onap.portalsdk.analytics.xmlobj.ColFilterType;
81 import org.onap.portalsdk.analytics.xmlobj.CustomReportType;
82 import org.onap.portalsdk.analytics.xmlobj.DataColumnList;
83 import org.onap.portalsdk.analytics.xmlobj.DataColumnType;
84 import org.onap.portalsdk.analytics.xmlobj.DataSourceType;
85 import org.onap.portalsdk.analytics.xmlobj.DataminingOptions;
86 import org.onap.portalsdk.analytics.xmlobj.FormFieldList;
87 import org.onap.portalsdk.analytics.xmlobj.FormFieldType;
88 import org.onap.portalsdk.analytics.xmlobj.FormatList;
89 import org.onap.portalsdk.analytics.xmlobj.FormatType;
90 import org.onap.portalsdk.analytics.xmlobj.JavascriptItemType;
91 import org.onap.portalsdk.analytics.xmlobj.ObjectFactory;
92 import org.onap.portalsdk.analytics.xmlobj.PredefinedValueList;
93 import org.onap.portalsdk.analytics.xmlobj.SemaphoreType;
94 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
95 import org.springframework.beans.factory.annotation.Autowired;
96 import org.springframework.stereotype.Component;
99 * This class is part of <B><I>RAPTOR (Rapid Application Programming Tool for OLAP Reporting)</I></B><BR/>
102 * --------------------------------------------------------------------------------------------------<BR/>
103 * <B>ReportDefinition.java</B> - This involves in creating and modifying RAPTOR reports.
104 * --------------------------------------------------------------------------------------------------<BR/>
107 * <U>Change Log</U><BR/><BR/>
109 * 18-Aug-2009 : Version 8.5.1 (Sundar);<UL><LI> request Object is passed to prevent caching user/roles - Datamining/Hosting. </LI></UL>
110 * 27-Jul-2009 : Version 8.4 (Sundar); <UL><LI>userIsAuthorizedToSeeLog is checked for Admin User instead of Super User.</LI></UL>
111 * 22-Jun-2009 : Version 8.4 (Sundar); <UL><LI>A new type ChartAdditionalOptions is introduced in RAPTOR XSD.
112 * For this type a create procedure is added to this class.</LI></UL>
117 public class ReportDefinition extends ReportWrapper implements Serializable {
119 private static transient final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ReportDefinition.class);
121 protected static RemDbInfo remDbInfo;
123 @SuppressWarnings("static-access")
125 public void setRemDbInfo(RemDbInfo remDbInfo) {
126 this.remDbInfo = remDbInfo;
129 private ReportSchedule reportSchedule = null;
131 private WizardSequence wizardSequence = null;
134 private boolean reportUpdateLogged = false; // Used to avoid multiple
135 // entries in the report log
136 // when persisting report on
139 public ReportDefinition() {
143 private ReportDefinition(CustomReportType crType, String reportID, String ownerID,
144 String createID, String createDate, String updateID, String updateDate,
145 String menuID, boolean menuApproved, HttpServletRequest request) throws RaptorException {
146 super(crType, reportID, ownerID, createID, createDate, updateID, updateDate, menuID,
148 if("-1".equals(reportID))
149 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), false, request);
151 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), true, request);
152 generateWizardSequence(null);
153 } // ReportDefinition
155 public ReportDefinition(ReportWrapper rw, HttpServletRequest request)throws RaptorException {
158 reportSchedule = new ReportSchedule(reportID, rw.getOwnerID(),false, request);
159 generateWizardSequence(null);
160 } // ReportDefinition
162 private void setReportID(String reportID) {
163 this.reportID = reportID;
164 reportSchedule.setReportID(reportID);
165 reportSchedule.setScheduleUserID(getOwnerID());
168 public ReportSchedule getReportSchedule() {
169 return reportSchedule;
172 public static ReportDefinition unmarshal(String reportXML, String reportID, HttpServletRequest request)
173 throws RaptorException {
174 ReportDefinition rn = null;
175 CustomReportType crType = ReportWrapper.unmarshalCR(reportXML);
177 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] Report [" + reportID + "]: XML unmarshalled"));
179 rn = new ReportDefinition(crType, reportID, null, null, null, null, null, null, false, request);
183 public static ReportDefinition createBlank(HttpServletRequest request) throws RaptorException {
184 String curTime = Utils.getCurrentDateTime();
185 String userID = AppUtils.getUserID(request);
186 return new ReportDefinition(ReportWrapper.createBlankCR(userID), "-1",
187 userID, userID, curTime, userID, curTime, "", false, request);
188 } // ReportDefinition
190 public void setAsCopy(HttpServletRequest request) throws RaptorException {
191 verifySQLBasedReportAccess(request);
193 replaceCustomReportWithClone();
196 setReportName("Copy: " + getReportName());
199 public WizardSequence getWizardSequence() {
200 return wizardSequence;
201 } // getWizardSequence
203 public void generateWizardSequence(HttpServletRequest request) throws RaptorException {
204 boolean userIsAuthorizedToSeeLog = false;
205 String userId = null;
207 userId = AppUtils.getUserID(request);
209 userIsAuthorizedToSeeLog = AppUtils.isAdminUser(request);
211 if (getReportType().equals(AppConstants.RT_LINEAR)){
212 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
213 wizardSequence = new WizardSequenceSQLBasedLinear(userIsAuthorizedToSeeLog);
214 else if (getReportDefType().equals(AppConstants.RD_SQL_BASED_DATAMIN))
215 wizardSequence = new WizardSequenceSQLBasedLinearDatamining(userIsAuthorizedToSeeLog);
217 wizardSequence = new WizardSequenceLinear(userIsAuthorizedToSeeLog);
218 } else if (getReportType().equals(AppConstants.RT_CROSSTAB)) {
219 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
220 wizardSequence = new WizardSequenceSQLBasedCrossTab(userIsAuthorizedToSeeLog);
222 wizardSequence = new WizardSequenceCrossTab(userIsAuthorizedToSeeLog);
223 } else if (getReportType().equals(AppConstants.RT_DASHBOARD)) {
224 wizardSequence = new WizardSequenceDashboard(userIsAuthorizedToSeeLog);
225 } else if (getReportType().equals(AppConstants.RT_HIVE)) {
226 wizardSequence = new WizardSequenceSQLBasedHive(userIsAuthorizedToSeeLog);
228 wizardSequence = new WizardSequence();
229 } // generateWizardSequence
231 private boolean canPersistDashboard() {
233 return nvl(getDashboardLayoutJSON()).length() > 0;
234 } //canPersistDashboard
236 private boolean canPersistLinearReport() {
237 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& canPersistLinearReport");
238 boolean visibleColExist = false;
240 if (!getDataSourceList().getDataSource().isEmpty()) {
241 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
242 DataColumnType dct = (DataColumnType) iter.next();
244 if (dct.isVisible()) {
245 visibleColExist = true;
251 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& visibleColExist " + visibleColExist);
252 return visibleColExist;
253 } // canPersistLinearReport
255 private boolean canPersistCrossTabReport() {
256 boolean rowColExist = false;
257 boolean colColExist = false;
258 boolean valColExist = false;
260 if (!getDataSourceList().getDataSource().isEmpty()) {
261 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
262 DataColumnType dct = (DataColumnType) iter.next();
264 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_ROW))
266 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_COLUMN))
268 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_VALUE))
273 return rowColExist && colColExist && valColExist;
274 } // canPersistCrossTabReport
276 private boolean canPersistReport() {
277 return getReportType().equals(AppConstants.RT_CROSSTAB) ? canPersistCrossTabReport()
278 : (getReportType().equals(AppConstants.RT_LINEAR)? canPersistLinearReport()
279 :(getReportType().equals(AppConstants.RT_HIVE)? canPersistLinearReport()
280 :canPersistDashboard()));
281 } // canPersistReport
283 public void persistReport(HttpServletRequest request) throws RaptorException {
284 if (!canPersistReport()) {
285 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& In !canPersistReport ReportType: " + getReportType());
288 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& Not In !canPersistReport");
291 Connection connection = null;
293 String userID = AppUtils.getUserID(request);
294 String reportXML = marshal();
295 logger.debug(EELFLoggerDelegate.debugLogger, ("Ocurring during Schedule "));
296 logger.debug(EELFLoggerDelegate.debugLogger,"&&&&&&&&&&&&&&&&&&&&&& Report ID " + reportID);
297 if ("-1".equals(nvl(reportID, "-1"))) {
298 connection = DbUtils.startTransaction();
301 if (nvl(Globals.getAdhocReportSequence()).length()> 0 && nvl(Globals.getAdhocUserRoldId()).length() > 0 && AppUtils.isUserInRole(request, Globals.getAdhocUserRoldId()) && !AppUtils.isAdminUser(request)) {
302 sql = Globals.getPersistReportAdhoc();
303 sql = sql.replace("[Globals.getAdhocReportSequence()]", Globals.getAdhocReportSequence());
306 sql = Globals.getNewReportData();
308 DataSet ds = DbUtils.executeQuery(connection,sql);
309 setReportID(ds.getString(0, 0));
311 reportSecurity.reportCreate(reportID, userID, isPublic());
312 ReportLoader.createCustomReportRec(connection, this, reportXML);
313 ReportLoader.createReportLogEntry(connection, reportID, userID,
314 AppConstants.RLA_CREATE, "", "");
315 reportUpdateLogged = true;
316 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB insert report " + reportID + " succesfull"));
319 verifySQLBasedReportAccess(request);
320 reportSecurity.reportUpdate(request);
321 connection = DbUtils.startTransaction();
322 ReportLoader.updateCustomReportRec(connection, this, reportXML);
323 if (!reportUpdateLogged) {
324 ReportLoader.createReportLogEntry(connection, reportID, userID,
325 AppConstants.RLA_UPDATE,"","");
326 reportUpdateLogged = true;
328 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB update report " + reportID + " succesfull"));
331 getReportSchedule().persistScheduleData(connection, request);
333 DbUtils.commitTransaction(connection);
334 } catch (RaptorException e) {
336 DbUtils.rollbackTransaction(connection);
339 DbUtils.clearConnection(connection);
343 public String getCrossTabDisplayValue(String crossTabValue) {
344 return nvl(crossTabValue).equals(AppConstants.CV_ROW) ? "Row headings" : (nvl(
345 crossTabValue).equals(AppConstants.CV_COLUMN) ? "Column headings" : (nvl(
346 crossTabValue).equals(AppConstants.CV_VALUE) ? "Report values" : "Invisible/Filter"));
347 } // getCrossTabDisplayValue
349 public String getCrossTabDisplayValue(DataColumnType dct) {
350 return getCrossTabDisplayValue(dct.getCrossTabValue());
351 } // getCrossTabDisplayValue
353 public String getColumnLabel(DataColumnType dct) throws Exception {
354 String tableName = getTableById(dct.getTableId()).getTableName();
355 Vector dbColumns = null;
356 dbColumns = DataCache.getReportTableDbColumns(tableName, cr.getDbInfo());
357 if (dbColumns != null)
358 for (int i = 0; i < dbColumns.size(); i++) {
359 DBColumnInfo dbCol = (DBColumnInfo) dbColumns.get(i);
360 if (dct.getDbColName().equals(dbCol.getColName()))
361 return dbCol.getLabel();
365 } // getCrossTabDisplayValue
367 public String getFilterLabel(ColFilterType cft) {
368 StringBuffer fLabel = new StringBuffer();
370 fLabel.append(cft.getExpression());
372 if (cft.getArgType() != null)
373 if (cft.getArgType().equals(AppConstants.AT_FORMULA)) {
374 fLabel.append("[" + cft.getArgValue() + "]");
375 } else if (cft.getArgType().equals(AppConstants.AT_VALUE)) {
376 fLabel.append(cft.getArgValue());
377 } else if (cft.getArgType().equals(AppConstants.AT_LIST)) {
378 fLabel.append("(" + cft.getArgValue() + ")");
379 } else if (cft.getArgType().equals(AppConstants.AT_COLUMN)) {
380 DataColumnType dctFilter = getColumnById(cft.getArgValue());
381 fLabel.append("[" + dctFilter.getDisplayName() + "]");
382 } else if (cft.getArgType().equals(AppConstants.AT_FORM)) {
383 fLabel.append("[Form Field]");
386 return fLabel.toString();
389 public Vector getReportUsers(HttpServletRequest request) throws RaptorException {
390 return reportSecurity.getReportUsers(request);
393 public Vector getReportRoles(HttpServletRequest request) throws RaptorException {
394 return reportSecurity.getReportRoles(request);
397 /** ************************************************************************************************* */
399 public void clearAllDrillDowns() {
400 List reportCols = getAllColumns();
401 for (int i = 0; i < reportCols.size(); i++) {
402 DataColumnType dct = (DataColumnType) reportCols.get(i);
403 dct.setDrillDownURL(null);
404 dct.setDrillDownParams(null);
405 dct.setDrillDownType(null);
407 } // clearAllDrillDowns
409 public void setOuterJoin(DataSourceType curTable, String joinType) {
410 String refDefinition = nvl(curTable.getRefDefinition());
411 int outerJoinIdx = refDefinition.indexOf(" (+)");
412 if (outerJoinIdx >= 0)
413 // Clear existing outer join
414 if (outerJoinIdx == (refDefinition.length() - 4))
415 refDefinition = refDefinition.substring(0, outerJoinIdx);
417 refDefinition = refDefinition.substring(0, outerJoinIdx)
418 + refDefinition.substring(outerJoinIdx + 4);
420 int equalSignIdx = refDefinition.indexOf("=");
421 if (equalSignIdx < 0)
422 // Ref. definition not present
425 if (refDefinition.indexOf(curTable.getTableId()) < equalSignIdx) {
426 // Cur. table is on the left side
427 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
428 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
429 + refDefinition.substring(equalSignIdx);
430 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
431 refDefinition = refDefinition + " (+)";
433 // Joined table is on the left side
434 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
435 refDefinition = refDefinition + " (+)";
436 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
437 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
438 + refDefinition.substring(equalSignIdx);
441 curTable.setRefDefinition(refDefinition);
444 public void addDataSourceType(ObjectFactory objFactory, String tableId, String tableName,
445 String tablePK, String displayName, String refTableId, String refDefinition,
446 String comment) throws RaptorException {
447 DataSourceType dst = objFactory.createDataSourceType();
449 dst.setTableId(tableId);
450 dst.setTableName(tableName);
451 dst.setTablePK(tablePK);
452 dst.setDisplayName(displayName);
453 if (nvl(refTableId).length() > 0)
454 dst.setRefTableId(refTableId);
455 if (nvl(refDefinition).length() > 0)
456 dst.setRefDefinition(refDefinition);
457 if (nvl(comment).length() > 0)
458 dst.setComment(comment);
460 DataColumnList dataColumnList = objFactory.createDataColumnList();
461 dst.setDataColumnList(dataColumnList);
463 getDataSourceList().getDataSource().add(dst);
466 } // addDataSourceType
468 public void deleteDataSourceType(String tableId) {
469 super.deleteDataSourceType(tableId);
470 } // deleteDataSourceType
472 public String getUniqueColumnId(String colName) {
475 int colIdN = getAllColumns().size() + 1;
477 colId = colName.substring(0, 2).toLowerCase() + (colIdN++);
478 } while (getColumnById(colId) != null);
481 } // getUniqueColumnId
483 public DataColumnType addDataColumnType(ObjectFactory objFactory, String colId,
484 String tableId, // Table to which the new column belongs
485 String dbColName, String crossTabValue, String colName, String displayName,
486 int displayWidth, String displayAlignment, int orderSeq, boolean visible,
487 boolean calculated, String colType, String colFormat, boolean groupBreak,
488 int orderBySeq, String orderByAscDesc, String displayTotal, String colOnChart,
489 int chartSeq, String drillDownType, String drillDownURL, String drillDownParams,
490 String semaphoreId, String comment) throws RaptorException {
491 DataColumnType dct = null;
492 dct = objFactory.createDataColumnType();
495 dct.setTableId(tableId);
496 dct.setDbColName(dbColName);
497 if (nvl(crossTabValue).length() > 0)
498 dct.setCrossTabValue(crossTabValue);
499 dct.setColName(colName);
500 dct.setDisplayName(displayName);
501 if (displayWidth > 0)
502 dct.setDisplayWidth(displayWidth);
503 if (nvl(displayAlignment).length() > 0)
504 dct.setDisplayAlignment(displayAlignment);
506 dct.setOrderSeq(orderSeq);
508 dct.setOrderSeq(getAllColumns().size() + 1);
509 dct.setVisible(visible);
510 dct.setCalculated(calculated);
511 if (nvl(colFormat).length() > 0)
512 dct.setColFormat(colFormat);
513 dct.setGroupBreak(groupBreak);
515 dct.setOrderBySeq(orderBySeq);
516 if (nvl(orderByAscDesc).length() > 0)
517 dct.setOrderByAscDesc(orderByAscDesc);
518 if (nvl(displayTotal).length() > 0)
519 dct.setDisplayTotal(displayTotal);
520 if (nvl(colOnChart).length() > 0)
521 dct.setColOnChart(colOnChart);
523 dct.setChartSeq(chartSeq);
524 if (nvl(drillDownType).length() > 0)
525 dct.setDrillDownType(drillDownType);
526 if (nvl(drillDownURL).length() > 0)
527 dct.setDrillDownURL(drillDownURL);
528 if (nvl(drillDownParams).length() > 0)
529 dct.setDrillDownParams(drillDownParams);
530 if (nvl(semaphoreId).length() > 0)
531 dct.setSemaphoreId(semaphoreId);
532 if (nvl(comment).length() > 0)
533 dct.setComment(comment);
535 dct.setDbColType(colType);
536 adjustColumnType(dct);
538 getTableById(tableId).getDataColumnList().getDataColumn().add(dct);
543 } // addDataColumnType
545 public void deleteDataColumnType(String colId) {
546 int colOrder = getColumnById(colId).getOrderSeq();
548 List dcList = getColumnTableById(colId).getDataColumnList().getDataColumn();
549 for (Iterator iterC = dcList.iterator(); iterC.hasNext();) {
550 DataColumnType dct = (DataColumnType) iterC.next();
552 if (dct.getColId().equals(colId) && dct.getOrderSeq() == colOrder)
554 else if (dct.getOrderSeq() > colOrder)
555 dct.setOrderSeq(dct.getOrderSeq() - 1);
558 if (getFormFieldList() != null)
559 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
560 FormFieldType fft = (FormFieldType) iter.next();
561 if (nvl(fft.getColId()).equals(colId)) {
563 fft.setFieldType(FormField.FFT_TEXT);
564 if (nvl(fft.getDefaultValue()).equals(AppConstants.FILTER_MAX_VALUE)
565 || nvl(fft.getDefaultValue())
566 .equals(AppConstants.FILTER_MIN_VALUE))
567 fft.setDefaultValue("");
572 resetColumnOrderValues();
573 } // deleteDataColumnType
575 public void shiftColumnOrderUp(String colId) {
576 List reportCols = getAllColumns();
577 for (int i = 0; i < reportCols.size(); i++) {
578 DataColumnType dct = (DataColumnType) reportCols.get(i);
580 if (dct.getColId().equals(colId) && (i > 0)) {
581 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
582 dctUp.setOrderSeq(dctUp.getOrderSeq() + 1);
583 dct.setOrderSeq(dct.getOrderSeq() - 1);
588 Collections.sort(reportCols, new OrderSeqComparator());
590 resetColumnOrderValues();
591 } // shiftColumnOrderUp
593 public void shiftColumnOrderDown(String colId) {
594 List reportCols = getAllColumns();
595 for (int i = 0; i < reportCols.size(); i++) {
596 DataColumnType dct = (DataColumnType) reportCols.get(i);
598 if (dct.getColId().equals(colId) && (i < reportCols.size() - 1)) {
599 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
600 dctDown.setOrderSeq(dctDown.getOrderSeq() - 1);
601 dct.setOrderSeq(dct.getOrderSeq() + 1);
606 Collections.sort(reportCols, new OrderSeqComparator());
608 resetColumnOrderValues();
609 } // shiftColumnOrderDown
611 public void resetColumnOrderValues() {
612 List reportCols = getAllColumns();
615 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
616 DataColumnType dct = (DataColumnType) iter.next();
617 dct.setOrderSeq(++colOrder);
620 Collections.sort(reportCols, new OrderSeqComparator());
621 } // resetColumnOrderValues
623 public void addColFilterType(ObjectFactory objFactory, String colId, // Column
630 String joinCondition, String openBrackets, String expression, String argType,
631 String argValue, String closeBrackets, String comment) throws RaptorException {
632 ColFilterType cft = objFactory.createColFilterType();
635 cft.setJoinCondition(nvl(joinCondition, "AND"));
636 if (nvl(openBrackets).length() > 0)
637 cft.setOpenBrackets(openBrackets);
638 cft.setExpression(expression);
639 if (nvl(argType).length() > 0)
640 cft.setArgType(argType);
641 if (nvl(argValue).length() > 0)
642 cft.setArgValue(argValue);
643 if (nvl(closeBrackets).length() > 0)
644 cft.setCloseBrackets(closeBrackets);
645 if (nvl(comment).length() > 0)
646 cft.setComment(comment);
648 DataColumnType dct = getColumnById(colId);
650 if (dct.getColFilterList() == null)
651 dct.setColFilterList(objFactory.createColFilterList());
653 cft.setFilterSeq(dct.getColFilterList().getColFilter().size());
654 dct.getColFilterList().getColFilter().add(cft);
658 } // addColFilterType
660 public void removeColumnFilter(String colId, int filterPos) {
661 DataColumnType dct = getColumnById(colId);
663 if (dct.getColFilterList() != null)
665 dct.getColFilterList().getColFilter().remove(filterPos);
666 } catch (IndexOutOfBoundsException e) {
670 } // removeColumnFilter
672 public void addColumnSort(String colId, String ascDesc) {
673 addColumnSort(colId, ascDesc, -1);
676 public void addColumnSort(String colId, String ascDesc, int sortOrder) {
677 if (sortOrder <= 0) {
679 List reportCols = getAllColumns();
680 for (Iterator iter = reportCols.iterator(); iter.hasNext();)
681 if (((DataColumnType) iter.next()).getOrderBySeq() > 0)
685 DataColumnType dct = getColumnById(colId);
686 dct.setOrderBySeq(sortOrder);
687 dct.setOrderByAscDesc(ascDesc);
692 public void removeColumnSort(String colId) {
693 DataColumnType dct = getColumnById(colId);
694 int sortOrder = dct.getOrderBySeq();
696 dct.setOrderBySeq(0);
697 dct.setOrderByAscDesc(null);
700 List reportCols = getAllColumns();
701 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
702 DataColumnType dct2 = (DataColumnType) iter.next();
704 if (dct2.getOrderBySeq() > sortOrder)
705 dct2.setOrderBySeq(dct2.getOrderBySeq() - 1);
710 } // removeColumnSort
712 public void shiftColumnSortUp(String colId) {
713 List reportCols = getAllColumns();
714 Collections.sort(reportCols, new OrderBySeqComparator());
716 for (int i = 0; i < reportCols.size(); i++) {
717 DataColumnType dct = (DataColumnType) reportCols.get(i);
719 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
720 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
721 if (dctUp.getOrderBySeq() > 0)
722 dctUp.setOrderBySeq(dctUp.getOrderBySeq() + 1);
723 dct.setOrderBySeq(dct.getOrderBySeq() - 1);
728 Collections.sort(reportCols, new OrderSeqComparator());
730 } // shiftColumnSortUp
732 public void shiftColumnSortDown(String colId) {
733 List reportCols = getAllColumns();
734 Collections.sort(reportCols, new OrderBySeqComparator());
736 for (int i = 0; i < reportCols.size(); i++) {
737 DataColumnType dct = (DataColumnType) reportCols.get(i);
739 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
740 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
741 if (dctDown.getOrderBySeq() > 0)
742 dctDown.setOrderBySeq(dctDown.getOrderBySeq() - 1);
743 dct.setOrderBySeq(dct.getOrderBySeq() + 1);
748 Collections.sort(reportCols, new OrderSeqComparator());
750 } // shiftColumnSortDown
752 /** ************************************************************************************************* */
754 public String generateNewSemaphoreId() {
755 if (getSemaphoreList() == null)
758 String semaphoreId = null;
759 boolean idExists = true;
760 for (int i = 1; idExists; i++) {
761 semaphoreId = "sem" + i;
763 for (Iterator iter = getSemaphoreList().getSemaphore().iterator(); iter.hasNext();)
764 if (semaphoreId.equals(((SemaphoreType) iter.next()).getSemaphoreId())) {
771 } // generateNewSemaphoreId
773 public SemaphoreType addSemaphore(ObjectFactory objFactory, SemaphoreType semaphoreType)
774 throws RaptorException {
775 SemaphoreType sem = null;
777 if (getSemaphoreList() == null)
778 setSemaphoreList(objFactory.createSemaphoreList());
780 String semaphoreName = null;
781 boolean nameExists = true;
782 for (int i = 1; nameExists; i++) {
783 semaphoreName = semaphoreType.getSemaphoreName() + ((i > 1) ? (" v" + i) : "");
785 for (Iterator iter2 = getSemaphoreList().getSemaphore().iterator(); iter2
787 if (semaphoreName.equals(((SemaphoreType) iter2.next()).getSemaphoreName())) {
793 sem = cloneSemaphoreType(objFactory, semaphoreType);
794 getSemaphoreList().getSemaphore().add(sem);
796 sem.setSemaphoreId(generateNewSemaphoreId());
797 sem.setSemaphoreName(semaphoreName);
798 } catch (JAXBException ex) {
799 throw new RaptorException(ex.getMessage(), ex.getCause());
805 public SemaphoreType addSemaphoreType(ObjectFactory objFactory, String semaphoreName,
806 String semaphoreType, String comment) throws RaptorException {
807 SemaphoreType sem = null;
808 if (getSemaphoreList() == null)
809 setSemaphoreList(objFactory.createSemaphoreList());
811 sem = objFactory.createSemaphoreType();
812 getSemaphoreList().getSemaphore().add(sem);
814 sem.setSemaphoreId(generateNewSemaphoreId());
815 sem.setSemaphoreName(semaphoreName);
816 sem.setSemaphoreType(nvl(semaphoreType));
817 if (nvl(comment).length() > 0)
818 sem.setComment(comment);
820 FormatList formatList = objFactory.createFormatList();
821 sem.setFormatList(formatList);
823 } // addSemaphoreType
826 public String getNextIdForJavaScriptElement (ObjectFactory objFactory, String fieldId) throws RaptorException {
828 JavascriptItemType jit = null;
830 if (getJavascriptList() == null) {
831 setJavascriptList(objFactory.createJavascriptList());
832 return fieldId + "|1";
834 if(getJavascriptList().getJavascriptItem().iterator().hasNext()) {
835 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
836 jit = (JavascriptItemType) iter.next();
837 logger.debug(EELFLoggerDelegate.debugLogger, ("^^^^^JAVASCRIPTITEMTYPE " + jit.getFieldId() + " " + fieldId + " " + id));
838 if(nvl(jit.getFieldId()).length()>0 && jit.getFieldId().equals(fieldId)) {
842 return fieldId + "|"+incr;
844 return fieldId + "|1";
850 public JavascriptItemType addJavascriptType(ObjectFactory objFactory, String id) throws RaptorException {
851 JavascriptItemType javascriptItemType = null;
852 int flag = 0; // checking whether id existing in the list
853 if (getJavascriptList() == null) {
854 setJavascriptList(objFactory.createJavascriptList());
855 javascriptItemType = objFactory.createJavascriptItemType();
856 getJavascriptList().getJavascriptItem().add(javascriptItemType);
857 return javascriptItemType;
860 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
861 javascriptItemType = (JavascriptItemType)iter.next();
862 if(javascriptItemType.getId().equals(id) && !id.startsWith("-1")) {
868 return javascriptItemType;
870 javascriptItemType = objFactory.createJavascriptItemType();
871 getJavascriptList().getJavascriptItem().add(javascriptItemType);
872 return javascriptItemType;
876 } // addSemaphoreType
878 public boolean deleteJavascriptType(String id) throws RaptorException {
879 JavascriptItemType javascriptType = null;
880 if (getJavascriptList() == null)
882 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
883 javascriptType = (JavascriptItemType)iter.next();
884 if(javascriptType.getId().equals(id)) {
890 } // addSemaphoreType
892 public static FormatType addEmptyFormatType(ObjectFactory objFactory,
893 SemaphoreType semaphore) throws RaptorException {
894 FormatType fmt = null;
895 fmt = objFactory.createFormatType();
896 semaphore.getFormatList().getFormat().add(fmt);
898 String formatId = null;
899 boolean idExists = true;
900 for (int i = 1; idExists; i++) {
901 formatId = semaphore.getSemaphoreId() + "_fmt" + i;
903 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter
905 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
910 fmt.setFormatId(formatId);
912 } // addEmptyFormatType
914 public static void deleteFormatType(SemaphoreType semaphore, String formatId) {
915 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter.hasNext();)
916 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
920 } // deleteFormatType
922 public FormFieldType addFormFieldType(ObjectFactory objFactory, String fieldName,
923 String colId, String fieldType, String validationType, String mandatory,
924 String defaultValue, String fieldSQL, String comment, Calendar rangeStartDate, Calendar rangeEndDate,
925 String rangeStartDateSQL, String rangeEndDateSQL) throws RaptorException {
926 FormFieldType fft = null;
927 fft = objFactory.createFormFieldType();
929 fft.setFieldName(fieldName);
931 fft.setFieldType(fieldType);
932 fft.setValidationType(validationType);
933 fft.setMandatory(nvl(mandatory, "N"));
934 fft.setDefaultValue(nvl(defaultValue));
935 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
937 fft.setFieldSQL(fieldSQL);
939 fft.setRangeStartDate(DatatypeFactory.newInstance()
940 .newXMLGregorianCalendar(rangeStartDate.YEAR, rangeStartDate.MONTH, rangeStartDate.DAY_OF_WEEK, rangeStartDate.HOUR, rangeStartDate.MINUTE, rangeStartDate.SECOND, rangeStartDate.MILLISECOND, rangeStartDate.ZONE_OFFSET));
941 fft.setRangeStartDate(DatatypeFactory.newInstance()
942 .newXMLGregorianCalendar(rangeEndDate.YEAR, rangeEndDate.MONTH, rangeEndDate.DAY_OF_WEEK, rangeEndDate.HOUR, rangeEndDate.MINUTE, rangeEndDate.SECOND, rangeEndDate.MILLISECOND, rangeEndDate.ZONE_OFFSET));
943 } catch (DatatypeConfigurationException ex) {
947 fft.setRangeStartDateSQL(rangeStartDateSQL);
948 fft.setRangeEndDateSQL(rangeEndDateSQL);
949 if (nvl(comment).length() > 0)
950 fft.setComment(comment);
952 String fieldId = null;
953 boolean idExists = true;
954 for (int i = 1; idExists; i++) {
957 if (getFormFieldList() != null)
958 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
960 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
965 fft.setFieldId(fieldId);
967 if (getFormFieldList() == null) {
968 FormFieldList formFieldList = objFactory.createFormFieldList();
969 setFormFieldList(formFieldList);
972 getFormFieldList().getFormField().add(fft);
974 } // addFormFieldType
976 //addCustomizedTextForParameters
977 public void addCustomizedTextForParameters(String comment) throws RaptorException {
978 getFormFieldList().setComment(comment);
981 public FormFieldType addFormFieldBlank(ObjectFactory objFactory) throws RaptorException {
982 FormFieldType fft = null;
983 fft = objFactory.createFormFieldType();
985 fft.setFieldName("BLANK");
987 fft.setFieldType(FormField.FFT_BLANK);
988 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
990 String fieldId = null;
991 boolean idExists = true;
992 for (int i = 1; idExists; i++) {
995 if (getFormFieldList() != null)
996 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
998 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
1003 fft.setFieldId(fieldId);
1005 if (getFormFieldList() == null) {
1006 FormFieldList formFieldList = objFactory.createFormFieldList();
1007 setFormFieldList(formFieldList);
1010 getFormFieldList().getFormField().add(fft);
1012 } // addFormFieldBlank
1014 public void replaceFormFieldReferences(String fieldName, String replaceWith) {
1015 if (fieldName.equals(replaceWith))
1018 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
1019 DataColumnType dct = (DataColumnType) iter.next();
1021 if (dct.isCalculated() && dct.getColName().indexOf(fieldName) >= 0)
1022 dct.setColName(Utils.replaceInString(dct.getColName(), fieldName, nvl(
1023 replaceWith, "NULL")));
1025 if (dct.getColFilterList() != null)
1026 for (Iterator iter2 = dct.getColFilterList().getColFilter().iterator(); iter2
1028 ColFilterType cft = (ColFilterType) iter2.next();
1030 if (nvl(cft.getArgType()).equals(AppConstants.AT_FORM)
1031 && nvl(cft.getArgValue()).equals(fieldName))
1032 cft.setArgValue(replaceWith);
1035 } // replaceFormFieldReferences
1037 public void deleteFormField(String fieldId) {
1038 String fieldDisplayName = null;
1040 int orderBySeq = Integer.MAX_VALUE;
1041 if (getFormFieldList() != null)
1042 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
1043 FormFieldType fft = (FormFieldType) iter.next();
1045 if (fieldId.equals(fft.getFieldId())) {
1046 fieldDisplayName = getFormFieldDisplayName(fft);
1048 } else if (fft.getOrderBySeq()!=null && (fft.getOrderBySeq().intValue() > orderBySeq))
1049 fft.setOrderBySeq(fft.getOrderBySeq() - 1);
1052 if (fieldDisplayName != null)
1053 replaceFormFieldReferences(fieldDisplayName, "");
1054 } // deleteFormField
1056 public void shiftFormFieldUp(String fieldId) {
1057 if (getFormFieldList() == null)
1060 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1061 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1063 if (fft.getFieldId().equals(fieldId) && (i > 0)) {
1064 FormFieldType prevFft = (FormFieldType) getFormFieldList().getFormField().get(
1066 prevFft.setOrderBySeq(prevFft.getOrderBySeq() + 1);
1067 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() - 1);
1069 getFormFieldList().getFormField().remove(i);
1070 getFormFieldList().getFormField().add(i - 1, fft);
1074 } // shiftFormFieldUp
1076 public void shiftFormFieldDown(String fieldId) {
1077 if (getFormFieldList() == null)
1080 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1081 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1083 if (fft.getFieldId().equals(fieldId)
1084 && (i < getFormFieldList().getFormField().size() - 1)) {
1085 FormFieldType nextFft = (FormFieldType) getFormFieldList().getFormField().get(
1087 nextFft.setOrderBySeq((nextFft.getOrderBySeq() == null)?0:nextFft.getOrderBySeq() - 1);
1088 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() + 1);
1090 getFormFieldList().getFormField().remove(i + 1);
1091 getFormFieldList().getFormField().add(i, nextFft);
1095 } // shiftFormFieldDown
1097 public static void addFormFieldPredefinedValue(ObjectFactory objFactory,
1098 FormFieldType formField, String predefinedValue) throws RaptorException {
1099 if (formField.getPredefinedValueList() == null) {
1100 PredefinedValueList predefinedValueList = objFactory.createPredefinedValueList();
1101 formField.setPredefinedValueList(predefinedValueList);
1104 if (predefinedValue.length() > 0) {
1105 formField.getPredefinedValueList().getPredefinedValue().add(predefinedValue);
1106 Collections.sort(formField.getPredefinedValueList().getPredefinedValue());
1108 } // addFormFieldPredefinedValue
1110 public static void deleteFormFieldPredefinedValue(FormFieldType formField,
1111 String predefinedValue) {
1112 if (formField != null && formField.getPredefinedValueList() != null
1113 && predefinedValue.length() > 0)
1114 for (Iterator iter = formField.getPredefinedValueList().getPredefinedValue()
1115 .iterator(); iter.hasNext();)
1116 if (predefinedValue.equals((String) iter.next())) {
1120 } // deleteFormFieldPredefinedValue
1122 /** ************************************************************************************************* */
1124 private int curSQLParsePos = 0;
1126 private String getNextSQLParseToken(String sql, boolean updateParsePos) {
1127 int braketCount = 0;
1128 boolean isInsideQuote = false;
1129 StringBuffer nextToken = new StringBuffer();
1130 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1131 char ch = sql.charAt(idxNext);
1133 if (Character.isWhitespace(ch) || ch == ',') {
1135 nextToken.append(ch);
1137 if (nextToken.length() == 0)
1139 else if (braketCount == 0 && (!isInsideQuote)) {
1141 curSQLParsePos = idxNext + ((ch == ',') ? 1 : 0);
1143 } else if (ch != ',' && nextToken.charAt(nextToken.length() - 1) != ' ')
1144 nextToken.append(' ');
1146 nextToken.append(ch);
1148 if (ch == '(' || ch == '[')
1150 else if (ch == ')' || ch == ']')
1152 else if (ch == '\''/* ||ch=='\"' */)
1153 isInsideQuote = (!isInsideQuote);
1157 return nextToken.toString();
1158 } // getNextSQLParseToken
1160 private boolean isParseSQLColID(String token) {
1161 if (nvl(token).length() == 0)
1164 for (int i = 0; i < token.length(); i++) {
1165 char ch = token.charAt(i);
1167 if (i == 0 && ch == '_')
1170 if (!(Character.isLetterOrDigit(ch) || ch == '_'))
1175 } // isParseSQLColID
1177 private DataColumnType getParseSQLDataColumn(String sqlExpression, String colId,
1178 StringBuffer parsedSQL, Vector updatedReportCols, boolean isCYMBALScript) throws RaptorException {
1179 DataColumnType dct = null;
1181 if (colId != null) {
1182 if (!isParseSQLColID(colId))
1183 throw new org.onap.portalsdk.analytics.error.ValidationException(
1186 + "] must either be a valid column id consisting only of letters, numbers, and underscores, or there must be a comma in front of it.");
1188 dct = getColumnById(colId);
1190 // Getting unique column id
1193 for (int i = 0; (i < sqlExpression.length()) && (colIdN < 2); i++)
1194 if (Character.isLetter(sqlExpression.charAt(i))) {
1195 colId += sqlExpression.toLowerCase().charAt(i);
1199 colIdN = getAllColumns().size() + updatedReportCols.size();
1200 for (boolean idAlreadyUsed = true; idAlreadyUsed; colIdN++) {
1201 String newColId = colId + colIdN;
1202 idAlreadyUsed = false;
1204 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();)
1205 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1206 idAlreadyUsed = true;
1211 for (Iterator iter = updatedReportCols.iterator(); iter.hasNext();)
1212 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1213 idAlreadyUsed = true;
1218 colId += (colIdN - 1);
1222 dct = (new ObjectFactory()).createDataColumnType();
1223 dct.setColId(colId);
1224 dct.setDisplayWidth(10);
1225 dct.setDisplayAlignment("Left");
1226 dct.setVisible(true);
1227 dct.setGroupBreak(false); // ???
1228 if(!isCYMBALScript) {
1229 boolean isValidIdentifier = Character.isLetterOrDigit(sqlExpression.charAt(0));
1230 for (int i = 0; i < sqlExpression.length(); i++)
1231 if (!(Character.isLetterOrDigit(sqlExpression.charAt(i))
1232 || (sqlExpression.charAt(i) == '_') || (sqlExpression.charAt(i) == '$'))) {
1233 isValidIdentifier = false;
1237 if (isValidIdentifier) {
1238 dct.setDisplayName(sqlExpression);
1240 dct.setDisplayName(colId);
1242 } else dct.setDisplayName(colId);
1245 sqlExpression = sqlExpression.replaceAll(", '", ",'");
1246 dct.setDbColName(sqlExpression);
1247 dct.setColName(sqlExpression);
1248 dct.setCalculated(true);
1249 dct.setColType(AppConstants.CT_CHAR);
1250 dct.setDbColType(AppConstants.CT_CHAR);
1251 adjustColumnType(dct); // ???
1252 if(!isCYMBALScript) {
1253 if (parsedSQL.toString().equals("SELECT ")
1254 || parsedSQL.toString().equals("SELECT DISTINCT "))
1255 parsedSQL.append("\n\t");
1257 parsedSQL.append(", \n\t");
1258 parsedSQL.append(sqlExpression);
1259 parsedSQL.append(" ");
1260 parsedSQL.append(colId);
1264 } // getParseSQLDataColumn
1266 public void parseReportSQL(String sql) throws RaptorException {
1267 StringBuffer parsedSQL = new StringBuffer();
1269 Vector updatedReportCols = new Vector();
1272 int lastParsePos = curSQLParsePos;
1273 String lastToken = null;
1274 String nextToken = getNextSQLParseToken(sql, true);
1276 String dbInfo = getDBInfo();
1277 boolean isCYMBALScript = false;
1278 if (!isNull(dbInfo) && (!dbInfo.equals(AppConstants.DB_LOCAL))) {
1280 String dbType = remDbInfo.getDBType(dbInfo);
1281 if (dbType.equals("DAYTONA") && !(nextToken.toUpperCase().equals("SELECT"))) {
1282 isCYMBALScript = true;
1284 } catch (Exception ex) {
1285 throw new RaptorException(ex);
1288 if ( isCYMBALScript == false ) {
1289 while (nextToken.length() > 0) {
1290 if (parsedSQL.length() == 0) {
1291 if (nextToken.toUpperCase().equals("SELECT"))
1292 parsedSQL.append("SELECT ");
1294 throw new org.onap.portalsdk.analytics.error.ValidationException(
1295 "The SQL must start with the SELECT keyword.");
1296 } else if (nextToken.toUpperCase().equals("DISTINCT")
1297 && parsedSQL.toString().equals("SELECT ")) {
1298 parsedSQL.append("DISTINCT ");
1299 } else if (nextToken.equals("*")
1300 && (parsedSQL.toString().equals("SELECT ") || parsedSQL.toString().equals(
1301 "SELECT DISTINCT "))) {
1302 throw new org.onap.portalsdk.analytics.error.ValidationException(
1303 "You cannot use \"SELECT *\". Please specify select columns/expressions.");
1304 } else if (nextToken.toUpperCase().equals("FROM")) {
1305 if (lastToken != null) {
1306 updatedReportCols.add(getParseSQLDataColumn(lastToken, null, parsedSQL,
1307 updatedReportCols, false));
1311 parsedSQL.append(" \n");
1312 while (lastParsePos < sql.length()
1313 && Character.isWhitespace(sql.charAt(lastParsePos)))
1315 parsedSQL.append(sql.substring(lastParsePos));
1318 if (nextToken.charAt(nextToken.length() - 1) == ',') {
1319 // The token ends with ,
1320 nextToken = nextToken.substring(0, nextToken.length() - 1);
1322 if (nextToken.length() == 0) {
1323 if (lastToken != null) {
1324 updatedReportCols.add(getParseSQLDataColumn(lastToken, null,
1325 parsedSQL, updatedReportCols, false));
1327 } // else just comma => ignore it
1329 if (lastToken != null) {
1330 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1331 parsedSQL, updatedReportCols, false));
1334 updatedReportCols.add(getParseSQLDataColumn(nextToken, null,
1335 parsedSQL, updatedReportCols, false));
1338 // The token doesn't end with ,
1339 if (lastToken == null)
1340 lastToken = nextToken;
1342 String token = getNextSQLParseToken(sql, false);
1343 if (!token.toUpperCase().equals("FROM"))
1344 throw new org.onap.portalsdk.analytics.error.ValidationException(
1345 "|FROM keyword or a comma expected after [" + nextToken
1348 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1349 parsedSQL, updatedReportCols, false));
1355 lastParsePos = curSQLParsePos;
1356 nextToken = getNextSQLParseToken(sql, true);
1358 } else { // if CYMBAL Script
1361 Matcher matcher = null;
1362 String extracted = null;
1363 nextToken = getNextCYMBALSQLParseToken(sql,true);
1364 while (nextToken.length() > 0) {
1365 if (lastToken == null)
1366 lastToken = nextToken;
1368 if( lastToken.toUpperCase().startsWith("DO DISPLAY")) {
1369 re = Pattern.compile("each(.*)\\[.(.*?)\\]"); //\\[(.*?)\\]
1370 matcher = re.matcher(nextToken);
1371 if (matcher.find()) {
1372 extracted = matcher.group();
1373 re = Pattern.compile("\\[(.*?)\\]");
1374 matcher = re.matcher(nextToken);
1375 if(matcher.find()) {
1376 extracted = matcher.group();
1377 extracted = extracted.substring(1,extracted.length()-1);
1378 StringTokenizer sToken = new StringTokenizer(extracted, ",");
1379 while(sToken.hasMoreTokens()) {
1380 String str1 = sToken.nextToken().trim().substring(1);
1381 updatedReportCols.add(getParseSQLDataColumn("", str1,
1382 new StringBuffer(""), updatedReportCols, true));
1389 lastToken = nextToken;
1390 nextToken = getNextCYMBALSQLParseToken(sql, true);
1394 if (updatedReportCols.size() == 0)
1395 throw new org.onap.portalsdk.analytics.error.ValidationException(
1396 "The SQL statement must have at least one column in the SELECT clause.");
1397 if (getDataSourceList().getDataSource().size() == 0)
1398 addDataSourceType(new ObjectFactory(), "du0", "DUAL", "", "DUAL", null, null, null);
1399 DataSourceType dst = (DataSourceType) getDataSourceList().getDataSource().get(0);
1400 dst.getDataColumnList().getDataColumn().clear();
1402 for (int i = 0; i < updatedReportCols.size(); i++) {
1403 DataColumnType dct = (DataColumnType) updatedReportCols.get(i);
1404 dct.setTableId(dst.getTableId());
1405 dct.setOrderSeq(i + 1);
1406 dst.getDataColumnList().getDataColumn().add(dct);
1408 setReportSQL(parsedSQL.toString());
1412 public void parseReportSQL(String sql, boolean storeInSession) throws RaptorException {
1413 StringBuffer parsedSQL = new StringBuffer();
1415 Vector updatedReportCols = new Vector();
1418 int lastParsePos = curSQLParsePos;
1419 String lastToken = null;
1420 String nextToken = getNextSQLParseToken(sql, true);
1422 String dbInfo = getDBInfo();
1423 boolean isCYMBALScript = false;
1424 if (!isNull(dbInfo) && (!dbInfo.equals(AppConstants.DB_LOCAL))) {
1426 String dbType = remDbInfo.getDBType(dbInfo);
1427 if (dbType.equals("DAYTONA") && !(nextToken.toUpperCase().equals("SELECT"))) {
1428 isCYMBALScript = true;
1430 } catch (Exception ex) {
1431 throw new RaptorException(ex);
1434 if ( isCYMBALScript == false ) {
1435 while (nextToken.length() > 0) {
1436 if (parsedSQL.length() == 0) {
1437 if (nextToken.toUpperCase().equals("SELECT"))
1438 parsedSQL.append("SELECT ");
1440 throw new org.onap.portalsdk.analytics.error.ValidationException(
1441 "The SQL must start with the SELECT keyword.");
1442 } else if (nextToken.toUpperCase().equals("DISTINCT")
1443 && parsedSQL.toString().equals("SELECT ")) {
1444 parsedSQL.append("DISTINCT ");
1445 } else if (nextToken.equals("*")
1446 && (parsedSQL.toString().equals("SELECT ") || parsedSQL.toString().equals(
1447 "SELECT DISTINCT "))) {
1448 throw new org.onap.portalsdk.analytics.error.ValidationException(
1449 "You cannot use \"SELECT *\". Please specify select columns/expressions.");
1450 } else if (nextToken.toUpperCase().equals("FROM")) {
1451 if (lastToken != null) {
1452 updatedReportCols.add(getParseSQLDataColumn(lastToken, null, parsedSQL,
1453 updatedReportCols, false));
1457 parsedSQL.append(" \n");
1458 while (lastParsePos < sql.length()
1459 && Character.isWhitespace(sql.charAt(lastParsePos)))
1461 parsedSQL.append(sql.substring(lastParsePos));
1464 if (nextToken.charAt(nextToken.length() - 1) == ',') {
1465 // The token ends with ,
1466 nextToken = nextToken.substring(0, nextToken.length() - 1);
1468 if (nextToken.length() == 0) {
1469 if (lastToken != null) {
1470 updatedReportCols.add(getParseSQLDataColumn(lastToken, null,
1471 parsedSQL, updatedReportCols, false));
1473 } // else just comma => ignore it
1475 if (lastToken != null) {
1476 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1477 parsedSQL, updatedReportCols, false));
1480 updatedReportCols.add(getParseSQLDataColumn(nextToken, null,
1481 parsedSQL, updatedReportCols, false));
1484 // The token doesn't end with ,
1485 if (lastToken == null)
1486 lastToken = nextToken;
1488 String token = getNextSQLParseToken(sql, false);
1489 if (!token.toUpperCase().equals("FROM"))
1490 throw new org.onap.portalsdk.analytics.error.ValidationException(
1491 "|FROM keyword or a comma expected after [" + nextToken
1494 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1495 parsedSQL, updatedReportCols, false));
1501 lastParsePos = curSQLParsePos;
1502 nextToken = getNextSQLParseToken(sql, true);
1504 } else { // if CYMBAL Script
1507 Matcher matcher = null;
1508 String extracted = null;
1509 nextToken = getNextCYMBALSQLParseToken(sql,true);
1510 while (nextToken.length() > 0) {
1511 if (lastToken == null)
1512 lastToken = nextToken;
1514 if( lastToken.toUpperCase().startsWith("DO DISPLAY")) {
1515 re = Pattern.compile("each(.*)\\[.(.*?)\\]"); //\\[(.*?)\\]
1516 matcher = re.matcher(nextToken);
1517 if (matcher.find()) {
1518 extracted = matcher.group();
1519 re = Pattern.compile("\\[(.*?)\\]");
1520 matcher = re.matcher(nextToken);
1521 if(matcher.find()) {
1522 extracted = matcher.group();
1523 extracted = extracted.substring(1,extracted.length()-1);
1524 StringTokenizer sToken = new StringTokenizer(extracted, ",");
1525 while(sToken.hasMoreTokens()) {
1526 String str1 = sToken.nextToken().trim().substring(1);
1527 updatedReportCols.add(getParseSQLDataColumn("", str1,
1528 new StringBuffer(""), updatedReportCols, true));
1535 lastToken = nextToken;
1536 nextToken = getNextCYMBALSQLParseToken(sql, true);
1540 if (updatedReportCols.size() == 0)
1541 throw new org.onap.portalsdk.analytics.error.ValidationException(
1542 "The SQL statement must have at least one column in the SELECT clause.");
1543 if (getDataSourceList().getDataSource().size() == 0)
1544 addDataSourceType(new ObjectFactory(), "du0", "DUAL", "", "DUAL", null, null, null);
1545 DataSourceType dst = (DataSourceType) getDataSourceList().getDataSource().get(0);
1546 dst.getDataColumnList().getDataColumn().clear();
1548 for (int i = 0; i < updatedReportCols.size(); i++) {
1549 DataColumnType dct = (DataColumnType) updatedReportCols.get(i);
1550 dct.setTableId(dst.getTableId());
1551 dct.setOrderSeq(i + 1);
1552 dst.getDataColumnList().getDataColumn().add(dct);
1555 setReportSQL(parsedSQL.toString());
1559 private String getNextCYMBALSQLParseToken(String sql, boolean updateParsePos) {
1560 int braketCount = 0;
1561 boolean isInsideQuote = false;
1562 StringBuffer nextToken = new StringBuffer();
1563 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1564 char ch = sql.charAt(idxNext);
1567 nextToken.append(ch);
1569 curSQLParsePos = idxNext;
1572 curSQLParsePos = idxNext+1;
1577 return nextToken.toString();
1578 } // getNextSQLParseToken
1580 public void addChartAdditionalOptions(ObjectFactory objFactory) throws RaptorException {
1581 ChartAdditionalOptions chartOptions = objFactory.createChartAdditionalOptions();
1582 cr.setChartAdditionalOptions(chartOptions);
1585 public void addChartDrillOptions(ObjectFactory objFactory) throws RaptorException {
1586 ChartDrillOptions chartOptions = objFactory.createChartDrillOptions();
1587 cr.setChartDrillOptions(chartOptions);
1590 public void addDataminingOptions(ObjectFactory objFactory) throws RaptorException {
1591 DataminingOptions dataminingOptions = objFactory.createDataminingOptions();
1592 cr.setDataminingOptions(dataminingOptions);
1595 } // ReportDefinition