001/* 002 * #%L 003 * Netarchivesuite - harvester 004 * %% 005 * Copyright (C) 2005 - 2014 The Royal Danish Library, the Danish State and University Library, 006 * the National Library of France and the Austrian National Library. 007 * %% 008 * This program is free software: you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation, either version 2.1 of the 011 * License, or (at your option) any later version. 012 * 013 * This program is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU General Lesser Public License for more details. 017 * 018 * You should have received a copy of the GNU General Lesser Public 019 * License along with this program. If not, see 020 * <http://www.gnu.org/licenses/lgpl-2.1.html>. 021 * #L% 022 */ 023 024package dk.netarkivet.harvester.distribute; 025 026import javax.jms.Message; 027import javax.jms.MessageListener; 028 029import org.slf4j.Logger; 030import org.slf4j.LoggerFactory; 031 032import dk.netarkivet.common.distribute.JMSConnection; 033import dk.netarkivet.common.distribute.NetarkivetMessage; 034import dk.netarkivet.common.exceptions.ArgumentNotValid; 035import dk.netarkivet.common.exceptions.PermissionDenied; 036import dk.netarkivet.harvester.harvesting.distribute.CrawlProgressMessage; 037import dk.netarkivet.harvester.harvesting.distribute.CrawlStatusMessage; 038import dk.netarkivet.harvester.harvesting.distribute.DoOneCrawlMessage; 039import dk.netarkivet.harvester.harvesting.distribute.FrontierReportMessage; 040import dk.netarkivet.harvester.harvesting.distribute.HarvesterReadyMessage; 041import dk.netarkivet.harvester.harvesting.distribute.HarvesterRegistrationRequest; 042import dk.netarkivet.harvester.harvesting.distribute.HarvesterRegistrationResponse; 043import dk.netarkivet.harvester.harvesting.distribute.JobEndedMessage; 044import dk.netarkivet.harvester.indexserver.distribute.IndexRequestMessage; 045 046/** 047 * This default message handler shields of all unimplemented methods from the HarvesterMessageVisitor interface. 048 * <p> 049 * Classes should not implement HarvesterMessageVisitor but extend this class. 050 * 051 * @see HarvesterMessageVisitor 052 */ 053public abstract class HarvesterMessageHandler implements HarvesterMessageVisitor, MessageListener { 054 private static final Logger log = LoggerFactory.getLogger(HarvesterMessageHandler.class); 055 056 /** 057 * Unpacks and calls accept() on the message object. 058 * <p> 059 * This method catches <b>all</b> exceptions and logs them. 060 * 061 * @param msg an ObjectMessage 062 */ 063 @Override 064 public void onMessage(Message msg) { 065 ArgumentNotValid.checkNotNull(msg, "msg"); 066 log.trace("Message received:\n{}", msg.toString()); 067 try { 068 NetarkivetMessage unpackedMsg = JMSConnection.unpack(msg); 069 ((HarvesterMessage) unpackedMsg).accept(this); 070 } catch (Throwable t) { 071 log.warn("Error processing message '{}'", msg, t); 072 } 073 } 074 075 /** 076 * Handles when a handler receives a message it is not prepare to handle. 077 * 078 * @param msg The received message. 079 * @throws PermissionDenied Always 080 */ 081 private void deny(HarvesterMessage msg) { 082 throw new PermissionDenied("'" + this + "' provides no handling for " + msg + " of type " 083 + msg.getClass().getName() + " and should not be invoked!"); 084 } 085 086 /** 087 * This method should be overridden and implemented by a sub class if message handling is wanted. 088 * 089 * @param msg a CrawlStatusMessage 090 * @throws PermissionDenied when invoked 091 */ 092 @Override 093 public void visit(CrawlStatusMessage msg) throws PermissionDenied { 094 ArgumentNotValid.checkNotNull(msg, "msg"); 095 deny(msg); 096 } 097 098 /** 099 * This method should be overridden and implemented by a sub class if message handling is wanted. 100 * 101 * @param msg a DoOneCrawlMessage 102 * @throws PermissionDenied when invoked 103 */ 104 @Override 105 public void visit(DoOneCrawlMessage msg) throws PermissionDenied { 106 ArgumentNotValid.checkNotNull(msg, "msg"); 107 deny(msg); 108 } 109 110 /** 111 * This method should be overridden and implemented by a sub class if message handling is wanted. 112 * 113 * @param msg a {@link CrawlProgressMessage} 114 * @throws PermissionDenied when invoked 115 */ 116 @Override 117 public void visit(CrawlProgressMessage msg) { 118 ArgumentNotValid.checkNotNull(msg, "msg"); 119 deny(msg); 120 } 121 122 /** 123 * This method should be overridden and implemented by a sub class if message handling is wanted. 124 * 125 * @param msg a {@link FrontierReportMessage} 126 * @throws PermissionDenied when invoked 127 */ 128 @Override 129 public void visit(FrontierReportMessage msg) { 130 ArgumentNotValid.checkNotNull(msg, "msg"); 131 deny(msg); 132 } 133 134 /** 135 * This method should be overridden and implemented by a sub class if message handling is wanted. 136 * 137 * @param msg a {@link JobEndedMessage} 138 * @throws PermissionDenied when invoked 139 */ 140 @Override 141 public void visit(JobEndedMessage msg) { 142 ArgumentNotValid.checkNotNull(msg, "msg"); 143 deny(msg); 144 } 145 146 /** 147 * This method should be overridden and implemented by a sub class if message handling is wanted. 148 * 149 * @param msg a {@link HarvesterReadyMessage} 150 * @throws PermissionDenied when invoked 151 */ 152 @Override 153 public void visit(HarvesterReadyMessage msg) { 154 ArgumentNotValid.checkNotNull(msg, "msg"); 155 deny(msg); 156 } 157 158 /** 159 * This method should be overridden and implemented by a sub class if message handling is wanted. 160 * 161 * @param msg a {@link IndexReadyMessage} 162 * @throws PermissionDenied when invoked 163 */ 164 @Override 165 public void visit(IndexReadyMessage msg) { 166 ArgumentNotValid.checkNotNull(msg, "msg"); 167 deny(msg); 168 } 169 170 /** 171 * This method should be overridden and implemented by a sub class if message handling is wanted. 172 * 173 * @param msg a {@link IndexRequestMessage} 174 * @throws PermissionDenied when invoked 175 */ 176 @Override 177 public void visit(IndexRequestMessage msg) { 178 ArgumentNotValid.checkNotNull(msg, "msg"); 179 deny(msg); 180 } 181 182 /** 183 * This method should be overridden and implemented by a sub class if message handling is wanted. 184 * 185 * @param msg a {@link HarvesterRegistrationRequest} 186 */ 187 @Override 188 public void visit(HarvesterRegistrationRequest msg) { 189 ArgumentNotValid.checkNotNull(msg, "msg"); 190 deny(msg); 191 } 192 193 /** 194 * This method should be overridden and implemented by a sub class if message handling is wanted. 195 * 196 * @param msg a {@link HarvesterRegistrationResponse} 197 */ 198 @Override 199 public void visit(HarvesterRegistrationResponse msg) { 200 ArgumentNotValid.checkNotNull(msg, "msg"); 201 deny(msg); 202 } 203 204}