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}