Skip to content

Commit 99fb9ee

Browse files
committed
added geojson layer
Signed-off-by: makbn <[email protected]>
1 parent 4c88bad commit 99fb9ee

File tree

12 files changed

+256
-113
lines changed

12 files changed

+256
-113
lines changed

jlmap-api/src/main/java/io/github/makbn/jlmap/exception/JLException.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
/**
44
* Internal JLMap application's Exception base class.
5+
*
56
* @author Matt Akbarian (@makbn)
67
*/
78

8-
public class JLException extends RuntimeException{
9+
public class JLException extends RuntimeException {
910
public JLException(String message) {
1011
super(message);
1112
}
13+
1214
public JLException(Throwable cause) {
1315
super(cause);
1416
}

jlmap-api/src/main/java/io/github/makbn/jlmap/geojson/JLGeoJsonSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.Gson;
44
import com.google.gson.JsonSyntaxException;
55
import io.github.makbn.jlmap.exception.JLGeoJsonParserException;
6+
import io.github.makbn.jlmap.model.JLGeoJson;
67
import lombok.AccessLevel;
78
import lombok.experimental.FieldDefaults;
89
import lombok.experimental.NonFinal;
@@ -26,7 +27,7 @@ public abstract class JLGeoJsonSource<S> {
2627
* The GeoJSON object loaded from this source.
2728
*/
2829
@NonFinal
29-
JLGeoJsonObject geoJsonObject;
30+
JLGeoJson geoJsonObject;
3031

3132
/**
3233
* Initializes a new instance of {@code JLGeoJsonSource} and sets up the Gson object.

jlmap-api/src/main/java/io/github/makbn/jlmap/layer/leaflet/LeafletGeoJsonLayerInt.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.github.makbn.jlmap.layer.leaflet;
22

33
import io.github.makbn.jlmap.exception.JLException;
4-
import io.github.makbn.jlmap.geojson.JLGeoJsonObject;
4+
import io.github.makbn.jlmap.model.JLGeoJson;
55
import lombok.NonNull;
66

77
import java.io.File;
@@ -23,36 +23,36 @@ public interface LeafletGeoJsonLayerInt extends LeafletLayer {
2323
*
2424
* @param file The {@link File} object representing the GeoJSON file to be
2525
* added.
26-
* @return The {@link JLGeoJsonObject} representing the added GeoJSON data.
26+
* @return The {@link JLGeoJson} representing the added GeoJSON data.
2727
* @throws JLException If there is an error while adding the GeoJSON data.
2828
*/
29-
JLGeoJsonObject addFromFile(@NonNull File file) throws JLException;
29+
JLGeoJson addFromFile(@NonNull File file) throws JLException;
3030

3131
/**
3232
* Adds a GeoJSON object from a URL to the Leaflet map.
3333
*
3434
* @param url The URL of the GeoJSON data to be added.
35-
* @return The {@link JLGeoJsonObject} representing the added GeoJSON data.
35+
* @return The {@link JLGeoJson} representing the added GeoJSON data.
3636
* @throws JLException If there is an error while adding the GeoJSON data.
3737
*/
38-
JLGeoJsonObject addFromUrl(@NonNull String url) throws JLException;
38+
JLGeoJson addFromUrl(@NonNull String url) throws JLException;
3939

4040
/**
4141
* Adds a GeoJSON object from raw content to the Leaflet map.
4242
*
4343
* @param content The raw GeoJSON content to be added.
44-
* @return The {@link JLGeoJsonObject} representing the added GeoJSON data.
44+
* @return The {@link JLGeoJson} representing the added GeoJSON data.
4545
* @throws JLException If there is an error while adding the GeoJSON data.
4646
*/
47-
JLGeoJsonObject addFromContent(@NonNull String content) throws JLException;
47+
JLGeoJson addFromContent(@NonNull String content) throws JLException;
4848

4949
/**
5050
* Removes a GeoJSON object from the Leaflet map.
5151
*
52-
* @param object The {@link JLGeoJsonObject} to be removed from the map.
52+
* @param id of the {@link JLGeoJson} to be removed from the map.
5353
* @return {@code true} if the removal was successful, {@code false}
5454
* if the object was not found or could not be removed.
5555
*/
56-
boolean removeGeoJson(@NonNull JLGeoJsonObject object);
56+
boolean removeGeoJson(@NonNull String id);
5757

5858
}

jlmap-api/src/main/java/io/github/makbn/jlmap/geojson/JLGeoJsonObject.java renamed to jlmap-api/src/main/java/io/github/makbn/jlmap/model/JLGeoJson.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package io.github.makbn.jlmap.geojson;
1+
package io.github.makbn.jlmap.model;
22

3+
import io.github.makbn.jlmap.engine.JLTransporter;
34
import lombok.AccessLevel;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -13,13 +14,14 @@
1314
@Getter
1415
@Setter
1516
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
16-
public class JLGeoJsonObject {
17+
public final class JLGeoJson extends JLObject<JLMarker> {
1718
@NonFinal
18-
int id;
19+
String id;
1920
String geoJsonContent;
2021

2122
@Builder
22-
public JLGeoJsonObject(int id, String geoJsonContent) {
23+
public JLGeoJson(String id, String geoJsonContent, JLTransporter transport) {
24+
super(transport);
2325
this.id = id;
2426
this.geoJsonContent = geoJsonContent;
2527
}

jlmap-api/src/main/java/io/github/makbn/jlmap/model/JLObject.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
*/
1818
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
1919
@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true)
20-
public abstract sealed class JLObject<T extends JLObject<?>> permits JLCircle, JLCircleMarker, JLMarker,
21-
JLMultiPolyline, JLPolygon, JLPolyline, JLPopup {
22-
public static final String REFERENCE_PREFIX = "jl_map_item_";
23-
20+
public abstract sealed class JLObject<T extends JLObject<?>> permits JLCircle, JLCircleMarker, JLGeoJson, JLMarker, JLMultiPolyline, JLPolygon, JLPolyline, JLPopup {
2421
JLTransporter transport;
2522

2623
@NonFinal
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.github.makbn.jlmap.model.builder;
2+
3+
import io.github.makbn.jlmap.model.JLGeoJson;
4+
import lombok.AccessLevel;
5+
import lombok.experimental.FieldDefaults;
6+
7+
@FieldDefaults(level = AccessLevel.PRIVATE)
8+
public class JLGeoJsonObjectBuilder extends JLObjectBuilder<JLGeoJson, JLGeoJsonObjectBuilder> {
9+
String geoJson;
10+
11+
@Override
12+
protected String getElementType() {
13+
return JLGeoJson.class.getSimpleName().toLowerCase();
14+
}
15+
16+
@Override
17+
protected String getElementVarName() {
18+
return uuid;
19+
}
20+
21+
public JLGeoJsonObjectBuilder setGeoJson(String geoJson) {
22+
this.geoJson = geoJson;
23+
return this;
24+
}
25+
26+
@Override
27+
public String buildJsElement() {
28+
// all the options and methods are going to be implemented through the object as they are usually
29+
// provided using feature for each geojson object
30+
return String.format("""
31+
let %1$s = L.geoJSON(%2$s, { %3$s });
32+
this.%1$s = %1$s;
33+
%1$s.uuid = '%1$s';
34+
// callback start
35+
%4$s
36+
// callback end
37+
%1$s.addTo(this.map);
38+
""",
39+
getElementVarName(), geoJson, renderOptions(), renderCallbacks());
40+
41+
}
42+
43+
@Override
44+
public JLGeoJson buildJLObject() {
45+
return JLGeoJson.builder()
46+
.id(uuid)
47+
.geoJsonContent(geoJson)
48+
.transport(transporter)
49+
.build();
50+
}
51+
}

jlmap-fx/src/main/java/io/github/makbn/jlmap/fx/demo/LeafletTestJFX.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,14 @@
33
import io.github.makbn.jlmap.JLMapController;
44
import io.github.makbn.jlmap.JLProperties;
55
import io.github.makbn.jlmap.fx.JLMapView;
6-
import io.github.makbn.jlmap.geojson.JLGeoJsonObject;
76
import io.github.makbn.jlmap.listener.OnJLMapViewListener;
87
import io.github.makbn.jlmap.listener.OnJLObjectActionListener;
98
import io.github.makbn.jlmap.listener.event.ClickEvent;
109
import io.github.makbn.jlmap.listener.event.Event;
1110
import io.github.makbn.jlmap.listener.event.MoveEvent;
1211
import io.github.makbn.jlmap.listener.event.ZoomEvent;
1312
import io.github.makbn.jlmap.map.JLMapProvider;
14-
import io.github.makbn.jlmap.model.JLLatLng;
15-
import io.github.makbn.jlmap.model.JLMarker;
16-
import io.github.makbn.jlmap.model.JLOptions;
17-
import io.github.makbn.jlmap.model.JLPolygon;
13+
import io.github.makbn.jlmap.model.*;
1814
import javafx.application.Application;
1915
import javafx.geometry.Rectangle2D;
2016
import javafx.scene.Scene;
@@ -100,7 +96,7 @@ public void mapLoadedSuccessfully(@NonNull JLMapController mapView) {
10096
map.getControlLayer().zoomIn(2);
10197
map.getControlLayer().zoomOut(1);
10298

103-
JLGeoJsonObject geoJsonObject = map.getGeoJsonLayer()
99+
JLGeoJson geoJsonObject = map.getGeoJsonLayer()
104100
.addFromUrl("https://pkgstore.datahub.io/examples/geojson-tutorial/example/data/db696b3bf628d9a273ca9907adcea5c9/example.geojson");
105101

106102
log.info("geojson loaded! id: {}", geoJsonObject.getId());

jlmap-fx/src/main/java/io/github/makbn/jlmap/fx/layer/JLGeoJsonLayer.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import io.github.makbn.jlmap.exception.JLException;
66
import io.github.makbn.jlmap.geojson.JLGeoJsonContent;
77
import io.github.makbn.jlmap.geojson.JLGeoJsonFile;
8-
import io.github.makbn.jlmap.geojson.JLGeoJsonObject;
98
import io.github.makbn.jlmap.geojson.JLGeoJsonURL;
109
import io.github.makbn.jlmap.layer.leaflet.LeafletGeoJsonLayerInt;
10+
import io.github.makbn.jlmap.model.JLGeoJson;
1111
import lombok.NonNull;
1212
import netscape.javascript.JSObject;
1313

@@ -16,6 +16,7 @@
1616

1717
/**
1818
* Represents the GeoJson (other) layer on Leaflet map.
19+
*
1920
* @author Matt Akbarian (@makbn)
2021
*/
2122
public class JLGeoJsonLayer extends JLLayer implements LeafletGeoJsonLayerInt {
@@ -36,39 +37,39 @@ public JLGeoJsonLayer(JLWebEngine<Object> engine,
3637
}
3738

3839
@Override
39-
public JLGeoJsonObject addFromFile(@NonNull File file) throws JLException {
40+
public JLGeoJson addFromFile(@NonNull File file) throws JLException {
4041
String json = fromFile.load(file);
4142
return addGeoJson(json);
4243
}
4344

4445
@Override
45-
public JLGeoJsonObject addFromUrl(@NonNull String url) throws JLException {
46+
public JLGeoJson addFromUrl(@NonNull String url) throws JLException {
4647
String json = fromUrl.load(url);
4748
return addGeoJson(json);
4849
}
4950

5051
@Override
51-
public JLGeoJsonObject addFromContent(@NonNull String content)
52+
public JLGeoJson addFromContent(@NonNull String content)
5253
throws JLException {
5354
String json = fromContent.load(content);
5455
return addGeoJson(json);
5556
}
5657

5758
@Override
58-
public boolean removeGeoJson(@NonNull JLGeoJsonObject object) {
59+
public boolean removeGeoJson(@NonNull String id) {
5960
return Boolean.parseBoolean(engine.executeScript(
60-
String.format("removeGeoJson(%d)", object.getId())).toString());
61+
String.format("removeGeoJson(%s)", id)).toString());
6162
}
6263

63-
private JLGeoJsonObject addGeoJson(String jlGeoJsonObject) {
64+
private JLGeoJson addGeoJson(String jlGeoJsonObject) {
6465
try {
6566
String identifier = MEMBER_PREFIX + UUID.randomUUID();
6667
this.window.setMember(identifier, jlGeoJsonObject);
6768
String returnedId = engine.executeScript(
6869
String.format("addGeoJson(\"%s\")", identifier)).toString();
6970

70-
return JLGeoJsonObject.builder()
71-
.id(Integer.parseInt(returnedId))
71+
return JLGeoJson.builder()
72+
.id(returnedId)
7273
.geoJsonContent(jlGeoJsonObject)
7374
.build();
7475
} catch (Exception e) {

jlmap-vaadin-demo/src/main/java/io/github/makbn/vaadin/demo/views/DialogBuilder.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
package io.github.makbn.vaadin.demo.views;
22

3+
import com.vaadin.flow.component.Unit;
34
import com.vaadin.flow.component.button.Button;
45
import com.vaadin.flow.component.dialog.Dialog;
56
import com.vaadin.flow.component.formlayout.FormLayout;
67
import com.vaadin.flow.component.textfield.IntegerField;
78
import com.vaadin.flow.component.textfield.NumberField;
89
import com.vaadin.flow.component.textfield.TextField;
10+
import com.vaadin.flow.component.upload.Upload;
11+
import com.vaadin.flow.server.streams.FileUploadCallback;
12+
import com.vaadin.flow.server.streams.FileUploadHandler;
13+
import com.vaadin.flow.server.streams.TemporaryFileFactory;
914

15+
import java.io.File;
1016
import java.util.LinkedHashMap;
17+
import java.util.LinkedHashSet;
1118
import java.util.Map;
19+
import java.util.Set;
1220
import java.util.function.Consumer;
1321

1422
/**
@@ -19,6 +27,7 @@ public class DialogBuilder {
1927
private final Dialog dialog;
2028
private final FormLayout formLayout;
2129
private final Map<String, Object> fieldComponents = new LinkedHashMap<>();
30+
private final Set<File> uploadedFiles = new LinkedHashSet<>();
2231

2332
private DialogBuilder() {
2433
this.dialog = new Dialog();
@@ -53,6 +62,21 @@ public DialogBuilder decimalField(String label) {
5362
return this;
5463
}
5564

65+
public DialogBuilder addUpload() {
66+
FileUploadHandler inMemoryHandler = new FileUploadHandler(
67+
(FileUploadCallback) (metadata, file) ->
68+
uploadedFiles.add(file), new TemporaryFileFactory());
69+
70+
Upload upload = new Upload(inMemoryHandler);
71+
upload.setMinHeight(200, Unit.PIXELS);
72+
upload.setMinWidth(400, Unit.PIXELS);
73+
upload.setMaxFileSize(100000000);
74+
75+
fieldComponents.put("uploader", upload);
76+
formLayout.add(upload);
77+
return this;
78+
}
79+
5680
public void get(Consumer<Map<String, Object>> okHandler) {
5781
Button ok = new Button("OK", e -> {
5882
Map<String, Object> values = new LinkedHashMap<>();
@@ -63,6 +87,8 @@ public void get(Consumer<Map<String, Object>> okHandler) {
6387
values.put(label, nf.getValue());
6488
} else if (comp instanceof NumberField df) {
6589
values.put(label, df.getValue());
90+
} else if (comp instanceof Upload) {
91+
values.put("uploadedFiles", uploadedFiles);
6692
}
6793
});
6894
okHandler.accept(values);

0 commit comments

Comments
 (0)