aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/BasePipelineFactory.java
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2013-01-15 00:19:39 +1300
committerAnton Tananaev <anton.tananaev@gmail.com>2013-01-15 00:19:39 +1300
commitb5bd3e35f563825c9d40eaa04c02bc6397029219 (patch)
tree05684875856d3908fdec3c582ecbf2153a5bdfb8 /src/org/traccar/BasePipelineFactory.java
parent38fbc3e872717a1179abd00a48b600b489f9fead (diff)
downloadtraccar-server-b5bd3e35f563825c9d40eaa04c02bc6397029219.tar.gz
traccar-server-b5bd3e35f563825c9d40eaa04c02bc6397029219.tar.bz2
traccar-server-b5bd3e35f563825c9d40eaa04c02bc6397029219.zip
Pass ServerManager to every protocol decoder
Diffstat (limited to 'src/org/traccar/BasePipelineFactory.java')
-rw-r--r--src/org/traccar/BasePipelineFactory.java124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
new file mode 100644
index 000000000..139f5e526
--- /dev/null
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2012 - 2013 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * 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 org.traccar;
+
+import java.net.InetSocketAddress;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.*;
+import org.jboss.netty.handler.logging.LoggingHandler;
+import org.jboss.netty.handler.timeout.IdleStateHandler;
+import org.traccar.geocode.ReverseGeocoder;
+import org.traccar.helper.Log;
+import org.traccar.model.DataManager;
+
+/**
+ * Base pipeline factory
+ */
+public abstract class BasePipelineFactory implements ChannelPipelineFactory {
+
+ private TrackerServer server;
+ private DataManager dataManager;
+ private Boolean loggerEnabled;
+ private Integer resetDelay;
+ private ReverseGeocoder reverseGeocoder;
+
+ /**
+ * Open channel handler
+ */
+ protected class OpenChannelHandler extends SimpleChannelHandler {
+
+ private TrackerServer server;
+
+ public OpenChannelHandler(TrackerServer server) {
+ this.server = server;
+ }
+
+ @Override
+ public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
+ server.getChannelGroup().add(e.getChannel());
+ }
+ }
+
+ /**
+ * Logging using global logger
+ */
+ protected class StandardLoggingHandler extends LoggingHandler {
+
+ static final String HEX_CHARS = "0123456789ABCDEF";
+
+ @Override
+ public void log(ChannelEvent e) {
+ if (e instanceof MessageEvent) {
+ MessageEvent event = (MessageEvent) e;
+ StringBuilder msg = new StringBuilder();
+
+ msg.append("[").append(((InetSocketAddress) e.getChannel().getLocalAddress()).getPort()).append(" - ");
+ msg.append(((InetSocketAddress) event.getRemoteAddress()).getAddress().getHostAddress()).append("]");
+
+ // Append hex message
+ if (event.getMessage() instanceof ChannelBuffer) {
+ msg.append(" - (HEX: ");
+ msg.append(ChannelBuffers.hexDump((ChannelBuffer) event.getMessage()));
+ msg.append(")");
+ }
+
+ Log.fine(msg.toString());
+ } else if (e instanceof ExceptionEvent) {
+ ExceptionEvent event = (ExceptionEvent) e;
+ Log.warning(event.getCause().toString());
+ }
+ // TODO: handle other events
+ }
+ }
+
+ public BasePipelineFactory(ServerManager serverManager, TrackerServer server, String protocol) {
+ this.server = server;
+ dataManager = serverManager.getDataManager();
+ loggerEnabled = serverManager.isLoggerEnabled();
+ reverseGeocoder = serverManager.getReverseGeocoder();
+
+ String resetDelayProperty = serverManager.getProperties().getProperty(protocol + ".resetDelay");
+ if (resetDelayProperty != null) {
+ resetDelay = Integer.valueOf(resetDelayProperty);
+ }
+ }
+
+ protected DataManager getDataManager() {
+ return dataManager;
+ }
+
+ protected abstract void addSpecificHandlers(ChannelPipeline pipeline);
+
+ @Override
+ public ChannelPipeline getPipeline() {
+ ChannelPipeline pipeline = Channels.pipeline();
+ if (resetDelay != null) {
+ pipeline.addLast("idleHandler", new IdleStateHandler(GlobalTimer.getTimer(), resetDelay, 0, 0));
+ }
+ pipeline.addLast("openHandler", new OpenChannelHandler(server));
+ if (loggerEnabled) {
+ pipeline.addLast("logger", new StandardLoggingHandler());
+ }
+ addSpecificHandlers(pipeline);
+ if (reverseGeocoder != null) {
+ pipeline.addLast("geocoder", new ReverseGeocoderHandler(reverseGeocoder));
+ }
+ pipeline.addLast("handler", new TrackerEventHandler(dataManager));
+ return pipeline;
+ }
+
+}