2015-06-22 15:56:57 +02:00
package org.gcube.portal.invites ;
2015-06-30 13:57:13 +02:00
import java.util.Date ;
2015-06-22 15:56:57 +02:00
import java.util.Properties ;
2015-06-30 13:57:13 +02:00
import java.util.UUID ;
2015-06-22 15:56:57 +02:00
import javax.mail.Message ;
import javax.mail.Session ;
import javax.mail.Transport ;
2015-06-30 13:57:13 +02:00
import javax.mail.internet.AddressException ;
2015-06-22 15:56:57 +02:00
import javax.mail.internet.InternetAddress ;
import javax.mail.internet.MimeMessage ;
import org.gcube.application.framework.core.session.ASLSession ;
2015-06-30 13:57:13 +02:00
import org.gcube.portal.databook.server.DBCassandraAstyanaxImpl ;
import org.gcube.portal.databook.server.DatabookStore ;
import org.gcube.portal.databook.shared.Invite ;
import org.gcube.portal.databook.shared.InviteOperationResult ;
import org.gcube.portal.databook.shared.InviteStatus ;
2015-06-22 15:56:57 +02:00
import org.jsoup.Jsoup ;
import org.jsoup.nodes.Document ;
import org.jsoup.nodes.Element ;
import org.jsoup.nodes.Node ;
import org.jsoup.nodes.TextNode ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
/ * *
*
* @author Massimiliano Assante
*
* /
public class InvitesManager {
private static final Logger _log = LoggerFactory . getLogger ( InvitesManager . class ) ;
private final static String MAIL_SERVICE_HOST = " localhost " ;
private final static String MAIL_SERVICE_PORT = " 25 " ;
private static InvitesManager instance ;
2015-06-30 13:57:13 +02:00
private static DatabookStore store ;
2015-06-22 15:56:57 +02:00
private InvitesManager ( ) { }
public static InvitesManager getInstance ( ) {
instance = new InvitesManager ( ) ;
2015-06-30 13:57:13 +02:00
initStore ( ) ;
2015-06-22 15:56:57 +02:00
return instance ;
}
2015-06-30 13:57:13 +02:00
/ * *
*
* @return the unique instance of the store
* /
public static synchronized DatabookStore initStore ( ) {
if ( store = = null ) {
store = new DBCassandraAstyanaxImpl ( ) ;
}
return store ;
}
public InviteOperationResult sendInvite (
ASLSession aslSession ,
String portalSenderEmail ,
String portalURL ,
String name ,
String lastName ,
String email ,
String vreDescription ) {
String username = aslSession . getUsername ( ) ;
String fromFullName = aslSession . getUserFullName ( ) ;
String controlcode = UUID . randomUUID ( ) . toString ( ) ;
Invite invite = new Invite ( UUID . randomUUID ( ) . toString ( ) , username , aslSession . getScopeName ( ) , email , controlcode , InviteStatus . PENDING , new Date ( ) , fromFullName ) ;
InviteOperationResult result = null ;
boolean emailResult = false ;
try {
result = store . saveInvite ( invite ) ;
emailResult = sendInviteEmail ( aslSession , portalSenderEmail , portalURL , fromFullName , lastName , email , vreDescription ) ;
} catch ( AddressException e ) {
_log . error ( " Email not valid " + e . getMessage ( ) ) ;
e . printStackTrace ( ) ;
return InviteOperationResult . FAILED ;
}
return ( emailResult ) ? result : InviteOperationResult . FAILED ;
}
2015-06-22 15:56:57 +02:00
2015-06-30 13:57:13 +02:00
private Boolean sendInviteEmail (
2015-06-22 15:56:57 +02:00
ASLSession aslSession ,
String portalSenderEmail ,
String portalURL ,
String name ,
String lastName ,
String email ,
String vreDescription ) {
String vreName = aslSession . getGroupName ( ) ;
String fromFullName = aslSession . getUserFullName ( ) ;
Properties props = System . getProperties ( ) ;
Session session = null ;
props . put ( " mail.smtp.host " , MAIL_SERVICE_HOST ) ;
props . put ( " mail.smtp.port " , MAIL_SERVICE_PORT ) ;
session = Session . getDefaultInstance ( props ) ;
session . setDebug ( true ) ;
try {
MimeMessage message = new MimeMessage ( session ) ;
message . setHeader ( " Content-Type " , " text/plain; charset=UTF-8 " ) ;
// Set From: header field of the header.
message . setFrom ( new InternetAddress ( portalSenderEmail , fromFullName ) ) ;
message . addRecipient ( Message . RecipientType . TO , new InternetAddress ( email ) ) ;
message . addRecipient ( Message . RecipientType . CC , new InternetAddress ( aslSession . getUserEmailAddress ( ) ) ) ;
// Set Subject: header field
message . setSubject ( " Join me on " + vreName ) ;
// Now set the actual message
message . setText ( getTextEmail ( aslSession , portalURL , name , lastName , email , fromFullName , vreName , vreDescription ) ) ;
// Send message
Transport . send ( message ) ;
_log . debug ( " Sent message successfully to " + email ) ;
} catch ( Exception mex ) {
mex . printStackTrace ( ) ;
_log . error ( " Sent message ERROR to " + email ) ;
return false ;
}
return true ;
}
/ * *
*
* @param aslSession
* @param portalUrl the url of the portal
* @param name the name of the invited person
* @param lastName the last name of the invited person
* @param email the email address of the invite person
* @param fromFullName who is inviting
* @param vreName the name of the environment where you are inviting the person
* @param vreDescription the description of the environment where you are inviting the person
* @return the email text
* /
private String getTextEmail (
ASLSession aslSession ,
String portalUrl ,
String name ,
String lastName ,
String email ,
String fromFullName ,
String vreName ,
String vreDescription ) {
long organizationId = aslSession . getGroupId ( ) ;
StringBuilder body = new StringBuilder ( ) ;
body . append ( " Dear " + name )
. append ( " , \ n " )
. append ( fromFullName ) . append ( " has invited you to " + vreName + " , you can find a brief description below: " )
. append ( " \ n " )
. append ( " \ n " ) . append ( convertHTML2Text ( vreDescription ) )
. append ( " \ n \ n " )
. append ( " To accept the invite just follow this link: " + portalUrl + " /group/data-e-infrastructure-gateway/join-new?orgid= " + organizationId )
. append ( " \ n \ n " )
. append ( " Please note: if you do not have an account yet, sign up first: " + portalUrl + " /web/guest/home?p_p_id=58&_58_struts_action=%2Flogin%2Fcreate_account " )
. append ( " \ n \ n \ n \ n " )
. append ( " WARNING / LEGAL TEXT: This message is intended only for the use of the individual or entity to which it is addressed and may contain " )
. append ( " information which is privileged, confidential, proprietary, or exempt from disclosure under applicable law. "
+ " If you are not the intended recipient or the person responsible for delivering the message to the intended recipient, "
+ " you are strictly prohibited from disclosing, distributing, copying, or in any way using this message. " )
. append ( " If you have received this communication in error, please notify the <sender> and destroy and delete any copies you may have received. " ) ;
return body . toString ( ) ;
}
/ * *
* Convert html into simple text
*
* /
protected static String convertHTML2Text ( String html ) {
if ( html = = null ) {
return null ;
}
String removedMarkup = html . replaceAll ( " & " , " & " ) ;
removedMarkup = removedMarkup . replaceAll ( " > " , " > " ) ;
removedMarkup = removedMarkup . replaceAll ( " < " , " < " ) ;
String text = removedMarkup ;
try {
Document document = Jsoup . parse ( removedMarkup ) ;
Element body = document . body ( ) ;
text = buildStringFromNode ( body ) . toString ( ) ;
}
catch ( Exception e ) {
_log . error ( " While converting HTML into text: " + e . getMessage ( ) ) ;
return removedMarkup ;
}
return text ;
}
private static StringBuffer buildStringFromNode ( Node node ) {
StringBuffer buffer = new StringBuffer ( ) ;
if ( node instanceof TextNode ) {
TextNode textNode = ( TextNode ) node ;
buffer . append ( textNode . text ( ) . trim ( ) ) ;
}
for ( Node childNode : node . childNodes ( ) ) {
buffer . append ( buildStringFromNode ( childNode ) ) ;
}
if ( node instanceof Element ) {
Element element = ( Element ) node ;
String tagName = element . tagName ( ) ;
if ( " p " . equals ( tagName ) | | " br " . equals ( tagName ) | | " div " . equals ( tagName ) | | " h1 " . equals ( tagName ) | | " h2 " . equals ( tagName ) | | " h3 " . equals ( tagName ) | | " h4 " . equals ( tagName ) ) {
buffer . append ( " \ n " ) ;
}
}
return buffer ;
}
}