Compare commits

..

No commits in common. "2be9df6094128512e6bf0a00943b6e72462646f8" and "8e23124c6ba6554461eadf73acbd3ce5784a70dd" have entirely different histories.

9 changed files with 73 additions and 81 deletions

View File

@ -4,6 +4,7 @@ import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
@ -13,15 +14,12 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MainFXMLController implements Initializable { public class MainFXMLController implements Initializable {
/** /**
* Caching the panes * Caching the panes
*/ */
private final Map<String, AnchorPane> panes = new HashMap<>(); private final Map<String, AnchorPane> panes = new HashMap<>();
private static final Logger LOG = Logger.getLogger(MainFXMLController.class.getName());
@FXML @FXML
private Button home_button; private Button home_button;
@ -102,7 +100,7 @@ public class MainFXMLController implements Initializable {
loadPane("Home.fxml"); loadPane("Home.fxml");
styleChangeButton(home_button); styleChangeButton(home_button);
} catch (IOException e) { } catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to load FXML-Pane!", e); e.printStackTrace();
} }
} }
} }

View File

@ -7,6 +7,8 @@ import ch.zhaw.gartenverwaltung.types.Plant;
import ch.zhaw.gartenverwaltung.types.Seasons; import ch.zhaw.gartenverwaltung.types.Seasons;
import javafx.beans.property.ListProperty; import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleListProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
@ -27,11 +29,8 @@ import java.net.URL;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
public class PlantsController implements Initializable { public class PlantsController implements Initializable {
private static final Logger LOG = Logger.getLogger(PlantsController.class.getName());
private final PlantListModel plantListModel = new PlantListModel(); private final PlantListModel plantListModel = new PlantListModel();
private Plant selectedPlant = null; private Plant selectedPlant = null;
private final HardinessZone DEFAULT_HARDINESS_ZONE = HardinessZone.ZONE_8A; private final HardinessZone DEFAULT_HARDINESS_ZONE = HardinessZone.ZONE_8A;
@ -99,10 +98,8 @@ public class PlantsController implements Initializable {
lookForSelectedListEntry(); lookForSelectedListEntry();
try { try {
viewFilteredListBySearch(); viewFilteredListBySearch();
} catch (HardinessZoneNotSetException e) { } catch (HardinessZoneNotSetException | IOException e) {
LOG.log(Level.WARNING, "Hardiness Zone not set!"); e.printStackTrace();
} catch (IOException e) {
LOG.log(Level.WARNING, "Could not retrieve data!", e);
} }
} }
@ -110,7 +107,7 @@ public class PlantsController implements Initializable {
* set text of list view to plant name * set text of list view to plant name
*/ */
private void setListCellFactory() { private void setListCellFactory() {
list_plants.setCellFactory(param -> new ListCell<>() { list_plants.setCellFactory(param -> new ListCell<Plant>() {
@Override @Override
protected void updateItem(Plant plant, boolean empty) { protected void updateItem(Plant plant, boolean empty) {
super.updateItem(plant, empty); super.updateItem(plant, empty);
@ -146,15 +143,13 @@ public class PlantsController implements Initializable {
search_plants.textProperty().addListener((observable, oldValue, newValue) -> { search_plants.textProperty().addListener((observable, oldValue, newValue) -> {
if (newValue.isEmpty()) { if (newValue.isEmpty()) {
fillPlantListWithHardinessZone(); fillPlantListWithHardinessZone();
} else { }else {
try { try {
List<Plant> filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, newValue); List<Plant> filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, newValue);
clearListView(); clearListView();
plantListProperty.addAll(filteredPlants); plantListProperty.addAll(filteredPlants);
} catch (HardinessZoneNotSetException e) { } catch (HardinessZoneNotSetException | IOException e) {
LOG.log(Level.WARNING, "Hardiness Zone not set!"); e.printStackTrace();
} catch (IOException e) {
LOG.log(Level.WARNING, "Could not retrieve data!", e);
} }
} }
}); });
@ -168,10 +163,8 @@ public class PlantsController implements Initializable {
try { try {
clearListView(); clearListView();
plantListProperty.addAll(plantListModel.getPlantList(plantListModel.getCurrentZone())); plantListProperty.addAll(plantListModel.getPlantList(plantListModel.getCurrentZone()));
} catch (HardinessZoneNotSetException e) { } catch (HardinessZoneNotSetException | IOException e) {
LOG.log(Level.WARNING, "Hardiness Zone not set!"); e.printStackTrace();
} catch (IOException e) {
LOG.log(Level.WARNING, "Could not retrieve data!", e);
} }
} }
@ -189,9 +182,12 @@ public class PlantsController implements Initializable {
if (zone.equals(DEFAULT_HARDINESS_ZONE)) { if (zone.equals(DEFAULT_HARDINESS_ZONE)) {
radioButton.setSelected(true); radioButton.setSelected(true);
} }
radioButton.selectedProperty().addListener((observable, oldValue, newValue) -> { radioButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
plantListModel.setCurrentZone(zone); @Override
fillPlantListWithHardinessZone(); public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
plantListModel.setCurrentZone(zone);
fillPlantListWithHardinessZone();
}
}); });
climate_zones.getChildren().add(radioButton); climate_zones.getChildren().add(radioButton);
} }
@ -211,19 +207,20 @@ public class PlantsController implements Initializable {
if (season.equals(Seasons.AllSEASONS)) { if (season.equals(Seasons.AllSEASONS)) {
radioButton.setSelected(true); radioButton.setSelected(true);
} }
radioButton.selectedProperty().addListener((observable, oldValue, newValue) -> { radioButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
if (season.equals(Seasons.AllSEASONS)) { @Override
fillPlantListWithHardinessZone(); public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
} else { if (season.equals(Seasons.AllSEASONS)) {
try { fillPlantListWithHardinessZone();
viewFilteredListBySeason(season); } else {
} catch (HardinessZoneNotSetException e) { try {
LOG.log(Level.WARNING, "Hardiness Zone not set!"); viewFilteredListBySeason(season);
} catch (IOException e) { } catch (HardinessZoneNotSetException | IOException e) {
LOG.log(Level.WARNING, "Could not retrieve data!", e); e.printStackTrace();
}
} }
}
}
}); });
seasons.getChildren().add(radioButton); seasons.getChildren().add(radioButton);
} }
@ -240,24 +237,27 @@ public class PlantsController implements Initializable {
selectSowDay_button.setDisable(true); selectSowDay_button.setDisable(true);
Image img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png"))); Image img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
img_plant.setImage(img); img_plant.setImage(img);
list_plants.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { list_plants.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Plant>() {
if(newValue != null) { @Override
selectedPlant = newValue; public void changed(ObservableValue<? extends Plant> observable, Plant oldValue, Plant newValue) {
description_plant.setText(selectedPlant.description()); if(newValue != null) {
selectSowDay_button.setDisable(false); selectedPlant = newValue;
Image img1; description_plant.setText(selectedPlant.description());
if(selectedPlant.image() != null) { selectSowDay_button.setDisable(false);
img1 = selectedPlant.image(); Image img;
if(selectedPlant.image() != null) {
img = selectedPlant.image();
} else {
img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
}
img_plant.setImage(img);
} else { } else {
img1 = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png"))); selectedPlant = null;
description_plant.setText("");
selectSowDay_button.setDisable(true);
Image img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
img_plant.setImage(img);
} }
img_plant.setImage(img1);
} else {
selectedPlant = null;
description_plant.setText("");
selectSowDay_button.setDisable(true);
Image img1 = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
img_plant.setImage(img1);
} }
}); });
} }

