/*! * 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.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.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; 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.user.client.Timer; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.TextBox; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.mantle.client.MantleApplication; import org.pentaho.mantle.client.messages.Messages; public class EmailAdminPanelController extends EmailAdminPanel implements ISysAdminPanel, UpdatePasswordController { private boolean isDirty = false; private JsEmailConfiguration emailConfig; private static EmailAdminPanelController emailAdminPanelController; private EmailTester emailTester = null; private final EmailTestDialog etd = new EmailTestDialog(); public static EmailAdminPanelController getInstance() { if ( emailAdminPanelController == null ) { emailAdminPanelController = new EmailAdminPanelController(); } return emailAdminPanelController; } private EmailAdminPanelController() { activate(); AsyncCallback<String> emailTestCallback = new AsyncCallback<String>() { @Override public void onFailure( Throwable err ) { MantleApplication.hideBusyIndicator(); etd.getElement().setId( "emailTestDialog" ); etd.show( err.getMessage() ); } @Override public void onSuccess( String message ) { MantleApplication.hideBusyIndicator(); etd.getElement().setId( "emailTestDialog" ); etd.show( message ); } }; emailTester = new EmailTester( emailTestCallback ); testButton.addClickHandler( new ClickHandler() { public void onClick( final ClickEvent clickEvent ) { testEmail(); } } ); authenticationCheckBox.addValueChangeHandler( new ValueChangeHandler<Boolean>() { public void onValueChange( final ValueChangeEvent<Boolean> booleanValueChangeEvent ) { emailConfig.setAuthenticate( booleanValueChangeEvent.getValue() ); authenticationPanel.setVisible( booleanValueChangeEvent.getValue() ); setDirty( true ); } } ); prepareTextBox( smtpHostTextBox, new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { emailConfig.setSmtpHost( smtpHostTextBox.getValue() ); setDirty( true ); } } ); prepareTextBox( portTextBox, new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { setDirty( true ); } } ); portTextBox.addChangeHandler( new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { if ( isPortValid( portTextBox.getValue() ) ) { emailConfig.setSmtpPort( Integer.parseInt( portTextBox.getValue() ) ); setDirty( true ); } else { new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "portValidationLength" ), false , false, true ).center(); } } } ); prepareTextBox( fromAddressTextBox, new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { emailConfig.setDefaultFrom( fromAddressTextBox.getValue() ); setDirty( true ); } } ); prepareTextBox( fromNameTextBox, new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { emailConfig.setFromName( fromNameTextBox.getValue() ); setDirty( true ); } } ); prepareTextBox( userNameTextBox, new ChangeHandler() { @Override public void onChange( ChangeEvent event ) { emailConfig.setUserId( userNameTextBox.getValue() ); setDirty( true ); } } ); useSSLCheckBox.addValueChangeHandler( new ValueChangeHandler<Boolean>() { public void onValueChange( final ValueChangeEvent<Boolean> booleanValueChangeEvent ) { emailConfig.setUseSsl( useSSLCheckBox.getValue() ); setDirty( true ); } } ); useStartTLSCheckBox.addValueChangeHandler( new ValueChangeHandler<Boolean>() { public void onValueChange( final ValueChangeEvent<Boolean> booleanValueChangeEvent ) { emailConfig.setUseStartTls( useStartTLSCheckBox.getValue() ); setDirty( true ); } } ); protocolsListBox.addChangeHandler( new ChangeHandler() { public void onChange( final ChangeEvent changeEvent ) { emailConfig.setSmtpProtocol( protocolsListBox.getItemText( protocolsListBox.getSelectedIndex() ) ); setDirty( true ); } } ); saveButton.addClickHandler( new ClickHandler() { public void onClick( final ClickEvent clickEvent ) { if ( isPortValid( portTextBox.getValue() ) ) { setEmailConfig(); } else { new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "portValidationLength" ), false , false, true ).center(); } } } ); passwordTextBox.addKeyUpHandler( new KeyUpHandler() { public void onKeyUp( final KeyUpEvent keyUpEvent ) { emailConfig.setPassword( passwordTextBox.getValue() ); setDirty( true ); } } ); } public void updatePassword( String password ) { emailConfig.setPassword( password ); passwordTextBox.setValue( password ); if ( !StringUtils.isEmpty( passwordTextBox.getValue() ) ) { passwordTextBox.setEnabled( false ); } setDirty( true ); } // -- Remote Calls. private void setEmailConfig() { String serviceUrl = GWT.getHostPageBaseURL() + "api/emailconfig/setEmailConfig"; RequestBuilder executableTypesRequestBuilder = new RequestBuilder( RequestBuilder.PUT, serviceUrl ); try { executableTypesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); executableTypesRequestBuilder.setHeader( "Content-Type", "application/json" ); executableTypesRequestBuilder.sendRequest( emailConfig.getJSONString(), new RequestCallback() { public void onError( Request request, Throwable exception ) { } public void onResponseReceived( Request request, Response response ) { setDirty( false ); } } ); } catch ( RequestException e ) { //ignored } } private void testEmail() { // show the busy indicator... MantleApplication.showBusyIndicator( Messages.getString( "pleaseWait" ), Messages .getString( "connectionTest.inprog" ) ); emailTester.test( emailConfig ); } private void getEmailConfig() { String serviceUrl = GWT.getHostPageBaseURL() + "api/emailconfig/getEmailConfig?cb=" + System.currentTimeMillis(); RequestBuilder executableTypesRequestBuilder = new RequestBuilder( RequestBuilder.GET, serviceUrl ); executableTypesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); executableTypesRequestBuilder.setHeader( "accept", "application/json" ); try { executableTypesRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { } public void onResponseReceived( Request request, Response response ) { emailConfig = JsEmailConfiguration.parseJsonString( response.getText() ); authenticationCheckBox.setValue( Boolean.parseBoolean( emailConfig.isAuthenticate() + "" ) ); authenticationPanel.setVisible( Boolean.parseBoolean( emailConfig.isAuthenticate() + "" ) ); smtpHostTextBox.setValue( emailConfig.getSmtpHost() ); portTextBox.setValue( emailConfig.getSmtpPort() + "" ); useStartTLSCheckBox.setValue( Boolean.parseBoolean( emailConfig.isUseStartTls() + "" ) ); useSSLCheckBox.setValue( Boolean.parseBoolean( emailConfig.isUseSsl() + "" ) ); fromAddressTextBox.setValue( emailConfig.getDefaultFrom() ); fromNameTextBox.setValue( emailConfig.getFromName() ); userNameTextBox.setValue( emailConfig.getUserId() ); // If password is non-empty.. disable the text-box String password = emailConfig.getPassword(); passwordTextBox.setValue( password ); String protocol = emailConfig.getSmtpProtocol(); protocolsListBox.setSelectedIndex( -1 ); if ( !StringUtils.isEmpty( protocol ) ) { for ( int i = 0; i < protocolsListBox.getItemCount(); ++i ) { if ( protocol.equalsIgnoreCase( protocolsListBox.getItemText( i ) ) ) { protocolsListBox.setSelectedIndex( i ); break; } } } } } ); } catch ( RequestException e ) { //ignored } } // -- ISysAdminPanel implementation. public void activate() { setDirty( false ); getEmailConfig(); } public String getId() { return "emailAdminPanel"; } public void passivate( final AsyncCallback<Boolean> callback ) { if ( isDirty ) { MessageDialogBox messageBox = new MessageDialogBox( Messages.getString( "confirm" ) , Messages.getString( "dirtyStateMessage" ), false, false, true, Messages.getString( "yes" ), null , Messages.getString( "no" ) ); messageBox.setCallback( new IDialogCallback() { @Override public void okPressed() { if ( isPortValid( portTextBox.getValue() ) ) { setEmailConfig(); callback.onSuccess( true ); setDirty( false ); } else { new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "portValidationLength" ), false , false, true ).center(); } } @Override public void cancelPressed() { callback.onSuccess( true ); setDirty( false ); } } ); messageBox.center(); } else { callback.onSuccess( true ); } } private void setDirty( boolean isDirty ) { this.isDirty = isDirty; saveButton.setEnabled( isDirty ); } private void prepareTextBox( final TextBox textBox, final ChangeHandler changeHandler ) { textBox.addKeyUpHandler( new KeyUpHandler() { @Override public void onKeyUp( KeyUpEvent event ) { changeHandler.onChange( null ); } } ); textBox.addMouseUpHandler( new MouseUpHandler() { @Override public void onMouseUp( MouseUpEvent event ) { final String oldValue = textBox.getValue(); new Timer() { // set timer for IE 'x' clear input button. @Override public void run() { if ( !oldValue.equals( textBox.getValue() ) ) { changeHandler.onChange( null ); } } } .schedule( 100 ); } } ); } }