Commit 21d80d87 authored by Phillip Webb's avatar Phillip Webb

Merge branch '1.5.x' into 2.0.x

parents 606eb9dd e69296d7
...@@ -237,8 +237,9 @@ public class JerseyAutoConfiguration implements ServletContextAware { ...@@ -237,8 +237,9 @@ public class JerseyAutoConfiguration implements ServletContextAware {
final ObjectMapper objectMapper) { final ObjectMapper objectMapper) {
addJaxbAnnotationIntrospectorIfPresent(objectMapper); addJaxbAnnotationIntrospectorIfPresent(objectMapper);
return (ResourceConfig config) -> { return (ResourceConfig config) -> {
config.register(JacksonFeature.class); JerseyAutoConfiguration.this.config.register(JacksonFeature.class);
config.register(new ObjectMapperContextResolver(objectMapper), JerseyAutoConfiguration.this.config.register(
new ObjectMapperContextResolver(objectMapper),
ContextResolver.class); ContextResolver.class);
}; };
} }
......
...@@ -5,8 +5,7 @@ ...@@ -5,8 +5,7 @@
<suppressions> <suppressions>
<suppress files="SpringApplicationTests\.java" checks="FinalClass" /> <suppress files="SpringApplicationTests\.java" checks="FinalClass" />
<suppress files=".+Configuration\.java" checks="HideUtilityClassConstructor" /> <suppress files=".+Configuration\.java" checks="HideUtilityClassConstructor" />
<suppress files="LaunchScriptTestApplication\.java" checks="HideUtilityClassConstructor" /> <suppress files=".+Application\.java" checks="HideUtilityClassConstructor" />
<suppress files="DevToolsTestApplication\.java" checks="HideUtilityClassConstructor" />
<suppress files="SignalUtils\.java" checks="IllegalImport" /> <suppress files="SignalUtils\.java" checks="IllegalImport" />
<suppress files="[\\/]src[\\/]test[\\/]java[\\/]cli[\\/]command[\\/]" checks="ImportControl" /> <suppress files="[\\/]src[\\/]test[\\/]java[\\/]cli[\\/]command[\\/]" checks="ImportControl" />
<suppress files="[\\/]src[\\/]main[\\/]java[\\/]sample[\\/]" checks="ImportControl" /> <suppress files="[\\/]src[\\/]main[\\/]java[\\/]sample[\\/]" checks="ImportControl" />
...@@ -23,4 +22,8 @@ ...@@ -23,4 +22,8 @@
<suppress files="LogLevel\.java" checks="JavadocVariable" /> <suppress files="LogLevel\.java" checks="JavadocVariable" />
<suppress files="HelpMojo\.java" checks=".*"/> <suppress files="HelpMojo\.java" checks=".*"/>
<suppress files="[\\/]org.springframework.boot.configurationprocessor.json[\\/].*\.java$" checks=".*"/> <suppress files="[\\/]org.springframework.boot.configurationprocessor.json[\\/].*\.java$" checks=".*"/>
<suppress files="TripType\.java" checks="JavadocVariable" />
<suppress files="Rating\.java" checks="JavadocVariable" />
<suppress files="Direction\.java" checks="JavadocVariable" />
<suppress files="JooqExamples\.java" checks="AvoidStaticImport"/>
</suppressions> </suppressions>
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
...@@ -16,17 +16,18 @@ ...@@ -16,17 +16,18 @@
package sample.ant; package sample.ant;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.loader.tools.JavaExecutable; import org.springframework.boot.loader.tools.JavaExecutable;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Integration Tests for {@code SampleAntApplication}. * Integration Tests for {@code SampleAntApplication}.
* *
......
...@@ -59,6 +59,10 @@ public class SampleAtmosphereApplication { ...@@ -59,6 +59,10 @@ public class SampleAtmosphereApplication {
return registration; return registration;
} }
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleAtmosphereApplication.class, args);
}
@Configuration @Configuration
static class MvcConfiguration implements WebMvcConfigurer { static class MvcConfiguration implements WebMvcConfigurer {
...@@ -79,8 +83,4 @@ public class SampleAtmosphereApplication { ...@@ -79,8 +83,4 @@ public class SampleAtmosphereApplication {
} }
public static void main(String[] args) {
SpringApplication.run(SampleAtmosphereApplication.class, args);
}
} }
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -53,7 +53,7 @@ class SampleClient { ...@@ -53,7 +53,7 @@ class SampleClient {
private final Random random; private final Random random;
public SampleClient(CountryRepository countryService) { SampleClient(CountryRepository countryService) {
this.countryService = countryService; this.countryService = countryService;
this.random = new Random(); this.random = new Random();
} }
......
...@@ -24,6 +24,8 @@ import org.springframework.boot.loader.tools.Layouts; ...@@ -24,6 +24,8 @@ import org.springframework.boot.loader.tools.Layouts;
import org.springframework.boot.loader.tools.LoaderClassesWriter; import org.springframework.boot.loader.tools.LoaderClassesWriter;
/** /**
* An example layout.
*
* @author Phillip Webb * @author Phillip Webb
*/ */
public class SampleLayout extends Layouts.Jar implements CustomLoaderLayout { public class SampleLayout extends Layouts.Jar implements CustomLoaderLayout {
......
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -24,9 +24,9 @@ import org.springframework.data.repository.CrudRepository; ...@@ -24,9 +24,9 @@ import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, String> { public interface CustomerRepository extends CrudRepository<Customer, String> {
@Query("Select * from customer where firstname=?0") @Query("Select * from customer where firstname=?0")
public Customer findByFirstName(String firstName); Customer findByFirstName(String firstName);
@Query("Select * from customer where lastname=?0") @Query("Select * from customer where lastname=?0")
public List<Customer> findByLastName(String lastName); List<Customer> findByLastName(String lastName);
} }
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,8 +22,8 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository ...@@ -22,8 +22,8 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
public interface CustomerRepository extends ElasticsearchRepository<Customer, String> { public interface CustomerRepository extends ElasticsearchRepository<Customer, String> {
public Customer findByFirstName(String firstName); Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName); List<Customer> findByLastName(String lastName);
} }
...@@ -34,8 +34,7 @@ class CityServiceImpl implements CityService { ...@@ -34,8 +34,7 @@ class CityServiceImpl implements CityService {
private final HotelRepository hotelRepository; private final HotelRepository hotelRepository;
public CityServiceImpl(CityRepository cityRepository, CityServiceImpl(CityRepository cityRepository, HotelRepository hotelRepository) {
HotelRepository hotelRepository) {
this.cityRepository = cityRepository; this.cityRepository = cityRepository;
this.hotelRepository = hotelRepository; this.hotelRepository = hotelRepository;
} }
......
...@@ -41,8 +41,7 @@ class HotelServiceImpl implements HotelService { ...@@ -41,8 +41,7 @@ class HotelServiceImpl implements HotelService {
private final ReviewRepository reviewRepository; private final ReviewRepository reviewRepository;
public HotelServiceImpl(HotelRepository hotelRepository, HotelServiceImpl(HotelRepository hotelRepository, ReviewRepository reviewRepository) {
ReviewRepository reviewRepository) {
this.hotelRepository = hotelRepository; this.hotelRepository = hotelRepository;
this.reviewRepository = reviewRepository; this.reviewRepository = reviewRepository;
} }
...@@ -82,7 +81,7 @@ class HotelServiceImpl implements HotelService { ...@@ -82,7 +81,7 @@ class HotelServiceImpl implements HotelService {
private final Map<Rating, Long> ratingCount; private final Map<Rating, Long> ratingCount;
public ReviewsSummaryImpl(List<RatingCount> ratingCounts) { ReviewsSummaryImpl(List<RatingCount> ratingCounts) {
this.ratingCount = new HashMap<>(); this.ratingCount = new HashMap<>();
for (RatingCount ratingCount : ratingCounts) { for (RatingCount ratingCount : ratingCounts) {
this.ratingCount.put(ratingCount.getRating(), ratingCount.getCount()); this.ratingCount.put(ratingCount.getRating(), ratingCount.getCount());
...@@ -92,7 +91,7 @@ class HotelServiceImpl implements HotelService { ...@@ -92,7 +91,7 @@ class HotelServiceImpl implements HotelService {
@Override @Override
public long getNumberOfReviewsWithRating(Rating rating) { public long getNumberOfReviewsWithRating(Rating rating) {
Long count = this.ratingCount.get(rating); Long count = this.ratingCount.get(rating);
return count == null ? 0 : count; return (count != null ? count : 0);
} }
} }
......
spring.datasource.name=scratchdb spring.datasource.name=scratchdb
spring.jmx.default-domain=jpa.sample spring.jmx.default-domain=jpa.sample
\ No newline at end of file
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -24,6 +24,7 @@ public class Customer { ...@@ -24,6 +24,7 @@ public class Customer {
private String id; private String id;
private String firstName; private String firstName;
private String lastName; private String lastName;
public Customer() { public Customer() {
...@@ -36,8 +37,8 @@ public class Customer { ...@@ -36,8 +37,8 @@ public class Customer {
@Override @Override
public String toString() { public String toString() {
return String.format("Customer[id=%s, firstName='%s', lastName='%s']", id, return String.format("Customer[id=%s, firstName='%s', lastName='%s']", this.id,
firstName, lastName); this.firstName, this.lastName);
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -28,6 +28,7 @@ public class Customer { ...@@ -28,6 +28,7 @@ public class Customer {
private Long id; private Long id;
private String firstName; private String firstName;
private String lastName; private String lastName;
public Customer() { public Customer() {
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,8 +22,8 @@ import org.springframework.data.neo4j.repository.Neo4jRepository; ...@@ -22,8 +22,8 @@ import org.springframework.data.neo4j.repository.Neo4jRepository;
public interface CustomerRepository extends Neo4jRepository<Customer, Long> { public interface CustomerRepository extends Neo4jRepository<Customer, Long> {
public Customer findByFirstName(String firstName); Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName); List<Customer> findByLastName(String lastName);
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,7 +22,7 @@ import org.neo4j.driver.v1.exceptions.ServiceUnavailableException; ...@@ -22,7 +22,7 @@ import org.neo4j.driver.v1.exceptions.ServiceUnavailableException;
import org.springframework.boot.test.rule.OutputCapture; import org.springframework.boot.test.rule.OutputCapture;
import static org.junit.Assert.assertTrue; import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Tests for {@link SampleNeo4jApplication}. * Tests for {@link SampleNeo4jApplication}.
...@@ -45,8 +45,7 @@ public class SampleNeo4jApplicationTests { ...@@ -45,8 +45,7 @@ public class SampleNeo4jApplicationTests {
} }
} }
String output = this.outputCapture.toString(); String output = this.outputCapture.toString();
assertTrue("Wrong output: " + output, assertThat(output).contains("firstName='Alice', lastName='Smith'");
output.contains("firstName='Alice', lastName='Smith'"));
} }
private boolean neo4jServerRunning(Throwable ex) { private boolean neo4jServerRunning(Throwable ex) {
......
spring.data.rest.base-path=/api spring.data.rest.base-path=/api
\ No newline at end of file
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,8 +16,14 @@ ...@@ -16,8 +16,14 @@
package sample.devtools; package sample.devtools;
public class Message { public final class Message {
/**
* Sample message.
*/
public static String MESSAGE = "Message"; public static String MESSAGE = "Message";
private Message() {
}
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -23,11 +23,14 @@ import javax.persistence.SequenceGenerator; ...@@ -23,11 +23,14 @@ import javax.persistence.SequenceGenerator;
@Entity @Entity
public class Person { public class Person {
@Id @Id
@SequenceGenerator(name = "person_generator", sequenceName = "person_sequence", allocationSize = 1) @SequenceGenerator(name = "person_generator", sequenceName = "person_sequence", allocationSize = 1)
@GeneratedValue(generator = "person_generator") @GeneratedValue(generator = "person_generator")
private Long id; private Long id;
private String firstName; private String firstName;
private String lastName; private String lastName;
public String getFirstName() { public String getFirstName() {
...@@ -51,4 +54,5 @@ public class Person { ...@@ -51,4 +54,5 @@ public class Person {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
+ "]"; + "]";
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -119,4 +119,5 @@ public class SampleIntegrationApplicationTests { ...@@ -119,4 +119,5 @@ public class SampleIntegrationApplicationTests {
} }
return candidates; return candidates;
} }
} }
server.port = 8443 server.port = 8443
server.ssl.key-store = classpath:sample.jks server.ssl.key-store = classpath:sample.jks
server.ssl.key-store-password = secret server.ssl.key-store-password = secret
server.ssl.key-password = password server.ssl.key-password = password
\ No newline at end of file
...@@ -76,4 +76,5 @@ public class JooqExamples implements CommandLineRunner { ...@@ -76,4 +76,5 @@ public class JooqExamples implements CommandLineRunner {
}); });
System.out.println("jOOQ SQL " + list); System.out.println("jOOQ SQL " + list);
} }
} }
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -68,4 +68,5 @@ public class SampleLiquibaseApplicationTests { ...@@ -68,4 +68,5 @@ public class SampleLiquibaseApplicationTests {
} }
return false; return false;
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
...@@ -36,6 +36,11 @@ import org.springframework.integration.file.FileWritingMessageHandler; ...@@ -36,6 +36,11 @@ import org.springframework.integration.file.FileWritingMessageHandler;
@EnableConfigurationProperties(ServiceProperties.class) @EnableConfigurationProperties(ServiceProperties.class)
public class SampleParentContextApplication { public class SampleParentContextApplication {
public static void main(String[] args) throws Exception {
new SpringApplicationBuilder(Parent.class)
.child(SampleParentContextApplication.class).run(args);
}
@EnableAutoConfiguration @EnableAutoConfiguration
protected static class Parent { protected static class Parent {
...@@ -83,9 +88,4 @@ public class SampleParentContextApplication { ...@@ -83,9 +88,4 @@ public class SampleParentContextApplication {
} }
public static void main(String[] args) {
new SpringApplicationBuilder(Parent.class)
.child(SampleParentContextApplication.class).run(args);
}
} }
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -99,4 +99,5 @@ public class SampleIntegrationParentApplicationTests { ...@@ -99,4 +99,5 @@ public class SampleIntegrationParentApplicationTests {
} }
return builder.toString(); return builder.toString();
} }
} }
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,9 +16,6 @@ ...@@ -16,9 +16,6 @@
package sample.profile.service; package sample.profile.service;
/**
* @author Dave Syer
*/
public interface MessageService { public interface MessageService {
String getMessage(); String getMessage();
......
sample.host=192.168.0.1 sample.host=192.168.0.1
sample.port=7070 sample.port=7070
\ No newline at end of file
/* /*
<<<<<<< HEAD:spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleJob.java
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2017 the original author or authors.
=======
* Copyright 2012-2018 the original author or authors.
>>>>>>> local15x/1.5.x:spring-boot-samples/spring-boot-sample-hibernate4/src/main/java/sample/hibernate4/service/CitySearchCriteria.java
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
/* /*
* Copyright 2012-2014 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -20,10 +20,6 @@ import org.springframework.security.access.annotation.Secured; ...@@ -20,10 +20,6 @@ import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/**
* @author Dave Syer
*
*/
@Service @Service
public class SampleService { public class SampleService {
......
# debug: true # debug: true
spring.security.user.name=user spring.security.user.name=user
spring.security.user.password=password spring.security.user.password=password
spring.security.user.roles=USER spring.security.user.roles=USER
\ No newline at end of file
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -67,4 +67,5 @@ public class SampleServletApplicationTests { ...@@ -67,4 +67,5 @@ public class SampleServletApplicationTests {
private String getPassword() { private String getPassword() {
return "password"; return "password";
} }
} }
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -25,7 +25,7 @@ import sample.test.domain.VehicleIdentificationNumber; ...@@ -25,7 +25,7 @@ import sample.test.domain.VehicleIdentificationNumber;
*/ */
public class VehicleIdentificationNumberNotFoundException extends RuntimeException { public class VehicleIdentificationNumberNotFoundException extends RuntimeException {
private VehicleIdentificationNumber vehicleIdentificationNumber; private final VehicleIdentificationNumber vehicleIdentificationNumber;
public VehicleIdentificationNumberNotFoundException(VehicleIdentificationNumber vin) { public VehicleIdentificationNumberNotFoundException(VehicleIdentificationNumber vin) {
this(vin, null); this(vin, null);
...@@ -40,4 +40,5 @@ public class VehicleIdentificationNumberNotFoundException extends RuntimeExcepti ...@@ -40,4 +40,5 @@ public class VehicleIdentificationNumberNotFoundException extends RuntimeExcepti
public VehicleIdentificationNumber getVehicleIdentificationNumber() { public VehicleIdentificationNumber getVehicleIdentificationNumber() {
return this.vehicleIdentificationNumber; return this.vehicleIdentificationNumber;
} }
} }
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND) @ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNameNotFoundException extends RuntimeException { public class UserNameNotFoundException extends RuntimeException {
private String username; private final String username;
public UserNameNotFoundException(String username) { public UserNameNotFoundException(String username) {
this.username = username; this.username = username;
......
spring.mvc.view.prefix: /WEB-INF/jsp/ spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp spring.mvc.view.suffix: .jsp
application.message: Hello Phil application.message: Hello Phil
\ No newline at end of file
...@@ -25,7 +25,7 @@ import org.springframework.boot.web.servlet.server.ServletWebServerFactory; ...@@ -25,7 +25,7 @@ import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
/** /**
* Sample Application to show Tomcat running two connectors * Sample Application to show Tomcat running two connectors.
* *
* @author Brock Mills * @author Brock Mills
* @author Andy Wilkinson * @author Andy Wilkinson
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -52,6 +52,13 @@ public class NonAutoConfigurationSampleTomcatApplicationTests { ...@@ -52,6 +52,13 @@ public class NonAutoConfigurationSampleTomcatApplicationTests {
@Autowired @Autowired
private TestRestTemplate restTemplate; private TestRestTemplate restTemplate;
@Test
public void testHome() throws Exception {
ResponseEntity<String> entity = this.restTemplate.getForEntity("/", String.class);
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(entity.getBody()).isEqualTo("Hello World");
}
@Configuration @Configuration
@Import({ ServletWebServerFactoryAutoConfiguration.class, @Import({ ServletWebServerFactoryAutoConfiguration.class,
DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class, DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class,
...@@ -67,11 +74,4 @@ public class NonAutoConfigurationSampleTomcatApplicationTests { ...@@ -67,11 +74,4 @@ public class NonAutoConfigurationSampleTomcatApplicationTests {
} }
@Test
public void testHome() {
ResponseEntity<String> entity = this.restTemplate.getForEntity("/", String.class);
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(entity.getBody()).isEqualTo("Hello World");
}
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -55,4 +55,5 @@ public class WebConfig implements WebMvcConfigurer { ...@@ -55,4 +55,5 @@ public class WebConfig implements WebMvcConfigurer {
DefaultServletHandlerConfigurer configurer) { DefaultServletHandlerConfigurer configurer) {
configurer.enable(); configurer.enable();
} }
} }
server.port = 8443 server.port = 8443
server.ssl.key-store = classpath:sample.jks server.ssl.key-store = classpath:sample.jks
server.ssl.key-store-password = secret server.ssl.key-store-password = secret
server.ssl.key-password = password server.ssl.key-password = password
\ No newline at end of file
...@@ -2,4 +2,4 @@ server.undertow.accesslog.enabled=true ...@@ -2,4 +2,4 @@ server.undertow.accesslog.enabled=true
server.undertow.accesslog.dir=target/logs server.undertow.accesslog.dir=target/logs
server.undertow.accesslog.pattern=combined server.undertow.accesslog.pattern=combined
server.compression.enabled=true server.compression.enabled=true
server.compression.min-response-size=1 server.compression.min-response-size=1
\ No newline at end of file
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -21,11 +21,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -21,11 +21,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
/**
* Sample WAR application
*/
@SpringBootApplication @SpringBootApplication
@PropertySource(value = { "WEB-INF/custom.properties" }) @PropertySource("WEB-INF/custom.properties")
public class SampleWarApplication extends SpringBootServletInitializer { public class SampleWarApplication extends SpringBootServletInitializer {
public static void main(String[] args) { public static void main(String[] args) {
......
application.message: Hello, Andy application.message: Hello, Andy
\ No newline at end of file
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
......
# Allow templates to be reloaded at dev time # Allow templates to be reloaded at dev time
spring.groovy.template.cache: false spring.groovy.template.cache: false
logging.level.org.springframework.web: INFO logging.level.org.springframework.web: INFO
\ No newline at end of file
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -82,14 +82,10 @@ public class MessageControllerWebTests { ...@@ -82,14 +82,10 @@ public class MessageControllerWebTests {
private final String regex; private final String regex;
public RegexMatcher(String regex) { RegexMatcher(String regex) {
this.regex = regex; this.regex = regex;
} }
public static org.hamcrest.Matcher<java.lang.String> matches(String regex) {
return new RegexMatcher(regex);
}
@Override @Override
public boolean matchesSafely(String item) { public boolean matchesSafely(String item) {
return Pattern.compile(this.regex).matcher(item).find(); return Pattern.compile(this.regex).matcher(item).find();
...@@ -106,6 +102,10 @@ public class MessageControllerWebTests { ...@@ -106,6 +102,10 @@ public class MessageControllerWebTests {
.appendText(this.regex); .appendText(this.regex);
} }
public static org.hamcrest.Matcher<java.lang.String> matches(String regex) {
return new RegexMatcher(regex);
}
} }
} }
spring.mvc.view.prefix: /WEB-INF/jsp/ spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp spring.mvc.view.suffix: .jsp
application.message: Hello Phil application.message: Hello Phil
\ No newline at end of file
...@@ -42,20 +42,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; ...@@ -42,20 +42,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableGlobalMethodSecurity(securedEnabled = true) @EnableGlobalMethodSecurity(securedEnabled = true)
public class SampleMethodSecurityApplication implements WebMvcConfigurer { public class SampleMethodSecurityApplication implements WebMvcConfigurer {
@Controller
protected static class HomeController {
@GetMapping("/")
@Secured("ROLE_ADMIN")
public String home(Map<String, Object> model) {
model.put("message", "Hello World");
model.put("title", "Hello Home");
model.put("date", new Date());
return "home";
}
}
@Override @Override
public void addViewControllers(ViewControllerRegistry registry) { public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login"); registry.addViewController("/login").setViewName("login");
...@@ -118,4 +104,18 @@ public class SampleMethodSecurityApplication implements WebMvcConfigurer { ...@@ -118,4 +104,18 @@ public class SampleMethodSecurityApplication implements WebMvcConfigurer {
} }
@Controller
protected static class HomeController {
@GetMapping("/")
@Secured("ROLE_ADMIN")
public String home(Map<String, Object> model) {
model.put("message", "Hello World");
model.put("title", "Hello Home");
model.put("date", new Date());
return "home";
}
}
} }
application.message: Hello, Andy application.message: Hello, Andy
\ No newline at end of file
spring.thymeleaf.cache: false spring.thymeleaf.cache: false
logging.level.org.springframework.security: INFO logging.level.org.springframework.security: INFO
spring.security.user.name=user spring.security.user.name=user
spring.security.user.password=password spring.security.user.password=password
\ No newline at end of file
debug: true debug: true
spring.thymeleaf.cache: false spring.thymeleaf.cache: false
logging.level.org.springframework.security: INFO logging.level.org.springframework.security: INFO
\ No newline at end of file
...@@ -2,6 +2,5 @@ spring.thymeleaf.cache: false ...@@ -2,6 +2,5 @@ spring.thymeleaf.cache: false
# demo only: # demo only:
logging.level.org.springframework.security: INFO logging.level.org.springframework.security: INFO
logging.level.org.springframework.boot.actuate.audit.listener.AuditListener: DEBUG logging.level.org.springframework.boot.actuate.audit.listener.AuditListener: DEBUG
spring.security.user.name=user spring.security.user.name=user
spring.security.user.password=password spring.security.user.password=password
\ No newline at end of file
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -20,9 +20,6 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -20,9 +20,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
/**
* @author Dave Syer
*/
public class InMemoryMessageRepository implements MessageRepository { public class InMemoryMessageRepository implements MessageRepository {
private static AtomicLong counter = new AtomicLong(); private static AtomicLong counter = new AtomicLong();
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -20,9 +20,6 @@ import java.util.Calendar; ...@@ -20,9 +20,6 @@ import java.util.Calendar;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
/**
* @author Rob Winch
*/
public class Message { public class Message {
private Long id; private Long id;
......
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 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 * Licensed under the Apache License, Version 2.0 (the "License");
* the License. You may obtain a copy of the License at * 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 * 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 * Unless required by applicable law or agreed to in writing, software
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * distributed under the License is distributed on an "AS IS" BASIS,
* specific language governing permissions and limitations under the License. * 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 sample.web.ui; package sample.web.ui;
/**
* @author Rob Winch
*/
public interface MessageRepository { public interface MessageRepository {
Iterable<Message> findAll(); Iterable<Message> findAll();
......
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -31,10 +31,6 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -31,10 +31,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
/**
* @author Rob Winch
* @author Doo-Hwan Kwak
*/
@Controller @Controller
@RequestMapping("/") @RequestMapping("/")
public class MessageController { public class MessageController {
...@@ -77,14 +73,14 @@ public class MessageController { ...@@ -77,14 +73,14 @@ public class MessageController {
throw new RuntimeException("Expected exception in controller"); throw new RuntimeException("Expected exception in controller");
} }
@GetMapping(value = "delete/{id}") @GetMapping("delete/{id}")
public ModelAndView delete(@PathVariable("id") Long id) { public ModelAndView delete(@PathVariable("id") Long id) {
this.messageRepository.deleteMessage(id); this.messageRepository.deleteMessage(id);
Iterable<Message> messages = this.messageRepository.findAll(); Iterable<Message> messages = this.messageRepository.findAll();
return new ModelAndView("messages/list", "messages", messages); return new ModelAndView("messages/list", "messages", messages);
} }
@GetMapping(value = "modify/{id}") @GetMapping("modify/{id}")
public ModelAndView modifyForm(@PathVariable("id") Message message) { public ModelAndView modifyForm(@PathVariable("id") Message message) {
return new ModelAndView("messages/form", "message", message); return new ModelAndView("messages/form", "message", message);
} }
......
# Allow Thymeleaf templates to be reloaded at dev time # Allow Thymeleaf templates to be reloaded at dev time
spring.thymeleaf.cache: false spring.thymeleaf.cache: false
server.tomcat.access_log_enabled: true server.tomcat.access_log_enabled: true
server.tomcat.basedir: target/tomcat server.tomcat.basedir: target/tomcat
\ No newline at end of file
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -81,16 +81,13 @@ public class MessageControllerWebTests { ...@@ -81,16 +81,13 @@ public class MessageControllerWebTests {
} }
private static class RegexMatcher extends TypeSafeMatcher<String> { private static class RegexMatcher extends TypeSafeMatcher<String> {
private final String regex; private final String regex;
public RegexMatcher(String regex) { RegexMatcher(String regex) {
this.regex = regex; this.regex = regex;
} }
public static org.hamcrest.Matcher<java.lang.String> matches(String regex) {
return new RegexMatcher(regex);
}
@Override @Override
public boolean matchesSafely(String item) { public boolean matchesSafely(String item) {
return Pattern.compile(this.regex).matcher(item).find(); return Pattern.compile(this.regex).matcher(item).find();
...@@ -106,5 +103,11 @@ public class MessageControllerWebTests { ...@@ -106,5 +103,11 @@ public class MessageControllerWebTests {
description.appendText("a string that matches regex: ") description.appendText("a string that matches regex: ")
.appendText(this.regex); .appendText(this.regex);
} }
public static org.hamcrest.Matcher<java.lang.String> matches(String regex) {
return new RegexMatcher(regex);
}
} }
} }
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService { ...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService {
private final String echoFormat; private final String echoFormat;
public DefaultEchoService(String echoFormat) { public DefaultEchoService(String echoFormat) {
this.echoFormat = (echoFormat != null) ? echoFormat : "%s"; this.echoFormat = (echoFormat != null ? echoFormat : "%s");
} }
@Override @Override
......
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint { ...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint {
session.getBasicRemote() session.getBasicRemote()
.sendText("Reversed: " + new StringBuilder(message).reverse()); .sendText("Reversed: " + new StringBuilder(message).reverse());
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -18,5 +17,7 @@ ...@@ -18,5 +17,7 @@
package samples.websocket.jetty.snake; package samples.websocket.jetty.snake;
public enum Direction { public enum Direction {
NONE, NORTH, SOUTH, EAST, WEST NONE, NORTH, SOUTH, EAST, WEST
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -19,11 +18,15 @@ package samples.websocket.jetty.snake; ...@@ -19,11 +18,15 @@ package samples.websocket.jetty.snake;
public class Location { public class Location {
/**
* The X location.
*/
public int x; public int x;
/**
* The Y location.
*/
public int y; 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) { public Location(int x, int y) {
this.x = x; this.x = x;
...@@ -33,13 +36,13 @@ public class Location { ...@@ -33,13 +36,13 @@ public class Location {
public Location getAdjacentLocation(Direction direction) { public Location getAdjacentLocation(Direction direction) {
switch (direction) { switch (direction) {
case NORTH: case NORTH:
return new Location(this.x, this.y - Location.GRID_SIZE); return new Location(this.x, this.y - SnakeUtils.GRID_SIZE);
case SOUTH: case SOUTH:
return new Location(this.x, this.y + Location.GRID_SIZE); return new Location(this.x, this.y + SnakeUtils.GRID_SIZE);
case EAST: case EAST:
return new Location(this.x + Location.GRID_SIZE, this.y); return new Location(this.x + SnakeUtils.GRID_SIZE, this.y);
case WEST: case WEST:
return new Location(this.x - Location.GRID_SIZE, this.y); return new Location(this.x - SnakeUtils.GRID_SIZE, this.y);
case NONE: case NONE:
// fall through // fall through
default: default:
...@@ -55,16 +58,13 @@ public class Location { ...@@ -55,16 +58,13 @@ public class Location {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
Location location = (Location) o; Location location = (Location) o;
if (this.x != location.x) { if (this.x != location.x) {
return false; return false;
} }
if (this.y != location.y) { if (this.y != location.y) {
return false; return false;
} }
return true; return true;
} }
...@@ -74,4 +74,5 @@ public class Location { ...@@ -74,4 +74,5 @@ public class Location {
result = 31 * result + this.y; result = 31 * result + this.y;
return result; return result;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -157,4 +156,5 @@ public class Snake { ...@@ -157,4 +156,5 @@ public class Snake {
public String getHexColor() { public String getHexColor() {
return this.hexColor; return this.hexColor;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -31,7 +30,7 @@ import org.slf4j.LoggerFactory; ...@@ -31,7 +30,7 @@ import org.slf4j.LoggerFactory;
/** /**
* Sets up the timer for the multi-player snake game WebSocket example. * Sets up the timer for the multi-player snake game WebSocket example.
*/ */
public class SnakeTimer { public final class SnakeTimer {
private static final long TICK_DELAY = 100; private static final long TICK_DELAY = 100;
...@@ -43,6 +42,9 @@ public class SnakeTimer { ...@@ -43,6 +42,9 @@ public class SnakeTimer {
private static Timer gameTimer = null; private static Timer gameTimer = null;
private SnakeTimer() {
}
public static void addSnake(Snake snake) { public static void addSnake(Snake snake) {
synchronized (MONITOR) { synchronized (MONITOR) {
if (snakes.isEmpty()) { if (snakes.isEmpty()) {
...@@ -112,4 +114,5 @@ public class SnakeTimer { ...@@ -112,4 +114,5 @@ public class SnakeTimer {
gameTimer.cancel(); gameTimer.cancel();
} }
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -20,14 +19,28 @@ package samples.websocket.jetty.snake; ...@@ -20,14 +19,28 @@ package samples.websocket.jetty.snake;
import java.awt.Color; import java.awt.Color;
import java.util.Random; import java.util.Random;
public class SnakeUtils { public final class SnakeUtils {
/**
* The width of the playfield.
*/
public static final int PLAYFIELD_WIDTH = 640; public static final int PLAYFIELD_WIDTH = 640;
/**
* The height of the playfield.
*/
public static final int PLAYFIELD_HEIGHT = 480; public static final int PLAYFIELD_HEIGHT = 480;
/**
* The grid size.
*/
public static final int GRID_SIZE = 10; public static final int GRID_SIZE = 10;
private static final Random random = new Random(); private static final Random random = new Random();
private SnakeUtils() {
}
public static String getRandomHexColor() { public static String getRandomHexColor() {
float hue = random.nextFloat(); float hue = random.nextFloat();
// sat between 0.1 and 0.3 // sat between 0.1 and 0.3
......
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler; ...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler;
public class SnakeWebSocketHandler extends TextWebSocketHandler { public class SnakeWebSocketHandler extends TextWebSocketHandler {
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 AtomicInteger snakeIds = new AtomicInteger(0);
private static final Random random = new Random(); private static final Random random = new Random();
private final int id; private final int id;
private Snake snake; private Snake snake;
public static String getRandomHexColor() { public static String getRandomHexColor() {
...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
} }
public static Location getRandomLocation() { public static Location getRandomLocation() {
int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); int x = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_WIDTH));
int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); int y = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_HEIGHT));
return new Location(x, y); return new Location(x, y);
} }
private static int roundByGridSize(int value) { private static int roundByGridSize(int value) {
value = value + (GRID_SIZE / 2); value = value + (SnakeUtils.GRID_SIZE / 2);
value = value / GRID_SIZE; value = value / SnakeUtils.GRID_SIZE;
value = value * GRID_SIZE; value = value * SnakeUtils.GRID_SIZE;
return value; return value;
} }
...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
SnakeTimer.broadcast( SnakeTimer.broadcast(
String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id))); String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id)));
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -130,6 +130,7 @@ public class SampleWebSocketsApplicationTests { ...@@ -130,6 +130,7 @@ public class SampleWebSocketsApplicationTests {
public GreetingService greetingService() { public GreetingService greetingService() {
return new SimpleGreetingService(); return new SimpleGreetingService();
} }
} }
} }
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService { ...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService {
private final String echoFormat; private final String echoFormat;
public DefaultEchoService(String echoFormat) { public DefaultEchoService(String echoFormat) {
this.echoFormat = (echoFormat != null) ? echoFormat : "%s"; this.echoFormat = (echoFormat != null ? echoFormat : "%s");
} }
@Override @Override
......
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint { ...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint {
session.getBasicRemote() session.getBasicRemote()
.sendText("Reversed: " + new StringBuilder(message).reverse()); .sendText("Reversed: " + new StringBuilder(message).reverse());
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -18,5 +17,7 @@ ...@@ -18,5 +17,7 @@
package samples.websocket.tomcat.snake; package samples.websocket.tomcat.snake;
public enum Direction { public enum Direction {
NONE, NORTH, SOUTH, EAST, WEST NONE, NORTH, SOUTH, EAST, WEST
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -19,11 +18,15 @@ package samples.websocket.tomcat.snake; ...@@ -19,11 +18,15 @@ package samples.websocket.tomcat.snake;
public class Location { public class Location {
/**
* The X location.
*/
public int x; public int x;
/**
* The Y location.
*/
public int y; 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) { public Location(int x, int y) {
this.x = x; this.x = x;
...@@ -33,13 +36,13 @@ public class Location { ...@@ -33,13 +36,13 @@ public class Location {
public Location getAdjacentLocation(Direction direction) { public Location getAdjacentLocation(Direction direction) {
switch (direction) { switch (direction) {
case NORTH: case NORTH:
return new Location(this.x, this.y - Location.GRID_SIZE); return new Location(this.x, this.y - SnakeUtils.GRID_SIZE);
case SOUTH: case SOUTH:
return new Location(this.x, this.y + Location.GRID_SIZE); return new Location(this.x, this.y + SnakeUtils.GRID_SIZE);
case EAST: case EAST:
return new Location(this.x + Location.GRID_SIZE, this.y); return new Location(this.x + SnakeUtils.GRID_SIZE, this.y);
case WEST: case WEST:
return new Location(this.x - Location.GRID_SIZE, this.y); return new Location(this.x - SnakeUtils.GRID_SIZE, this.y);
case NONE: case NONE:
// fall through // fall through
default: default:
...@@ -55,16 +58,13 @@ public class Location { ...@@ -55,16 +58,13 @@ public class Location {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
Location location = (Location) o; Location location = (Location) o;
if (this.x != location.x) { if (this.x != location.x) {
return false; return false;
} }
if (this.y != location.y) { if (this.y != location.y) {
return false; return false;
} }
return true; return true;
} }
...@@ -74,4 +74,5 @@ public class Location { ...@@ -74,4 +74,5 @@ public class Location {
result = 31 * result + this.y; result = 31 * result + this.y;
return result; return result;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -157,4 +156,5 @@ public class Snake { ...@@ -157,4 +156,5 @@ public class Snake {
public String getHexColor() { public String getHexColor() {
return this.hexColor; return this.hexColor;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -25,24 +24,27 @@ import java.util.TimerTask; ...@@ -25,24 +24,27 @@ import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.juli.logging.Log; import org.slf4j.Logger;
import org.apache.juli.logging.LogFactory; import org.slf4j.LoggerFactory;
/** /**
* Sets up the timer for the multi-player snake game WebSocket example. * Sets up the timer for the multi-player snake game WebSocket example.
*/ */
public class SnakeTimer { public final class SnakeTimer {
private static final long TICK_DELAY = 100; private static final long TICK_DELAY = 100;
private static final Object MONITOR = new Object(); private static final Object MONITOR = new Object();
private static final Log log = LogFactory.getLog(SnakeTimer.class); private static final Logger log = LoggerFactory.getLogger(SnakeTimer.class);
private static final ConcurrentHashMap<Integer, Snake> snakes = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<Integer, Snake> snakes = new ConcurrentHashMap<>();
private static Timer gameTimer = null; private static Timer gameTimer = null;
private SnakeTimer() {
}
public static void addSnake(Snake snake) { public static void addSnake(Snake snake) {
synchronized (MONITOR) { synchronized (MONITOR) {
if (snakes.isEmpty()) { if (snakes.isEmpty()) {
...@@ -112,4 +114,5 @@ public class SnakeTimer { ...@@ -112,4 +114,5 @@ public class SnakeTimer {
gameTimer.cancel(); gameTimer.cancel();
} }
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -20,14 +19,28 @@ package samples.websocket.tomcat.snake; ...@@ -20,14 +19,28 @@ package samples.websocket.tomcat.snake;
import java.awt.Color; import java.awt.Color;
import java.util.Random; import java.util.Random;
public class SnakeUtils { public final class SnakeUtils {
/**
* The width of the playfield.
*/
public static final int PLAYFIELD_WIDTH = 640; public static final int PLAYFIELD_WIDTH = 640;
/**
* The height of the playfield.
*/
public static final int PLAYFIELD_HEIGHT = 480; public static final int PLAYFIELD_HEIGHT = 480;
/**
* The grid size.
*/
public static final int GRID_SIZE = 10; public static final int GRID_SIZE = 10;
private static final Random random = new Random(); private static final Random random = new Random();
private SnakeUtils() {
}
public static String getRandomHexColor() { public static String getRandomHexColor() {
float hue = random.nextFloat(); float hue = random.nextFloat();
// sat between 0.1 and 0.3 // sat between 0.1 and 0.3
......
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler; ...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler;
public class SnakeWebSocketHandler extends TextWebSocketHandler { public class SnakeWebSocketHandler extends TextWebSocketHandler {
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 AtomicInteger snakeIds = new AtomicInteger(0);
private static final Random random = new Random(); private static final Random random = new Random();
private final int id; private final int id;
private Snake snake; private Snake snake;
public static String getRandomHexColor() { public static String getRandomHexColor() {
...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
} }
public static Location getRandomLocation() { public static Location getRandomLocation() {
int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); int x = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_WIDTH));
int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); int y = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_HEIGHT));
return new Location(x, y); return new Location(x, y);
} }
private static int roundByGridSize(int value) { private static int roundByGridSize(int value) {
value = value + (GRID_SIZE / 2); value = value + (SnakeUtils.GRID_SIZE / 2);
value = value / GRID_SIZE; value = value / SnakeUtils.GRID_SIZE;
value = value * GRID_SIZE; value = value * SnakeUtils.GRID_SIZE;
return value; return value;
} }
...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
SnakeTimer.broadcast( SnakeTimer.broadcast(
String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id))); String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id)));
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -32,8 +32,8 @@ public class SnakeTimerTests { ...@@ -32,8 +32,8 @@ public class SnakeTimerTests {
Snake snake = mock(Snake.class); Snake snake = mock(Snake.class);
willThrow(new IOException()).given(snake).sendMessage(anyString()); willThrow(new IOException()).given(snake).sendMessage(anyString());
SnakeTimer.addSnake(snake); SnakeTimer.addSnake(snake);
SnakeTimer.broadcast(""); SnakeTimer.broadcast("");
assertThat(SnakeTimer.getSnakes()).hasSize(0); assertThat(SnakeTimer.getSnakes()).hasSize(0);
} }
} }
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService { ...@@ -21,7 +21,7 @@ public class DefaultEchoService implements EchoService {
private final String echoFormat; private final String echoFormat;
public DefaultEchoService(String echoFormat) { public DefaultEchoService(String echoFormat) {
this.echoFormat = (echoFormat != null) ? echoFormat : "%s"; this.echoFormat = (echoFormat != null ? echoFormat : "%s");
} }
@Override @Override
......
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint { ...@@ -30,4 +30,5 @@ public class ReverseWebSocketEndpoint {
session.getBasicRemote() session.getBasicRemote()
.sendText("Reversed: " + new StringBuilder(message).reverse()); .sendText("Reversed: " + new StringBuilder(message).reverse());
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -18,5 +17,7 @@ ...@@ -18,5 +17,7 @@
package samples.websocket.undertow.snake; package samples.websocket.undertow.snake;
public enum Direction { public enum Direction {
NONE, NORTH, SOUTH, EAST, WEST NONE, NORTH, SOUTH, EAST, WEST
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -19,11 +18,15 @@ package samples.websocket.undertow.snake; ...@@ -19,11 +18,15 @@ package samples.websocket.undertow.snake;
public class Location { public class Location {
/**
* The X location.
*/
public int x; public int x;
/**
* The Y location.
*/
public int y; 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) { public Location(int x, int y) {
this.x = x; this.x = x;
...@@ -33,13 +36,13 @@ public class Location { ...@@ -33,13 +36,13 @@ public class Location {
public Location getAdjacentLocation(Direction direction) { public Location getAdjacentLocation(Direction direction) {
switch (direction) { switch (direction) {
case NORTH: case NORTH:
return new Location(this.x, this.y - Location.GRID_SIZE); return new Location(this.x, this.y - SnakeUtils.GRID_SIZE);
case SOUTH: case SOUTH:
return new Location(this.x, this.y + Location.GRID_SIZE); return new Location(this.x, this.y + SnakeUtils.GRID_SIZE);
case EAST: case EAST:
return new Location(this.x + Location.GRID_SIZE, this.y); return new Location(this.x + SnakeUtils.GRID_SIZE, this.y);
case WEST: case WEST:
return new Location(this.x - Location.GRID_SIZE, this.y); return new Location(this.x - SnakeUtils.GRID_SIZE, this.y);
case NONE: case NONE:
// fall through // fall through
default: default:
...@@ -55,16 +58,13 @@ public class Location { ...@@ -55,16 +58,13 @@ public class Location {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
Location location = (Location) o; Location location = (Location) o;
if (this.x != location.x) { if (this.x != location.x) {
return false; return false;
} }
if (this.y != location.y) { if (this.y != location.y) {
return false; return false;
} }
return true; return true;
} }
...@@ -74,4 +74,5 @@ public class Location { ...@@ -74,4 +74,5 @@ public class Location {
result = 31 * result + this.y; result = 31 * result + this.y;
return result; return result;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -157,4 +156,5 @@ public class Snake { ...@@ -157,4 +156,5 @@ public class Snake {
public String getHexColor() { public String getHexColor() {
return this.hexColor; return this.hexColor;
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -31,7 +30,7 @@ import org.slf4j.LoggerFactory; ...@@ -31,7 +30,7 @@ import org.slf4j.LoggerFactory;
/** /**
* Sets up the timer for the multi-player snake game WebSocket example. * Sets up the timer for the multi-player snake game WebSocket example.
*/ */
public class SnakeTimer { public final class SnakeTimer {
private static final long TICK_DELAY = 100; private static final long TICK_DELAY = 100;
...@@ -43,6 +42,9 @@ public class SnakeTimer { ...@@ -43,6 +42,9 @@ public class SnakeTimer {
private static Timer gameTimer = null; private static Timer gameTimer = null;
private SnakeTimer() {
}
public static void addSnake(Snake snake) { public static void addSnake(Snake snake) {
synchronized (MONITOR) { synchronized (MONITOR) {
if (snakes.isEmpty()) { if (snakes.isEmpty()) {
...@@ -112,4 +114,5 @@ public class SnakeTimer { ...@@ -112,4 +114,5 @@ public class SnakeTimer {
gameTimer.cancel(); gameTimer.cancel();
} }
} }
} }
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -20,14 +19,28 @@ package samples.websocket.undertow.snake; ...@@ -20,14 +19,28 @@ package samples.websocket.undertow.snake;
import java.awt.Color; import java.awt.Color;
import java.util.Random; import java.util.Random;
public class SnakeUtils { public final class SnakeUtils {
/**
* The width of the playfield.
*/
public static final int PLAYFIELD_WIDTH = 640; public static final int PLAYFIELD_WIDTH = 640;
/**
* The height of the playfield.
*/
public static final int PLAYFIELD_HEIGHT = 480; public static final int PLAYFIELD_HEIGHT = 480;
/**
* The grid size.
*/
public static final int GRID_SIZE = 10; public static final int GRID_SIZE = 10;
private static final Random random = new Random(); private static final Random random = new Random();
private SnakeUtils() {
}
public static String getRandomHexColor() { public static String getRandomHexColor() {
float hue = random.nextFloat(); float hue = random.nextFloat();
// sat between 0.1 and 0.3 // sat between 0.1 and 0.3
......
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Copyright 2012-2018 the original author or authors.
* contributor license agreements. See the NOTICE file distributed with *
* this work for additional information regarding copyright ownership. * Licensed under the Apache License, Version 2.0 (the "License");
* The ASF licenses this file to You under the Apache License, Version 2.0 * you may not use this file except in compliance with the License.
* (the "License"); you may not use this file except in compliance with * You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler; ...@@ -29,14 +28,12 @@ import org.springframework.web.socket.handler.TextWebSocketHandler;
public class SnakeWebSocketHandler extends TextWebSocketHandler { public class SnakeWebSocketHandler extends TextWebSocketHandler {
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 AtomicInteger snakeIds = new AtomicInteger(0);
private static final Random random = new Random(); private static final Random random = new Random();
private final int id; private final int id;
private Snake snake; private Snake snake;
public static String getRandomHexColor() { public static String getRandomHexColor() {
...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -50,15 +47,15 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
} }
public static Location getRandomLocation() { public static Location getRandomLocation() {
int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); int x = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_WIDTH));
int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); int y = roundByGridSize(random.nextInt(SnakeUtils.PLAYFIELD_HEIGHT));
return new Location(x, y); return new Location(x, y);
} }
private static int roundByGridSize(int value) { private static int roundByGridSize(int value) {
value = value + (GRID_SIZE / 2); value = value + (SnakeUtils.GRID_SIZE / 2);
value = value / GRID_SIZE; value = value / SnakeUtils.GRID_SIZE;
value = value * GRID_SIZE; value = value * SnakeUtils.GRID_SIZE;
return value; return value;
} }
...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler { ...@@ -109,4 +106,5 @@ public class SnakeWebSocketHandler extends TextWebSocketHandler {
SnakeTimer.broadcast( SnakeTimer.broadcast(
String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id))); String.format("{'type': 'leave', 'id': %d}", Integer.valueOf(this.id)));
} }
} }
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -32,8 +32,8 @@ public class SnakeTimerTests { ...@@ -32,8 +32,8 @@ public class SnakeTimerTests {
Snake snake = mock(Snake.class); Snake snake = mock(Snake.class);
willThrow(new IOException()).given(snake).sendMessage(anyString()); willThrow(new IOException()).given(snake).sendMessage(anyString());
SnakeTimer.addSnake(snake); SnakeTimer.addSnake(snake);
SnakeTimer.broadcast(""); SnakeTimer.broadcast("");
assertThat(SnakeTimer.getSnakes()).hasSize(0); assertThat(SnakeTimer.getSnakes()).hasSize(0);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment