From 92375b8755754a7e6ed4db44fd2005a03c31d19b Mon Sep 17 00:00:00 2001
From: Hallvard Traetteberg <hal@ntnu.no>
Date: Fri, 9 Feb 2018 00:04:43 +0100
Subject: [PATCH] Tags for configuring markers, and some fixes.

---
 .../java/tdt4140/gr1800/app/core/App.java     | 13 +++++----
 .../tdt4140/gr1800/app/core/GeoLocations.java | 29 ++++++++++++++++++-
 .../java/tdt4140/gr1800/app/core/Tagged.java  |  5 ++++
 .../app/doc/AbstractDocumentStorageImpl.java  |  6 ++--
 .../gr1800/app/gpx/GpxDocumentConverter.java  |  6 +++-
 .../gr1800/app/core/GeoLocationsTest.java     |  9 ++++++
 .../gr1800/app/ui/FileMenuController.java     |  9 +++---
 .../gr1800/app/ui/FxAppController.java        |  4 ++-
 .../gr1800/app/ui/IMapMarkerProvider.java     |  9 ++++++
 .../app/ui/TagBasedMapMarkerProvider.java     | 13 +++++++++
 10 files changed, 88 insertions(+), 15 deletions(-)
 create mode 100644 tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java
 create mode 100644 tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java
 create mode 100644 tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java

diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
index cf24b40..8325b47 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
@@ -5,12 +5,13 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
-import tdt4140.gr1800.app.doc.DocumentStorageImpl;
+import tdt4140.gr1800.app.doc.AbstractDocumentStorageImpl;
 import tdt4140.gr1800.app.doc.IDocumentImporter;
 import tdt4140.gr1800.app.doc.IDocumentLoader;
 import tdt4140.gr1800.app.doc.IDocumentPersistence;
