diff --git a/case-1/src/main/java/com/company/app/pvmodulelayouts/DefaultPvModuleLayouts.java b/case-1/src/main/java/com/company/app/pvmodulelayouts/DefaultPvModuleLayouts.java index 984ef40..fc6fb86 100644 --- a/case-1/src/main/java/com/company/app/pvmodulelayouts/DefaultPvModuleLayouts.java +++ b/case-1/src/main/java/com/company/app/pvmodulelayouts/DefaultPvModuleLayouts.java @@ -4,18 +4,23 @@ import com.company.app.PvModuleLayouts; import com.company.app.PvModulePosition; import com.company.app.RoofFace; -import com.company.app.pvmodulelayouts.layoutspecification.PvModulesMountedOnRoofFacePlaneLayoutSpecification; -import com.company.app.pvmodulelayouts.layoutspecification.PvModulesMountedOnTiltedRacksLayoutSpecification; import java.util.List; +import java.util.function.BiFunction; import java.util.stream.Stream; public class DefaultPvModuleLayouts implements PvModuleLayouts { + private final BiFunction layoutSpecificationConstructor; + + public DefaultPvModuleLayouts( + BiFunction layoutSpecificationConstructor + ) { + this.layoutSpecificationConstructor = layoutSpecificationConstructor; + } + @Override public List optimalLayoutFor(RoofFace roofFace, PvModuleDefinition pvModuleDefinition) { - var layoutSpecification = roofFace.slopeAngleInDegrees() < 10 - ? new PvModulesMountedOnRoofFacePlaneLayoutSpecification(pvModuleDefinition) - : new PvModulesMountedOnTiltedRacksLayoutSpecification(pvModuleDefinition); + var layoutSpecification = layoutSpecificationConstructor.apply(roofFace, pvModuleDefinition); return optimalLayoutTiles(roofFace, layoutSpecification) .flatMap(layoutTile -> layoutSpecification.splitIntoPvModulePositions(layoutTile)) diff --git a/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnRoofFacePlaneLayoutSpecification.java b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnRoofFacePlaneLayoutSpecification.java index 7ce1177..691c9d7 100644 --- a/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnRoofFacePlaneLayoutSpecification.java +++ b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnRoofFacePlaneLayoutSpecification.java @@ -13,10 +13,10 @@ * Let's assume the logic is that PV modules are always mounted individually and in portrait orientation. * (i.e. the unit of placement (layout tile) is a single PV module in portrait orientation) */ -public class PvModulesMountedOnRoofFacePlaneLayoutSpecification implements LayoutSpecification { +class PvModulesMountedOnRoofFacePlaneLayoutSpecification implements LayoutSpecification { private final PvModuleDefinition pvModuleDefinition; - public PvModulesMountedOnRoofFacePlaneLayoutSpecification(PvModuleDefinition pvModuleDefinition) { + PvModulesMountedOnRoofFacePlaneLayoutSpecification(PvModuleDefinition pvModuleDefinition) { this.pvModuleDefinition = pvModuleDefinition; } diff --git a/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnTiltedRacksLayoutSpecification.java b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnTiltedRacksLayoutSpecification.java index 0fa0e9e..e4f48c9 100644 --- a/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnTiltedRacksLayoutSpecification.java +++ b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/PvModulesMountedOnTiltedRacksLayoutSpecification.java @@ -13,10 +13,10 @@ * Let's assume the logic is that PV modules are always mounted in rows of 3 in landscape orientation * (i.e. the unit of placement (layout tile) is a group of 3 PV modules in landscape orientation) */ -public class PvModulesMountedOnTiltedRacksLayoutSpecification implements LayoutSpecification { +class PvModulesMountedOnTiltedRacksLayoutSpecification implements LayoutSpecification { private final PvModuleDefinition pvModuleDefinition; - public PvModulesMountedOnTiltedRacksLayoutSpecification(PvModuleDefinition pvModuleDefinition) { + PvModulesMountedOnTiltedRacksLayoutSpecification(PvModuleDefinition pvModuleDefinition) { this.pvModuleDefinition = pvModuleDefinition; } diff --git a/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/RoofSlopeDependentLayoutSpecification.java b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/RoofSlopeDependentLayoutSpecification.java new file mode 100644 index 0000000..6383cf7 --- /dev/null +++ b/case-1/src/main/java/com/company/app/pvmodulelayouts/layoutspecification/RoofSlopeDependentLayoutSpecification.java @@ -0,0 +1,34 @@ +package com.company.app.pvmodulelayouts.layoutspecification; + +import com.company.app.PvModuleDefinition; +import com.company.app.PvModulePosition; +import com.company.app.RoofFace; +import com.company.app.pvmodulelayouts.LayoutSpecification; +import com.company.app.pvmodulelayouts.LayoutTile; + +import java.util.stream.Stream; + +public class RoofSlopeDependentLayoutSpecification implements LayoutSpecification { + private final LayoutSpecification delegate; + + public RoofSlopeDependentLayoutSpecification(RoofFace roofFace, PvModuleDefinition pvModuleDefinition) { + this.delegate = roofFace.slopeAngleInDegrees() < 10 + ? new PvModulesMountedOnRoofFacePlaneLayoutSpecification(pvModuleDefinition) + : new PvModulesMountedOnTiltedRacksLayoutSpecification(pvModuleDefinition); + } + + @Override + public double tileWidth() { + return delegate.tileWidth(); + } + + @Override + public double tileLength() { + return delegate.tileLength(); + } + + @Override + public Stream splitIntoPvModulePositions(LayoutTile layoutTile) { + return delegate.splitIntoPvModulePositions(layoutTile); + } +} diff --git a/case-1/src/main/java/com/company/appconfig/Main.java b/case-1/src/main/java/com/company/appconfig/Main.java new file mode 100644 index 0000000..202673e --- /dev/null +++ b/case-1/src/main/java/com/company/appconfig/Main.java @@ -0,0 +1,13 @@ +package com.company.appconfig; + +import com.company.app.PvModuleLayouts; +import com.company.app.pvmodulelayouts.DefaultPvModuleLayouts; +import com.company.app.pvmodulelayouts.layoutspecification.RoofSlopeDependentLayoutSpecification; + +// @Configuration +public class Main { + // @Bean + public PvModuleLayouts pvModuleLayouts() { + return new DefaultPvModuleLayouts(RoofSlopeDependentLayoutSpecification::new); + } +}