/*! * 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-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.admin; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsonUtils; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.gwt.widgets.client.wizards.AbstractWizardDialog; import org.pentaho.mantle.client.dialogs.scheduling.ScheduleRecurrenceDialog; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.workspace.JsJob; import org.pentaho.mantle.client.workspace.JsJobParam; import java.util.Date; public class ContentCleanerPanel extends DockPanel implements ISysAdminPanel { private static ContentCleanerPanel instance = new ContentCleanerPanel(); /** * Use get instance for use in Admin, otherwise use constructor * * @return singleton ContentCleanerPanel */ public static ContentCleanerPanel getInstance() { return instance; } public ContentCleanerPanel() { setStyleName( "pentaho-admin-panel" ); activate(); } public void activate() { clear(); String moduleBaseURL = GWT.getModuleBaseURL(); String moduleName = GWT.getModuleName(); String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); RequestBuilder scheduleFileRequestBuilder = new RequestBuilder( RequestBuilder.GET, contextURL + "api/scheduler/getContentCleanerJob?cb=" + System.currentTimeMillis() ); scheduleFileRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); scheduleFileRequestBuilder.setHeader( "Content-Type", "application/json" ); //$NON-NLS-1$//$NON-NLS-2$ scheduleFileRequestBuilder.setHeader( "accept", "application/json" ); //$NON-NLS-1$//$NON-NLS-2$ try { scheduleFileRequestBuilder.sendRequest( "", new RequestCallback() { public void onError( Request request, Throwable exception ) { } public void onResponseReceived( Request request, Response response ) { final TextBox nowTextBox = new TextBox(); nowTextBox.setWidth( "24px" ); nowTextBox.getElement().getStyle().setPadding( 5, Unit.PX ); nowTextBox.getElement().getStyle().setMarginLeft( 5, Unit.PX ); nowTextBox.getElement().getStyle().setMarginRight( 5, Unit.PX ); final TextBox scheduleTextBox = new TextBox(); scheduleTextBox.setVisibleLength( 4 ); JsJob tmpJsJob = parseJsonJob( JsonUtils.escapeJsonForEval( response.getText() ) ); boolean fakeJob = false; if ( tmpJsJob == null ) { tmpJsJob = createJsJob(); fakeJob = true; } final JsJob jsJob = tmpJsJob; if ( jsJob != null ) { scheduleTextBox.setValue( "" + ( Long.parseLong( jsJob.getJobParamValue( "age" ) ) / 86400L ) ); } else { scheduleTextBox.setText( "180" ); } scheduleTextBox.addChangeHandler( new ChangeHandler() { public void onChange( ChangeEvent event ) { if ( jsJob != null ) { JsArray<JsJobParam> params = jsJob.getJobParams(); for ( int i = 0; i < params.length(); i++ ) { if ( params.get( i ).getName().equals( "age" ) ) { params.get( i ).setValue( "" + ( Long.parseLong( scheduleTextBox.getText() ) * 86400L ) ); break; } } } } } ); Label settingsLabel = new Label( Messages.getString( "settings" ) ); settingsLabel.setStyleName( "pentaho-fieldgroup-major" ); add( settingsLabel, DockPanel.NORTH ); VerticalPanel nowPanelWrapper = new VerticalPanel(); Label deleteNowLabel = new Label( Messages.getString( "deleteGeneratedFilesNow" ) ); deleteNowLabel.getElement().getStyle().setPaddingTop( 15, Unit.PX ); deleteNowLabel.setStyleName( "pentaho-fieldgroup-minor" ); nowPanelWrapper.add( deleteNowLabel ); HorizontalPanel nowLabelPanel = new HorizontalPanel(); nowLabelPanel.getElement().getStyle().setPaddingTop( 10, Unit.PX ); nowLabelPanel.getElement().getStyle().setPaddingBottom( 10, Unit.PX ); Label deleteGeneratedFilesOlderThan = new Label( Messages.getString( "deleteGeneratedFilesOlderThan" ) ); deleteGeneratedFilesOlderThan.getElement().getStyle().setPaddingTop( 7, Unit.PX ); nowLabelPanel.add( deleteGeneratedFilesOlderThan ); nowLabelPanel.add( nowTextBox ); nowTextBox.setText( "180" ); Label days = new Label( Messages.getString( "daysDot" ) ); days.getElement().getStyle().setPaddingTop( 7, Unit.PX ); nowLabelPanel.add( days ); Button deleteNowButton = new Button( Messages.getString( "deleteNow" ) ); deleteNowButton.setStylePrimaryName( "pentaho-button" ); deleteNowButton.addStyleName( "first" ); deleteNowButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { deleteContentNow( Long.parseLong( nowTextBox.getValue() ) * 86400L ); } } ); nowPanelWrapper.add( nowLabelPanel ); nowPanelWrapper.add( deleteNowButton ); add( nowPanelWrapper, DockPanel.NORTH ); // scheduled VerticalPanel scheduledPanel = new VerticalPanel(); Label deleteScheduleLabel = new Label( Messages.getString( "scheduleDeletionOfGeneratedFiles" ) ); deleteScheduleLabel.setStyleName( "pentaho-fieldgroup-minor" ); deleteScheduleLabel.getElement().getStyle().setPaddingTop( 15, Unit.PX ); scheduledPanel.add( deleteScheduleLabel ); Label descLabel; if ( !fakeJob ) { String desc = jsJob.getJobTrigger().getDescription(); descLabel = new Label( desc ); scheduledPanel.add( descLabel ); } else { descLabel = new Label( Messages.getString( "generatedFilesAreNotScheduledToBeDeleted" ) ); scheduledPanel.add( descLabel ); } descLabel.getElement().getStyle().setPaddingTop( 10, Unit.PX ); descLabel.getElement().getStyle().setPaddingBottom( 10, Unit.PX ); Button editScheduleButton = new Button( Messages.getString( "edit" ) ); if ( fakeJob ) { editScheduleButton.setText( Messages.getString( "scheduleDeletion" ) ); } Button deleteScheduleButton = new Button( Messages.getString( "cancelSchedule" ) ); deleteScheduleButton.setStylePrimaryName( "pentaho-button" ); deleteScheduleButton.addStyleName( "last" ); deleteScheduleButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { deleteContentCleaner( jsJob ); } } ); editScheduleButton.setStylePrimaryName( "pentaho-button" ); editScheduleButton.addStyleName( "first" ); editScheduleButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { IDialogCallback callback = new IDialogCallback() { public void okPressed() { deleteContentCleaner( jsJob ); } public void cancelPressed() { } }; HorizontalPanel scheduleLabelPanel = new HorizontalPanel(); scheduleLabelPanel.add( new Label( Messages.getString( "deleteGeneratedFilesOlderThan" ), false ) ); scheduleLabelPanel.add( scheduleTextBox ); scheduleLabelPanel.add( new Label( Messages.getString( "daysUsingTheFollowingRules" ), false ) ); ScheduleRecurrenceDialog editSchedule = new ScheduleRecurrenceDialog( null, jsJob, callback, false, false, AbstractWizardDialog.ScheduleDialogType.SCHEDULER ); editSchedule.setShowSuccessDialog( false ); editSchedule.addCustomPanel( scheduleLabelPanel, DockPanel.NORTH ); editSchedule.center(); } } ); HorizontalPanel scheduleButtonPanel = new HorizontalPanel(); scheduleButtonPanel.add( editScheduleButton ); if ( !fakeJob ) { scheduleButtonPanel.add( deleteScheduleButton ); } scheduledPanel.add( scheduleButtonPanel ); add( scheduledPanel, DockPanel.NORTH ); VerticalPanel fillPanel = new VerticalPanel(); add( fillPanel, DockPanel.NORTH ); fillPanel.getElement().getParentElement().getStyle().setHeight( 100, Unit.PCT ); } } ); } catch ( RequestException re ) { //ignored } } public String getId() { return "contentCleanerPanel"; } public void passivate( AsyncCallback<Boolean> passivateCallback ) { passivateCallback.onSuccess( true ); } /** * @param age * in milliseconds */ public void deleteContentNow( long age ) { String date = DateTimeFormat.getFormat( PredefinedFormat.ISO_8601 ).format( new Date() ); String json = "{\"jobName\": \"Content Cleaner\", \"actionClass\": \"org.pentaho.platform.admin.GeneratedContentCleaner\"," + " \"jobParameters\":[ { \"name\": \"age\", \"stringValue\": \"" + age + "\", \"type\": \"string\" }], \"simpleJobTrigger\": { \"endTime\": null, \"repeatCount\": \"0\", " + "\"repeatInterval\": \"0\", \"startTime\": \"" + date + "\", \"uiPassParam\": \"RUN_ONCE\"} }"; String moduleBaseURL = GWT.getModuleBaseURL(); String moduleName = GWT.getModuleName(); String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); RequestBuilder scheduleFileRequestBuilder = new RequestBuilder( RequestBuilder.POST, contextURL + "api/scheduler/job" ); scheduleFileRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); scheduleFileRequestBuilder.setHeader( "Content-Type", "application/json" ); //$NON-NLS-1$//$NON-NLS-2$ try { scheduleFileRequestBuilder.sendRequest( json, new RequestCallback() { public void onError( Request request, Throwable exception ) { } public void onResponseReceived( Request request, Response response ) { } } ); } catch ( RequestException re ) { //ignored } } private final native JsJob parseJsonJob( String json ) /*-{ window.parent.jobjson = json; if (null == json || "" == json) { return null; } var obj = JSON.parse(json); return obj; }-*/; private final native JsJob createJsJob() /*-{ var jsJob = new Object(); jsJob.jobParams = new Object(); jsJob.jobParams.jobParams = []; jsJob.jobParams.jobParams[0] = new Object(); jsJob.jobParams.jobParams[0].name = "ActionAdapterQuartzJob-ActionClass"; jsJob.jobParams.jobParams[0].value = "org.pentaho.platform.admin.GeneratedContentCleaner"; jsJob.jobParams.jobParams[1] = new Object(); jsJob.jobParams.jobParams[1].name = "age"; jsJob.jobParams.jobParams[1].value = "15552000"; jsJob.jobTrigger = new Object(); jsJob.jobTrigger['@type'] = "simpleJobTrigger"; jsJob.jobTrigger.repeatCount = -1; jsJob.jobTrigger.repeatInterval = 86400; jsJob.jobTrigger.scheduleType = "DAILY"; //jsJob.jobTrigger.startTime = "2013-03-22T09:35:52.276-04:00"; jsJob.jobName = "GeneratedContentCleaner"; return jsJob; }-*/; private void deleteContentCleaner( JsJob jsJob ) { if ( jsJob == null || StringUtils.isEmpty( jsJob.getJobId() ) ) { activate(); return; } final String url = GWT.getHostPageBaseURL() + "api/scheduler/removeJob"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.DELETE, url ); builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.setHeader( "Content-Type", "application/json" ); //$NON-NLS-1$//$NON-NLS-2$ JSONObject startJobRequest = new JSONObject(); startJobRequest.put( "jobId", new JSONString( jsJob.getJobId() ) ); //$NON-NLS-1$ try { builder.sendRequest( startJobRequest.toString(), new RequestCallback() { public void onError( Request request, Throwable exception ) { // showError(exception); activate(); } public void onResponseReceived( Request request, Response response ) { activate(); } } ); } catch ( RequestException re ) { Window.alert( re.getMessage() ); } } }