001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wmps/DefaultRequestManager.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     ---------------------------------------------------------------------------*/
043    package org.deegree.ogcwebservices.wmps;
044    
045    import java.sql.Connection;
046    
047    import javax.mail.internet.AddressException;
048    import javax.mail.internet.InternetAddress;
049    
050    import org.deegree.framework.log.ILogger;
051    import org.deegree.framework.log.LoggerFactory;
052    import org.deegree.framework.mail.EMailMessage;
053    import org.deegree.framework.mail.MailHelper;
054    import org.deegree.framework.mail.MailMessage;
055    import org.deegree.framework.mail.SendMailException;
056    import org.deegree.framework.mail.UnknownMimeTypeException;
057    import org.deegree.framework.xml.NamespaceContext;
058    import org.deegree.framework.xml.XMLFragment;
059    import org.deegree.framework.xml.XMLParsingException;
060    import org.deegree.framework.xml.XMLTools;
061    import org.deegree.i18n.Messages;
062    import org.deegree.ogcbase.CommonNamespaces;
063    import org.deegree.ogcwebservices.OGCWebServiceException;
064    import org.deegree.ogcwebservices.wmps.configuration.CacheDatabase;
065    import org.deegree.ogcwebservices.wmps.configuration.WMPSConfiguration;
066    import org.deegree.ogcwebservices.wmps.operation.PrintMap;
067    import org.deegree.ogcwebservices.wmps.operation.PrintMapResponse;
068    import org.deegree.ogcwebservices.wmps.operation.PrintMapResponseDocument;
069    import org.w3c.dom.Element;
070    
071    /**
072     * Default Handler to save the PrintMap requests to the 'HSQLDB' and send email after processing the
073     * request.
074     * 
075     * @author <a href="mailto:deshmukh@lat-lon.de">Anup Deshmukh</a>
076     * @author last edited by: $Author:wanhoff$
077     * 
078     * @version $Revision: 9546 $, $Date:20.03.2007$
079     */
080    public class DefaultRequestManager implements RequestManager {
081    
082        private static final ILogger LOG = LoggerFactory.getLogger( DefaultRequestManager.class );
083    
084        protected static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext();
085    
086        private WMPSConfiguration configuration;
087    
088        private final String MIMETYPE = "text/html";
089    
090        private PrintMap request;
091    
092        /**
093         * Creates a new DefaultRequestManager instance.
094         * 
095         * @param configuration
096         * @param request
097         *            request to perform
098         */
099        public DefaultRequestManager( WMPSConfiguration configuration, PrintMap request ) {
100            this.configuration = configuration;
101            this.request = request;
102        }
103    
104        /**
105         * returns the configuration used by the handler
106         * 
107         * @return WMPSConfiguration
108         */
109        public WMPSConfiguration getConfiguration() {
110            return this.configuration;
111    
112        }
113    
114        /**
115         * returns the request used by the handler
116         * 
117         * @return PrintMap request
118         */
119        public PrintMap getRequest() {
120            return this.request;
121    
122        }
123    
124        /**
125         * Opens a connection to a database based on the properties file in the resources directory and
126         * saves the current PrintMap request in the table for later access.
127         * 
128         * @throws OGCWebServiceException
129         */
130        public synchronized void saveRequestToDB()
131                                throws OGCWebServiceException {
132    
133            try {
134                CacheDatabase cacheDatabase = this.configuration.getDeegreeParams().getCacheDatabase();
135                WMPSDatabase dbConnection = new WMPSDatabase( cacheDatabase );
136                Connection connection = dbConnection.acquireConnection();
137                dbConnection.insertData( connection, this.request );
138                dbConnection.releaseConnection( connection );
139            } catch ( Exception e ) {
140                LOG.logError( e.getMessage(), e );
141                throw new OGCWebServiceException( Messages.getMessage( "WMPS_ERROR_CREATE_WMPSDB" ) );
142            }
143    
144        }
145    
146        /**
147         * Send an intial response back to the user, depending on whether the request has been
148         * successfull saved in the DB or not. The email address from the request is used to send the
149         * reply.
150         * 
151         * @param message
152         * @param success
153         *            to denote whether the operation was a success or not
154         * @return PrintMapResponseDocument
155         * @throws OGCWebServiceException
156         */
157        public PrintMapResponseDocument createInitialResponse( String message )
158                                throws OGCWebServiceException {
159    
160            // before the print operation is finished stage.
161            PrintMapResponse initialResponse = new PrintMapResponse( this.request.getId(), this.request.getEmailAddress(),
162                                                                     this.request.getTimestamp(),
163                                                                     this.request.getTimestamp(), message, "" );
164    
165            PrintMapResponseDocument document;
166            try {
167                document = XMLFactory.export( initialResponse );
168    
169            } catch ( XMLParsingException e ) {
170                LOG.logError( e.getMessage(), e );
171                throw new OGCWebServiceException( Messages.getMessage( "WMPS_ERROR_CREATE_RESPONSE2" ) );
172            }
173    
174            return document;
175        }
176    
177        /**
178         * Send an Email to the address provided in the PrintMap request.
179         * 
180         * @param response
181         * @throws OGCWebServiceException
182         */
183        public void sendEmail( PrintMapResponseDocument response )
184                                throws OGCWebServiceException {
185    
186            XMLFragment doc = new XMLFragment( response.getRootElement() );
187            Element root = doc.getRootElement();
188            String id = root.getAttribute( "id" );
189            String toEmailAddress = null;
190            String timestamp = null;
191            String message = null;
192            // String processingTime = null;
193            try {
194                String xPath = "deegreewmps:EmailAddress";
195                toEmailAddress = XMLTools.getRequiredNodeAsString( root, xPath, nsContext );
196                if ( !isValidEmailAddress( toEmailAddress ) ) {
197                    throw new PrintMapServiceException( Messages.getMessage( "WMPS_INCORRECT_MAIL_ADDRESS", toEmailAddress ) );
198                }
199                timestamp = XMLTools.getRequiredNodeAsString( root, "deegreewmps:Timestamp", nsContext );
200                message = XMLTools.getRequiredNodeAsString( root, "deegreewmps:Message", nsContext );
201                xPath = "deegreewmps:ExpectedProcessingTime";
202                // TODO
203                // processingTime = XMLTools.getNodeAsString( root, xPath, nsContext, null );
204            } catch ( XMLParsingException e ) {
205                LOG.logError( e.getMessage(), e );
206                throw new OGCWebServiceException( Messages.getMessage( "WMPS_PARSING_RESPONSE" ) );
207            }
208            String fromEmailAddress = this.configuration.getDeegreeParams().getPrintMapParam().getAdminMailAddress();
209    
210            if ( !isValidEmailAddress( fromEmailAddress ) ) {
211                throw new PrintMapServiceException( Messages.getMessage( "WMPS_INCORRECT_MAIL_ADDRESS", fromEmailAddress ) );
212            }
213            String subject = "PrintMap Notification: " + id + ' ' + timestamp;
214    
215            MailMessage email;
216            try {
217                email = new EMailMessage( fromEmailAddress, toEmailAddress, subject, message, this.MIMETYPE );
218            } catch ( UnknownMimeTypeException e ) {
219                throw new OGCWebServiceException( "Unknown mime type set." + e );
220            }
221            String mailHost = this.configuration.getDeegreeParams().getPrintMapParam().getMailHost();
222            try {
223                MailHelper.createAndSendMail( email, mailHost );
224            } catch ( SendMailException e ) {
225                LOG.logError( e.getMessage(), e );
226                String msg = Messages.getMessage( "WMPS_ERROR_SEND_EMAIL", toEmailAddress, mailHost );
227                throw new OGCWebServiceException( msg );
228            }
229    
230        }
231    
232        /**
233         * Check if the email address is valid and has a valid name and domain string.
234         * 
235         * @param aEmailAddress
236         * @return boolean
237         */
238        private boolean hasNameAndDomain( String aEmailAddress ) {
239    
240            String[] tokens = aEmailAddress.split( "@" );
241            return tokens.length == 2 && ( ( tokens[0] != null ) || ( tokens[0] != "" ) )
242                   && ( ( tokens[1] != null ) || ( tokens[1] != "" ) );
243        }
244    
245        /**
246         * Check email add validity.
247         * 
248         * @param aEmailAddress
249         * @return boolean
250         */
251        private boolean isValidEmailAddress( String aEmailAddress ) {
252    
253            String status = "VALID";
254            if ( aEmailAddress == null )
255                status = "NOTVALID";
256    
257            try {
258                new InternetAddress( aEmailAddress );
259                if ( !hasNameAndDomain( aEmailAddress ) ) {
260                    status = "NOTVALID";
261                }
262            } catch ( AddressException ex ) {
263                status = "NOTVALID " + ex.getMessage();
264            }
265    
266            return status.startsWith( "VALID" );
267        }
268    
269        /**
270         * Export the PrintMap service final response to a PrintMapResponseDocument.
271         * 
272         * @param message
273         * @param exception
274         * @return PrintMapResponseDocument
275         * @throws OGCWebServiceException
276         */
277        public PrintMapResponseDocument createFinalResponse( String message, String exception )
278                                throws OGCWebServiceException {
279    
280            PrintMapResponse finalResponse = new PrintMapResponse( this.request.getId(), this.request.getEmailAddress(),
281                                                                   this.request.getTimestamp(),
282                                                                   this.request.getTimestamp(), message, exception );
283    
284            PrintMapResponseDocument document;
285            try {
286                document = XMLFactory.export( finalResponse );
287            } catch ( XMLParsingException e ) {
288                LOG.logError( e.getMessage(), e );
289                throw new OGCWebServiceException( Messages.getMessage( "WMPS_ERROR_CREATE_RESPONSE1" ) );
290            }
291    
292            return document;
293        }
294    }