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============================================
36 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
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;
55 //import javax.xml.transform.stream.*;
57 import org.onap.portalsdk.analytics.controller.WizardSequence;
58 import org.onap.portalsdk.analytics.controller.WizardSequenceCrossTab;
59 import org.onap.portalsdk.analytics.controller.WizardSequenceDashboard;
60 import org.onap.portalsdk.analytics.controller.WizardSequenceLinear;
61 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedCrossTab;
62 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedHive;
63 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedLinear;
64 import org.onap.portalsdk.analytics.controller.WizardSequenceSQLBasedLinearDatamining;
65 import org.onap.portalsdk.analytics.error.RaptorException;
66 import org.onap.portalsdk.analytics.model.DataCache;
67 import org.onap.portalsdk.analytics.model.ReportLoader;
68 import org.onap.portalsdk.analytics.model.base.OrderBySeqComparator;
69 import org.onap.portalsdk.analytics.model.base.OrderSeqComparator;
70 import org.onap.portalsdk.analytics.model.base.ReportWrapper;
71 import org.onap.portalsdk.analytics.model.runtime.FormField;
72 import org.onap.portalsdk.analytics.system.AppUtils;
73 import org.onap.portalsdk.analytics.system.DbUtils;
74 import org.onap.portalsdk.analytics.system.Globals;
75 import org.onap.portalsdk.analytics.util.AppConstants;
76 import org.onap.portalsdk.analytics.util.DataSet;
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;
97 * This class is part of <B><I>RAPTOR (Rapid Application Programming Tool for OLAP Reporting)</I></B><BR/>
100 * --------------------------------------------------------------------------------------------------<BR/>
101 * <B>ReportDefinition.java</B> - This involves in creating and modifying RAPTOR reports.
102 * --------------------------------------------------------------------------------------------------<BR/>
105 * <U>Change Log</U><BR/><BR/>
107 * 18-Aug-2009 : Version 8.5.1 (Sundar);<UL><LI> request Object is passed to prevent caching user/roles - Datamining/Hosting. </LI></UL>
108 * 27-Jul-2009 : Version 8.4 (Sundar); <UL><LI>userIsAuthorizedToSeeLog is checked for Admin User instead of Super User.</LI></UL>
109 * 22-Jun-2009 : Version 8.4 (Sundar); <UL><LI>A new type ChartAdditionalOptions is introduced in RAPTOR XSD.
110 * For this type a create procedure is added to this class.</LI></UL>
114 public class ReportDefinition extends ReportWrapper implements Serializable {
116 private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ReportDefinition.class);
118 private ReportSchedule reportSchedule = null;
120 private WizardSequence wizardSequence = null;
123 private boolean reportUpdateLogged = false; // Used to avoid multiple
124 // entries in the report log
125 // when persisting report on
128 private ReportDefinition(CustomReportType crType, String reportID, String ownerID,
129 String createID, String createDate, String updateID, String updateDate,
130 String menuID, boolean menuApproved, HttpServletRequest request) throws RaptorException {
131 super(crType, reportID, ownerID, createID, createDate, updateID, updateDate, menuID,
133 if(reportID.equals("-1"))
134 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), false, request);
136 reportSchedule = new ReportSchedule(getReportID(), getOwnerID(), true, request);
137 generateWizardSequence(null);
138 } // ReportDefinition
140 public ReportDefinition(ReportWrapper rw, HttpServletRequest request)throws RaptorException {
143 reportSchedule = new ReportSchedule(reportID, rw.getOwnerID(),false, request);
144 generateWizardSequence(null);
145 } // ReportDefinition
147 private void setReportID(String reportID) {
148 this.reportID = reportID;
149 reportSchedule.setReportID(reportID);
150 reportSchedule.setScheduleUserID(getOwnerID());
153 public ReportSchedule getReportSchedule() {
154 return reportSchedule;
157 public static ReportDefinition unmarshal(String reportXML, String reportID, HttpServletRequest request)
158 throws RaptorException {
159 ReportDefinition rn = null;
160 CustomReportType crType = ReportWrapper.unmarshalCR(reportXML);
161 //Log.write("Report [" + reportID + "]: XML unmarshalled", 4);
162 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] Report [" + reportID + "]: XML unmarshalled"));
164 rn = new ReportDefinition(crType, reportID, null, null, null, null, null, null, false, request);
168 public static ReportDefinition createBlank(HttpServletRequest request) throws RaptorException {
169 String curTime = Utils.getCurrentDateTime();
170 String userID = AppUtils.getUserID(request);
171 ReportDefinition rd = new ReportDefinition(ReportWrapper.createBlankCR(userID), "-1",
172 userID, userID, curTime, userID, curTime, "", false, request);
174 // Necessary initialization
177 } // ReportDefinition
179 public void setAsCopy(HttpServletRequest request) throws RaptorException {
180 verifySQLBasedReportAccess(request);
182 replaceCustomReportWithClone();
185 setReportName("Copy: " + getReportName());
188 public WizardSequence getWizardSequence() {
189 return wizardSequence;
190 } // getWizardSequence
192 public void generateWizardSequence(HttpServletRequest request) throws RaptorException {
193 boolean userIsAuthorizedToSeeLog = false;
194 String userId = null;
196 userId = AppUtils.getUserID(request);
198 userIsAuthorizedToSeeLog = AppUtils.isAdminUser(request)
199 || AppUtils.isAdminUser(request);
200 //System.out.println("******** Report Type "+getReportType() + " userIsAuthorizedToSeeLog " + userIsAuthorizedToSeeLog);
202 if (getReportType().equals(AppConstants.RT_LINEAR)){
203 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
204 wizardSequence = new WizardSequenceSQLBasedLinear(userIsAuthorizedToSeeLog);
205 else if (getReportDefType().equals(AppConstants.RD_SQL_BASED_DATAMIN))
206 wizardSequence = new WizardSequenceSQLBasedLinearDatamining(userIsAuthorizedToSeeLog);
208 wizardSequence = new WizardSequenceLinear(userIsAuthorizedToSeeLog);
209 } else if (getReportType().equals(AppConstants.RT_CROSSTAB)) {
210 if (getReportDefType().equals(AppConstants.RD_SQL_BASED))
211 wizardSequence = new WizardSequenceSQLBasedCrossTab(userIsAuthorizedToSeeLog);
213 wizardSequence = new WizardSequenceCrossTab(userIsAuthorizedToSeeLog);
214 } else if (getReportType().equals(AppConstants.RT_DASHBOARD)) {
215 wizardSequence = new WizardSequenceDashboard(userIsAuthorizedToSeeLog);
216 } else if (getReportType().equals(AppConstants.RT_HIVE)) {
217 wizardSequence = new WizardSequenceSQLBasedHive(userIsAuthorizedToSeeLog);
219 wizardSequence = new WizardSequence();
220 } // generateWizardSequence
222 private boolean canPersistDashboard() {
223 //System.out.println(" getDashBoardReports().getReportsList().size() " + getDashBoardReports().getReportsList().size());
224 /* Commented for New DashBoard
225 if (getDashBoardReports()!=null && getDashBoardReports().getReportsList()!=null && getDashBoardReports().getReportsList().size() > 0) {
226 for (Iterator iter = getDashBoardReports().getReportsList().iterator(); iter.hasNext();) {
227 Reports report = (Reports)iter.next();
229 if(Integer.parseInt(report.getReportId())>0) return true;
230 } catch (NumberFormatException ex) {}
236 return nvl(getDashboardLayoutHTML()).length() > 0;
237 } //canPersistDashboard
239 private boolean canPersistLinearReport() {
240 System.out.println("&&&&&&&&&&&&&&&&&&&&&& canPersistLinearReport");
241 boolean visibleColExist = false;
243 if (getDataSourceList().getDataSource().size() > 0) {
244 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
245 DataColumnType dct = (DataColumnType) iter.next();
247 if (dct.isVisible()) {
248 visibleColExist = true;
254 System.out.println("&&&&&&&&&&&&&&&&&&&&&& visibleColExist " + visibleColExist);
255 return visibleColExist;
256 } // canPersistLinearReport
258 private boolean canPersistCrossTabReport() {
259 boolean rowColExist = false;
260 boolean colColExist = false;
261 boolean valColExist = false;
263 if (getDataSourceList().getDataSource().size() > 0) {
264 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
265 DataColumnType dct = (DataColumnType) iter.next();
267 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_ROW))
269 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_COLUMN))
271 if (nvl(dct.getCrossTabValue()).equals(AppConstants.CV_VALUE))
276 return rowColExist && colColExist && valColExist;
277 } // canPersistCrossTabReport
279 private boolean canPersistReport() {
280 return getReportType().equals(AppConstants.RT_CROSSTAB) ? canPersistCrossTabReport()
281 : (getReportType().equals(AppConstants.RT_LINEAR)? canPersistLinearReport():((getReportType().equals(AppConstants.RT_HIVE)? canPersistLinearReport():canPersistDashboard())));
282 } // canPersistReport
284 public void persistReport(HttpServletRequest request) throws RaptorException {
285 if (!canPersistReport()) {
286 System.out.println("&&&&&&&&&&&&&&&&&&&&&& In !canPersistReport ReportType: " + getReportType());
289 System.out.println("&&&&&&&&&&&&&&&&&&&&&& Not In !canPersistReport");
292 Connection connection = null;
294 String userID = AppUtils.getUserID(request);
295 String reportXML = marshal();
296 logger.debug(EELFLoggerDelegate.debugLogger, ("Ocurring during Schedule "));
297 System.out.println("&&&&&&&&&&&&&&&&&&&&&& Report ID " + reportID);
298 if (nvl(reportID, "-1").equals("-1")) {
299 connection = DbUtils.startTransaction();
302 if (nvl(Globals.getAdhocReportSequence()).length()> 0 && nvl(Globals.getAdhocUserRoldId()).length() > 0 && AppUtils.isUserInRole(request, Globals.getAdhocUserRoldId()) && !AppUtils.isAdminUser(request)) {
303 //sql = "SELECT "+ Globals.getAdhocReportSequence() + ".nextval FROM dual";
304 sql = Globals.getPersistReportAdhoc();
305 sql = sql.replace("[Globals.getAdhocReportSequence()]", Globals.getAdhocReportSequence());
308 //sql = "SELECT seq_cr_report.nextval FROM dual";
309 sql = Globals.getNewReportData();
311 DataSet ds = DbUtils.executeQuery(connection,sql);
312 setReportID(ds.getString(0, 0));
314 reportSecurity.reportCreate(reportID, userID, isPublic());
315 ReportLoader.createCustomReportRec(connection, this, reportXML);
316 ReportLoader.createReportLogEntry(connection, reportID, userID,
317 AppConstants.RLA_CREATE, "", "");
318 reportUpdateLogged = true;
319 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB insert report " + reportID + " succesfull"));
322 verifySQLBasedReportAccess(request);
323 reportSecurity.reportUpdate(request);
324 connection = DbUtils.startTransaction();
325 ReportLoader.updateCustomReportRec(connection, this, reportXML);
326 if (!reportUpdateLogged) {
327 ReportLoader.createReportLogEntry(connection, reportID, userID,
328 AppConstants.RLA_UPDATE,"","");
329 reportUpdateLogged = true;
331 logger.debug(EELFLoggerDelegate.debugLogger, ("[DEBUG MESSAGE FROM RAPTOR] DB update report " + reportID + " succesfull"));
334 getReportSchedule().persistScheduleData(connection, request);
336 DbUtils.commitTransaction(connection);
337 } catch (RaptorException e) {
339 DbUtils.rollbackTransaction(connection);
342 DbUtils.clearConnection(connection);
346 public String getCrossTabDisplayValue(String crossTabValue) {
347 return nvl(crossTabValue).equals(AppConstants.CV_ROW) ? "Row headings" : (nvl(
348 crossTabValue).equals(AppConstants.CV_COLUMN) ? "Column headings" : (nvl(
349 crossTabValue).equals(AppConstants.CV_VALUE) ? "Report values" : "Invisible/Filter"));
350 } // getCrossTabDisplayValue
352 public String getCrossTabDisplayValue(DataColumnType dct) {
353 return getCrossTabDisplayValue(dct.getCrossTabValue());
354 } // getCrossTabDisplayValue
356 public String getColumnLabel(DataColumnType dct) throws Exception {
357 String tableName = getTableById(dct.getTableId()).getTableName();
358 Vector dbColumns = null;
359 dbColumns = DataCache.getReportTableDbColumns(tableName, cr.getDbInfo());
360 if (dbColumns != null)
361 for (int i = 0; i < dbColumns.size(); i++) {
362 DBColumnInfo dbCol = (DBColumnInfo) dbColumns.get(i);
363 if (dct.getDbColName().equals(dbCol.getColName()))
364 return dbCol.getLabel();
368 } // getCrossTabDisplayValue
370 public String getFilterLabel(ColFilterType cft) {
371 StringBuffer fLabel = new StringBuffer();
373 fLabel.append(cft.getExpression());
375 if (cft.getArgType() != null)
376 if (cft.getArgType().equals(AppConstants.AT_FORMULA)) {
377 fLabel.append("[" + cft.getArgValue() + "]");
378 } else if (cft.getArgType().equals(AppConstants.AT_VALUE)) {
379 fLabel.append(cft.getArgValue());
380 } else if (cft.getArgType().equals(AppConstants.AT_LIST)) {
381 fLabel.append("(" + cft.getArgValue() + ")");
382 } else if (cft.getArgType().equals(AppConstants.AT_COLUMN)) {
383 DataColumnType dctFilter = getColumnById(cft.getArgValue());
384 fLabel.append("[" + dctFilter.getDisplayName() + "]");
385 } else if (cft.getArgType().equals(AppConstants.AT_FORM)) {
386 fLabel.append("[Form Field]");
389 return fLabel.toString();
392 public Vector getReportUsers(HttpServletRequest request) throws RaptorException {
393 return reportSecurity.getReportUsers(request);
396 public Vector getReportRoles(HttpServletRequest request) throws RaptorException {
397 return reportSecurity.getReportRoles(request);
400 /** ************************************************************************************************* */
402 public void clearAllDrillDowns() {
403 List reportCols = getAllColumns();
404 for (int i = 0; i < reportCols.size(); i++) {
405 DataColumnType dct = (DataColumnType) reportCols.get(i);
406 dct.setDrillDownURL(null);
407 dct.setDrillDownParams(null);
408 dct.setDrillDownType(null);
410 } // clearAllDrillDowns
412 public void setOuterJoin(DataSourceType curTable, String joinType) {
413 String refDefinition = nvl(curTable.getRefDefinition());
414 int outerJoinIdx = refDefinition.indexOf(" (+)");
415 if (outerJoinIdx >= 0)
416 // Clear existing outer join
417 if (outerJoinIdx == (refDefinition.length() - 4))
418 refDefinition = refDefinition.substring(0, outerJoinIdx);
420 refDefinition = refDefinition.substring(0, outerJoinIdx)
421 + refDefinition.substring(outerJoinIdx + 4);
423 int equalSignIdx = refDefinition.indexOf("=");
424 if (equalSignIdx < 0)
425 // Ref. definition not present
428 if (refDefinition.indexOf(curTable.getTableId()) < equalSignIdx) {
429 // Cur. table is on the left side
430 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
431 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
432 + refDefinition.substring(equalSignIdx);
433 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
434 refDefinition = refDefinition + " (+)";
436 // Joined table is on the left side
437 if (nvl(joinType).equals(AppConstants.OJ_CURRENT))
438 refDefinition = refDefinition + " (+)";
439 else if (nvl(joinType).equals(AppConstants.OJ_JOINED))
440 refDefinition = refDefinition.substring(0, equalSignIdx) + " (+)"
441 + refDefinition.substring(equalSignIdx);
444 curTable.setRefDefinition(refDefinition);
447 public void addDataSourceType(ObjectFactory objFactory, String tableId, String tableName,
448 String tablePK, String displayName, String refTableId, String refDefinition,
449 String comment) throws RaptorException {
450 DataSourceType dst = objFactory.createDataSourceType();
452 dst.setTableId(tableId);
453 dst.setTableName(tableName);
454 dst.setTablePK(tablePK);
455 dst.setDisplayName(displayName);
456 if (nvl(refTableId).length() > 0)
457 dst.setRefTableId(refTableId);
458 if (nvl(refDefinition).length() > 0)
459 dst.setRefDefinition(refDefinition);
460 if (nvl(comment).length() > 0)
461 dst.setComment(comment);
463 DataColumnList dataColumnList = objFactory.createDataColumnList();
464 dst.setDataColumnList(dataColumnList);
466 getDataSourceList().getDataSource().add(dst);
469 } // addDataSourceType
471 public void deleteDataSourceType(String tableId) {
472 super.deleteDataSourceType(tableId);
473 } // deleteDataSourceType
475 public String getUniqueColumnId(String colName) {
478 int colIdN = getAllColumns().size() + 1;
480 colId = colName.substring(0, 2).toLowerCase() + (colIdN++);
481 } while (getColumnById(colId) != null);
484 } // getUniqueColumnId
486 public DataColumnType addDataColumnType(ObjectFactory objFactory, String colId,
487 String tableId, // Table to which the new column belongs
488 String dbColName, String crossTabValue, String colName, String displayName,
489 int displayWidth, String displayAlignment, int orderSeq, boolean visible,
490 boolean calculated, String colType, String colFormat, boolean groupBreak,
491 int orderBySeq, String orderByAscDesc, String displayTotal, String colOnChart,
492 int chartSeq, String drillDownType, String drillDownURL, String drillDownParams,
493 String semaphoreId, String comment) throws RaptorException {
494 DataColumnType dct = null;
495 dct = objFactory.createDataColumnType();
498 dct.setTableId(tableId);
499 dct.setDbColName(dbColName);
500 if (nvl(crossTabValue).length() > 0)
501 dct.setCrossTabValue(crossTabValue);
502 dct.setColName(colName);
503 dct.setDisplayName(displayName);
504 if (displayWidth > 0)
505 dct.setDisplayWidth(displayWidth);
506 if (nvl(displayAlignment).length() > 0)
507 dct.setDisplayAlignment(displayAlignment);
509 dct.setOrderSeq(orderSeq);
511 dct.setOrderSeq(getAllColumns().size() + 1);
512 dct.setVisible(visible);
513 dct.setCalculated(calculated);
514 // dct.setColType(colType);
515 if (nvl(colFormat).length() > 0)
516 dct.setColFormat(colFormat);
517 dct.setGroupBreak(groupBreak);
519 dct.setOrderBySeq(orderBySeq);
520 if (nvl(orderByAscDesc).length() > 0)
521 dct.setOrderByAscDesc(orderByAscDesc);
522 if (nvl(displayTotal).length() > 0)
523 dct.setDisplayTotal(displayTotal);
524 if (nvl(colOnChart).length() > 0)
525 dct.setColOnChart(colOnChart);
527 dct.setChartSeq(chartSeq);
528 if (nvl(drillDownType).length() > 0)
529 dct.setDrillDownType(drillDownType);
530 if (nvl(drillDownURL).length() > 0)
531 dct.setDrillDownURL(drillDownURL);
532 if (nvl(drillDownParams).length() > 0)
533 dct.setDrillDownParams(drillDownParams);
534 if (nvl(semaphoreId).length() > 0)
535 dct.setSemaphoreId(semaphoreId);
536 if (nvl(comment).length() > 0)
537 dct.setComment(comment);
539 dct.setDbColType(colType);
540 adjustColumnType(dct);
542 // ColFilterList colFilterList = objFactory.createColFilterList();
543 // dct.setColFilterList(colFilterList);
545 getTableById(tableId).getDataColumnList().getDataColumn().add(dct);
550 } // addDataColumnType
552 public void deleteDataColumnType(String colId) {
553 int colOrder = getColumnById(colId).getOrderSeq();
555 List dcList = getColumnTableById(colId).getDataColumnList().getDataColumn();
556 for (Iterator iterC = dcList.iterator(); iterC.hasNext();) {
557 DataColumnType dct = (DataColumnType) iterC.next();
559 if (dct.getColId().equals(colId) && dct.getOrderSeq() == colOrder)
561 else if (dct.getOrderSeq() > colOrder)
562 dct.setOrderSeq(dct.getOrderSeq() - 1);
565 if (getFormFieldList() != null)
566 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
567 FormFieldType fft = (FormFieldType) iter.next();
568 if (nvl(fft.getColId()).equals(colId)) {
570 fft.setFieldType(FormField.FFT_TEXT);
571 if (nvl(fft.getDefaultValue()).equals(AppConstants.FILTER_MAX_VALUE)
572 || nvl(fft.getDefaultValue())
573 .equals(AppConstants.FILTER_MIN_VALUE))
574 fft.setDefaultValue("");
579 resetColumnOrderValues();
580 } // deleteDataColumnType
582 public void shiftColumnOrderUp(String colId) {
583 List reportCols = getAllColumns();
584 for (int i = 0; i < reportCols.size(); i++) {
585 DataColumnType dct = (DataColumnType) reportCols.get(i);
587 if (dct.getColId().equals(colId) && (i > 0)) {
588 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
589 dctUp.setOrderSeq(dctUp.getOrderSeq() + 1);
590 dct.setOrderSeq(dct.getOrderSeq() - 1);
595 Collections.sort(reportCols, new OrderSeqComparator());
597 resetColumnOrderValues();
598 } // shiftColumnOrderUp
600 public void shiftColumnOrderDown(String colId) {
601 List reportCols = getAllColumns();
602 for (int i = 0; i < reportCols.size(); i++) {
603 DataColumnType dct = (DataColumnType) reportCols.get(i);
605 if (dct.getColId().equals(colId) && (i < reportCols.size() - 1)) {
606 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
607 dctDown.setOrderSeq(dctDown.getOrderSeq() - 1);
608 dct.setOrderSeq(dct.getOrderSeq() + 1);
613 Collections.sort(reportCols, new OrderSeqComparator());
615 resetColumnOrderValues();
616 } // shiftColumnOrderDown
618 public void resetColumnOrderValues() {
619 List reportCols = getAllColumns();
622 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
623 DataColumnType dct = (DataColumnType) iter.next();
624 dct.setOrderSeq(++colOrder);
627 Collections.sort(reportCols, new OrderSeqComparator());
628 } // resetColumnOrderValues
630 public void addColFilterType(ObjectFactory objFactory, String colId, // Column
637 String joinCondition, String openBrackets, String expression, String argType,
638 String argValue, String closeBrackets, String comment) throws RaptorException {
639 ColFilterType cft = objFactory.createColFilterType();
642 cft.setJoinCondition(nvl(joinCondition, "AND"));
643 if (nvl(openBrackets).length() > 0)
644 cft.setOpenBrackets(openBrackets);
645 cft.setExpression(expression);
646 if (nvl(argType).length() > 0)
647 cft.setArgType(argType);
648 if (nvl(argValue).length() > 0)
649 cft.setArgValue(argValue);
650 if (nvl(closeBrackets).length() > 0)
651 cft.setCloseBrackets(closeBrackets);
652 if (nvl(comment).length() > 0)
653 cft.setComment(comment);
655 DataColumnType dct = getColumnById(colId);
657 if (dct.getColFilterList() == null)
658 dct.setColFilterList(objFactory.createColFilterList());
660 cft.setFilterSeq(dct.getColFilterList().getColFilter().size());
661 dct.getColFilterList().getColFilter().add(cft);
665 } // addColFilterType
667 public void removeColumnFilter(String colId, int filterPos) {
668 DataColumnType dct = getColumnById(colId);
670 if (dct.getColFilterList() != null)
672 dct.getColFilterList().getColFilter().remove(filterPos);
673 } catch (IndexOutOfBoundsException e) {
677 } // removeColumnFilter
679 public void addColumnSort(String colId, String ascDesc) {
680 addColumnSort(colId, ascDesc, -1);
683 public void addColumnSort(String colId, String ascDesc, int sortOrder) {
684 if (sortOrder <= 0) {
686 List reportCols = getAllColumns();
687 for (Iterator iter = reportCols.iterator(); iter.hasNext();)
688 if (((DataColumnType) iter.next()).getOrderBySeq() > 0)
692 DataColumnType dct = getColumnById(colId);
693 dct.setOrderBySeq(sortOrder);
694 dct.setOrderByAscDesc(ascDesc);
699 public void removeColumnSort(String colId) {
700 DataColumnType dct = getColumnById(colId);
701 int sortOrder = dct.getOrderBySeq();
703 dct.setOrderBySeq(0);
704 dct.setOrderByAscDesc(null);
707 List reportCols = getAllColumns();
708 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
709 DataColumnType dct2 = (DataColumnType) iter.next();
711 if (dct2.getOrderBySeq() > sortOrder)
712 dct2.setOrderBySeq(dct2.getOrderBySeq() - 1);
717 } // removeColumnSort
719 public void shiftColumnSortUp(String colId) {
720 List reportCols = getAllColumns();
721 Collections.sort(reportCols, new OrderBySeqComparator());
723 for (int i = 0; i < reportCols.size(); i++) {
724 DataColumnType dct = (DataColumnType) reportCols.get(i);
726 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
727 DataColumnType dctUp = (DataColumnType) reportCols.get(i - 1);
728 if (dctUp.getOrderBySeq() > 0)
729 dctUp.setOrderBySeq(dctUp.getOrderBySeq() + 1);
730 dct.setOrderBySeq(dct.getOrderBySeq() - 1);
735 Collections.sort(reportCols, new OrderSeqComparator());
737 } // shiftColumnSortUp
739 public void shiftColumnSortDown(String colId) {
740 List reportCols = getAllColumns();
741 Collections.sort(reportCols, new OrderBySeqComparator());
743 for (int i = 0; i < reportCols.size(); i++) {
744 DataColumnType dct = (DataColumnType) reportCols.get(i);
746 if (dct.getColId().equals(colId) && (dct.getOrderBySeq() > 0)) {
747 DataColumnType dctDown = (DataColumnType) reportCols.get(i + 1);
748 if (dctDown.getOrderBySeq() > 0)
749 dctDown.setOrderBySeq(dctDown.getOrderBySeq() - 1);
750 dct.setOrderBySeq(dct.getOrderBySeq() + 1);
755 Collections.sort(reportCols, new OrderSeqComparator());
757 } // shiftColumnSortDown
759 /** ************************************************************************************************* */
761 public String generateNewSemaphoreId() {
762 if (getSemaphoreList() == null)
765 String semaphoreId = null;
766 boolean idExists = true;
767 for (int i = 1; idExists; i++) {
768 semaphoreId = "sem" + i;
770 for (Iterator iter = getSemaphoreList().getSemaphore().iterator(); iter.hasNext();)
771 if (semaphoreId.equals(((SemaphoreType) iter.next()).getSemaphoreId())) {
778 } // generateNewSemaphoreId
780 public SemaphoreType addSemaphore(ObjectFactory objFactory, SemaphoreType semaphoreType)
781 throws RaptorException {
782 SemaphoreType sem = null;
784 if (getSemaphoreList() == null)
785 setSemaphoreList(objFactory.createSemaphoreList());
787 String semaphoreName = null;
788 boolean nameExists = true;
789 for (int i = 1; nameExists; i++) {
790 semaphoreName = semaphoreType.getSemaphoreName() + ((i > 1) ? (" v" + i) : "");
792 for (Iterator iter2 = getSemaphoreList().getSemaphore().iterator(); iter2
794 if (semaphoreName.equals(((SemaphoreType) iter2.next()).getSemaphoreName())) {
800 sem = cloneSemaphoreType(objFactory, semaphoreType);
801 getSemaphoreList().getSemaphore().add(sem);
803 sem.setSemaphoreId(generateNewSemaphoreId());
804 sem.setSemaphoreName(semaphoreName);
805 } catch (JAXBException ex) {
806 throw new RaptorException(ex.getMessage(), ex.getCause());
812 public SemaphoreType addSemaphoreType(ObjectFactory objFactory, String semaphoreName,
813 String semaphoreType, String comment) throws RaptorException {
814 SemaphoreType sem = null;
815 if (getSemaphoreList() == null)
816 setSemaphoreList(objFactory.createSemaphoreList());
818 sem = objFactory.createSemaphoreType();
819 getSemaphoreList().getSemaphore().add(sem);
821 sem.setSemaphoreId(generateNewSemaphoreId());
822 sem.setSemaphoreName(semaphoreName);
823 sem.setSemaphoreType(nvl(semaphoreType));
824 if (nvl(comment).length() > 0)
825 sem.setComment(comment);
827 FormatList formatList = objFactory.createFormatList();
828 sem.setFormatList(formatList);
830 } // addSemaphoreType
833 public String getNextIdForJavaScriptElement (ObjectFactory objFactory, String fieldId) throws RaptorException {
835 JavascriptItemType jit = null;
837 if (getJavascriptList() == null) {
838 setJavascriptList(objFactory.createJavascriptList());
839 return fieldId + "|1";
841 if(getJavascriptList().getJavascriptItem().iterator().hasNext()) {
842 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
843 jit = (JavascriptItemType) iter.next();
844 logger.debug(EELFLoggerDelegate.debugLogger, ("^^^^^JAVASCRIPTITEMTYPE " + jit.getFieldId() + " " + fieldId + " " + id));
845 if(nvl(jit.getFieldId()).length()>0 && jit.getFieldId().equals(fieldId)) {
849 return fieldId + "|"+incr;
851 return fieldId + "|1";
858 public JavascriptItemType addJavascriptType(ObjectFactory objFactory, String id) throws RaptorException {
859 JavascriptItemType javascriptItemType = null;
860 int flag = 0; // checking whether id existing in the list
861 if (getJavascriptList() == null) {
862 setJavascriptList(objFactory.createJavascriptList());
863 javascriptItemType = objFactory.createJavascriptItemType();
864 getJavascriptList().getJavascriptItem().add(javascriptItemType);
865 return javascriptItemType;
868 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
869 javascriptItemType = (JavascriptItemType)iter.next();
870 if(javascriptItemType.getId().equals(id) && !id.startsWith("-1")) {
875 if(flag == 1) return javascriptItemType;
877 javascriptItemType = objFactory.createJavascriptItemType();
878 getJavascriptList().getJavascriptItem().add(javascriptItemType);
879 return javascriptItemType;
883 } // addSemaphoreType
885 public boolean deleteJavascriptType(String id) throws RaptorException {
886 JavascriptItemType javascriptType = null;
887 if (getJavascriptList() == null)
889 for (Iterator iter = getJavascriptList().getJavascriptItem().iterator(); iter.hasNext();) {
890 javascriptType = (JavascriptItemType)iter.next();
891 if(javascriptType.getId().equals(id)) {
897 } // addSemaphoreType
899 public static FormatType addEmptyFormatType(ObjectFactory objFactory,
900 SemaphoreType semaphore) throws RaptorException {
901 FormatType fmt = null;
902 fmt = objFactory.createFormatType();
903 semaphore.getFormatList().getFormat().add(fmt);
905 String formatId = null;
906 boolean idExists = true;
907 for (int i = 1; idExists; i++) {
908 formatId = semaphore.getSemaphoreId() + "_fmt" + i;
910 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter
912 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
917 fmt.setFormatId(formatId);
919 } // addEmptyFormatType
921 public static void deleteFormatType(SemaphoreType semaphore, String formatId) {
922 for (Iterator iter = semaphore.getFormatList().getFormat().iterator(); iter.hasNext();)
923 if (formatId.equals(((FormatType) iter.next()).getFormatId())) {
927 } // deleteFormatType
929 public FormFieldType addFormFieldType(ObjectFactory objFactory, String fieldName,
930 String colId, String fieldType, String validationType, String mandatory,
931 String defaultValue, String fieldSQL, String comment, Calendar rangeStartDate, Calendar rangeEndDate,
932 String rangeStartDateSQL, String rangeEndDateSQL) throws RaptorException {
933 FormFieldType fft = null;
934 fft = objFactory.createFormFieldType();
936 fft.setFieldName(fieldName);
938 fft.setFieldType(fieldType);
939 fft.setValidationType(validationType);
940 fft.setMandatory(nvl(mandatory, "N"));
941 fft.setDefaultValue(nvl(defaultValue));
942 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
944 fft.setFieldSQL(fieldSQL);
945 //fft.setRangeStartDate(rangeStartDate);
946 //fft.setRangeEndDate(rangeEndDate);
949 fft.setRangeStartDate(DatatypeFactory.newInstance()
950 .newXMLGregorianCalendar(rangeStartDate.YEAR, rangeStartDate.MONTH, rangeStartDate.DAY_OF_WEEK, rangeStartDate.HOUR, rangeStartDate.MINUTE, rangeStartDate.SECOND, rangeStartDate.MILLISECOND, rangeStartDate.ZONE_OFFSET));
951 fft.setRangeStartDate(DatatypeFactory.newInstance()
952 .newXMLGregorianCalendar(rangeEndDate.YEAR, rangeEndDate.MONTH, rangeEndDate.DAY_OF_WEEK, rangeEndDate.HOUR, rangeEndDate.MINUTE, rangeEndDate.SECOND, rangeEndDate.MILLISECOND, rangeEndDate.ZONE_OFFSET));
953 /*currField.setRangeEndDate(DatatypeFactory.newInstance()
954 .newXMLGregorianCalendar(end));*/
955 } catch (DatatypeConfigurationException ex) {
959 fft.setRangeStartDateSQL(rangeStartDateSQL);
960 fft.setRangeEndDateSQL(rangeEndDateSQL);
961 if (nvl(comment).length() > 0)
962 fft.setComment(comment);
964 String fieldId = null;
965 boolean idExists = true;
966 for (int i = 1; idExists; i++) {
969 if (getFormFieldList() != null)
970 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
972 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
977 fft.setFieldId(fieldId);
979 if (getFormFieldList() == null) {
980 FormFieldList formFieldList = objFactory.createFormFieldList();
981 setFormFieldList(formFieldList);
984 getFormFieldList().getFormField().add(fft);
986 } // addFormFieldType
988 //addCustomizedTextForParameters
989 public void addCustomizedTextForParameters(String comment) throws RaptorException {
990 getFormFieldList().setComment(comment);
993 public FormFieldType addFormFieldBlank(ObjectFactory objFactory) throws RaptorException {
994 FormFieldType fft = null;
995 fft = objFactory.createFormFieldType();
997 fft.setFieldName("BLANK");
999 fft.setFieldType(FormField.FFT_BLANK);
1000 fft.setOrderBySeq((getFormFieldList() == null) ? 1 : getFormFieldList().getFormField()
1002 String fieldId = null;
1003 boolean idExists = true;
1004 for (int i = 1; idExists; i++) {
1007 if (getFormFieldList() != null)
1008 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter
1010 if (fieldId.equals(((FormFieldType) iter.next()).getFieldId())) {
1015 fft.setFieldId(fieldId);
1017 if (getFormFieldList() == null) {
1018 FormFieldList formFieldList = objFactory.createFormFieldList();
1019 setFormFieldList(formFieldList);
1022 getFormFieldList().getFormField().add(fft);
1024 } // addFormFieldBlank
1026 public void replaceFormFieldReferences(String fieldName, String replaceWith) {
1027 if (fieldName.equals(replaceWith))
1030 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();) {
1031 DataColumnType dct = (DataColumnType) iter.next();
1033 if (dct.isCalculated() && dct.getColName().indexOf(fieldName) >= 0)
1034 dct.setColName(Utils.replaceInString(dct.getColName(), fieldName, nvl(
1035 replaceWith, "NULL")));
1037 if (dct.getColFilterList() != null)
1038 for (Iterator iter2 = dct.getColFilterList().getColFilter().iterator(); iter2
1040 ColFilterType cft = (ColFilterType) iter2.next();
1042 if (nvl(cft.getArgType()).equals(AppConstants.AT_FORM)
1043 && nvl(cft.getArgValue()).equals(fieldName))
1044 cft.setArgValue(replaceWith);
1047 } // replaceFormFieldReferences
1049 public void deleteFormField(String fieldId) {
1050 String fieldDisplayName = null;
1052 int orderBySeq = Integer.MAX_VALUE;
1053 if (getFormFieldList() != null)
1054 for (Iterator iter = getFormFieldList().getFormField().iterator(); iter.hasNext();) {
1055 FormFieldType fft = (FormFieldType) iter.next();
1057 if (fieldId.equals(fft.getFieldId())) {
1058 //orderBySeq = fft.getOrderBySeq();
1059 fieldDisplayName = getFormFieldDisplayName(fft);
1061 } else if (fft.getOrderBySeq()!=null && (fft.getOrderBySeq().intValue() > orderBySeq))
1062 fft.setOrderBySeq(fft.getOrderBySeq() - 1);
1065 if (fieldDisplayName != null)
1066 replaceFormFieldReferences(fieldDisplayName, "");
1067 } // deleteFormField
1069 public void shiftFormFieldUp(String fieldId) {
1070 if (getFormFieldList() == null)
1073 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1074 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1076 if (fft.getFieldId().equals(fieldId) && (i > 0)) {
1077 FormFieldType prevFft = (FormFieldType) getFormFieldList().getFormField().get(
1079 prevFft.setOrderBySeq(prevFft.getOrderBySeq() + 1);
1080 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() - 1);
1082 getFormFieldList().getFormField().remove(i);
1083 getFormFieldList().getFormField().add(i - 1, fft);
1087 } // shiftFormFieldUp
1089 public void shiftFormFieldDown(String fieldId) {
1090 if (getFormFieldList() == null)
1093 for (int i = 0; i < getFormFieldList().getFormField().size(); i++) {
1094 FormFieldType fft = (FormFieldType) getFormFieldList().getFormField().get(i);
1096 if (fft.getFieldId().equals(fieldId)
1097 && (i < getFormFieldList().getFormField().size() - 1)) {
1098 FormFieldType nextFft = (FormFieldType) getFormFieldList().getFormField().get(
1100 nextFft.setOrderBySeq((nextFft.getOrderBySeq() == null)?0:nextFft.getOrderBySeq() - 1);
1101 fft.setOrderBySeq((fft.getOrderBySeq() == null)?0:fft.getOrderBySeq() + 1);
1103 getFormFieldList().getFormField().remove(i + 1);
1104 getFormFieldList().getFormField().add(i, nextFft);
1108 } // shiftFormFieldDown
1110 public static void addFormFieldPredefinedValue(ObjectFactory objFactory,
1111 FormFieldType formField, String predefinedValue) throws RaptorException {
1112 if (formField.getPredefinedValueList() == null) {
1113 PredefinedValueList predefinedValueList = objFactory.createPredefinedValueList();
1114 formField.setPredefinedValueList(predefinedValueList);
1117 if (predefinedValue.length() > 0) {
1118 formField.getPredefinedValueList().getPredefinedValue().add(predefinedValue);
1119 Collections.sort(formField.getPredefinedValueList().getPredefinedValue());
1121 } // addFormFieldPredefinedValue
1123 public static void deleteFormFieldPredefinedValue(FormFieldType formField,
1124 String predefinedValue) {
1125 if (formField != null && formField.getPredefinedValueList() != null
1126 && predefinedValue.length() > 0)
1127 for (Iterator iter = formField.getPredefinedValueList().getPredefinedValue()
1128 .iterator(); iter.hasNext();)
1129 if (predefinedValue.equals((String) iter.next())) {
1133 } // deleteFormFieldPredefinedValue
1135 /** ************************************************************************************************* */
1137 private int curSQLParsePos = 0;
1139 private String getNextSQLParseToken(String sql, boolean updateParsePos) {
1140 int braketCount = 0;
1141 boolean isInsideQuote = false;
1142 StringBuffer nextToken = new StringBuffer();
1143 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1144 char ch = sql.charAt(idxNext);
1146 if (Character.isWhitespace(ch) || ch == ',') {
1148 nextToken.append(ch);
1150 if (nextToken.length() == 0)
1152 else if (braketCount == 0 && (!isInsideQuote)) {
1154 curSQLParsePos = idxNext + ((ch == ',') ? 1 : 0);
1156 } else if (ch != ',' && nextToken.charAt(nextToken.length() - 1) != ' ')
1157 nextToken.append(' ');
1159 nextToken.append(ch);
1161 if (ch == '(' || ch == '[')
1163 else if (ch == ')' || ch == ']')
1165 else if (ch == '\''/* ||ch=='\"' */)
1166 isInsideQuote = (!isInsideQuote);
1170 return nextToken.toString();
1171 } // getNextSQLParseToken
1173 private boolean isParseSQLColID(String token) {
1174 if (nvl(token).length() == 0)
1177 for (int i = 0; i < token.length(); i++) {
1178 char ch = token.charAt(i);
1180 if (i == 0 && ch == '_')
1183 if (!(Character.isLetterOrDigit(ch) || ch == '_'))
1188 } // isParseSQLColID
1190 private DataColumnType getParseSQLDataColumn(String sqlExpression, String colId,
1191 StringBuffer parsedSQL, Vector updatedReportCols, boolean isCYMBALScript) throws RaptorException {
1192 DataColumnType dct = null;
1194 if (colId != null) {
1195 if (!isParseSQLColID(colId))
1196 throw new org.onap.portalsdk.analytics.error.ValidationException(
1199 + "] must either be a valid column id consisting only of letters, numbers, and underscores, or there must be a comma in front of it.");
1201 dct = getColumnById(colId);
1203 // Getting unique column id
1206 for (int i = 0; (i < sqlExpression.length()) && (colIdN < 2); i++)
1207 if (Character.isLetter(sqlExpression.charAt(i))) {
1208 colId += sqlExpression.toLowerCase().charAt(i);
1212 colIdN = getAllColumns().size() + updatedReportCols.size();
1213 for (boolean idAlreadyUsed = true; idAlreadyUsed; colIdN++) {
1214 String newColId = colId + colIdN;
1215 idAlreadyUsed = false;
1217 for (Iterator iter = getAllColumns().iterator(); iter.hasNext();)
1218 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1219 idAlreadyUsed = true;
1224 for (Iterator iter = updatedReportCols.iterator(); iter.hasNext();)
1225 if (newColId.equals(((DataColumnType) iter.next()).getColId())) {
1226 idAlreadyUsed = true;
1231 colId += (colIdN - 1);
1235 dct = (new ObjectFactory()).createDataColumnType();
1236 dct.setColId(colId);
1237 dct.setDisplayWidth(10);
1238 dct.setDisplayAlignment("Left");
1239 dct.setVisible(true);
1240 dct.setGroupBreak(false); // ???
1241 if(!isCYMBALScript) {
1242 boolean isValidIdentifier = Character.isLetterOrDigit(sqlExpression.charAt(0));
1243 for (int i = 0; i < sqlExpression.length(); i++)
1244 if (!(Character.isLetterOrDigit(sqlExpression.charAt(i))
1245 || (sqlExpression.charAt(i) == '_') || (sqlExpression.charAt(i) == '$'))) {
1246 isValidIdentifier = false;
1250 if (isValidIdentifier) {
1251 dct.setDisplayName(sqlExpression);
1253 dct.setDisplayName(colId);
1255 } else dct.setDisplayName(colId);
1258 sqlExpression = sqlExpression.replaceAll(", '", ",'");
1259 dct.setDbColName(sqlExpression);
1260 dct.setColName(sqlExpression);
1261 dct.setCalculated(true);
1262 dct.setColType(AppConstants.CT_CHAR);
1263 dct.setDbColType(AppConstants.CT_CHAR);
1264 adjustColumnType(dct); // ???
1265 if(!isCYMBALScript) {
1266 if (parsedSQL.toString().equals("SELECT ")
1267 || parsedSQL.toString().equals("SELECT DISTINCT "))
1268 parsedSQL.append("\n\t");
1270 parsedSQL.append(", \n\t");
1271 parsedSQL.append(sqlExpression);
1272 parsedSQL.append(" ");
1273 parsedSQL.append(colId);
1277 } // getParseSQLDataColumn
1279 public void parseReportSQL(String sql) throws RaptorException {
1280 StringBuffer parsedSQL = new StringBuffer();
1282 Vector updatedReportCols = new Vector();
1285 int lastParsePos = curSQLParsePos;
1286 String lastToken = null;
1287 String nextToken = getNextSQLParseToken(sql, true);
1289 String dbInfo = getDBInfo();
1290 boolean isCYMBALScript = false;
1291 if (!isNull(dbInfo) && (!dbInfo.equals(AppConstants.DB_LOCAL))) {
1293 org.onap.portalsdk.analytics.util.RemDbInfo remDbInfo = new org.onap.portalsdk.analytics.util.RemDbInfo();
1294 String dbType = remDbInfo.getDBType(dbInfo);
1295 if (dbType.equals("DAYTONA") && !(nextToken.toUpperCase().equals("SELECT"))) {
1296 isCYMBALScript = true;
1298 } catch (Exception ex) {
1299 throw new RaptorException(ex);
1302 if ( isCYMBALScript == false ) {
1303 while (nextToken.length() > 0) {
1304 if (parsedSQL.length() == 0) {
1305 if (nextToken.toUpperCase().equals("SELECT"))
1306 parsedSQL.append("SELECT ");
1308 throw new org.onap.portalsdk.analytics.error.ValidationException(
1309 "The SQL must start with the SELECT keyword.");
1310 } else if (nextToken.toUpperCase().equals("DISTINCT")
1311 && parsedSQL.toString().equals("SELECT ")) {
1312 parsedSQL.append("DISTINCT ");
1313 } else if (nextToken.equals("*")
1314 && (parsedSQL.toString().equals("SELECT ") || parsedSQL.toString().equals(
1315 "SELECT DISTINCT "))) {
1316 throw new org.onap.portalsdk.analytics.error.ValidationException(
1317 "You cannot use \"SELECT *\". Please specify select columns/expressions.");
1318 } else if (nextToken.toUpperCase().equals("FROM")) {
1319 if (lastToken != null) {
1320 updatedReportCols.add(getParseSQLDataColumn(lastToken, null, parsedSQL,
1321 updatedReportCols, false));
1325 parsedSQL.append(" \n");
1326 while (lastParsePos < sql.length()
1327 && Character.isWhitespace(sql.charAt(lastParsePos)))
1329 parsedSQL.append(sql.substring(lastParsePos));
1332 if (nextToken.charAt(nextToken.length() - 1) == ',') {
1333 // The token ends with ,
1334 nextToken = nextToken.substring(0, nextToken.length() - 1);
1336 if (nextToken.length() == 0) {
1337 if (lastToken != null) {
1338 updatedReportCols.add(getParseSQLDataColumn(lastToken, null,
1339 parsedSQL, updatedReportCols, false));
1341 } // else just comma => ignore it
1343 if (lastToken != null) {
1344 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1345 parsedSQL, updatedReportCols, false));
1348 updatedReportCols.add(getParseSQLDataColumn(nextToken, null,
1349 parsedSQL, updatedReportCols, false));
1352 // The token doesn't end with ,
1353 if (lastToken == null)
1354 lastToken = nextToken;
1356 String token = getNextSQLParseToken(sql, false);
1357 if (!token.toUpperCase().equals("FROM"))
1358 throw new org.onap.portalsdk.analytics.error.ValidationException(
1359 "|FROM keyword or a comma expected after [" + nextToken
1362 updatedReportCols.add(getParseSQLDataColumn(lastToken, nextToken,
1363 parsedSQL, updatedReportCols, false));
1369 lastParsePos = curSQLParsePos;
1370 nextToken = getNextSQLParseToken(sql, true);
1372 } else { // if CYMBAL Script
1375 Matcher matcher = null;
1376 String extracted = null;
1377 nextToken = getNextCYMBALSQLParseToken(sql,true);
1378 while (nextToken.length() > 0) {
1379 if (lastToken == null) lastToken = nextToken;
1381 if( lastToken.toUpperCase().startsWith("DO DISPLAY")) {
1382 re = Pattern.compile("each(.*)\\[.(.*?)\\]"); //\\[(.*?)\\]
1383 matcher = re.matcher(nextToken);
1384 if (matcher.find()) {
1385 extracted = matcher.group();
1386 re = Pattern.compile("\\[(.*?)\\]");
1387 matcher = re.matcher(nextToken);
1388 if(matcher.find()) {
1389 extracted = matcher.group();
1390 extracted = extracted.substring(1,extracted.length()-1);
1391 StringTokenizer sToken = new StringTokenizer(extracted, ",");
1392 while(sToken.hasMoreTokens()) {
1393 String str1 = sToken.nextToken().trim().substring(1);
1394 updatedReportCols.add(getParseSQLDataColumn("", str1,
1395 new StringBuffer(""), updatedReportCols, true));
1402 lastToken = nextToken;
1403 nextToken = getNextCYMBALSQLParseToken(sql, true);
1407 if (updatedReportCols.size() == 0)
1408 throw new org.onap.portalsdk.analytics.error.ValidationException(
1409 "The SQL statement must have at least one column in the SELECT clause.");
1410 if (getDataSourceList().getDataSource().size() == 0)
1411 addDataSourceType(new ObjectFactory(), "du0", "DUAL", "", "DUAL", null, null, null);
1412 DataSourceType dst = (DataSourceType) getDataSourceList().getDataSource().get(0);
1413 dst.getDataColumnList().getDataColumn().clear();
1415 for (int i = 0; i < updatedReportCols.size(); i++) {
1416 DataColumnType dct = (DataColumnType) updatedReportCols.get(i);
1417 dct.setTableId(dst.getTableId());
1418 dct.setOrderSeq(i + 1);
1419 dst.getDataColumnList().getDataColumn().add(dct);
1421 setReportSQL(parsedSQL.toString());
1425 private String getNextCYMBALSQLParseToken(String sql, boolean updateParsePos) {
1426 int braketCount = 0;
1427 boolean isInsideQuote = false;
1428 StringBuffer nextToken = new StringBuffer();
1429 for (int idxNext = curSQLParsePos; idxNext < sql.length(); idxNext++) {
1430 char ch = sql.charAt(idxNext);
1433 nextToken.append(ch);
1435 curSQLParsePos = idxNext;
1438 curSQLParsePos = idxNext+1;
1443 return nextToken.toString();
1444 } // getNextSQLParseToken
1446 public void addChartAdditionalOptions(ObjectFactory objFactory) throws RaptorException {
1447 ChartAdditionalOptions chartOptions = objFactory.createChartAdditionalOptions();
1448 cr.setChartAdditionalOptions(chartOptions);
1451 public void addChartDrillOptions(ObjectFactory objFactory) throws RaptorException {
1452 ChartDrillOptions chartOptions = objFactory.createChartDrillOptions();
1453 cr.setChartDrillOptions(chartOptions);
1456 public void addDataminingOptions(ObjectFactory objFactory) throws RaptorException {
1457 DataminingOptions dataminingOptions = objFactory.createDataminingOptions();
1458 cr.setDataminingOptions(dataminingOptions);
1460 /*public void addChartAdditionalOptions(ObjectFactory objFactory, String chartType, String chartMultiplePieOrder, String chartMultiplePieLabelDisplay,
1461 String chartOrientation, String secondaryChartRenderer, String chartDisplay, String legendPosition,
1462 String labelAngle) throws RaptorException {
1464 ChartAdditionalOptions chartOptions = objFactory.createChartAdditionalOptions();
1466 if (nvl(chartMultiplePieOrder).length() > 0)
1467 chartOptions.setChartMultiplePieOrder(chartMultiplePieOrder);
1468 if (nvl(chartMultiplePieLabelDisplay).length() > 0)
1469 chartOptions.setChartMultiplePieLabelDisplay(chartMultiplePieLabelDisplay);
1470 if (nvl(chartOrientation).length() > 0)
1471 chartOptions.setChartOrientation(chartOrientation);
1472 if (nvl(secondaryChartRenderer).length() > 0)
1473 chartOptions.setSecondaryChartRenderer(secondaryChartRenderer);
1474 if (nvl(chartDisplay).length() > 0)
1475 chartOptions.setChartDisplay(chartDisplay);
1476 if (nvl(legendPosition).length() > 0)
1477 chartOptions.setLegendPosition(legendPosition);
1478 if (nvl(labelAngle).length() > 0)
1479 chartOptions.setLabelAngle(labelAngle);
1481 cr.setChartAdditionalOptions(chartOptions);
1482 } catch (JAXBException ex) {
1483 throw new RaptorException(ex.getMessage(), ex.getCause());
1485 } // addChartAdditionalOptions*/
1488 } // ReportDefinition