/* Copyright (c) 2011 Danish Maritime Authority.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dk.dma.ais.bus.provider;
import java.util.concurrent.atomic.AtomicReference;
import net.jcip.annotations.ThreadSafe;
import dk.dma.ais.bus.AisBusProvider;
import dk.dma.ais.packet.AisPacket;
import dk.dma.ais.reader.AisReader;
import java.util.function.Consumer;
/**
* Provider class that uses an AisReader to provide AIS packets
*/
@ThreadSafe
public class AisReaderProvider extends AisBusProvider implements Consumer<AisPacket> {
/**
* The AIS reader to provide packets
*/
private AtomicReference<AisReader> aisReader = new AtomicReference<>();
public AisReaderProvider(boolean blocking) {
super(blocking);
}
public AisReaderProvider(AisReader aisReader) {
setAisReader(aisReader);
}
/**
* Receive packet from reader
*/
@Override
public void accept(AisPacket packet) {
// Push to bus
push(packet);
}
@Override
public void start() {
// Start the reader
aisReader.get().start();
setThread(aisReader.get());
}
@Override
public void cancel() {
aisReader.get().stopReader();
try {
aisReader.get().join(THREAD_STOP_WAIT_MAX);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void setAisReader(AisReader aisReader) {
if (this.aisReader.get() != null) {
throw new IllegalStateException("AisReader already defined");
}
this.aisReader.set(aisReader);
// Register self as handler of packets
this.aisReader.get().registerPacketHandler(this);
}
}