diff --git a/server/src/main/java/Exceptions/InactiveCarException.kt b/server/src/main/java/Exceptions/InactiveCarException.kt new file mode 100644 index 00000000000..fed00479424 --- /dev/null +++ b/server/src/main/java/Exceptions/InactiveCarException.kt @@ -0,0 +1,7 @@ +package Exceptions + +/** + * Created by user on 7/28/16. + */ +class InactiveCarException : Exception() { +} \ No newline at end of file diff --git a/server/src/main/java/ServerMain.kt b/server/src/main/java/ServerMain.kt index 1003c314471..3aa710b794e 100644 --- a/server/src/main/java/ServerMain.kt +++ b/server/src/main/java/ServerMain.kt @@ -1,3 +1,4 @@ +import Exceptions.InactiveCarException import car.client.Client import io.netty.bootstrap.ServerBootstrap import io.netty.buffer.Unpooled @@ -77,7 +78,13 @@ fun main(args: Array) { request.headers().set(HttpHeaderNames.HOST, car.host) request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE) request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes()) - Client.sendRequest(request, car.host, car.port, id) + try { + Client.sendRequest(request, car.host, car.port, id) + } catch (e: InactiveCarException) { + synchronized(environment, { + environment.map.remove(id) + }) + } break } else { val wayPointData = wayPointInputString.split(" ") @@ -99,13 +106,24 @@ fun main(args: Array) { } } else if (readedString.equals("refloc", true)) { val cars = synchronized(environment, { environment.map.values }) + val inactiveCarUids = mutableListOf() for (car in cars) { val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, getLocationUrl, Unpooled.EMPTY_BUFFER) request.headers().set(HttpHeaderNames.HOST, car.host) request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE) request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes()) - Client.sendRequest(request, car.host, car.port, car.uid) + try { + Client.sendRequest(request, car.host, car.port, car.uid) + } catch (e: InactiveCarException) { + inactiveCarUids.add(car.uid) + } + println("ref loc done") } + synchronized(environment, { + for (id in inactiveCarUids) { + environment.map.remove(id) + } + }) } else if (readedString.equals("stop")) { break } else { diff --git a/server/src/main/java/car/client/Client.kt b/server/src/main/java/car/client/Client.kt index acc60f5e6e0..9b4617b4d0a 100644 --- a/server/src/main/java/car/client/Client.kt +++ b/server/src/main/java/car/client/Client.kt @@ -1,11 +1,11 @@ package car.client +import Exceptions.InactiveCarException import io.netty.bootstrap.Bootstrap import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import io.netty.handler.codec.http.HttpRequest import io.netty.util.AttributeKey -import objects.Environment import java.net.ConnectException /** @@ -34,10 +34,7 @@ object Client { } catch (e: InterruptedException) { } catch (e: ConnectException) { - val carMap = Environment.instance.map - synchronized(carMap, { - carMap.remove(carUid) - }) + throw InactiveCarException() } } diff --git a/server/src/main/java/car/client/ClientHandler.kt b/server/src/main/java/car/client/ClientHandler.kt index 1490cd82ddf..fedcef505d7 100644 --- a/server/src/main/java/car/client/ClientHandler.kt +++ b/server/src/main/java/car/client/ClientHandler.kt @@ -1,15 +1,16 @@ package car.client +import CodedInputStream +import InvalidProtocolBufferException +import LocationResponse import getLocationUrl import io.netty.channel.ChannelHandlerContext import io.netty.channel.SimpleChannelInboundHandler -import io.netty.handler.codec.http.HttpContent +import io.netty.handler.codec.http.DefaultHttpContent import io.netty.util.AttributeKey import objects.Environment -import LocationResponse import java.io.ByteArrayInputStream -import CodedInputStream -import InvalidProtocolBufferException +import java.util.* /** * Created by user on 7/8/16. @@ -41,6 +42,7 @@ class ClientHandler : SimpleChannelInboundHandler { }) } } catch (e: InvalidProtocolBufferException) { + println("invalic proto format!") } } else -> { @@ -51,7 +53,7 @@ class ClientHandler : SimpleChannelInboundHandler { } override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) { - if (msg is HttpContent) { + if (msg is DefaultHttpContent) { val contentsBytes = msg.content(); contentBytes = ByteArray(contentsBytes.capacity()) contentsBytes.readBytes(contentBytes) diff --git a/server/src/main/java/direction.kt b/server/src/main/java/direction.kt index c2f33a305d9..85e10feb96c 100644 --- a/server/src/main/java/direction.kt +++ b/server/src/main/java/direction.kt @@ -1,10 +1,14 @@ -class DirectionRequest private constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0)) { +class DirectionRequest private constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) { var command : DirectionRequest.Command private set + var sid : Int + private set + init { this.command = command + this.sid = sid } enum class Command(val ord: Int) { stop (0), @@ -31,9 +35,12 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = if (command != DirectionRequest.Command.fromIntToCommand(0)) { output.writeEnum (1, command.ord) } + if (sid != 0) { + output.writeInt32 (2, sid) + } } - class BuilderDirectionRequest constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0)) { + class BuilderDirectionRequest constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) { var command : DirectionRequest.Command private set fun setCommand(value: DirectionRequest.Command): DirectionRequest.BuilderDirectionRequest { @@ -41,19 +48,30 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = return this } + var sid : Int + private set + fun setSid(value: Int): DirectionRequest.BuilderDirectionRequest { + sid = value + return this + } + init { this.command = command + this.sid = sid } fun writeTo (output: CodedOutputStream) { if (command != DirectionRequest.Command.fromIntToCommand(0)) { output.writeEnum (1, command.ord) } + if (sid != 0) { + output.writeInt32 (2, sid) + } } fun build(): DirectionRequest { - return DirectionRequest(command) + return DirectionRequest(command, sid) } fun parseFieldFrom(input: CodedInputStream): Boolean { @@ -68,6 +86,11 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} command = DirectionRequest.Command.fromIntToCommand(input.readEnumNoTag()) } + 2 -> { + if (wireType != WireType.VARINT) { + throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.VARINT but read ${wireType.toString()}")} + sid = input.readInt32NoTag() + } } return true} fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): DirectionRequest.BuilderDirectionRequest { @@ -86,6 +109,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = if (command != DirectionRequest.Command.fromIntToCommand(0)) { size += WireFormat.getEnumSize(1, command.ord) } + if (sid != 0) { + size += WireFormat.getInt32Size(2, sid) + } size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) return size } @@ -94,6 +120,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = if (command != DirectionRequest.Command.fromIntToCommand(0)) { size += WireFormat.getEnumSize(1, command.ord) } + if (sid != 0) { + size += WireFormat.getInt32Size(2, sid) + } return size } } @@ -101,6 +130,7 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = fun mergeWith (other: DirectionRequest) { command = other.command + sid = other.sid } fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { @@ -115,6 +145,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = if (command != DirectionRequest.Command.fromIntToCommand(0)) { size += WireFormat.getEnumSize(1, command.ord) } + if (sid != 0) { + size += WireFormat.getInt32Size(2, sid) + } size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) return size } @@ -123,6 +156,9 @@ class DirectionRequest private constructor (command: DirectionRequest.Command = if (command != DirectionRequest.Command.fromIntToCommand(0)) { size += WireFormat.getEnumSize(1, command.ord) } + if (sid != 0) { + size += WireFormat.getInt32Size(2, sid) + } return size } }