View File

@ -145,6 +145,7 @@ public class JsonGardenPlan implements GardenPlan {
.registerModule(new Jdk8Module()) .registerModule(new Jdk8Module())
.writeValue(new File(dataSource.toURI()), cropMap.values()); .writeValue(new File(dataSource.toURI()), cropMap.values());
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
// TODO: Log
throw new IOException(INVALID_DATASOURCE_MSG, e); throw new IOException(INVALID_DATASOURCE_MSG, e);
} }
} }

View File

@ -16,12 +16,13 @@ public class GrowthPhaseTypeDeserializer extends StdDeserializer<GrowthPhaseType
@Override @Override
public GrowthPhaseType deserialize(JsonParser parser, DeserializationContext context) throws IOException { public GrowthPhaseType deserialize(JsonParser parser, DeserializationContext context) throws IOException {
GrowthPhaseType result; GrowthPhaseType result = null;
String token = parser.getText(); String token = parser.getText();
try { try {
result = GrowthPhaseType.valueOf(token.toUpperCase()); result = GrowthPhaseType.valueOf(token.toUpperCase());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new IOException(String.format("Bad growth phase type \"%s\"\n", token)); // TODO: Log
System.err.printf("Bad growth phase type \"%s\"\n", token);
} }
return result; return result;
} }

