/*!
* 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.platform.plugin.services.email;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pentaho.platform.api.email.IEmailConfiguration;
import org.pentaho.platform.api.util.XmlParseException;
import org.pentaho.platform.config.DtdEntityResolver;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.services.messages.Messages;
import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.File;
import java.io.IOException;
@XmlRootElement
public class EmailConfigurationXml extends EmailConfiguration {
private static final long serialVersionUID = -3938443547757985845L;
private static final String ROOT_ELEMENT = "email-smtp"; //$NON-NLS-1$
private static final String PASSWORD_XPATH = ROOT_ELEMENT + "/mail.password"; //$NON-NLS-1$
private static final String AUTHENTICATE_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.auth"; //$NON-NLS-1$
private static final String DEBUG_XPATH = ROOT_ELEMENT + "/properties/mail.debug"; //$NON-NLS-1$
private static final String DEFAULT_FROM_XPATH = ROOT_ELEMENT + "/mail.from.default"; //$NON-NLS-1$
private static final String FROM_NAME_XPATH = ROOT_ELEMENT + "/mail.from.name"; //$NON-NLS-1$
private static final String SMTP_HOST_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.host"; //$NON-NLS-1$
private static final String SMTP_PORT_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.port"; //$NON-NLS-1$
private static final String SMTP_PROTOCOL_XPATH = ROOT_ELEMENT + "/properties/mail.transport.protocol"; //$NON-NLS-1$
private static final String SMTP_QUIT_WAIT_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.quitwait"; //$NON-NLS-1$
private static final String USER_ID_XPATH = ROOT_ELEMENT + "/mail.userid"; //$NON-NLS-1$
private static final String USE_SSL_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.ssl"; //$NON-NLS-1$
private static final String USE_START_TLS_XPATH = ROOT_ELEMENT + "/properties/mail.smtp.starttls.enable"; //$NON-NLS-1$
private static final Integer MIN_PORT_NUMBER = 0;
private static final Integer MAX_PORT_NUMBER = 65535;
private static final Log logger = LogFactory.getLog( EmailConfigurationXml.class );
private static final Messages messages = Messages.getInstance();
private static final String DEFAULT_EMAIL_CONFIG_PATH = "system" + File.separator + "smtp-email" + File.separator
+ "email_config.xml";
public EmailConfigurationXml() throws Exception {
this( new File( PentahoSystem.getApplicationContext().getSolutionPath( DEFAULT_EMAIL_CONFIG_PATH ) ) );
}
public EmailConfigurationXml( File pentahoXmlFile ) throws IOException, DocumentException {
if ( null == pentahoXmlFile ) {
throw new IllegalArgumentException();
}
loadFromConfigurationDocument( XmlDom4JHelper.getDocFromFile( pentahoXmlFile, new DtdEntityResolver() ) );
}
public EmailConfigurationXml( String xml ) throws DocumentException, XmlParseException {
if ( null == xml ) {
throw new IllegalArgumentException();
}
loadFromConfigurationDocument( XmlDom4JHelper.getDocFromString( xml, new DtdEntityResolver() ) );
}
/**
* Protected empty constructor for testing and subclasses
*/
protected EmailConfigurationXml( final Document doc ) throws DocumentException {
if ( doc == null ) {
throw new IllegalArgumentException();
}
loadFromConfigurationDocument( doc );
}
private void loadFromConfigurationDocument( final Document doc ) throws DocumentException {
final Element rootElement = doc.getRootElement();
if ( ( rootElement != null ) && !doc.getRootElement().getName().equals( ROOT_ELEMENT ) ) {
throw new DocumentException( messages.getErrorString( "EmailConfigurationXml.ERROR_0002_INVALID_ROOT_ELEMENT" ) ); //$NON-NLS-1$
}
setSmtpHost( getStringValue( doc, SMTP_HOST_XPATH ) );
setSmtpPort( getIntegerPortValue( doc, SMTP_PORT_XPATH ) );
setSmtpProtocol( getStringValue( doc, SMTP_PROTOCOL_XPATH ) );
setUseStartTls( getBooleanValue( doc, USE_START_TLS_XPATH ) );
setAuthenticate( getBooleanValue( doc, AUTHENTICATE_XPATH ) );
setUseSsl( getBooleanValue( doc, USE_SSL_XPATH ) );
setDebug( getBooleanValue( doc, DEBUG_XPATH ) );
setSmtpQuitWait( getBooleanValue( doc, SMTP_QUIT_WAIT_XPATH ) );
setDefaultFrom( getStringValue( doc, DEFAULT_FROM_XPATH ) );
setFromName( getStringValue( doc, FROM_NAME_XPATH ) );
setUserId( getStringValue( doc, USER_ID_XPATH ) );
setPassword( getStringValue( doc, PASSWORD_XPATH ) );
}
private static String getStringValue( final Document doc, final String xpath ) {
try {
final Element element = (Element) doc.selectSingleNode( xpath );
return element != null ? element.getText() : null;
} catch ( Exception e ) {
logger.error( messages.getErrorString( "EmailConfigurationXml.ERROR_0001_ERROR_PARSING_DATA", e
.getLocalizedMessage() ) );
}
return null;
}
private static Integer getIntegerPortValue( final Document doc, final String xpath ) {
try {
final Element element = (Element) doc.selectSingleNode( xpath );
Integer value = Integer.MIN_VALUE;
if ( element != null && !StringUtils.isEmpty( element.getText() ) ) {
value = Integer.parseInt( element.getText() );
}
if ( value >= MIN_PORT_NUMBER && value <= MAX_PORT_NUMBER ) {
return value;
}
} catch ( Exception e ) {
logger.error( messages.getErrorString( "EmailConfigurationXml.ERROR_0001_ERROR_PARSING_DATA", e
.getLocalizedMessage() ) );
}
return Integer.MIN_VALUE;
}
private static boolean getBooleanValue( final Document doc, final String xpath ) {
try {
final Element element = (Element) doc.selectSingleNode( xpath );
return element != null && Boolean.parseBoolean( element.getText() );
} catch ( Exception e ) {
logger.error( messages.getErrorString( "EmailConfigurationXml.ERROR_0001_ERROR_PARSING_DATA", e
.getLocalizedMessage() ) );
}
return false;
}
private static void setValue( final Document doc, final String xPath, final String value ) {
Element element = (Element) doc.selectSingleNode( xPath );
if ( null == element ) {
element = DocumentHelper.makeElement( doc, xPath );
}
element.setText( value );
}
public Document getDocument() {
return EmailConfigurationXml.getDocument( this );
}
public static Document getDocument( final IEmailConfiguration emailConfiguration ) {
final Document document = DocumentHelper.createDocument();
document.addElement( ROOT_ELEMENT );
setValue( document, SMTP_HOST_XPATH, ObjectUtils.toString( emailConfiguration.getSmtpHost() ) );
setValue( document, SMTP_PORT_XPATH, ObjectUtils.toString( emailConfiguration.getSmtpPort() ) );
setValue( document, SMTP_PROTOCOL_XPATH, ObjectUtils.toString( emailConfiguration.getSmtpProtocol() ) );
setValue( document, USE_START_TLS_XPATH, ObjectUtils.toString( emailConfiguration.isUseStartTls(), Boolean.FALSE
.toString() ) );
setValue( document, AUTHENTICATE_XPATH, ObjectUtils.toString( emailConfiguration.isAuthenticate(), Boolean.FALSE
.toString() ) );
setValue( document, USE_SSL_XPATH, ObjectUtils.toString( emailConfiguration.isUseSsl(),
Boolean.FALSE.toString() ) );
setValue( document, DEBUG_XPATH, ObjectUtils.toString( emailConfiguration.isDebug(), Boolean.FALSE.toString() ) );
setValue( document, SMTP_QUIT_WAIT_XPATH, ObjectUtils.toString( emailConfiguration.isSmtpQuitWait(), Boolean.FALSE
.toString() ) );
setValue( document, DEFAULT_FROM_XPATH, ObjectUtils.toString( emailConfiguration.getDefaultFrom() ) );
setValue( document, FROM_NAME_XPATH, ObjectUtils.toString( emailConfiguration.getFromName() ) );
setValue( document, USER_ID_XPATH, ObjectUtils.toString( emailConfiguration.getUserId() ) );
setValue( document, PASSWORD_XPATH, ObjectUtils.toString( emailConfiguration.getPassword() ) );
return document;
}
}