001 /*---------------------------------------------------------------------------- 002 This file is part of deegree, http://deegree.org/ 003 Copyright (C) 2001-2009 by: 004 Department of Geography, University of Bonn 005 and 006 lat/lon GmbH 007 008 This library is free software; you can redistribute it and/or modify it under 009 the terms of the GNU Lesser General Public License as published by the Free 010 Software Foundation; either version 2.1 of the License, or (at your option) 011 any later version. 012 This library is distributed in the hope that it will be useful, but WITHOUT 013 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 014 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 015 details. 016 You should have received a copy of the GNU Lesser General Public License 017 along with this library; if not, write to the Free Software Foundation, Inc., 018 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 019 020 Contact information: 021 022 lat/lon GmbH 023 Aennchenstr. 19, 53177 Bonn 024 Germany 025 http://lat-lon.de/ 026 027 Department of Geography, University of Bonn 028 Prof. Dr. Klaus Greve 029 Postfach 1147, 53001 Bonn 030 Germany 031 http://www.geographie.uni-bonn.de/deegree/ 032 033 e-mail: info@deegree.org 034 ----------------------------------------------------------------------------*/ 035 036 package org.deegree.ogcwebservices.csw; 037 038 import java.sql.Connection; 039 import java.sql.PreparedStatement; 040 import java.sql.ResultSet; 041 import java.sql.SQLException; 042 import java.sql.Statement; 043 import java.util.ArrayList; 044 import java.util.HashMap; 045 import java.util.List; 046 import java.util.Map; 047 import java.util.Timer; 048 import java.util.TimerTask; 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.SendMailException; 055 import org.deegree.framework.mail.UnknownMimeTypeException; 056 import org.deegree.i18n.Messages; 057 058 /** 059 * <code>DetectUnvalidCouplings</code> 060 * 061 * @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a> 062 * @author last edited by: $Author:$ 063 * 064 * @version $Revision:$, $Date:$ 065 * 066 */ 067 public class DetectInvalidCouplings { 068 069 private static final ILogger LOG = LoggerFactory.getLogger( DetectInvalidCouplings.class ); 070 071 private static final DetectInvalidCouplings instance = new DetectInvalidCouplings(); 072 073 private Timer timer; 074 075 private DetectInvalidCouplings() { 076 timer = new Timer(); 077 timer.schedule( new DetectInvalidCouplingsTask(), 1, 86400000 ); 078 } 079 080 public static DetectInvalidCouplings getInstance() { 081 return instance; 082 } 083 084 private class DetectInvalidCouplingsTask extends TimerTask { 085 /* 086 * (non-Javadoc) 087 * 088 * @see java.util.TimerTask#run() 089 */ 090 @Override 091 public void run() { 092 try { 093 Connection conn = CSW202PropertiesAccess.getConnection(); 094 if ( conn != null ) { 095 Map<String, List<String>> result = new HashMap<String, List<String>>(); 096 Statement st = conn.createStatement(); 097 ResultSet rsUuids = st.executeQuery( "SELECT distinct(uuidref) FROM operateson WHERE uuidref IS NOT null" ); 098 099 while ( rsUuids.next() ) { 100 String uuidref = rsUuids.getString( "uuidref" ); 101 PreparedStatement psCount = conn.prepareStatement( "SELECT count(fileIdentifier) as count FROM fileIdentifier WHERE fileIdentifier = ?" ); 102 psCount.setString( 1, uuidref ); 103 ResultSet rsCount = psCount.executeQuery(); 104 if ( !rsCount.next() || rsCount.getInt( "count" ) == 0 ) { 105 List<String> tmp; 106 PreparedStatement psIds = conn.prepareStatement( "SELECT f.fileidentifier as id FROM fileidentifier f, md_metadata m, operateson o WHERE o.fk_serviceidentification = m.id AND o.uuidref = ? AND o.fk_serviceidentification = m.id AND m.fk_fileidentifier = f.id" ); 107 psIds.setString( 1, uuidref ); 108 ResultSet rsIds = psIds.executeQuery(); 109 while ( rsIds.next() ) { 110 String id = rsIds.getString( "id" ); 111 if ( result.containsKey( uuidref ) ) { 112 tmp = result.get( uuidref ); 113 } else { 114 tmp = new ArrayList<String>(); 115 } 116 tmp.add( id ); 117 result.put( uuidref, tmp ); 118 } 119 } 120 } 121 printResult( result ); 122 conn.close(); 123 } 124 } catch ( SQLException e ) { 125 LOG.logError( "Could not connect with database", e ); 126 } 127 } 128 129 private void printResult( Map<String, List<String>> result ) { 130 StringBuffer sb = new StringBuffer(); 131 if ( result != null && result.size() > 0 ) { 132 sb.append( Messages.getMessage( "CSW_INVALID_SERVICES_DETECTED" ) ); 133 for ( String uuidref : result.keySet() ) { 134 List<String> uuidrefs = result.get( uuidref ); 135 String ids = ""; 136 for ( String id : uuidrefs ) { 137 if ( ids.length() > 0 ) { 138 ids = ids + ", "; 139 } 140 ids = ids + id; 141 } 142 sb.append( Messages.getMessage( "CSW_INVALID_SERVICES_DETECTED_ENTRY", ids, uuidref ) ); 143 } 144 145 try { 146 sendMail( sb.toString() ); 147 } catch ( SendMailException e ) { 148 LOG.logError( "Could not send inform admin about unknown coupled resources!", e ); 149 } 150 } else { 151 sb.append( Messages.getMessage( "CSW_NO_INVALID_SERVICES_DETECTED" ) ); 152 } 153 LOG.logInfo( sb.toString() ); 154 } 155 } 156 157 private void sendMail( String message ) 158 throws SendMailException { 159 String sender = "do-not-return@deegree-csw.de"; 160 String receiver = CSW202PropertiesAccess.getString( "admin.email" ); 161 String subject = "Detected some unknown coupled resources"; 162 EMailMessage mm = new EMailMessage( sender, receiver, subject, message ); 163 try { 164 mm.setMimeType( "text/html" ); 165 } catch ( UnknownMimeTypeException e ) { 166 LOG.logError( e.getMessage() ); 167 } 168 String smtpHost = CSW202PropertiesAccess.getString( "smtphost" ); 169 MailHelper.createAndSendMail( mm, smtpHost ); 170 } 171 172 public static void main( String[] args ) { 173 // Class.forName( "DetectInvalidCouplings"); 174 } 175 176 }