Java tutorial
/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.dialogs.scheduling; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.utils.NameUtils; import org.pentaho.gwt.widgets.client.utils.string.StringTokenizer; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.gwt.widgets.client.wizards.AbstractWizardDialog; import org.pentaho.gwt.widgets.client.wizards.IWizardPanel; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.workspace.JsJob; import org.pentaho.mantle.client.workspace.JsJobParam; import org.pentaho.mantle.login.client.MantleLoginDialog; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.http.client.URL; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; /** * @author wseyler * */ public class ScheduleParamsDialog extends AbstractWizardDialog { String moduleBaseURL = GWT.getModuleBaseURL(); String moduleName = GWT.getModuleName(); String contextURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf(moduleName)); IDialogCallback callback; IAfterResponse afterResponseCallback; ScheduleParamsWizardPanel scheduleParamsWizardPanel; ScheduleEmailDialog scheduleEmailDialog; ScheduleRecurrenceDialog parentDialog; String filePath; JSONObject jobSchedule; JsJob editJob; JSONArray scheduleParams; Boolean done = false; boolean isEmailConfValid = false; private boolean isNewJob = true; private boolean newSchedule = true; public ScheduleParamsDialog(ScheduleRecurrenceDialog parentDialog, boolean isEmailConfValid, JsJob editJob) { super(ScheduleDialogType.SCHEDULER, Messages.getString("newSchedule"), null, false, true); //$NON-NLS-1$ this.parentDialog = parentDialog; filePath = parentDialog.filePath; jobSchedule = parentDialog.getSchedule(); this.isEmailConfValid = isEmailConfValid; this.editJob = editJob; initDialog(); if (isEmailConfValid) { finishButton.setText(Messages.getString("next")); } } public ScheduleParamsDialog(String filePath, JSONObject schedule, boolean isEmailConfValid) { super(ScheduleDialogType.SCHEDULER, Messages.getString("runInBackground"), null, false, true); //$NON-NLS-1$ this.filePath = filePath; jobSchedule = schedule; this.isEmailConfValid = isEmailConfValid; initDialog(); if (isEmailConfValid) { finishButton.setText(Messages.getString("next")); } } @Override public boolean onKeyDownPreview(char key, int modifiers) { if (key == KeyCodes.KEY_ESCAPE) { hide(); } return true; } public void initDialog() { scheduleParamsWizardPanel = new ScheduleParamsWizardPanel(filePath); IWizardPanel[] wizardPanels = { scheduleParamsWizardPanel }; setWizardPanels(wizardPanels); setWidth("800px"); String urlPath = URL.encodePathSegment(NameUtils.encodeRepositoryPath(filePath)); String urlParams = ""; if (editJob != null) { // add all edit params to URL JsArray<JsJobParam> jparams = editJob.getJobParams(); for (int i = 0; i < jparams.length(); i++) { urlParams += i == 0 ? "?" : "&"; if (jparams.get(i).getValue().startsWith("[") && jparams.get(i).getValue().indexOf(",") >= 0) { // it's an array! StringTokenizer st = new StringTokenizer(jparams.get(i).getValue(), "[],"); int tokens = st.countTokens(); int numParamsAdded = 0; for (int j = 0; j < tokens; j++) { String token = st.tokenAt(j); if (!StringUtils.isEmpty(token)) { if (numParamsAdded > 0) { urlParams += "&"; } numParamsAdded++; urlParams += jparams.get(i).getName() + "=" + URL.encodeQueryString(token.trim()); } } } else if (jparams.get(i).getValue().startsWith("[") && jparams.get(i).getValue().indexOf(".") >= 0) { // mondrian style param urlParams += jparams.get(i).getName() + "=" + URL.encodeQueryString(jparams.get(i).getValue().trim()); } else if (jparams.get(i).getValue().startsWith("[") && jparams.get(i).getValue().endsWith("]")) { // single value, remove [] String param = jparams.get(i).getValue().trim(); param = param.substring(1); param = param.substring(0, param.length() - 1); urlParams += jparams.get(i).getName() + "=" + URL.encodeQueryString(param); } else { urlParams += jparams.get(i).getName() + "=" + URL.encodeQueryString(jparams.get(i).getValue().trim()); } } } setParametersUrl( ScheduleHelper.getFullyQualifiedURL() + "api/repos/" + urlPath + "/parameterUi" + urlParams); //$NON-NLS-1$ //$NON-NLS-2$ wizardDeckPanel.setHeight("100%"); //$NON-NLS-1$ wizardDeckPanel.getElement().getParentElement().addClassName("schedule-dialog-content"); wizardDeckPanel.getElement().getParentElement().removeClassName("dialog-content"); setSize("650px", "450px"); addStyleName("schedule-params-dialog"); } JSONArray getScheduleParams(boolean suppressAlerts) { JsArray<JsSchedulingParameter> schedulingParams = scheduleParamsWizardPanel.getParams(suppressAlerts); JSONArray params = new JSONArray(); for (int i = 0; i < schedulingParams.length(); i++) { params.set(i, new JSONObject(schedulingParams.get(i))); } return params; } /* * (non-Javadoc) * * @see org.pentaho.gwt.widgets.client.wizards.AbstractWizardDialog#finish() */ @Override protected boolean onFinish() { scheduleParams = getScheduleParams(false); if (editJob != null) { String lineageId = editJob.getJobParamValue("lineage-id"); // JsArrayString jobIdValue = (JsArrayString) JavaScriptObject.createArray().cast(); // jobIdValue.push( editJob.getJobId() ); JsArrayString lineageIdValue = (JsArrayString) JavaScriptObject.createArray().cast(); lineageIdValue.push(lineageId); JsSchedulingParameter p = (JsSchedulingParameter) JavaScriptObject.createObject().cast(); p.setName("lineage-id"); p.setType("string"); p.setStringValue(lineageIdValue); scheduleParams.set(scheduleParams.size(), new JSONObject(p)); } if (isEmailConfValid) { showScheduleEmailDialog(scheduleParams); } else { hide(); JSONObject scheduleRequest = (JSONObject) JSONParser.parseStrict(jobSchedule.toString()); scheduleRequest.put("jobParameters", scheduleParams); //$NON-NLS-1$ RequestBuilder scheduleFileRequestBuilder = ScheduleHelper.buildRequestForJob(editJob, scheduleRequest); try { scheduleFileRequestBuilder.sendRequest(scheduleRequest.toString(), new RequestCallback() { @Override public void onError(Request request, Throwable exception) { MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$ exception.toString(), false, false, true); dialogBox.center(); setDone(false); } @Override public void onResponseReceived(Request request, Response response) { if (response.getStatusCode() == 200) { setDone(true); ScheduleParamsDialog.this.hide(); if (callback != null) { callback.okPressed(); } if (afterResponseCallback != null) { afterResponseCallback.onResponse(jobSchedule.get("runInBackground")); } } else { MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), Messages.getString("serverErrorColon") + " " + response.getStatusCode(), //$NON-NLS-1$ false, false, true); dialogBox.center(); setDone(false); } } }); } catch (RequestException e) { MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), e.toString(), //$NON-NLS-1$ false, false, true); dialogBox.center(); setDone(false); } setDone(true); } return false; } private void showScheduleEmailDialog(final JSONArray scheduleParams) { try { final String url = ScheduleHelper.getFullyQualifiedURL() + "api/mantle/isAuthenticated"; //$NON-NLS-1$ RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url); requestBuilder.setHeader("accept", "text/plain"); requestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT"); requestBuilder.sendRequest(null, new RequestCallback() { @Override public void onError(Request request, Throwable caught) { MantleLoginDialog.performLogin(new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(Boolean result) { showScheduleEmailDialog(scheduleParams); } }); } @Override public void onResponseReceived(Request request, Response response) { if (scheduleEmailDialog == null) { scheduleEmailDialog = new ScheduleEmailDialog(ScheduleParamsDialog.this, filePath, jobSchedule, scheduleParams, editJob); scheduleEmailDialog.setCallback(callback); } else { scheduleEmailDialog.setScheduleParams(scheduleParams); scheduleEmailDialog.setJobSchedule(jobSchedule); } scheduleEmailDialog.center(); hide(); } }); } catch (RequestException e) { Window.alert(e.getMessage()); } } public Boolean getDone() { return done; } public void setDone(Boolean done) { this.done = done; } /* * (non-Javadoc) * * @see org.pentaho.gwt.widgets.client.wizards.AbstractWizardDialog#onNext(org.pentaho.gwt.widgets.client.wizards. * IWizardPanel, org.pentaho.gwt.widgets.client.wizards.IWizardPanel) */ @Override protected boolean onNext(IWizardPanel nextPanel, IWizardPanel previousPanel) { return true; } /* * (non-Javadoc) * * @see org.pentaho.gwt.widgets.client.wizards.AbstractWizardDialog#onPrevious(org.pentaho.gwt.widgets.client.wizards * .IWizardPanel, org.pentaho.gwt.widgets.client.wizards.IWizardPanel) */ @Override protected void backClicked() { try { scheduleParams = getScheduleParams(true); } catch (Exception e) { // If error generate on trying to assign params while backing out, // obviously you want to ignore it. } parentDialog.center(); hide(); } @Override public void center() { if (scheduleParams != null) { // we have saved params from back/next String urlPath = NameUtils.encodeRepositoryPath(filePath); String urlParams = ""; for (int i = 0; i < scheduleParams.size(); i++) { JSONObject o = scheduleParams.get(i).isObject(); // keys: name, stringValue, type JSONString name = o.get("name").isString(); JSONArray stringValueArr = o.get("stringValue").isArray(); for (int j = 0; j < stringValueArr.size(); j++) { urlParams += (i == 0 && j == 0) ? "?" : "&"; urlParams += name.stringValue().replace("\"", "") + "=" + stringValueArr.get(j).toString().replace("\"", ""); } } setParametersUrl( ScheduleHelper.getFullyQualifiedURL() + "api/repos/" + urlPath + "/parameterUi" + urlParams); //$NON-NLS-1$ //$NON-NLS-2$ } super.center(); } public void setParametersUrl(String url) { scheduleParamsWizardPanel.setParametersUrl(url); } @Override protected boolean onPrevious(IWizardPanel previousPanel, IWizardPanel currentPanel) { return true; } @Override protected boolean showBack(int index) { return parentDialog != null; } @Override protected boolean showFinish(int index) { return true; } @Override protected boolean showNext(int index) { return false; } @Override protected boolean enableBack(int index) { return true; } public void setCallback(IDialogCallback callback) { this.callback = callback; } public IDialogCallback getCallback() { return callback; } public void setAfterResponseCallback(IAfterResponse afterResponseCallback) { this.afterResponseCallback = afterResponseCallback; } public ScheduleRecurrenceDialog getParentDialog() { return parentDialog; } public void setParentDialog(ScheduleRecurrenceDialog parentDialog) { this.parentDialog = parentDialog; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public JSONObject getJobSchedule() { return jobSchedule; } public void setJobSchedule(JSONObject jobSchedule) { this.jobSchedule = jobSchedule; } public JsJob getEditJob() { return editJob; } public void setEditJob(JsJob editJob) { this.editJob = editJob; } public boolean isEmailConfValid() { return isEmailConfValid; } public void setEmailConfValid(boolean isEmailConfValid) { this.isEmailConfValid = isEmailConfValid; } public void setScheduleParams(JSONArray scheduleParams) { this.scheduleParams = scheduleParams; } public interface IAfterResponse { void onResponse(JSONValue rib); } public void setNewSchedule(boolean newSchedule) { this.newSchedule = newSchedule; } private boolean isNewSchedule() { return newSchedule; } public boolean isNewJob() { return isNewJob; } public void setNewJob(boolean isNewJob) { this.isNewJob = isNewJob; } }