diff --git a/spring-boot-samples/pom.xml b/spring-boot-samples/pom.xml index 904a17db7b..66d62aa1a4 100644 --- a/spring-boot-samples/pom.xml +++ b/spring-boot-samples/pom.xml @@ -48,6 +48,26 @@ test + + + + maven-eclipse-plugin + + false + + + .settings/org.eclipse.jdt.ui.prefs + ${main.basedir}/eclipse/org.eclipse.jdt.ui.prefs + + + .settings/org.eclipse.jdt.core.prefs + ${main.basedir}/eclipse/org.eclipse.jdt.core.prefs + + + + + + spring-snapshots diff --git a/spring-boot-samples/spring-boot-sample-websocket/pom.xml b/spring-boot-samples/spring-boot-sample-websocket/pom.xml index d98ca71dbd..7353cab0bd 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/pom.xml +++ b/spring-boot-samples/spring-boot-sample-websocket/pom.xml @@ -10,6 +10,7 @@ 0.5.0.BUILD-SNAPSHOT + ${basedir}/../.. 1.7 8.0.0-RC3 diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/GreetingService.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/GreetingService.java index 1b6793f1f8..e6b9f2982f 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/GreetingService.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/GreetingService.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.client; public interface GreetingService { diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleClientWebSocketHandler.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleClientWebSocketHandler.java index 4b8ca4a838..9eb379e97a 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleClientWebSocketHandler.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleClientWebSocketHandler.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.client; import java.util.concurrent.CountDownLatch; @@ -33,7 +34,8 @@ public class SimpleClientWebSocketHandler extends TextWebSocketHandlerAdapter { private CountDownLatch latch; @Autowired - public SimpleClientWebSocketHandler(GreetingService greetingService, CountDownLatch latch) { + public SimpleClientWebSocketHandler(GreetingService greetingService, + CountDownLatch latch) { this.greetingService = greetingService; this.latch = latch; } @@ -45,10 +47,11 @@ public class SimpleClientWebSocketHandler extends TextWebSocketHandlerAdapter { } @Override - public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { - logger.info("Received: " + message + " (" + latch.getCount() + ")"); + public void handleTextMessage(WebSocketSession session, TextMessage message) + throws Exception { + this.logger.info("Received: " + message + " (" + this.latch.getCount() + ")"); session.close(); - latch.countDown(); + this.latch.countDown(); } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleGreetingService.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleGreetingService.java index 726dd879f4..2943f5c858 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleGreetingService.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleGreetingService.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.client; public class SimpleGreetingService implements GreetingService { diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/DefaultEchoService.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/DefaultEchoService.java index bfc3b32474..9691d5b345 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/DefaultEchoService.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/DefaultEchoService.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.echo; public class DefaultEchoService implements EchoService { diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoService.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoService.java index 60751cccbb..36faaa55f8 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoService.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoService.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.echo; public interface EchoService { diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoWebSocketHandler.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoWebSocketHandler.java index fe76ee9686..bc8bad81fb 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoWebSocketHandler.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoWebSocketHandler.java @@ -1,3 +1,19 @@ +/* + * Copyright 2002-2013 the original author or authors. + * + * 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.springframework.boot.samples.websocket.echo; import org.slf4j.Logger; @@ -29,14 +45,16 @@ public class EchoWebSocketHandler extends TextWebSocketHandlerAdapter { } @Override - public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + public void handleTextMessage(WebSocketSession session, TextMessage message) + throws Exception { String echoMessage = this.echoService.getMessage(message.getPayload()); logger.debug(echoMessage); session.sendMessage(new TextMessage(echoMessage)); } @Override - public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + public void handleTransportError(WebSocketSession session, Throwable exception) + throws Exception { session.close(CloseStatus.SERVER_ERROR); } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Direction.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Direction.java index 60e18f7b03..286d9d768a 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Direction.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Direction.java @@ -14,8 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.snake; public enum Direction { - NONE, NORTH, SOUTH, EAST, WEST + NONE, NORTH, SOUTH, EAST, WEST } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Location.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Location.java index 493b9c69ae..06dbf8ba30 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Location.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Location.java @@ -14,58 +14,60 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.boot.samples.websocket.snake; - -import org.springframework.boot.samples.websocket.snake.Direction; +package org.springframework.boot.samples.websocket.snake; public class Location { - public int x; - public int y; + public int x; + public int y; public static final int GRID_SIZE = 10; public static final int PLAYFIELD_HEIGHT = 480; public static final int PLAYFIELD_WIDTH = 640; - public Location(int x, int y) { - this.x = x; - this.y = y; - } + public Location(int x, int y) { + this.x = x; + this.y = y; + } - public Location getAdjacentLocation(Direction direction) { - switch (direction) { - case NORTH: - return new Location(x, y - Location.GRID_SIZE); - case SOUTH: - return new Location(x, y + Location.GRID_SIZE); - case EAST: - return new Location(x + Location.GRID_SIZE, y); - case WEST: - return new Location(x - Location.GRID_SIZE, y); - case NONE: - // fall through - default: - return this; - } - } + public Location getAdjacentLocation(Direction direction) { + switch (direction) { + case NORTH: + return new Location(this.x, this.y - Location.GRID_SIZE); + case SOUTH: + return new Location(this.x, this.y + Location.GRID_SIZE); + case EAST: + return new Location(this.x + Location.GRID_SIZE, this.y); + case WEST: + return new Location(this.x - Location.GRID_SIZE, this.y); + case NONE: + // fall through + default: + return this; + } + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; - Location location = (Location) o; + Location location = (Location) o; - if (x != location.x) return false; - if (y != location.y) return false; + if (this.x != location.x) + return false; + if (this.y != location.y) + return false; - return true; - } + return true; + } - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - return result; - } + @Override + public int hashCode() { + int result = this.x; + result = 31 * result + this.y; + return result; + } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Snake.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Snake.java index 0ccf717281..05918ba340 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Snake.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Snake.java @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.snake; import java.util.ArrayDeque; @@ -23,117 +24,116 @@ import java.util.Deque; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; - public class Snake { - private static final int DEFAULT_LENGTH = 5; - - private final int id; - private final WebSocketSession session; - - private Direction direction; - private int length = DEFAULT_LENGTH; - private Location head; - private final Deque tail = new ArrayDeque(); - private final String hexColor; - - public Snake(int id, WebSocketSession session) { - this.id = id; - this.session = session; - this.hexColor = SnakeUtils.getRandomHexColor(); - resetState(); - } - - private void resetState() { - this.direction = Direction.NONE; - this.head = SnakeUtils.getRandomLocation(); - this.tail.clear(); - this.length = DEFAULT_LENGTH; - } - - private synchronized void kill() throws Exception { - resetState(); - sendMessage("{'type': 'dead'}"); - } - - private synchronized void reward() throws Exception { - length++; - sendMessage("{'type': 'kill'}"); - } - - - protected void sendMessage(String msg) throws Exception { - session.sendMessage(new TextMessage(msg)); - } - - public synchronized void update(Collection snakes) throws Exception { - Location nextLocation = head.getAdjacentLocation(direction); - if (nextLocation.x >= SnakeUtils.PLAYFIELD_WIDTH) { - nextLocation.x = 0; - } - if (nextLocation.y >= SnakeUtils.PLAYFIELD_HEIGHT) { - nextLocation.y = 0; - } - if (nextLocation.x < 0) { - nextLocation.x = SnakeUtils.PLAYFIELD_WIDTH; - } - if (nextLocation.y < 0) { - nextLocation.y = SnakeUtils.PLAYFIELD_HEIGHT; - } - if (direction != Direction.NONE) { - tail.addFirst(head); - if (tail.size() > length) { - tail.removeLast(); - } - head = nextLocation; - } - - handleCollisions(snakes); - } - - private void handleCollisions(Collection snakes) throws Exception { - for (Snake snake : snakes) { - boolean headCollision = id != snake.id && snake.getHead().equals(head); - boolean tailCollision = snake.getTail().contains(head); - if (headCollision || tailCollision) { - kill(); - if (id != snake.id) { - snake.reward(); - } - } - } - } - - public synchronized Location getHead() { - return head; - } - - public synchronized Collection getTail() { - return tail; - } - - public synchronized void setDirection(Direction direction) { - this.direction = direction; - } - - public synchronized String getLocationsJson() { - StringBuilder sb = new StringBuilder(); - sb.append(String.format("{x: %d, y: %d}", - Integer.valueOf(head.x), Integer.valueOf(head.y))); - for (Location location : tail) { - sb.append(','); - sb.append(String.format("{x: %d, y: %d}", - Integer.valueOf(location.x), Integer.valueOf(location.y))); - } - return String.format("{'id':%d,'body':[%s]}", - Integer.valueOf(id), sb.toString()); - } - - public int getId() { - return id; - } - - public String getHexColor() { - return hexColor; - } + private static final int DEFAULT_LENGTH = 5; + + private final int id; + private final WebSocketSession session; + + private Direction direction; + private int length = DEFAULT_LENGTH; + private Location head; + private final Deque tail = new ArrayDeque(); + private final String hexColor; + + public Snake(int id, WebSocketSession session) { + this.id = id; + this.session = session; + this.hexColor = SnakeUtils.getRandomHexColor(); + resetState(); + } + + private void resetState() { + this.direction = Direction.NONE; + this.head = SnakeUtils.getRandomLocation(); + this.tail.clear(); + this.length = DEFAULT_LENGTH; + } + + private synchronized void kill() throws Exception { + resetState(); + sendMessage("{'type': 'dead'}"); + } + + private synchronized void reward() throws Exception { + this.length++; + sendMessage("{'type': 'kill'}"); + } + + protected void sendMessage(String msg) throws Exception { + this.session.sendMessage(new TextMessage(msg)); + } + + public synchronized void update(Collection snakes) throws Exception { + Location nextLocation = this.head.getAdjacentLocation(this.direction); + if (nextLocation.x >= SnakeUtils.PLAYFIELD_WIDTH) { + nextLocation.x = 0; + } + if (nextLocation.y >= SnakeUtils.PLAYFIELD_HEIGHT) { + nextLocation.y = 0; + } + if (nextLocation.x < 0) { + nextLocation.x = SnakeUtils.PLAYFIELD_WIDTH; + } + if (nextLocation.y < 0) { + nextLocation.y = SnakeUtils.PLAYFIELD_HEIGHT; + } + if (this.direction != Direction.NONE) { + this.tail.addFirst(this.head); + if (this.tail.size() > this.length) { + this.tail.removeLast(); + } + this.head = nextLocation; + } + + handleCollisions(snakes); + } + + private void handleCollisions(Collection snakes) throws Exception { + for (Snake snake : snakes) { + boolean headCollision = this.id != snake.id + && snake.getHead().equals(this.head); + boolean tailCollision = snake.getTail().contains(this.head); + if (headCollision || tailCollision) { + kill(); + if (this.id != snake.id) { + snake.reward(); + } + } + } + } + + public synchronized Location getHead() { + return this.head; + } + + public synchronized Collection getTail() { + return this.tail; + } + + public synchronized void setDirection(Direction direction) { + this.direction = direction; + } + + public synchronized String getLocationsJson() { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("{x: %d, y: %d}", Integer.valueOf(this.head.x), + Integer.valueOf(this.head.y))); + for (Location location : this.tail) { + sb.append(','); + sb.append(String.format("{x: %d, y: %d}", Integer.valueOf(location.x), + Integer.valueOf(location.y))); + } + return String.format("{'id':%d,'body':[%s]}", Integer.valueOf(this.id), + sb.toString()); + } + + public int getId() { + return this.id; + } + + public String getHexColor() { + return this.hexColor; + } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeTimer.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeTimer.java index 99cc83f014..ace9bd67c8 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeTimer.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeTimer.java @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.snake; import java.util.Collection; @@ -32,84 +33,77 @@ import org.apache.juli.logging.LogFactory; */ public class SnakeTimer { - private static final Log log = - LogFactory.getLog(SnakeTimer.class); - - private static Timer gameTimer = null; - - private static final long TICK_DELAY = 100; - - private static final ConcurrentHashMap snakes = - new ConcurrentHashMap(); - - public static synchronized void addSnake(Snake snake) { - if (snakes.size() == 0) { - startTimer(); - } - snakes.put(Integer.valueOf(snake.getId()), snake); - } - - - public static Collection getSnakes() { - return Collections.unmodifiableCollection(snakes.values()); - } - - - public static synchronized void removeSnake(Snake snake) { - snakes.remove(Integer.valueOf(snake.getId())); - if (snakes.size() == 0) { - stopTimer(); - } - } - - - public static void tick() throws Exception { - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = SnakeTimer.getSnakes().iterator(); - iterator.hasNext();) { - Snake snake = iterator.next(); - snake.update(SnakeTimer.getSnakes()); - sb.append(snake.getLocationsJson()); - if (iterator.hasNext()) { - sb.append(','); - } - } - broadcast(String.format("{'type': 'update', 'data' : [%s]}", - sb.toString())); - } - - public static void broadcast(String message) throws Exception { - Collection snakes = new CopyOnWriteArrayList<>(SnakeTimer.getSnakes()); - for (Snake snake : snakes) { - try { - snake.sendMessage(message); - } - catch (Throwable ex) { - // if Snake#sendMessage fails the client is removed - removeSnake(snake); - } - } - } - - - public static void startTimer() { - gameTimer = new Timer(SnakeTimer.class.getSimpleName() + " Timer"); - gameTimer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - try { - tick(); - } catch (Throwable e) { - log.error("Caught to prevent timer from shutting down", e); - } - } - }, TICK_DELAY, TICK_DELAY); - } - - - public static void stopTimer() { - if (gameTimer != null) { - gameTimer.cancel(); - } - } + private static final Log log = LogFactory.getLog(SnakeTimer.class); + + private static Timer gameTimer = null; + + private static final long TICK_DELAY = 100; + + private static final ConcurrentHashMap snakes = new ConcurrentHashMap(); + + public static synchronized void addSnake(Snake snake) { + if (snakes.size() == 0) { + startTimer(); + } + snakes.put(Integer.valueOf(snake.getId()), snake); + } + + public static Collection getSnakes() { + return Collections.unmodifiableCollection(snakes.values()); + } + + public static synchronized void removeSnake(Snake snake) { + snakes.remove(Integer.valueOf(snake.getId())); + if (snakes.size() == 0) { + stopTimer(); + } + } + + public static void tick() throws Exception { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = SnakeTimer.getSnakes().iterator(); iterator + .hasNext();) { + Snake snake = iterator.next(); + snake.update(SnakeTimer.getSnakes()); + sb.append(snake.getLocationsJson()); + if (iterator.hasNext()) { + sb.append(','); + } + } + broadcast(String.format("{'type': 'update', 'data' : [%s]}", sb.toString())); + } + + public static void broadcast(String message) throws Exception { + Collection snakes = new CopyOnWriteArrayList<>(SnakeTimer.getSnakes()); + for (Snake snake : snakes) { + try { + snake.sendMessage(message); + } + catch (Throwable ex) { + // if Snake#sendMessage fails the client is removed + removeSnake(snake); + } + } + } + + public static void startTimer() { + gameTimer = new Timer(SnakeTimer.class.getSimpleName() + " Timer"); + gameTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + try { + tick(); + } + catch (Throwable e) { + log.error("Caught to prevent timer from shutting down", e); + } + } + }, TICK_DELAY, TICK_DELAY); + } + + public static void stopTimer() { + if (gameTimer != null) { + gameTimer.cancel(); + } + } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeUtils.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeUtils.java index 81527238fd..514c195c78 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeUtils.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeUtils.java @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.snake; import java.awt.Color; @@ -21,36 +22,33 @@ import java.util.Random; public class SnakeUtils { - public static final int PLAYFIELD_WIDTH = 640; - public static final int PLAYFIELD_HEIGHT = 480; - public static final int GRID_SIZE = 10; - - private static final Random random = new Random(); - - - public static String getRandomHexColor() { - float hue = random.nextFloat(); - // sat between 0.1 and 0.3 - float saturation = (random.nextInt(2000) + 1000) / 10000f; - float luminance = 0.9f; - Color color = Color.getHSBColor(hue, saturation, luminance); - return '#' + Integer.toHexString( - (color.getRGB() & 0xffffff) | 0x1000000).substring(1); - } - - - public static Location getRandomLocation() { - int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); - int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); - return new Location(x, y); - } - - - private static int roundByGridSize(int value) { - value = value + (GRID_SIZE / 2); - value = value / GRID_SIZE; - value = value * GRID_SIZE; - return value; - } + public static final int PLAYFIELD_WIDTH = 640; + public static final int PLAYFIELD_HEIGHT = 480; + public static final int GRID_SIZE = 10; + + private static final Random random = new Random(); + + public static String getRandomHexColor() { + float hue = random.nextFloat(); + // sat between 0.1 and 0.3 + float saturation = (random.nextInt(2000) + 1000) / 10000f; + float luminance = 0.9f; + Color color = Color.getHSBColor(hue, saturation, luminance); + return '#' + Integer.toHexString((color.getRGB() & 0xffffff) | 0x1000000) + .substring(1); + } + + public static Location getRandomLocation() { + int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); + int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); + return new Location(x, y); + } + + private static int roundByGridSize(int value) { + value = value + (GRID_SIZE / 2); + value = value / GRID_SIZE; + value = value * GRID_SIZE; + return value; + } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeWebSocketHandler.java b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeWebSocketHandler.java index f2eba5c349..48442a1547 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeWebSocketHandler.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeWebSocketHandler.java @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.boot.samples.websocket.snake; import java.awt.Color; @@ -28,85 +29,84 @@ import org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter; public class SnakeWebSocketHandler extends TextWebSocketHandlerAdapter { - public static final int PLAYFIELD_WIDTH = 640; - public static final int PLAYFIELD_HEIGHT = 480; - public static final int GRID_SIZE = 10; - - private static final AtomicInteger snakeIds = new AtomicInteger(0); - private static final Random random = new Random(); - - - private final int id; - private Snake snake; - - public static String getRandomHexColor() { - float hue = random.nextFloat(); - // sat between 0.1 and 0.3 - float saturation = (random.nextInt(2000) + 1000) / 10000f; - float luminance = 0.9f; - Color color = Color.getHSBColor(hue, saturation, luminance); - return '#' + Integer.toHexString( - (color.getRGB() & 0xffffff) | 0x1000000).substring(1); - } - - - public static Location getRandomLocation() { - int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); - int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); - return new Location(x, y); - } - - - private static int roundByGridSize(int value) { - value = value + (GRID_SIZE / 2); - value = value / GRID_SIZE; - value = value * GRID_SIZE; - return value; - } - - public SnakeWebSocketHandler() { - this.id = snakeIds.getAndIncrement(); - } - - - @Override + public static final int PLAYFIELD_WIDTH = 640; + public static final int PLAYFIELD_HEIGHT = 480; + public static final int GRID_SIZE = 10; + + private static final AtomicInteger snakeIds = new AtomicInteger(0); + private static final Random random = new Random(); + + private final int id; + private Snake snake; + + public static String getRandomHexColor() { + float hue = random.nextFloat(); + // sat between 0.1 and 0.3 + float saturation = (random.nextInt(2000) + 1000) / 10000f; + float luminance = 0.9f; + Color color = Color.getHSBColor(hue, saturation, luminance); + return '#' + Integer.toHexString((color.getRGB() & 0xffffff) | 0x1000000) + .substring(1); + } + + public static Location getRandomLocation() { + int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); + int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); + return new Location(x, y); + } + + private static int roundByGridSize(int value) { + value = value + (GRID_SIZE / 2); + value = value / GRID_SIZE; + value = value * GRID_SIZE; + return value; + } + + public SnakeWebSocketHandler() { + this.id = snakeIds.getAndIncrement(); + } + + @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { - this.snake = new Snake(id, session); - SnakeTimer.addSnake(snake); - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = SnakeTimer.getSnakes().iterator(); - iterator.hasNext();) { - Snake snake = iterator.next(); - sb.append(String.format("{id: %d, color: '%s'}", - Integer.valueOf(snake.getId()), snake.getHexColor())); - if (iterator.hasNext()) { - sb.append(','); - } - } - SnakeTimer.broadcast(String.format("{'type': 'join','data':[%s]}", - sb.toString())); - } - - - @Override - protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { - String payload = message.getPayload(); - if ("west".equals(payload)) { - snake.setDirection(Direction.WEST); - } else if ("north".equals(payload)) { - snake.setDirection(Direction.NORTH); - } else if ("east".equals(payload)) { - snake.setDirection(Direction.EAST); - } else if ("south".equals(payload)) { - snake.setDirection(Direction.SOUTH); - } - } - - - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { - SnakeTimer.removeSnake(snake); - SnakeTimer.broadcast(String.format("{'type': 'leave', 'id': %d}", - Integer.valueOf(id))); - } + this.snake = new Snake(this.id, session); + SnakeTimer.addSnake(this.snake); + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = SnakeTimer.getSnakes().iterator(); iterator + .hasNext();) { + Snake snake = iterator.next(); + sb.append(String.format("{id: %d, color: '%s'}", + Integer.valueOf(snake.getId()), snake.getHexColor())); + if (iterator.hasNext()) { + sb.append(','); + } + } + SnakeTimer + .broadcast(String.format("{'type': 'join','data':[%s]}", sb.toString())); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) + throws Exception { + String payload = message.getPayload(); + if ("west".equals(payload)) { + this.snake.setDirection(Direction.WEST); + } + else if ("north".equals(payload)) { + this.snake.setDirection(Direction.NORTH); + } + else if ("east".equals(payload)) { + this.snake.setDirection(Direction.EAST); + } + else if ("south".equals(payload)) { + this.snake.setDirection(Direction.SOUTH); + } + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) + throws Exception { + SnakeTimer.removeSnake(this.snake); + SnakeTimer.broadcast(String.format("{'type': 'leave', 'id': %d}", + Integer.valueOf(this.id))); + } } diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/echo/SampleWebSocketsApplicationTests.java b/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/echo/SampleWebSocketsApplicationTests.java index 89230dc802..346ec076bb 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/echo/SampleWebSocketsApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/echo/SampleWebSocketsApplicationTests.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.boot.samples.websocket.echo; -import static org.junit.Assert.assertEquals; +package org.springframework.boot.samples.websocket.echo; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; @@ -40,6 +39,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.client.WebSocketConnectionManager; import org.springframework.web.socket.client.endpoint.StandardWebSocketClient; +import static org.junit.Assert.assertEquals; + public class SampleWebSocketsApplicationTests { private static Log logger = LogFactory.getLog(SampleWebSocketsApplicationTests.class); @@ -55,7 +56,7 @@ public class SampleWebSocketsApplicationTests { new Callable() { @Override public ConfigurableApplicationContext call() throws Exception { - return (ConfigurableApplicationContext) SpringApplication + return SpringApplication .run(SampleWebSocketsApplication.class); } }); @@ -71,7 +72,8 @@ public class SampleWebSocketsApplicationTests { @Test public void runAndWait() throws Exception { - ConfigurableApplicationContext context = (ConfigurableApplicationContext) SpringApplication.run(ClientConfiguration.class, "--spring.main.web_environment=false"); + ConfigurableApplicationContext context = SpringApplication.run( + ClientConfiguration.class, "--spring.main.web_environment=false"); long count = context.getBean(ClientConfiguration.class).latch.getCount(); context.close(); assertEquals(0, count); @@ -84,15 +86,16 @@ public class SampleWebSocketsApplicationTests { @Override public void run(String... args) throws Exception { - logger.info("Waiting for response: latch=" + latch.getCount()); - latch.await(10, TimeUnit.SECONDS); - logger.info("Got response: latch=" + latch.getCount()); + logger.info("Waiting for response: latch=" + this.latch.getCount()); + this.latch.await(10, TimeUnit.SECONDS); + logger.info("Got response: latch=" + this.latch.getCount()); } @Bean public WebSocketConnectionManager wsConnectionManager() { - WebSocketConnectionManager manager = new WebSocketConnectionManager(client(), handler(), WS_URI); + WebSocketConnectionManager manager = new WebSocketConnectionManager(client(), + handler(), WS_URI); manager.setAutoStartup(true); return manager; @@ -105,7 +108,7 @@ public class SampleWebSocketsApplicationTests { @Bean public SimpleClientWebSocketHandler handler() { - return new SimpleClientWebSocketHandler(greetingService(), latch); + return new SimpleClientWebSocketHandler(greetingService(), this.latch); } @Bean diff --git a/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/snake/SnakeTimerTests.java b/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/snake/SnakeTimerTests.java index 8910711329..0911b8bad0 100644 --- a/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/snake/SnakeTimerTests.java +++ b/spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/snake/SnakeTimerTests.java @@ -1,9 +1,25 @@ -package org.springframework.boot.samples.websocket.snake; +/* + * Copyright 2002-2013 the original author or authors. + * + * 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. + */ -import org.junit.Test; +package org.springframework.boot.samples.websocket.snake; import java.io.IOException; +import org.junit.Test; + import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyString; @@ -12,13 +28,13 @@ import static org.mockito.Mockito.mock; public class SnakeTimerTests { - @Test - public void removeDysfunctionalSnakes() throws Exception { - Snake snake = mock(Snake.class); - doThrow(new IOException()).when(snake).sendMessage(anyString()); - SnakeTimer.addSnake(snake); + @Test + public void removeDysfunctionalSnakes() throws Exception { + Snake snake = mock(Snake.class); + doThrow(new IOException()).when(snake).sendMessage(anyString()); + SnakeTimer.addSnake(snake); - SnakeTimer.broadcast(""); - assertThat(SnakeTimer.getSnakes().size(), is(0)); - } + SnakeTimer.broadcast(""); + assertThat(SnakeTimer.getSnakes().size(), is(0)); + } }