001/* 002 * #%L 003 * Netarchivesuite - archive 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 */ 023package dk.netarkivet.archive.distribute; 024 025import javax.jms.Message; 026import javax.jms.MessageListener; 027 028import org.slf4j.Logger; 029import org.slf4j.LoggerFactory; 030 031import dk.netarkivet.archive.arcrepository.bitpreservation.AdminDataMessage; 032import dk.netarkivet.archive.arcrepository.distribute.StoreMessage; 033import dk.netarkivet.archive.bitarchive.distribute.BatchEndedMessage; 034import dk.netarkivet.archive.bitarchive.distribute.BatchMessage; 035import dk.netarkivet.archive.bitarchive.distribute.BatchReplyMessage; 036import dk.netarkivet.archive.bitarchive.distribute.GetFileMessage; 037import dk.netarkivet.archive.bitarchive.distribute.GetMessage; 038import dk.netarkivet.archive.bitarchive.distribute.HeartBeatMessage; 039import dk.netarkivet.archive.bitarchive.distribute.RemoveAndGetFileMessage; 040import dk.netarkivet.archive.bitarchive.distribute.UploadMessage; 041import dk.netarkivet.archive.checksum.distribute.CorrectMessage; 042import dk.netarkivet.archive.checksum.distribute.GetAllChecksumsMessage; 043import dk.netarkivet.archive.checksum.distribute.GetAllFilenamesMessage; 044import dk.netarkivet.archive.checksum.distribute.GetChecksumMessage; 045import dk.netarkivet.common.distribute.JMSConnection; 046import dk.netarkivet.common.exceptions.ArgumentNotValid; 047import dk.netarkivet.common.exceptions.PermissionDenied; 048 049/** 050 * This default message handler shields of all unimplemented methods from the ArchiveMessageVisitor interface. 051 * <p> 052 * Classes should not implement ArchiveMessageVisitor but extend this class. 053 * 054 * @see ArchiveMessageVisitor 055 */ 056public abstract class ArchiveMessageHandler implements ArchiveMessageVisitor, MessageListener { 057 058 /** The log. */ 059 private static final Logger log = LoggerFactory.getLogger(ArchiveMessageHandler.class); 060 061 /** 062 * Creates a ArchiveMessageHandler object. 063 */ 064 public ArchiveMessageHandler() { 065 } 066 067 /** 068 * Unpacks and calls accept() on the message object. 069 * <p> 070 * This method catches <b>all</b> exceptions and logs them. 071 * 072 * @param msg a ObjectMessage 073 */ 074 public void onMessage(Message msg) { 075 ArgumentNotValid.checkNotNull(msg, "Message msg"); 076 log.trace("Message received:\n{}", msg.toString()); 077 try { 078 ((ArchiveMessage) JMSConnection.unpack(msg)).accept(this); 079 } catch (ClassCastException e) { 080 log.warn("Invalid message type", e); 081 } catch (Throwable t) { 082 log.warn("Error processing message '{}'", msg, t); 083 } 084 } 085 086 /** 087 * Handles when a handler receives a message it is not prepare to handle. 088 * 089 * @param msg The received message. 090 * @throws PermissionDenied Always 091 */ 092 private void deny(ArchiveMessage msg) throws PermissionDenied { 093 throw new PermissionDenied("'" + this + "' provides no handling for " + msg + " of type " 094 + msg.getClass().getName() + " and should not be invoked!"); 095 } 096 097 /** 098 * This method should be overridden and implemented by a sub class if message handling is wanted. 099 * 100 * @param msg a BatchEndedMessage 101 * @throws PermissionDenied when invoked 102 */ 103 public void visit(BatchEndedMessage msg) throws PermissionDenied { 104 ArgumentNotValid.checkNotNull(msg, "msg"); 105 deny(msg); 106 } 107 108 /** 109 * This method should be overridden and implemented by a sub class if message handling is wanted. 110 * 111 * @param msg a BatchMessage 112 * @throws PermissionDenied when invoked 113 */ 114 public void visit(BatchMessage msg) throws PermissionDenied { 115 ArgumentNotValid.checkNotNull(msg, "msg"); 116 deny(msg); 117 } 118 119 /** 120 * This method should be overridden and implemented by a sub class if message handling is wanted. 121 * 122 * @param msg a BatchReplyMessage 123 * @throws PermissionDenied when invoked 124 */ 125 public void visit(BatchReplyMessage msg) throws PermissionDenied { 126 ArgumentNotValid.checkNotNull(msg, "msg"); 127 deny(msg); 128 } 129 130 /** 131 * This method should be overridden and implemented by a sub class if message handling is wanted. 132 * 133 * @param msg a GetFileMessage 134 * @throws PermissionDenied when invoked 135 */ 136 public void visit(GetFileMessage msg) throws PermissionDenied { 137 ArgumentNotValid.checkNotNull(msg, "msg"); 138 deny(msg); 139 } 140 141 /** 142 * This method should be overridden and implemented by a sub class if message handling is wanted. 143 * 144 * @param msg a GetMessage 145 * @throws PermissionDenied when invoked 146 */ 147 public void visit(GetMessage msg) throws PermissionDenied { 148 ArgumentNotValid.checkNotNull(msg, "msg"); 149 deny(msg); 150 } 151 152 /** 153 * This method should be overridden and implemented by a sub class if message handling is wanted. 154 * 155 * @param msg a HeartBeatMessage 156 * @throws PermissionDenied when invoked 157 */ 158 public void visit(HeartBeatMessage msg) throws PermissionDenied { 159 ArgumentNotValid.checkNotNull(msg, "msg"); 160 deny(msg); 161 } 162 163 /** 164 * This method should be overridden and implemented by a sub class if message handling is wanted. 165 * 166 * @param msg a StoreMessage 167 * @throws PermissionDenied when invoked 168 */ 169 public void visit(StoreMessage msg) throws PermissionDenied { 170 ArgumentNotValid.checkNotNull(msg, "msg"); 171 deny(msg); 172 } 173 174 /** 175 * This method should be overridden and implemented by a sub class if message handling is wanted. 176 * 177 * @param msg an UploadMessage 178 * @throws PermissionDenied when invoked 179 */ 180 public void visit(UploadMessage msg) throws PermissionDenied { 181 ArgumentNotValid.checkNotNull(msg, "msg"); 182 deny(msg); 183 } 184 185 /** 186 * This method should be overridden and implemented by a sub class if message handling is wanted. 187 * 188 * @param msg a AdminDataMessage 189 * @throws PermissionDenied when invoked 190 */ 191 public void visit(AdminDataMessage msg) throws PermissionDenied { 192 ArgumentNotValid.checkNotNull(msg, "msg"); 193 deny(msg); 194 } 195 196 /** 197 * This method should be overridden and implemented by a sub class if message handling is wanted. 198 * 199 * @param msg a RemoveAndGetFile 200 * @throws PermissionDenied when invoked 201 */ 202 public void visit(RemoveAndGetFileMessage msg) throws PermissionDenied { 203 ArgumentNotValid.checkNotNull(msg, "msg"); 204 deny(msg); 205 } 206 207 /** 208 * This method should be overridden and implemented by a sub class if message handling is wanted. 209 * 210 * @param msg an CorrectMessage for correcting a record. 211 * @throws PermissionDenied when invoked 212 */ 213 public void visit(CorrectMessage msg) throws PermissionDenied { 214 ArgumentNotValid.checkNotNull(msg, "msg"); 215 deny(msg); 216 } 217 218 /** 219 * This method should be overridden and implemented by a sub class if message handling is wanted. 220 * 221 * @param msg the GetChecksumMessage 222 * @throws PermissionDenied when invoked 223 */ 224 public void visit(GetChecksumMessage msg) throws PermissionDenied { 225 ArgumentNotValid.checkNotNull(msg, "msg"); 226 deny(msg); 227 } 228 229 /** 230 * This method should be overridden and implemented by a sub class if message handling is wanted. 231 * 232 * @param msg the GetAllChecksumMessage 233 * @throws PermissionDenied when invoked 234 */ 235 public void visit(GetAllChecksumsMessage msg) throws PermissionDenied { 236 ArgumentNotValid.checkNotNull(msg, "msg"); 237 deny(msg); 238 } 239 240 /** 241 * This method should be overridden and implemented by a sub class if message handling is wanted. 242 * 243 * @param msg an GetAllFilenamesMessage 244 * @throws PermissionDenied when invoked 245 */ 246 public void visit(GetAllFilenamesMessage msg) throws PermissionDenied { 247 ArgumentNotValid.checkNotNull(msg, "msg"); 248 deny(msg); 249 } 250 251}