Изменен формат сообщений в ws, рефакторинг

This commit is contained in:
serega6531
2019-11-25 00:52:08 +03:00
parent 9b5a61f023
commit 43d6973948
19 changed files with 87 additions and 39 deletions

View File

@@ -12,8 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.model.Protocol; import ru.serega6531.packmate.model.enums.Protocol;
import ru.serega6531.packmate.model.UnfinishedStream; import ru.serega6531.packmate.model.pojo.UnfinishedStream;
import ru.serega6531.packmate.service.ServicesService; import ru.serega6531.packmate.service.ServicesService;
import ru.serega6531.packmate.service.StreamService; import ru.serega6531.packmate.service.StreamService;

View File

@@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.serega6531.packmate.model.Protocol; import ru.serega6531.packmate.model.enums.Protocol;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;

View File

@@ -1,9 +1,11 @@
package ru.serega6531.packmate.controller; package ru.serega6531.packmate.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.Pagination;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
import ru.serega6531.packmate.service.PacketService; import ru.serega6531.packmate.service.PacketService;
import ru.serega6531.packmate.service.StreamService; import ru.serega6531.packmate.service.StreamService;

View File

@@ -2,8 +2,8 @@ package ru.serega6531.packmate.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import ru.serega6531.packmate.model.Pagination;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
import ru.serega6531.packmate.model.pojo.Pagination;
import ru.serega6531.packmate.service.StreamService; import ru.serega6531.packmate.service.StreamService;
import java.util.List; import java.util.List;

View File

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.GenericGenerator;
import ru.serega6531.packmate.model.enums.PatternType;
import javax.persistence.*; import javax.persistence.*;
import java.util.List; import java.util.List;

View File

@@ -1,5 +0,0 @@
package ru.serega6531.packmate.model;
public enum Protocol {
TCP, UDP
}

View File

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.GenericGenerator;
import ru.serega6531.packmate.model.enums.Protocol;
import javax.persistence.*; import javax.persistence.*;
import java.util.List; import java.util.List;

View File

@@ -1,4 +1,4 @@
package ru.serega6531.packmate.model; package ru.serega6531.packmate.model.enums;
public enum PatternType { public enum PatternType {
INPUT, OUTPUT, BOTH INPUT, OUTPUT, BOTH

View File

@@ -0,0 +1,5 @@
package ru.serega6531.packmate.model.enums;
public enum Protocol {
TCP, UDP
}

View File

@@ -0,0 +1,7 @@
package ru.serega6531.packmate.model.enums;
public enum SubscriptionMessageType {
SAVE_SERVICE, SAVE_PATTERN, DELETE_SERVICE, DELETE_PATTERN, NEW_STREAM
}

View File

@@ -1,7 +1,8 @@
package ru.serega6531.packmate.model; package ru.serega6531.packmate.model.pojo;
import lombok.Data; import lombok.Data;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import ru.serega6531.packmate.model.Pattern;
@Data @Data
public class Pagination { public class Pagination {

View File

@@ -0,0 +1,14 @@
package ru.serega6531.packmate.model.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
@Data
@AllArgsConstructor
public class SubscriptionMessage {
private SubscriptionMessageType type;
private Object value;
}

View File

@@ -1,7 +1,8 @@
package ru.serega6531.packmate.model; package ru.serega6531.packmate.model.pojo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import ru.serega6531.packmate.model.enums.Protocol;
import java.net.Inet4Address; import java.net.Inet4Address;

View File

@@ -2,7 +2,7 @@ package ru.serega6531.packmate.repository;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.PatternType; import ru.serega6531.packmate.model.enums.PatternType;
import java.util.List; import java.util.List;

View File

@@ -8,8 +8,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.FoundPattern;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.PatternType; import ru.serega6531.packmate.model.enums.PatternType;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
import ru.serega6531.packmate.model.pojo.SubscriptionMessage;
import ru.serega6531.packmate.repository.PatternRepository; import ru.serega6531.packmate.repository.PatternRepository;
import java.util.*; import java.util.*;
@@ -22,14 +24,19 @@ public class PatternService {
private final PatternRepository repository; private final PatternRepository repository;
private final StreamService streamService; private final StreamService streamService;
private final StreamSubscriptionService subscriptionService;
private final Map<Integer, Pattern> patterns = new HashMap<>(); private final Map<Integer, Pattern> patterns = new HashMap<>();
private final Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>(); private final Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>();
@Autowired @Autowired
public PatternService(PatternRepository repository, @Lazy StreamService streamService) { public PatternService(PatternRepository repository,
@Lazy StreamService streamService,
StreamSubscriptionService subscriptionService) {
this.repository = repository; this.repository = repository;
this.streamService = streamService; this.streamService = streamService;
this.subscriptionService = subscriptionService;
repository.findAll().forEach(p -> patterns.put(p.getId(), p)); repository.findAll().forEach(p -> patterns.put(p.getId(), p));
log.info("Loaded {} patterns", patterns.size()); log.info("Loaded {} patterns", patterns.size());
} }
@@ -108,6 +115,7 @@ public class PatternService {
patterns.remove(id); patterns.remove(id);
compiledPatterns.remove(pattern.getValue()); compiledPatterns.remove(pattern.getValue());
repository.delete(pattern); repository.delete(pattern);
subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.DELETE_PATTERN, id));
} }
} }
@@ -115,6 +123,7 @@ public class PatternService {
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue()); log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
final Pattern saved = repository.save(pattern); final Pattern saved = repository.save(pattern);
patterns.put(saved.getId(), pattern); patterns.put(saved.getId(), pattern);
subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.SAVE_PATTERN, saved));
return saved; return saved;
} }