View File

@ -17,12 +17,13 @@ public class HardinessZoneDeserializer extends StdDeserializer<HardinessZone> {
@Override @Override
public HardinessZone deserialize(JsonParser parser, DeserializationContext context) throws IOException { public HardinessZone deserialize(JsonParser parser, DeserializationContext context) throws IOException {
HardinessZone result; HardinessZone result = null;
String token = parser.getText(); String token = parser.getText();
try { try {
result = HardinessZone.valueOf(token.toUpperCase()); result = HardinessZone.valueOf(token.toUpperCase());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new IOException(String.format("Unknown Hardiness Zone \"%s\"\n", token), e); // TODO: Log
System.err.printf("Unknown Hardiness Zone \"%s\"\n", token);
} }
return result; return result;
} }

View File

@ -23,7 +23,9 @@ public class PlantImageDeserializer extends JsonDeserializer<Image> {
try (InputStream is = new FileInputStream(new File(imageUrl.toURI()))) { try (InputStream is = new FileInputStream(new File(imageUrl.toURI()))) {
result = new Image(is); result = new Image(is);
} catch (IllegalArgumentException | URISyntaxException e) { } catch (IllegalArgumentException | URISyntaxException e) {
throw new IOException(String.format("Cannot find Image \"%s\"\n", imageUrl.getFile())); // TODO: Log
e.printStackTrace();
System.err.printf("Cannot find Image \"%s\"\n", imageUrl.getFile());
} }
} }
return result; return result;

View File

@ -116,17 +116,16 @@ public class PlantListModel {
if (searchString.length() == 0) { if (searchString.length() == 0) {
return getPlantList(zone); return getPlantList(zone);
} else if (searchString.charAt(0) == '#') { } else if (searchString.charAt(0) == '#') {
if (isPositiveIntegral(searchString.substring(1))) { try {
Long searchId = Long.parseLong(searchString.substring(1)); return getFilteredPlantListById(zone, Long.parseLong(searchString.substring(1)));
return getFilteredPlantListById(zone, searchId); } catch (NumberFormatException e) {
} else {
return new ArrayList<>(); return new ArrayList<>();
} }
} else { } else {
String caseInsensitiveSearchString = searchString.toLowerCase(); String caseInsensitiveSearchString = searchString.toLowerCase();
return getFilteredPlantList(zone, plant -> return getFilteredPlantList(zone, plant ->
plant.name().toLowerCase().contains(caseInsensitiveSearchString) || plant.name().toLowerCase().contains(caseInsensitiveSearchString) ||
plant.description().toLowerCase().contains(caseInsensitiveSearchString) plant.description().toLowerCase().contains(caseInsensitiveSearchString)
); );
} }
} }
@ -170,24 +169,15 @@ public class PlantListModel {
} }
/** /**
*
* @param zone selected hardiness zone * @param zone selected hardiness zone
* @param from the earliest date to for the filter * @param from the earliest date to for the filter
* @param to the lastest date for the filter * @param to the lastest date for the filter
* @return List of Plants with selected saison * @return List of Plants with selected saison
* @throws HardinessZoneNotSetException If no {@link HardinessZone} was specified * @throws HardinessZoneNotSetException If no {@link HardinessZone} was specified
* @throws IOException If the database cannot be accessed * @throws IOException If the database cannot be accessed
*/ */
public List<Plant> getFilteredPlantListBySaisonWithoutGrowthPhase(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException { public List<Plant> getFilteredPlantListBySaisonWithoutGrowthPhase(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException {
return getFilteredPlantList(zone, plant -> plant.lifecycle().stream().anyMatch(growthPhase -> growthPhase.startDate().compareTo(from) >= 0 && (growthPhase.startDate().compareTo(to) <= 0))); return getFilteredPlantList(zone, plant -> plant.lifecycle().stream().anyMatch(growthPhase -> growthPhase.startDate().compareTo(from) >= 0 && (growthPhase.startDate().compareTo(to) <= 0)));
} }
/**
* Check if a string can safely be parsed as a positive Integral value (short/int/long)
*
* @param subject The string to be tested
* @return Whether the string contains only digits
*/
private boolean isPositiveIntegral(String subject) {
return subject != null && subject.matches("[0-9]+");
}
} }

