From 2b657edec92a35110547ca733cda7f853570d724 Mon Sep 17 00:00:00 2001 From: lukasgol Date: Wed, 11 Feb 2015 22:56:21 +0100 Subject: [PATCH] some events --- NFCServer.iml | 90 +++++++------- build.gradle | 1 - gradle/wrapper/gradle-wrapper.jar | Bin 50508 -> 51017 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- src/main/java/application/Config.java | 12 +- .../Notification/NotificationMessage.java | 30 +++++ .../Notification/NotificationRequest.java | 35 ++++++ .../Notification/NotificationResponse.java | 61 ++++++++++ .../controllers/EventController.java | 113 ++++++++++++++---- .../java/application/events/EventManager.java | 4 +- .../events/impl/DoorLockedEvent.java | 73 +++++++++++ .../application/events/impl/EntryEvent.java | 10 +- .../events/impl/EventObjectImpl.java | 31 ----- .../events/impl/MainDoorEntryEvent.java | 65 ++++++++++ .../DoorLockedEventRepository.java | 10 ++ ...sitoriy.java => EntryEventRepository.java} | 2 +- .../MainDoorEntryEventRepository.java | 11 ++ src/main/resources/app.properties | 1 + 18 files changed, 438 insertions(+), 115 deletions(-) create mode 100644 src/main/java/application/Notification/NotificationMessage.java create mode 100644 src/main/java/application/Notification/NotificationRequest.java create mode 100644 src/main/java/application/Notification/NotificationResponse.java create mode 100644 src/main/java/application/events/impl/DoorLockedEvent.java delete mode 100644 src/main/java/application/events/impl/EventObjectImpl.java create mode 100644 src/main/java/application/events/impl/MainDoorEntryEvent.java create mode 100644 src/main/java/application/repositories/DoorLockedEventRepository.java rename src/main/java/application/repositories/{EventRepositoriy.java => EntryEventRepository.java} (70%) create mode 100644 src/main/java/application/repositories/MainDoorEntryEventRepository.java diff --git a/NFCServer.iml b/NFCServer.iml index 2b9e840..4195ea1 100644 --- a/NFCServer.iml +++ b/NFCServer.iml @@ -4,28 +4,18 @@ - file://$MODULE_DIR$/src/main/java/application/Config.java file://$MODULE_DIR$/src/main/resources/Spring-Module.xml - - - - - - - - - - + @@ -44,69 +34,71 @@ + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - + - + - - - - - + - - + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 930d2b6..356c133 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,6 @@ dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") providedRuntime("javax.servlet:jstl") - compile 'com.google.code.gson:gson:2.2.4' compile "org.mockito:mockito-core:1.+" compile "org.reflections:reflections:0.9.9-RC1" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d5c591c9c532da774b062aa6d7ab16405ff8700a..3d0dee6e8edfecc92e04653ec780de06f7b34f8b 100644 GIT binary patch delta 24998 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 BwE6%5 delta 24393 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 52e38f2..d7adf46 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 02 00:24:51 CEST 2014 +#Mon Dec 15 22:59:12 CET 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-bin.zip diff --git a/src/main/java/application/Config.java b/src/main/java/application/Config.java index 2691981..4116782 100644 --- a/src/main/java/application/Config.java +++ b/src/main/java/application/Config.java @@ -1,8 +1,6 @@ package application; -import application.events.EventObject; import application.events.impl.EntryEvent; -import application.events.impl.EventObjectImpl; import application.model.User; import application.repositories.*; import application.utils.Initializer; @@ -17,6 +15,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @@ -29,6 +28,7 @@ import org.springframework.web.servlet.view.JstlView; @EnableAutoConfiguration @ImportResource("Spring-Module.xml") @EnableScheduling +@EnableWebMvc public class Config extends SpringBootServletInitializer { @@ -43,13 +43,13 @@ public class Config extends SpringBootServletInitializer { UserRepository userRepository = context.getBean(UserRepository.class); RoleRepository roleRepository = context.getBean(RoleRepository.class); DoorRepository doorRepository = context.getBean(DoorRepository.class); - EventRepositoriy eventRepositoriy = context.getBean(EventRepositoriy.class); + EntryEventRepository entryEventRepository = context.getBean(EntryEventRepository.class); HistoryEntryRepository historyEntryRepository = context.getBean(HistoryEntryRepository.class); new Initializer(roleRepository, userRepository, doorRepository, historyEntryRepository).init(); User user =new User("aa","bb","cc","dd"); - eventRepositoriy.save(new EntryEvent(1,1,2)); - eventRepositoriy.save(new EntryEvent(1,2,2)); - eventRepositoriy.save(new EntryEvent(2,1,2)); + entryEventRepository.save(new EntryEvent(1,1,2)); + entryEventRepository.save(new EntryEvent(1,2,2)); + entryEventRepository.save(new EntryEvent(2,1,2)); } diff --git a/src/main/java/application/Notification/NotificationMessage.java b/src/main/java/application/Notification/NotificationMessage.java new file mode 100644 index 0000000..bc3c406 --- /dev/null +++ b/src/main/java/application/Notification/NotificationMessage.java @@ -0,0 +1,30 @@ +package application.Notification; + +/** + * Created by lukasgol on 16.12.14. + */ +public class NotificationMessage { + + String title; + String msg; + + public NotificationMessage(String msg) { + this.msg = msg; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/src/main/java/application/Notification/NotificationRequest.java b/src/main/java/application/Notification/NotificationRequest.java new file mode 100644 index 0000000..858bd43 --- /dev/null +++ b/src/main/java/application/Notification/NotificationRequest.java @@ -0,0 +1,35 @@ +package application.Notification; + +/** + * Created by lukasgol on 16.12.14. + */ +public class NotificationRequest { + String registration_ids; + String data; + +/* public NotificationRequest(String registration_ids, String data) { + this.registration_ids = "[\""+registration_ids+"\"]"; + this.data = "{\"message\" : \""+data+"\"}"; + }*/ + + public NotificationRequest(String registration_ids, String data) { + this.registration_ids = registration_ids; + this.data = data; + } + + public String getRegistration_ids() { + return registration_ids; + } + + public void setRegistration_ids(String registration_ids) { + this.registration_ids = registration_ids; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/src/main/java/application/Notification/NotificationResponse.java b/src/main/java/application/Notification/NotificationResponse.java new file mode 100644 index 0000000..cd541bc --- /dev/null +++ b/src/main/java/application/Notification/NotificationResponse.java @@ -0,0 +1,61 @@ +package application.Notification; + +/** + * Created by lukasgol on 16.12.14. + */ +public class NotificationResponse { + String multicast_id; + String success; + String failure; + String canonical_ids; + String results; + + public String getMulticast_id() { + return multicast_id; + } + + public void setMulticast_id(String multicast_id) { + this.multicast_id = multicast_id; + } + + public String getFailure() { + return failure; + } + + public void setFailure(String failure) { + this.failure = failure; + } + + public String getCanonical_ids() { + return canonical_ids; + } + + public void setCanonical_ids(String canonical_ids) { + this.canonical_ids = canonical_ids; + } + + public String getSuccess() { + return success; + } + + public void setSuccess(String success) { + this.success = success; + } + + public String getResults() { + return results; + } + + public void setResults(String results) { + this.results = results; + } + + public NotificationResponse(String multicast_id, String success, String failure, String canonical_ids, String results) { + this.multicast_id = multicast_id; + this.success = success; + this.failure = failure; + this.canonical_ids = canonical_ids; + this.results = results; + } +} + diff --git a/src/main/java/application/controllers/EventController.java b/src/main/java/application/controllers/EventController.java index 8ace4c8..858717f 100644 --- a/src/main/java/application/controllers/EventController.java +++ b/src/main/java/application/controllers/EventController.java @@ -2,24 +2,15 @@ package application.controllers; import application.Constants; import application.events.EventManager; -import application.events.EventObject; +import application.events.impl.DoorLockedEvent; import application.events.impl.EntryEvent; -import application.model.Door; -import application.model.User; +import application.events.impl.MainDoorEntryEvent; import application.network.response.BaseResponse; -import application.repositories.DoorRepository; -import application.repositories.EventRepositoriy; -import application.repositories.UserRepository; +import application.repositories.*; import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.ArrayList; -import java.util.List; +import org.springframework.web.bind.annotation.*; /** * Created by lukasgol on 10.02.15. @@ -29,7 +20,13 @@ import java.util.List; public class EventController { @Autowired - EventRepositoriy eventRepositoriy; + EntryEventRepository entryEventRepository; + + @Autowired + MainDoorEntryEventRepository mainDoorEntryEventRepository; + + @Autowired + DoorLockedEventRepository doorLockedEventRepository; @Autowired UserRepository userRepository; @@ -41,28 +38,100 @@ public class EventController { EventManager eventManager; - @RequestMapping(value = "/eventEntry") + @RequestMapping(value = "/{doorId}/{userId}") @ResponseBody - public BaseResponse entryEventTrigger(@RequestBody long userId, @RequestBody long doorId) throws JSONException { + public BaseResponse entryEventTrigger(@RequestParam("userId") long userId ,@RequestParam("doorId") long doorId) throws JSONException { - for(EntryEvent e: eventRepositoriy.findAll()){ + for(EntryEvent e: entryEventRepository.findAll()){ if(e.getWho()==userId&&e.getDoor()==doorId) eventManager.sendNotification(e); } return new BaseResponse().init(Constants.SUCCESS_TRUE); } + /* Entry event*/ + @RequestMapping(value = "/eventEntry/add") @ResponseBody - public BaseResponse addEventTrigger(@RequestBody long userId, @RequestBody long doorId,@RequestBody long who) throws JSONException { - eventRepositoriy.save(new EntryEvent(doorId,who,userId)); + public BaseResponse addEntry(@RequestParam long userId, @RequestParam long doorId,@RequestParam long who) throws JSONException { + entryEventRepository.save(new EntryEvent(doorId,who,userId)); return new BaseResponse().init(Constants.SUCCESS_TRUE); } @RequestMapping(value = "/eventEntry/getAll") @ResponseBody - public Iterable getAll() throws JSONException { - Iterable a =eventRepositoriy.findAll(); - return eventRepositoriy.findAll(); + public Iterable getAllEntry() throws JSONException { + Iterable a = entryEventRepository.findAll(); + return entryEventRepository.findAll(); } + + @RequestMapping(value = "/eventEntry/get/{id}") + @ResponseBody + public EntryEvent getEntry(@PathVariable("id") long id) throws JSONException { + return entryEventRepository.findOne(id); + } + + @RequestMapping(value = "/eventEntry/remove/{id}") + @ResponseBody + public BaseResponse removeEntry(@PathVariable("id") long id) throws JSONException { + entryEventRepository.delete(id); + return new BaseResponse().init(Constants.SUCCESS_TRUE); + } + + /*Main door event*/ + + @RequestMapping(value = "/MainDoorEntry/add") + @ResponseBody + public BaseResponse addMainDoorEntry(@RequestParam long doorId ) throws JSONException { + mainDoorEntryEventRepository.save(new MainDoorEntryEvent(doorId)); + return new BaseResponse().init(Constants.SUCCESS_TRUE); + } + + @RequestMapping(value = "/MainDoorEntry/getAll") + @ResponseBody + public Iterable getAllMainDoorEntry() throws JSONException { + return mainDoorEntryEventRepository.findAll(); + } + + @RequestMapping(value = "/MainDoorEntry/get/{id}") + @ResponseBody + public MainDoorEntryEvent getMainDoorEntry(@PathVariable("id") long id) throws JSONException { + return mainDoorEntryEventRepository.findOne(id); + } + + @RequestMapping(value = "/MainDoorEntry/remove/{id}") + @ResponseBody + public BaseResponse removeMainDoorEntry(@PathVariable("id") long id) throws JSONException { + mainDoorEntryEventRepository.delete(id); + return new BaseResponse().init(Constants.SUCCESS_TRUE); + } + + /*locked door event*/ + + @RequestMapping(value = "/DoorLockedEntry/add") + @ResponseBody + public BaseResponse addDoorLockedEntry(@RequestParam long doorId, @RequestParam String why) throws JSONException { + doorLockedEventRepository.save(new DoorLockedEvent(doorId,why)); + return new BaseResponse().init(Constants.SUCCESS_TRUE); + } + + @RequestMapping(value = "/DoorLockedEntry/getAll") + @ResponseBody + public Iterable getAllDoorLockedEntry() throws JSONException { + return doorLockedEventRepository.findAll(); + } + + @RequestMapping(value = "/DoorLockedEntry/get/{id}") + @ResponseBody + public DoorLockedEvent getDoorLockedEntry(@PathVariable("id") long id) throws JSONException { + return doorLockedEventRepository.findOne(id); + } + + @RequestMapping(value = "/DoorLockedEntry/remove/{id}") + @ResponseBody + public BaseResponse removeDoorLockedEntry(@PathVariable("id") long id) throws JSONException { + doorLockedEventRepository.delete(id); + return new BaseResponse().init(Constants.SUCCESS_TRUE); + } + } diff --git a/src/main/java/application/events/EventManager.java b/src/main/java/application/events/EventManager.java index 3570a35..5f5305f 100644 --- a/src/main/java/application/events/EventManager.java +++ b/src/main/java/application/events/EventManager.java @@ -15,8 +15,8 @@ public class EventManager { Set> eventClassSet; Set eventsSet; public EventManager() { - eventClassSet = findEventClasses(); - eventsSet = instantiateEvents(eventClassSet); +/* eventClassSet = findEventClasses(); + eventsSet = instantiateEvents(eventClassSet);*/ System.out.println("Class EventManagerCreated"); } diff --git a/src/main/java/application/events/impl/DoorLockedEvent.java b/src/main/java/application/events/impl/DoorLockedEvent.java new file mode 100644 index 0000000..5e7a0a8 --- /dev/null +++ b/src/main/java/application/events/impl/DoorLockedEvent.java @@ -0,0 +1,73 @@ +package application.events.impl; + +import application.events.EventObject; + +import javax.persistence.*; + +/** + * Created by lukasgol on 11.02.15. + */ +@Entity +public class DoorLockedEvent implements EventObject { + + @Override + public void validEvent() { + + } + + @Override + public void handleEvent() { + + } + + @Override + public boolean isValid() { + return false; + } + + @Override + public String createMessage() { + return null; + } + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Basic + private Long user; + + @Basic String reason; + + public Long getUser() { + return user; + } + + public void setUser(Long user) { + this.user = user; + } + + public DoorLockedEvent(Long user, String reason) { + this.user = user; + this.reason = reason; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public DoorLockedEvent() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} diff --git a/src/main/java/application/events/impl/EntryEvent.java b/src/main/java/application/events/impl/EntryEvent.java index b48161e..bd6c8d2 100644 --- a/src/main/java/application/events/impl/EntryEvent.java +++ b/src/main/java/application/events/impl/EntryEvent.java @@ -19,7 +19,7 @@ public class EntryEvent implements EventObject { @Id @GeneratedValue(strategy = GenerationType.AUTO) - private Long entryEventId; + private Long id; @Basic private Long door; @@ -94,4 +94,12 @@ public class EntryEvent implements EventObject { public String createMessage() { return "User: "+who+" passed through door: " +door; } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } } diff --git a/src/main/java/application/events/impl/EventObjectImpl.java b/src/main/java/application/events/impl/EventObjectImpl.java deleted file mode 100644 index 5e059e8..0000000 --- a/src/main/java/application/events/impl/EventObjectImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package application.events.impl; - -import application.events.EventObject; -import application.model.User; - -/** - * Created by lukasgol on 01.02.15. - */ -public class EventObjectImpl implements EventObject { - public User user; - - @Override - public void validEvent() { - System.out.println("Chceking event: "+this.getClass().getName()); - } - - @Override - public void handleEvent() { - System.out.println("sending notification for event: "+this.getClass().getName()); - } - - @Override - public boolean isValid() { - return true; - } - - @Override - public String createMessage() { - return "User: "+user.getFirstName()+" "+user.getLastName()+" passed through door" ; - } -} diff --git a/src/main/java/application/events/impl/MainDoorEntryEvent.java b/src/main/java/application/events/impl/MainDoorEntryEvent.java new file mode 100644 index 0000000..cb8a365 --- /dev/null +++ b/src/main/java/application/events/impl/MainDoorEntryEvent.java @@ -0,0 +1,65 @@ +package application.events.impl; + +import application.events.EventObject; + +import javax.persistence.*; + +/** + * Created by lukasgol on 11.02.15. + */ +@Entity +public class MainDoorEntryEvent implements EventObject { + + + @Basic + private Long who; + + @Override + public void validEvent() { + + } + + @Override + public void handleEvent() { + + } + + @Override + public boolean isValid() { + return false; + } + + @Override + public String createMessage() { + return null; + } + + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + public Long getWho() { + return who; + } + + public void setWho(Long who) { + this.who = who; + } + + public MainDoorEntryEvent(Long who) { + this.who = who; + } + + public MainDoorEntryEvent() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} + diff --git a/src/main/java/application/repositories/DoorLockedEventRepository.java b/src/main/java/application/repositories/DoorLockedEventRepository.java new file mode 100644 index 0000000..a0f8601 --- /dev/null +++ b/src/main/java/application/repositories/DoorLockedEventRepository.java @@ -0,0 +1,10 @@ +package application.repositories; + +import application.events.impl.DoorLockedEvent; +import org.springframework.data.repository.CrudRepository; + +/** + * Created by lukasgol on 11.02.15. + */ +public interface DoorLockedEventRepository extends CrudRepository { +} diff --git a/src/main/java/application/repositories/EventRepositoriy.java b/src/main/java/application/repositories/EntryEventRepository.java similarity index 70% rename from src/main/java/application/repositories/EventRepositoriy.java rename to src/main/java/application/repositories/EntryEventRepository.java index 5144b59..faa240a 100644 --- a/src/main/java/application/repositories/EventRepositoriy.java +++ b/src/main/java/application/repositories/EntryEventRepository.java @@ -6,6 +6,6 @@ import org.springframework.data.repository.CrudRepository; /** * Created by lukasgol on 01.02.15. */ -public interface EventRepositoriy extends CrudRepository +public interface EntryEventRepository extends CrudRepository { } diff --git a/src/main/java/application/repositories/MainDoorEntryEventRepository.java b/src/main/java/application/repositories/MainDoorEntryEventRepository.java new file mode 100644 index 0000000..904d1f0 --- /dev/null +++ b/src/main/java/application/repositories/MainDoorEntryEventRepository.java @@ -0,0 +1,11 @@ +package application.repositories; + +import application.events.impl.EntryEvent; +import application.events.impl.MainDoorEntryEvent; +import org.springframework.data.repository.CrudRepository; + +/** + * Created by lukasgol on 11.02.15. + */ +public interface MainDoorEntryEventRepository extends CrudRepository { +} diff --git a/src/main/resources/app.properties b/src/main/resources/app.properties index d36bfd0..961e55a 100644 --- a/src/main/resources/app.properties +++ b/src/main/resources/app.properties @@ -1,2 +1,3 @@ +server.port=8181 my.prop=avalue lala=lala \ No newline at end of file