View File

@@ -4,6 +4,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
import ru.serega6531.packmate.model.pojo.SubscriptionMessage;
import ru.serega6531.packmate.repository.ServiceRepository; import ru.serega6531.packmate.repository.ServiceRepository;
import java.util.Collection; import java.util.Collection;
@@ -16,11 +18,15 @@ import java.util.Optional;
public class ServicesService { public class ServicesService {
private final ServiceRepository repository; private final ServiceRepository repository;
private final StreamSubscriptionService subscriptionService;
private final Map<Integer, CtfService> services = new HashMap<>(); private final Map<Integer, CtfService> services = new HashMap<>();
@Autowired @Autowired
public ServicesService(ServiceRepository repository) { public ServicesService(ServiceRepository repository, StreamSubscriptionService subscriptionService) {
this.repository = repository; this.repository = repository;
this.subscriptionService = subscriptionService;
repository.findAll().forEach(s -> services.put(s.getPort(), s)); repository.findAll().forEach(s -> services.put(s.getPort(), s));
log.info("Loaded {} services", services.size()); log.info("Loaded {} services", services.size());
} }
@@ -47,12 +53,14 @@ public class ServicesService {
log.info("Удален сервис на порту {}", port); log.info("Удален сервис на порту {}", port);
services.remove(port); services.remove(port);
repository.deleteById(port); repository.deleteById(port);
subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.DELETE_SERVICE, port));
} }
public CtfService save(CtfService service) { public CtfService save(CtfService service) {
log.info("Добавлен или изменен сервис {} на порту {}", service.getName(), service.getPort()); log.info("Добавлен или изменен сервис {} на порту {}", service.getName(), service.getPort());
final CtfService saved = repository.save(service); final CtfService saved = repository.save(service);
services.put(saved.getPort(), service); services.put(saved.getPort(), service);
subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.SAVE_SERVICE, saved));
return saved; return saved;
} }

View File

@@ -11,6 +11,10 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import ru.serega6531.packmate.model.*; import ru.serega6531.packmate.model.*;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
import ru.serega6531.packmate.model.pojo.Pagination;
import ru.serega6531.packmate.model.pojo.SubscriptionMessage;
import ru.serega6531.packmate.model.pojo.UnfinishedStream;
import ru.serega6531.packmate.repository.StreamRepository; import ru.serega6531.packmate.repository.StreamRepository;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -191,7 +195,7 @@ public class StreamService {
savedStream.setPackets(packetService.saveAll(packets)); savedStream.setPackets(packetService.saveAll(packets));
savedStream = save(savedStream); savedStream = save(savedStream);
subscriptionService.broadcastNewStream(savedStream); subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.NEW_STREAM, savedStream));
return true; return true;
} }

View File

@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.sockjs.SockJsTransportFailureException; import org.springframework.web.socket.sockjs.SockJsTransportFailureException;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.pojo.SubscriptionMessage;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -28,26 +28,26 @@ public class StreamSubscriptionService {
} }
public void addSubscriber(WebSocketSession session) { public void addSubscriber(WebSocketSession session) {
log.info("Подписан пользователь {}", session.getRemoteAddress().getHostName());
subscribers.add(session); subscribers.add(session);
log.info("Подписан пользователь {}", session.getRemoteAddress().getHostName());
} }
public void removeSubscriber(WebSocketSession session) { public void removeSubscriber(WebSocketSession session) {
log.info("Отписан пользователь {}", session.getRemoteAddress().getHostName());
subscribers.remove(session); subscribers.remove(session);
log.info("Отписан пользователь {}", session.getRemoteAddress().getHostName());
} }
public void broadcastNewStream(Stream stream) { public void broadcast(SubscriptionMessage message) {
subscribers.forEach(s -> { subscribers.forEach(s -> {
try { try {
s.sendMessage(objectToTextMessage(stream)); s.sendMessage(objectToTextMessage(message));
} catch (IOException | SockJsTransportFailureException e) { } catch (IOException | SockJsTransportFailureException e) {
e.printStackTrace(); log.warn("WS", e);
} }
}); });
} }
private TextMessage objectToTextMessage(Object object) throws JsonProcessingException { private TextMessage objectToTextMessage(SubscriptionMessage object) throws JsonProcessingException {
return new TextMessage(mapper.writeValueAsString(object)); return new TextMessage(mapper.writeValueAsString(object));
} }