View File

@ -4,7 +4,6 @@ module ch.zhaw.gartenverwaltung {
requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.databind;
requires com.fasterxml.jackson.datatype.jsr310; requires com.fasterxml.jackson.datatype.jsr310;
requires com.fasterxml.jackson.datatype.jdk8; requires com.fasterxml.jackson.datatype.jdk8;
requires java.logging;
opens ch.zhaw.gartenverwaltung to javafx.fxml; opens ch.zhaw.gartenverwaltung to javafx.fxml;
opens ch.zhaw.gartenverwaltung.types to com.fasterxml.jackson.databind; opens ch.zhaw.gartenverwaltung.types to com.fasterxml.jackson.databind;

View File

@ -6,7 +6,7 @@
"startDate" : "2022-05-01", "startDate" : "2022-05-01",
"endDate" : "2022-05-01", "endDate" : "2022-05-01",
"interval" : 0, "interval" : 0,
"cropId" : 0 "cropID" : 0
}, },
{ {
"id" : 2, "id" : 2,
@ -15,7 +15,7 @@
"startDate" : "2022-05-01", "startDate" : "2022-05-01",
"endDate" : "2022-09-01", "endDate" : "2022-09-01",
"interval" : 2, "interval" : 2,
"cropId" : 0 "cropID" : 0
}, },
{ {
"id" : 3, "id" : 3,
@ -24,7 +24,7 @@
"startDate" : "2022-06-01", "startDate" : "2022-06-01",
"endDate" : "2022-08-01", "endDate" : "2022-08-01",
"interval" : 28, "interval" : 28,
"cropId" : 0 "cropID" : 0
}, },
{ {
"id" : 4, "id" : 4,
@ -33,7 +33,7 @@
"startDate" : "2022-07-01", "startDate" : "2022-07-01",
"endDate" : "2022-07-01", "endDate" : "2022-07-01",
"interval" : 0, "interval" : 0,
"cropId" : 0 "cropID" : 0
}, },
{ {
"id" : 5, "id" : 5,
@ -42,7 +42,7 @@
"startDate" : "2022-05-01", "startDate" : "2022-05-01",
"endDate" : "2022-09-01", "endDate" : "2022-09-01",
"interval" : 5, "interval" : 5,
"cropId" : 0 "cropID" : 0
}, },
{ {
"id" : 6, "id" : 6,
@ -51,6 +51,6 @@
"startDate" : "2022-09-01", "startDate" : "2022-09-01",
"endDate" : "2022-09-01", "endDate" : "2022-09-01",
"interval" : 0, "interval" : 0,
"cropId" : 0 "cropID" : 0
} }
] ]