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}