diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java index 330c31a..6e163a1 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java @@ -70,7 +70,7 @@ public class ButtonDimmerController deviceService.saveAllAsOwner(buttonDimmer.getOutputs(), principal.getName()); - return buttonDimmer.getOutputs(); + return buttonDimmer.getDimmables(); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java index efde6e5..4d3bdcc 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java @@ -96,8 +96,8 @@ public abstract class InputDeviceConnectionController< * @return the list of output devices attached to the input device of id inputId * @throws NotFoundException if inputId or outputId are not valid */ - protected Set addOutput( - Long inputId, List outputs, String username) throws NotFoundException { + protected Set addOutput(Long inputId, List outputs, String username) + throws NotFoundException { final Connection pair = checkConnectionIDs(inputId, outputs, username); for (final O o : pair.getOutputs()) { @@ -116,8 +116,8 @@ public abstract class InputDeviceConnectionController< * @return the list of output devices attached to the input device of id inputId * @throws NotFoundException if inputId or outputId are not valid */ - protected Set removeOutput( - Long inputId, List outputs, String username) throws NotFoundException { + protected Set removeOutput(Long inputId, List outputs, String username) + throws NotFoundException { final Connection pair = checkConnectionIDs(inputId, outputs, username); for (final O o : pair.getOutputs()) { diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java index 266713d..7d46fe1 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java @@ -62,7 +62,7 @@ public class KnobDimmerController extends InputDeviceConnectionController toModel(); + public abstract Trigger toModel(); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java index e41265a..94628ba 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java @@ -18,14 +18,14 @@ public class ButtonDimmer extends Dimmer { /** Increases the current intensity level of the dimmable light by DIM_INCREMENT */ public void increaseIntensity() { - for (Dimmable dl : getOutputs()) { + for (Dimmable dl : getDimmables()) { dl.setIntensity(dl.getIntensity() + DIM_INCREMENT); } } /** Decreases the current intensity level of the dimmable light by DIM_INCREMENT */ public void decreaseIntensity() { - for (Dimmable dl : getOutputs()) { + for (Dimmable dl : getDimmables()) { dl.setIntensity(dl.getIntensity() - DIM_INCREMENT); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java index ab858b7..ca250bc 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java @@ -1,6 +1,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import java.util.Date; +import java.util.Objects; import java.util.UUID; import javax.persistence.*; import lombok.Data; @@ -43,4 +44,21 @@ public class ConfirmationToken { confirmToken = UUID.randomUUID().toString(); resetPassword = false; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ConfirmationToken that = (ConfirmationToken) o; + return resetPassword == that.resetPassword + && Objects.equals(id, that.id) + && confirmToken.equals(that.confirmToken) + && createdDate.equals(that.createdDate) + && Objects.equals(user, that.user); + } + + @Override + public int hashCode() { + return Objects.hash(id, confirmToken, createdDate, user, resetPassword); + } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java index 95f8e0d..111537a 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java @@ -23,6 +23,7 @@ public class Dimmable extends Switchable implements RangeTriggerable { @ManyToMany(mappedBy = "dimmables", cascade = CascadeType.DETACH) @GsonExclude @SocketGsonExclude + @EqualsAndHashCode.Exclude @Getter @Setter private Set dimmers = new HashSet<>(); diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmer.java index 205ddfd..c2185ee 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmer.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.Set; import javax.persistence.*; import lombok.EqualsAndHashCode; +import lombok.Getter; /** Represents a generic dimmer input device */ @Entity @@ -20,6 +21,7 @@ public abstract class Dimmer extends InputDevice implements Connectable getOutputs() { - return this.dimmables; + public Set getOutputs() { + return Set.copyOf(this.dimmables); } /** Add a light to be controller by this dimmer */ @@ -44,10 +46,10 @@ public abstract class Dimmer extends InputDevice implements Connectable getOutputs() { + public Set getOutputs() { return Set.of(); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java index 494dbe5..479e58c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java @@ -25,7 +25,7 @@ public class KnobDimmer extends Dimmer implements RangeTriggerable { */ public void setLightIntensity(int intensity) { this.intensity = intensity; - for (Dimmable dl : getOutputs()) { + for (Dimmable dl : getDimmables()) { dl.setIntensity(intensity); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java index ebc0113..72afd0e 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.Set; import javax.persistence.*; import lombok.EqualsAndHashCode; +import lombok.Getter; /** A switch input device */ @Entity @@ -22,6 +23,7 @@ public class Switch extends InputDevice implements BooleanTriggerable, Connectab @GsonExclude @SocketGsonExclude @EqualsAndHashCode.Exclude + @Getter @JoinTable( name = "switch_switchable", joinColumns = @JoinColumn(name = "switch_id"), @@ -64,17 +66,17 @@ public class Switch extends InputDevice implements BooleanTriggerable, Connectab } @Override - public Set getOutputs() { - return switchables; + public Set getOutputs() { + return Set.copyOf(switchables); } public void connect(Switchable output, boolean connect) { if (connect) { output.getSwitches().add(this); - getOutputs().add(output); + switchables.add(output); } else { output.getSwitches().remove(this); - getOutputs().remove(output); + switchables.remove(output); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java index f2d2c44..058baf2 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java @@ -3,6 +3,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude; import ch.usi.inf.sa4.sanmarinoes.smarthut.config.SocketGsonExclude; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import javax.persistence.*; @@ -55,4 +56,18 @@ public abstract class Switchable extends OutputDevice { newState.setOn(isOn()); return newState; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + Switchable that = (Switchable) o; + return isOn() == that.isOn(); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), isOn()); + } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/AutomationService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/AutomationService.java index 3887b02..265ace8 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/AutomationService.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/AutomationService.java @@ -21,15 +21,15 @@ public class AutomationService { this.conditionRepository = conditionRepository; } - public List> findTriggersByDeviceId(Long deviceId) { - return triggerRepository.findAllByDeviceId(deviceId); + public void findTriggersByDeviceId(Long deviceId, List> toPut) { + toPut.addAll(triggerRepository.findAllByDeviceId(deviceId)); } public Automation findByVerifiedId(Long automationId) { return automationRepository.findById(automationId).orElseThrow(); } - public List> findAllConditionsByAutomationId(Long automationId) { - return conditionRepository.findAllByAutomationId(automationId); + public void findAllConditionsByAutomationId(Long automationId, List> toPut) { + toPut.addAll(conditionRepository.findAllByAutomationId(automationId)); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceService.java index 43607d0..ac63201 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceService.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceService.java @@ -4,6 +4,7 @@ import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; +import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; @@ -52,7 +53,8 @@ public class DeviceService { public void triggerTriggers(Device device, final String username) { final long deviceId = device.getId(); - final List> triggers = automationService.findTriggersByDeviceId(deviceId); + final List> triggers = new ArrayList<>(); + automationService.findTriggersByDeviceId(deviceId, triggers); triggers.stream() .filter(Trigger::triggered) @@ -61,8 +63,9 @@ public class DeviceService { .distinct() .filter( a -> { - final List> conditions = - automationService.findAllConditionsByAutomationId(a.getId()); + final List> conditions = new ArrayList<>(); + automationService.findAllConditionsByAutomationId( + a.getId(), conditions); if (conditions.isEmpty()) return true; return conditions.stream().allMatch(Condition::triggered); }) diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchControllerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchControllerTests.java index 6d3787d..ef47b96 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchControllerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchControllerTests.java @@ -98,7 +98,7 @@ public class SwitchControllerTests { ArrayList helper = new ArrayList(); helper.add(light); helper.add(light2); - when(deviceService.saveAllAsOwner(aSwitch.getOutputs(), principal.getName())) + when(deviceService.saveAllAsOwner(aSwitch.getSwitchables(), principal.getName())) .thenReturn(helper); MockHttpServletRequest request = new MockHttpServletRequest(); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); @@ -123,7 +123,7 @@ public class SwitchControllerTests { ArrayList helper = new ArrayList(); helper.add(light); helper.add(light2); - when(deviceService.saveAllAsOwner(aSwitch.getOutputs(), principal.getName())) + when(deviceService.saveAllAsOwner(aSwitch.getSwitchables(), principal.getName())) .thenReturn(helper); MockHttpServletRequest request = new MockHttpServletRequest(); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); @@ -148,7 +148,7 @@ public class SwitchControllerTests { ArrayList helper = new ArrayList(); helper.add(light); helper.add(light2); - when(deviceService.saveAllAsOwner(aSwitch.getOutputs(), principal.getName())) + when(deviceService.saveAllAsOwner(aSwitch.getSwitchables(), principal.getName())) .thenReturn(helper); MockHttpServletRequest request = new MockHttpServletRequest(); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/ButtonDimmerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/ButtonDimmerTests.java index 421ca0f..7aab4ce 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/ButtonDimmerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/ButtonDimmerTests.java @@ -39,7 +39,7 @@ public class ButtonDimmerTests { @DisplayName(" increase the intensity ") public void increase() { buttonDimmer.increaseIntensity(); - for (Dimmable dl : buttonDimmer.getOutputs()) { + for (Dimmable dl : buttonDimmer.getDimmables()) { assertTrue(dl.getIntensity() > 10); } } @@ -48,7 +48,7 @@ public class ButtonDimmerTests { @DisplayName(" decrease the intensity ") public void decrease() { buttonDimmer.decreaseIntensity(); - for (Dimmable dl : buttonDimmer.getOutputs()) { + for (Dimmable dl : buttonDimmer.getDimmables()) { assertTrue(dl.getIntensity() < 10); } } diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/DimmerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/DimmerTests.java index 5f1ec32..6dfc46c 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/DimmerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/DimmerTests.java @@ -34,12 +34,13 @@ public class DimmerTests { @DisplayName("connect off") public void connectOff() { DimmableLight d = new DimmableLight(); + d.setId(35L); d.getDimmers().add(this.dimmer); - dimmer.getOutputs().add(d); + dimmer.getDimmables().add(d); dimmer.connect(d, false); assertFalse(d.getDimmers().contains((this.dimmer))); - assertFalse((this.dimmer.getOutputs().contains(d))); + assertFalse(this.dimmer.getOutputs().contains(d)); } } diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/KnobDimmerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/KnobDimmerTests.java index 181dc57..def3f7f 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/KnobDimmerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/KnobDimmerTests.java @@ -39,7 +39,7 @@ public class KnobDimmerTests { @DisplayName(" set the intensity ") public void increase() { knobDimmer.setLightIntensity(30); - for (Dimmable dl : knobDimmer.getOutputs()) { + for (Dimmable dl : knobDimmer.getDimmables()) { assertEquals(30, dl.getIntensity()); } } diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/SwitchTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/SwitchTests.java index b05bb94..3358b84 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/SwitchTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/model/SwitchTests.java @@ -20,9 +20,9 @@ public class SwitchTests { RegularLight regularLight = new RegularLight(); DimmableLight dimmableLight = new DimmableLight(); SmartPlug smartPlug = new SmartPlug(); - this.aSwitch.getOutputs().add(regularLight); - this.aSwitch.getOutputs().add(dimmableLight); - this.aSwitch.getOutputs().add(smartPlug); + this.aSwitch.getSwitchables().add(regularLight); + this.aSwitch.getSwitchables().add(dimmableLight); + this.aSwitch.getSwitchables().add(smartPlug); } @Test @@ -80,7 +80,7 @@ public class SwitchTests { @DisplayName("Checks that toggling on sets all elements of the Set on as well") public void toggleEffctOnSet() { aSwitch.toggle(); - for (final Switchable s : aSwitch.getOutputs()) { + for (final Switchable s : aSwitch.getSwitchables()) { assertTrue(s.isOn()); } } @@ -90,7 +90,7 @@ public class SwitchTests { public void toggleOffEffectOnElementes() { aSwitch.setOn(true); aSwitch.toggle(); - for (final Switchable s : aSwitch.getOutputs()) { + for (final Switchable s : aSwitch.getSwitchables()) { assertFalse(s.isOn()); } } diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java index 01000ea..ce7e5b9 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java @@ -98,8 +98,12 @@ public class DeviceServiceTests { a.getScenes().add(sp); - when(automationService.findTriggersByDeviceId(1L)).thenReturn(List.of(b)); - when(automationService.findAllConditionsByAutomationId(5L)).thenReturn(List.of(c)); + doAnswer(i -> ((List>) i.getArgument(1)).add(b)) + .when(automationService) + .findTriggersByDeviceId(eq(1L), any()); + doAnswer(i -> ((List>) i.getArgument(1)).add(c)) + .when(automationService) + .findAllConditionsByAutomationId(eq(5L), any()); when(automationService.findByVerifiedId(5L)).thenReturn(a); when(sceneService.findByValidatedId(4L)).thenReturn(s);