@@ -20,7 +21,7 @@ import tdt4140.gr1800.app.json.GeoLocationsJsonPersistence;
 
 public class App {
 
-	private GeoLocationsPersistence geoLocationsLoader = new GeoLocationsJsonPersistence();
+	private GeoLocationsPersistence geoLocationsPersistence = new GeoLocationsJsonPersistence();
 	
 	private Collection<GeoLocations> geoLocations = null;
 
@@ -79,16 +80,18 @@ public class App {
 		
 		@Override
 		public Collection<GeoLocations> loadDocument(InputStream inputStream) throws Exception {
-			return geoLocationsLoader.loadLocations(inputStream);
+			return geoLocationsPersistence.loadLocations(inputStream);
 		}
 
 		@Override
 		public void saveDocument(Collection<GeoLocations> document, File documentLocation) throws Exception {
-			geoLocationsLoader.saveLocations(document, new FileOutputStream(documentLocation));
+			try (OutputStream output = new FileOutputStream(documentLocation)) {
+				geoLocationsPersistence.saveLocations(document, output);
+			}
 		}
 	};
 
-	private DocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new DocumentStorageImpl<Collection<GeoLocations>, File>() {
+	private AbstractDocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new AbstractDocumentStorageImpl<Collection<GeoLocations>, File>() {
 
 		@Override
 		protected Collection<GeoLocations> getDocument() {
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
index 19e2fd4..3e3c1de 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
@@ -1,13 +1,18 @@
 package tdt4140.gr1800.app.core;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
-public class GeoLocations implements Iterable<GeoLocated> {
+import org.junit.Assert;
+
+public class GeoLocations implements Iterable<GeoLocated>, Tagged {
 
 	private String name;
 	
@@ -82,4 +87,26 @@ public class GeoLocations implements Iterable<GeoLocated> {
 	public Iterator<GeoLocated> iterator() {
 		return locations.iterator();
 	}
+	
+	//
+	
+	private Set<String> tags = null;
+
+	@Override
+	public boolean hasTags(String... tags) {
+		return this.tags != null && this.tags.containsAll(Arrays.asList(tags));
+	}
+	
+	public void addTags(String... tags) {
+		if (this.tags == null) {
+			this.tags = new HashSet<>();
+		}
+		this.tags.addAll(Arrays.asList(tags));
+	}
+	
+	public void removeTags(String... tags) {
+		if (this.tags != null) {
+			this.tags.removeAll(Arrays.asList(tags));
+		}
+	}
 }
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java
new file mode 100644
index 0000000..8f1ad45
--- /dev/null
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java
@@ -0,0 +1,5 @@
+package tdt4140.gr1800.app.core;
+
+public interface Tagged {
+	public boolean hasTags(String... tags);
+}
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
index f8aee01..0203ad7 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
@@ -5,7 +5,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 
-public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> {
+public abstract class AbstractDocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> {
 
 	private L documentLocation;
 
@@ -66,8 +66,8 @@ public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>,
 
 	@Override
 	public void openDocument(L storage) throws IOException {
-		try {
-			setDocumentAndLocation(loadDocument(toInputStream(storage)), storage);
+		try (InputStream input = toInputStream(storage)){
+			setDocumentAndLocation(loadDocument(input), storage);
 		} catch (Exception e) {
 			throw new IOException(e);
 		}
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
index 7c1f2d9..e8c65d0 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
@@ -62,6 +62,7 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat
 				String name = (singleTrack ? trackName : String.format(trackSegmentFormat, trackName, segmentCount));
 				GeoLocations gl = new GeoLocations(name, convert(segment.getPoints()));
 				gl.setPath(true);
+				gl.addTags(Track.class.getName().toLowerCase());
 				geoLocations.add(gl);
 			}
 		}
@@ -70,10 +71,13 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat
 			String routeName = (route.getName().isPresent() ? String.format(routeNameFormat, route.getName().get()) : String.format(routeCountFormat, routeCount));
 			GeoLocations gl = new GeoLocations(routeName, convert(route.getPoints()));
 			gl.setPath(true);
+			gl.addTags(Route.class.getName().toLowerCase());
 			geoLocations.add(gl);
 		}
 		if (! gpx.getWayPoints().isEmpty()) {
-			geoLocations.add(new GeoLocations("Waypoints", convert(gpx.getWayPoints())));
+			GeoLocations gl = new GeoLocations("Waypoints", convert(gpx.getWayPoints()));
+			gl.addTags(WayPoint.class.getName().toLowerCase());
+			geoLocations.add(gl);
 		}
 		return geoLocations;
 	}
diff --git a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
index 654d377..1af22c7 100644
--- a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
+++ b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
@@ -38,6 +38,15 @@ public class GeoLocationsTest {
 		}
 	}
 
+	public static void assertGeoLocations(GeoLocations geoLocations, GeoLocations geoLocations2) {
+		Iterator<GeoLocated> it = geoLocations.iterator(), it2 = geoLocations2.iterator();
+		while (it.hasNext()) {
+			Assert.assertTrue(it2.hasNext());
+			checkGeoLocated(it2.next(), it.next());
+		}
+		Assert.assertFalse(it2.hasNext());
+	}
+
 	@Test
 	public void testAddLocation() {
 		Assert.assertEquals(0, geoLocations.size());
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
index d3e5904..77c47e7 100644
--- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
@@ -3,6 +3,7 @@ package tdt4140.gr1800.app.ui;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -146,8 +147,8 @@ public class FileMenuController {
 
 	void handleFileImportAction(File selection) {
 		for (IDocumentImporter importer : documentStorage.getDocumentImporters()) {
-			try {
-				importer.importDocument(new FileInputStream(selection));
+			try (InputStream input = new FileInputStream(selection)) {
+				importer.importDocument(input);
 				break;
 			} catch (Exception e) {
 			}
@@ -187,8 +188,8 @@ public class FileMenuController {
 
 	boolean handleURLImportAction(URL url) {
 		for (IDocumentImporter importer : documentStorage.getDocumentImporters()) {
-			try {
-				importer.importDocument(url.openStream());
+			try (InputStream input = url.openStream()) {
+				importer.importDocument(input);
 				return true;
 			} catch (Exception e) {
 				System.err.println(e.getMessage());
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
index 060a5a4..7aca094 100644
--- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
@@ -75,6 +75,8 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation
 		return null;
 	}
 
+	private IMapMarkerProvider mapMarkerProvider = new TagBasedMapMarkerProvider();
+	
 	private void initMapMarkers() {
 		markersParent.getItems().clear();
 		geoLocationsSelector.getItems().clear();
@@ -82,7 +84,7 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation
 			GeoLocations geoLocations = app.getGeoLocations(geoLocationName);
 			MapMarker lastMarker = null;
 			for (GeoLocated geoLoc : geoLocations) {
-				MapMarker mapMarker = new MapMarker(geoLoc.getLatLong());
+				MapMarker mapMarker = mapMarkerProvider.getMapMarker(geoLoc, geoLocations);
 				markersParent.getItems().add(mapMarker);
 				if (geoLocations.isPath() && lastMarker != null) {
 					MapPathLine pathLine = new MapPathLine(lastMarker, mapMarker);
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java
new file mode 100644
index 0000000..55ef72e
--- /dev/null
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java
@@ -0,0 +1,9 @@
+package tdt4140.gr1800.app.ui;
+
+import tdt4140.gr1800.app.core.GeoLocated;
+import tdt4140.gr1800.app.core.GeoLocations;
+
+public interface IMapMarkerProvider {
+
+	public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations);
+}
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java
new file mode 100644
index 0000000..47bdc08
--- /dev/null
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java
@@ -0,0 +1,13 @@
+package tdt4140.gr1800.app.ui;
+
+import tdt4140.gr1800.app.core.GeoLocated;
+import tdt4140.gr1800.app.core.GeoLocations;
+
+public class TagBasedMapMarkerProvider implements IMapMarkerProvider {
+
+	@Override
+	public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations) {
+		MapMarker mapMarker = new MapMarker(geoLoc.getLatLong());
+		return mapMarker;
+	}
+}
-- 
GitLab