deleted Logic

This commit is contained in:
Patrick Haßel 2022-10-26 21:01:19 +02:00
parent 223e9baf4a
commit 818145e38b
7 changed files with 0 additions and 257 deletions

View File

@ -1,50 +0,0 @@
package de.ph87.homeautomation.logic;
import de.ph87.homeautomation.channel.Channel;
import de.ph87.homeautomation.channel.IChannelOwner;
import de.ph87.homeautomation.property.Property;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.time.ZonedDateTime;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@ToString
@Entity
@NoArgsConstructor
public class Logic extends Channel {
@Column(nullable = false, unique = true)
private String name;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private LogicOperator operator;
@ManyToMany
@ToString.Exclude
private Set<Property> properties = new HashSet<>();
@Column(name = "value_")
private Double value;
private ZonedDateTime timestamp;
public Logic(final String name, final LogicOperator operator, final HashSet<Property> properties) {
this.name = name;
this.operator = operator;
this.properties = properties;
}
@Override
public Class<? extends IChannelOwner> getChannelOwnerClass() {
return LogicChannelOwner.class;
}
}

View File

@ -1,47 +0,0 @@
package de.ph87.homeautomation.logic;
import de.ph87.homeautomation.channel.Channel;
import de.ph87.homeautomation.channel.IChannelOwner;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class LogicChannelOwner implements IChannelOwner {
private final LogicReader logicReader;
private final LogicWriter logicWriter;
@Override
public void requestUpdate(final Channel channel) {
logicWriter.update((Logic) channel);
}
@Override
public void write(final long id, final double value) {
throw new RuntimeException();
}
@Override
public LogicDto toDto(final long id) {
return logicReader.toDto(logicReader.getById(id));
}
@Override
public List<LogicDto> findAllDto() {
return logicReader.findAllDto();
}
@Override
public List<LogicDto> findAllDtoLikeIgnoreCase(final String like) {
return logicReader.findAllDtoLike(like);
}
}

View File

@ -1,27 +0,0 @@
package de.ph87.homeautomation.logic;
import de.ph87.homeautomation.channel.ChannelDto;
import de.ph87.homeautomation.property.Property;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Set;
import java.util.stream.Collectors;
@Getter
@Setter
@ToString
public class LogicDto extends ChannelDto {
private LogicOperator operator;
private Set<Long> propertyIds;
public LogicDto(final Logic logic) {
super(logic);
this.operator = logic.getOperator();
this.propertyIds = logic.getProperties().stream().map(Property::getId).collect(Collectors.toSet());
}
}

View File

@ -1,5 +0,0 @@
package de.ph87.homeautomation.logic;
public enum LogicOperator {
OR, AND, XOR
}

View File

@ -1,38 +0,0 @@
package de.ph87.homeautomation.logic;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class LogicReader {
private final LogicRepository logicRepository;
public List<LogicDto> findAllDto() {
return logicRepository.findAll().stream().map(this::toDto).toList();
}
public LogicDto toDto(final Logic logic) {
return new LogicDto(logic);
}
public List<LogicDto> findAllDtoLike(final String like) {
return logicRepository.findAllByNameContainsIgnoreCase(like).stream().map(this::toDto).toList();
}
public List<Logic> findAllByPropertyId(final long id) {
return logicRepository.findAllByPropertyName(id);
}
public Logic getById(final long id) {
return logicRepository.findById(id).orElseThrow(RuntimeException::new);
}
}

View File

@ -1,20 +0,0 @@
package de.ph87.homeautomation.logic;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
import java.util.Optional;
public interface LogicRepository extends CrudRepository<Logic, Long> {
List<Logic> findAll();
List<Logic> findAllByNameContainsIgnoreCase(String like);
@Query("select l from Logic l join l.properties p where p.id = :id")
List<Logic> findAllByPropertyName(long id);
Optional<Logic> findByName(String name);
}

View File

@ -1,70 +0,0 @@
package de.ph87.homeautomation.logic;
import de.ph87.homeautomation.channel.ChannelDto;
import de.ph87.homeautomation.property.Property;
import de.ph87.homeautomation.property.PropertyDto;
import de.ph87.homeautomation.web.WebSocketService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
import java.time.ZonedDateTime;
import java.util.Objects;
import static de.ph87.homeautomation.shared.Helpers.getCurrentTransactionName;
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class LogicWriter {
private final LogicReader logicReader;
private final ApplicationEventPublisher applicationEventPublisher;
private final WebSocketService webSocketService;
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
public void onPropertyChanged(final PropertyDto dto) {
log.debug("Listen [{}]: {}", getCurrentTransactionName(), dto.getTitle());
logicReader.findAllByPropertyId(dto.getId()).forEach(this::update);
}
public void update(final Logic logic) {
final Double value = evaluate(logic);
if (!Objects.equals(logic.getValue(), value)) {
logic.setValue(value);
logic.setTimestamp(ZonedDateTime.now());
log.info("Logic changed: {}", logic);
publish(logic, true);
}
}
private Double evaluate(final Logic logic) {
if (logic.getProperties().stream().map(Property::getValue).anyMatch(Objects::isNull)) {
return null;
}
switch (logic.getOperator()) {
case OR:
return logic.getProperties().stream().map(Property::getValue).anyMatch(v -> v > 0) ? 1.0 : 0.0;
case AND:
return logic.getProperties().stream().map(Property::getValue).allMatch(v -> v > 0) ? 1.0 : 0.0;
case XOR:
return (double) (logic.getProperties().stream().map(Property::getValue).map(v -> v > 0).count() % 2);
}
throw new RuntimeException();
}
private void publish(final Logic logic, final boolean existing) {
final LogicDto dto = logicReader.toDto(logic);
log.debug("Publish [{}]: {}", getCurrentTransactionName(), dto.getTitle());
applicationEventPublisher.publishEvent(dto);
webSocketService.send(ChannelDto.class, dto, existing);
}
}