1   package ch.ige.edossier.web.server;
2   
3   import java.io.File;
4   import java.io.FileOutputStream;
5   import java.io.IOException;
6   import java.sql.SQLException;
7   import java.text.SimpleDateFormat;
8   import java.util.*;
9   import java.util.Date;
10  import ch.ige.edossier.util.MailSender;
11  import ch.ige.edossier.util.ServerProperties;
12  import ch.ige.edossier.web.vo.MailSenderVO;
13  import ch.ige.edossier.web.vo.NewsletterVO;
14  
15  /**
16   * B32.03 - eDossier-Interceptions - Diplomarbeit an der Software-Schule Schweiz<br>
17   * KANN-ZIEL [K7] - Newsletter New (Pflichtenheft b32.03_PF_eDossier.pdf, Seite 17)<br>
18   * Die Klasse Newsletter wird durch eine Bat-Applikation auf dem Server gestartet. Beim Aufruf werden die Neueingänge
19   * auf den Dossiers überprüft und als Newsletter-Email an den
20   * Benutzer gesendet.
21   * <p>
22   * Copyright (c) 2004, Eidgenössisches Institut für Geistiges Eigentum
23   * @author    Anita Rueegsegger, Marc Bouquet
24   * @version   $Id: Newsletter.java,v 1.5 2004/11/10 19:51:56 ruegsegger Exp $
25   */
26  public class Newsletter
27  {
28    private Properties webproperties = null;
29    private StringBuffer logBuf = new StringBuffer();
30    private SimpleDateFormat sf = ( SimpleDateFormat )SimpleDateFormat.getDateInstance();
31  
32    /**
33     * Standard-Konstruktor startet den Thread für die Verarbeitung
34     * @throws Exception Unerwarteter Fehler
35     */
36    public Newsletter() throws Exception
37    {
38      sf.applyPattern( "yyyy-MM-dd" ); // Setzt das Datumsformat
39      setLogStart();
40  
41      run();
42  
43      setLogEnd();
44  
45      // Setzt den Sprachcode aus der Properties-Datei
46      String filepath = ServerProperties.loadServerProperties().getProperty( "newsletter" );
47      writeFile( filepath, logBuf.toString(), "edossier" );
48    }
49  
50    /**
51     * Diese Methode schreibt den Start in die Log-Datei
52     */
53    private void setLogStart()
54    {
55      logBuf.append( "---------------------------------------------------------------------------------------\n" );
56      logBuf.append( "  Die Newsletter-Batch-Applikation wurde gestartet: " );
57      logBuf.append( sf.format( new Date( System.currentTimeMillis() ) ) );
58      logBuf.append( "\n---------------------------------------------------------------------------------------\n" );
59    }
60  
61    /**
62     * Diese Methode schreibt das Ende in die Log-Datei
63     */
64    private void setLogEnd()
65    {
66      logBuf.append( "\n\n---------------------------------------------------------------------------------------\n" );
67      logBuf.append( "  Verarbeitung des Newsletter-Batch wurde beendet." );
68      logBuf.append( "\n---------------------------------------------------------------------------------------\n" );
69    }
70  
71    /**
72     * In dieser Methode wird die Verarbeitung für den Newsletter durchgeführt.
73     */
74    public void run()
75    {
76      try
77      {
78        SimpleDateFormat sf = ( SimpleDateFormat )SimpleDateFormat.getDateInstance();
79        sf.applyPattern( "yyyy-MM-dd" );
80        Collection newsList = new EDossierControl().getNewInterceptions( sf.format( new Date( System.currentTimeMillis() ) ) );
81  
82        if( newsList != null )
83        {
84          Iterator iter = newsList.iterator();
85  
86          while( iter.hasNext() )
87          {
88            NewsletterVO newsletterVO = ( NewsletterVO )iter.next();
89            webproperties = ServerProperties.loadWebProperties( newsletterVO.getLanguageCd() );
90            MailSender.sendMail( fillMailVO( newsletterVO ), true );
91  
92            logBuf.append( "\n- Newsletter wurde gesendet an: " );
93            logBuf.append( newsletterVO.getEmail() );
94          }
95        }
96      }
97      catch( SQLException sqlex )
98      {
99        sqlex.printStackTrace();
100       logBuf.append( "\nSQL-Fehler beim laden der Newsletter-Empfängerdaten:\n" + sqlex.getMessage() );
101     }
102     catch( Exception ex )
103     {
104       ex.printStackTrace();
105       logBuf.append( "\nFehler beim Senden des Newsletters:\n" + ex.getMessage() );
106     }
107   }
108 
109   /**
110    * Diese Methode füllt das MailSender-Value-Object mit den benötigten Daten
111    * @param newsletterVO NewsletterVO Value-Object
112    * @return MailSenderVO Value-Object mit den Daten für den Versand
113    */
114   private MailSenderVO fillMailVO( NewsletterVO newsletterVO )
115   {
116     MailSenderVO mailSenderVO = new MailSenderVO();
117     mailSenderVO.setAdressTo( newsletterVO.getEmail() );
118     mailSenderVO.setAdressFrom( "edossier-Newsletter" );
119     mailSenderVO.setSubject( webproperties.getProperty( "mail.newsletter.subject" ) );
120 
121     StringBuffer buf = new StringBuffer();
122     buf.append( webproperties.getProperty( "mail.body.auto" ) ); // Globale definierte Resource
123     buf.append( webproperties.getProperty( "mail.newsletter.body.start" ) );
124     buf.append( newsletterVO.getDetailMsg() );
125     buf.append( webproperties.getProperty( "mail.body.end" ) ); // Globale definierte Resource
126 
127     mailSenderVO.setBody( buf.toString() );
128     return mailSenderVO;
129   }
130 
131   /**
132    * Diese Methode schreibt eine Log-Datei mit den Verarbeitungsdaten.
133    * @param filepath String Pfad, wo die Log-Datei gespeichert wird.
134    * @param message String Log-Informationen
135    * @param appname String Name der Batch-Applikation, wird für das Zusammensetzen des Dateinamens benötigt
136    */
137   private void writeFile( String filepath, String message, String appname )
138   {
139     try
140     {
141       File statFile = new File( filepath );
142       if( !statFile.isDirectory() )
143       {
144         statFile.mkdirs();
145       }
146       FileOutputStream fos = new FileOutputStream( statFile + "//" + appname + "_newsletter.txt" );
147       fos.write( message.getBytes() );
148       fos.flush();
149       fos.close();
150     }
151     catch( IOException ioex )
152     {
153       System.err.println( "Log-Datei für edossier-newsletter konnte nicht erstellt werden: " + ioex.getMessage() );
154     }
155   }
156 
157   /**
158    * Mit dieser Methode wird die Verarbeitung der Newsletters gestartet.
159    * @param args String[]
160    */
161   public static void main( String[] args )
162   {
163     try
164     {
165       new Newsletter();
166     }
167     catch( Exception ex )
168     {
169       ex.printStackTrace();
170       System.err.println( "Fehler in der Verarbeitung des Newsletter: " + ex.getMessage() );
171       System.exit( 1 );
172     }
173   }
174 }
175