diff --git a/build.gradle b/build.gradle
index 2028776..7736c95 100644
--- a/build.gradle
+++ b/build.gradle
@@ -53,10 +53,12 @@ dependencies {
compile files('lib/JFXtras/jfxtras-labs-8.0-r1-SNAPSHOT.jar', 'lib/ScenicView/ScenicView.jar')
compile group: 'org.jdom', name: 'jdom2', version: '2.0.5'
compile group: 'org.controlsfx', name: 'controlsfx', version: '8.0.6'
- compile group: 'com.h2database', name: 'h2', version: '1.4.178'
- compile group: 'org.eclipse.persistence', name: 'eclipselink', version: '2.5.0'
compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.2.1'
compile group: 'org.jboss.weld.se', name: 'weld-se', version: '2.2.0.Final'
+ compile group: 'com.orientechnologies', name: 'orient-commons', version: '2.0-SNAPSHOT'
+ compile group: 'com.orientechnologies', name: 'orientdb-core', version: '2.0-SNAPSHOT'
+ compile group: 'com.orientechnologies', name: 'orientdb-server', version: '2.0-SNAPSHOT'
+ compile group: 'com.orientechnologies', name: 'orientdb-object', version: '2.0-SNAPSHOT'
}
///////////////////////////////////////////////////////////////////////////////////
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 3b624ba..d92d118 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Sep 22 11:48:27 CEST 2013
+#Fri Aug 15 19:56:32 CEST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-bin.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-all.zip
diff --git a/resources/META-INF/persistence.xml b/resources/META-INF/persistence.xml
deleted file mode 100644
index 78da4a6..0000000
--- a/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- org.eclipse.persistence.jpa.PersistenceProvider
-
- de.geofroggerfx.model.Attribute
- de.geofroggerfx.model.Cache
- de.geofroggerfx.model.Log
- de.geofroggerfx.model.TravelBug
- de.geofroggerfx.model.Type
- de.geofroggerfx.model.User
- de.geofroggerfx.model.Waypoint
- de.geofroggerfx.model.CacheList
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/de/geofroggerfx/application/SessionContext.java b/src/de/geofroggerfx/application/SessionContext.java
index dfbb00b..7cde71e 100644
--- a/src/de/geofroggerfx/application/SessionContext.java
+++ b/src/de/geofroggerfx/application/SessionContext.java
@@ -75,10 +75,10 @@ public class SessionContext {
private void fireSessionEvent(String key) {
if (sessionListeners.containsKey(key)) {
- final List listenerList = sessionListeners.get(key);
- for (final SessionContextListener listener : listenerList) {
- listener.sessionContextChanged();
- }
+ sessionListeners.
+ get(key).
+ stream().
+ forEach(SessionContextListener::sessionContextChanged);
}
}
}
diff --git a/src/de/geofroggerfx/fx/GeoFroggerFXMain.java b/src/de/geofroggerfx/fx/GeoFroggerFXMain.java
index 301fc60..5880cf8 100644
--- a/src/de/geofroggerfx/fx/GeoFroggerFXMain.java
+++ b/src/de/geofroggerfx/fx/GeoFroggerFXMain.java
@@ -84,7 +84,7 @@ public class GeoFroggerFXMain extends Application {
@Override
public void stop() throws Exception {
- weldContainer.instance().select(DatabaseService.class).get().getEntityManager().close();
+ weldContainer.instance().select(DatabaseService.class).get().close();
weld.shutdown();
super.stop();
}
diff --git a/src/de/geofroggerfx/fx/cachedetails/CacheDetailsController.java b/src/de/geofroggerfx/fx/cachedetails/CacheDetailsController.java
index e0c8ce0..ce335ef 100644
--- a/src/de/geofroggerfx/fx/cachedetails/CacheDetailsController.java
+++ b/src/de/geofroggerfx/fx/cachedetails/CacheDetailsController.java
@@ -25,12 +25,11 @@
*/
package de.geofroggerfx.fx.cachedetails;
-import de.geofroggerfx.application.SessionConstants;
import de.geofroggerfx.application.SessionContext;
import de.geofroggerfx.application.SessionContextListener;
-import de.geofroggerfx.fx.components.MapPaneWrapper;
import de.geofroggerfx.fx.components.GeocachingIcons;
import de.geofroggerfx.fx.components.IconManager;
+import de.geofroggerfx.fx.components.MapPaneWrapper;
import de.geofroggerfx.model.Cache;
import de.geofroggerfx.model.CacheList;
import de.geofroggerfx.service.CacheService;
@@ -53,6 +52,7 @@ import jfxtras.labs.map.render.MapMarkable;
import javax.inject.Inject;
import java.net.URL;
import java.time.LocalDate;
+import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
@@ -116,12 +116,6 @@ public class CacheDetailsController implements Initializable, SessionContextList
@Inject
private CacheService cacheService;
- /**
- * Initializes the controller class.
- *
- * @param url
- * @param rb
- */
@Override
public void initialize(URL url, ResourceBundle rb) {
setSessionListener();
@@ -227,7 +221,7 @@ public class CacheDetailsController implements Initializable, SessionContextList
icon.setImage(GeocachingIcons.getIcon(currentCache));
placedByTextfield.setText(currentCache.getPlacedBy());
ownerTextfield.setText(currentCache.getOwner().getName());
- date.setValue(currentCache.getMainWayPoint().getTime().toLocalDate());
+ date.setValue(currentCache.getMainWayPoint().getTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
typeTextfield.setText(currentCache.getType().toGroundspeakString());
containerTextfield.setText(currentCache.getContainer());
fillShortDescription(currentCache);
diff --git a/src/de/geofroggerfx/fx/cachelist/CacheListController.java b/src/de/geofroggerfx/fx/cachelist/CacheListController.java
index 341110c..ae2c385 100644
--- a/src/de/geofroggerfx/fx/cachelist/CacheListController.java
+++ b/src/de/geofroggerfx/fx/cachelist/CacheListController.java
@@ -25,7 +25,6 @@
*/
package de.geofroggerfx.fx.cachelist;
-import de.geofroggerfx.application.SessionConstants;
import de.geofroggerfx.application.SessionContext;
import de.geofroggerfx.fx.components.CacheListCell;
import de.geofroggerfx.fx.components.IconManager;
@@ -35,14 +34,10 @@ import de.geofroggerfx.model.CacheList;
import de.geofroggerfx.service.CacheService;
import de.geofroggerfx.service.CacheSortField;
import javafx.application.Platform;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.image.ImageView;
-import javafx.util.Callback;
-import org.scenicview.ScenicView;
import javax.inject.Inject;
import java.net.URL;
@@ -84,12 +79,6 @@ public class CacheListController implements Initializable {
@FXML
private ComboBox cacheListComboBox;
- /**
- * Initializes the controller class.
- *
- * @param url
- * @param rb
- */
@Override
@SuppressWarnings("unchecked")
public void initialize(URL url, ResourceBundle rb) {
@@ -99,10 +88,10 @@ public class CacheListController implements Initializable {
setCellFactory();
cacheListView.getSelectionModel().selectedItemProperty().addListener(
- (ChangeListener) (ObservableValue extends Cache> ov, Cache oldValue, Cache newValue) ->
- sessionContext.setData(CURRENT_CACHE, newValue)
+ observable -> sessionContext.setData(CURRENT_CACHE, cacheListView.getSelectionModel().getSelectedItem())
);
+
initCacheListComboBox();
initListMenuButton();
}
@@ -110,8 +99,8 @@ public class CacheListController implements Initializable {
@SuppressWarnings("unchecked")
private void setCellFactory() {
cacheListView.setCellFactory(
- (Callback, CacheListCell>)
- (ListView p) -> new CacheListCell());
+ param -> new CacheListCell()
+ );
}
private void setSessionListener() {
diff --git a/src/de/geofroggerfx/fx/components/MapPaneWrapper.java b/src/de/geofroggerfx/fx/components/MapPaneWrapper.java
index 92b5ade..1722cff 100644
--- a/src/de/geofroggerfx/fx/components/MapPaneWrapper.java
+++ b/src/de/geofroggerfx/fx/components/MapPaneWrapper.java
@@ -26,8 +26,6 @@
package de.geofroggerfx.fx.components;
import de.geofroggerfx.fx.utils.JavaFXUtils;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
import javafx.scene.layout.Pane;
import jfxtras.labs.map.MapPane;
import jfxtras.labs.map.render.MapMarkable;
@@ -63,20 +61,14 @@ public class MapPaneWrapper extends Pane {
}
private void setSizeListener() {
- this.widthProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue observable, Object oldValue, Object newValue) {
- Double width = (Double) newValue;
- mapPane.setMapWidth(width);
- }
+ this.widthProperty().addListener((observable, oldValue, newValue) -> {
+ Double width = (Double) newValue;
+ mapPane.setMapWidth(width);
});
- this.heightProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue observable, Object oldValue, Object newValue) {
- Double height = (Double) newValue;
- mapPane.setMapHeight(height);
- }
+ this.heightProperty().addListener((observable, oldValue, newValue) -> {
+ Double height = (Double) newValue;
+ mapPane.setMapHeight(height);
});
}
}
diff --git a/src/de/geofroggerfx/gpx/GroundspeakGPXReader.java b/src/de/geofroggerfx/gpx/GroundspeakGPXReader.java
index 4ad6983..9350b3d 100644
--- a/src/de/geofroggerfx/gpx/GroundspeakGPXReader.java
+++ b/src/de/geofroggerfx/gpx/GroundspeakGPXReader.java
@@ -36,20 +36,13 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Files;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
/**
- * TODO: describe the class
- *
* @author Andreas Billmann
*/
public class GroundspeakGPXReader implements GPXReader {
@@ -95,6 +88,9 @@ public class GroundspeakGPXReader implements GPXReader {
public static final String DEFAULT_NAMESPACE_URL = "http://www.topografix.com/GPX/1/0";
public static final String GROUNDSPEAK_NAMESPACE_URL = "http://www.groundspeak.com/cache/1/0/1";
+ // 2011-12-03T10:15:30+01:00
+ private final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
private final List listeners = new ArrayList<>();
private final Map userCache = new HashMap<>();
@@ -204,14 +200,14 @@ public class GroundspeakGPXReader implements GPXReader {
final Element cacheElement = waypointElement.getChild(CACHE, groundspeakNamespace);
setId(cacheElement, mainWaypoint);
parseCacheElement(cacheElement, cache);
- } catch (DataConversionException | MalformedURLException e) {
+ } catch (DataConversionException | ParseException e) {
// TODO: do some batch error handling
e.printStackTrace();
}
return cache;
}
- private void parseCacheElement(Element cacheElement, Cache cache) throws DataConversionException {
+ private void parseCacheElement(Element cacheElement, Cache cache) throws DataConversionException, ParseException {
setId(cacheElement, cache);
setAvailable(cacheElement, cache);
setArchived(cacheElement, cache);
@@ -259,7 +255,7 @@ public class GroundspeakGPXReader implements GPXReader {
travelBug.setId(travelBugElement.getAttribute(ID).getLongValue());
}
- private void setLogs(Element cacheElement, Cache cache) throws DataConversionException {
+ private void setLogs(Element cacheElement, Cache cache) throws DataConversionException, ParseException {
final Element logsElement = cacheElement.getChild(LOGS, groundspeakNamespace);
if (logsElement != null) {
final List logs = new ArrayList<>();
@@ -305,9 +301,9 @@ public class GroundspeakGPXReader implements GPXReader {
log.setId(logElement.getAttribute(ID).getLongValue());
}
- private void setDate(Element logElement, Log log) {
+ private void setDate(Element logElement, Log log) throws ParseException {
final String dateText = logElement.getChild(DATE, groundspeakNamespace).getTextTrim();
- final LocalDateTime date = LocalDateTime.parse(dateText, DateTimeFormatter.ISO_DATE_TIME);
+ final Date date = DATE_FORMAT.parse(dateText);
log.setDate(date);
}
@@ -349,27 +345,19 @@ public class GroundspeakGPXReader implements GPXReader {
final List attributes = new ArrayList<>();
cache.setAttributes(attributes);
for (Element attributeElement : attributesElement.getChildren()) {
- final Attribute attribute = new Attribute();
- attributes.add(attribute);
- setId(attributeElement, attribute);
- setInc(attributeElement, attribute);
- setText(attributeElement, attribute);
+ try {
+ final Attribute attribute = Attribute.groundspeakAttributeToAttribute(
+ attributeElement.getAttribute(ID).getLongValue(),
+ attributeElement.getAttribute(INC).getBooleanValue(),
+ attributeElement.getTextTrim());
+ attributes.add(attribute);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
}
}
- private void setText(Element attributeElement, Attribute attribute) {
- attribute.setText(attributeElement.getTextTrim());
- }
-
- private void setInc(Element attributeElement, Attribute attribute) throws DataConversionException {
- attribute.setInc(attributeElement.getAttribute(INC).getBooleanValue());
- }
-
- private void setId(Element attributeElement, Attribute attribute) throws DataConversionException {
- attribute.setId(attributeElement.getAttribute(ID).getLongValue());
- }
-
private void setContainer(Element cacheElement, Cache cache) {
cache.setContainer(cacheElement.getChild(CONTAINER, groundspeakNamespace).getTextTrim());
}
@@ -424,12 +412,12 @@ public class GroundspeakGPXReader implements GPXReader {
waypoint.setSymbol(cacheElement.getChild(SYM, defaultNamespace).getTextTrim());
}
- private void setUrlName(Element cacheElement, Waypoint waypoint) throws MalformedURLException {
+ private void setUrlName(Element cacheElement, Waypoint waypoint) {
waypoint.setUrlName(cacheElement.getChild(URLNAME, defaultNamespace).getTextTrim());
}
- private void setUrl(Element cacheElement, Waypoint waypoint) throws MalformedURLException {
- waypoint.setUrl(new URL(cacheElement.getChild(URL, defaultNamespace).getTextTrim()));
+ private void setUrl(Element cacheElement, Waypoint waypoint) {
+ waypoint.setUrl(cacheElement.getChild(URL, defaultNamespace).getTextTrim());
}
private void setDescription(Element cacheElement, Waypoint waypoint) {
@@ -445,9 +433,9 @@ public class GroundspeakGPXReader implements GPXReader {
waypoint.setLongitude(cacheElement.getAttribute(LON).getDoubleValue());
}
- private void setTime(Element cacheElement, Waypoint waypoint) {
+ private void setTime(Element cacheElement, Waypoint waypoint) throws ParseException {
final String timeText = cacheElement.getChild(TIME, defaultNamespace).getTextTrim();
- final LocalDateTime date = LocalDateTime.parse(timeText, DateTimeFormatter.ISO_DATE_TIME);
+ final Date date = DATE_FORMAT.parse(timeText);
waypoint.setTime(date);
}
diff --git a/src/de/geofroggerfx/model/Attribute.java b/src/de/geofroggerfx/model/Attribute.java
index 54f606f..8e3d022 100644
--- a/src/de/geofroggerfx/model/Attribute.java
+++ b/src/de/geofroggerfx/model/Attribute.java
@@ -25,41 +25,319 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.Id;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author Andreas Billmann
*/
-@Entity
-public class Attribute {
+public enum Attribute {
- @Id
- private Long id;
- private boolean inc;
- private String text;
+ // id:1 text:Dogs
+ DOGS_TRUE(1),
+ DOGS_FALSE(-1),
- public Long getId() {
- return id;
- }
+ // id:2 text:Access or parking fee
+ ACCESS_OR_PARKING_FEE_TRUE(2),
+ ACCESS_OR_PARKING_FEE_FALSE(-2),
- public void setId(Long id) {
+ // id:3 text:Climbing gear
+ CLIMBING_GEAR_TRUE(3),
+ CLIMBING_GEAR_FALSE(-3),
+
+ // id:4 text:Boat
+ BOAT_TRUE(4),
+ BOAT_FALSE(-4),
+
+ // id:5 text:Scuba gear
+ SCUBA_GEAR_TRUE(5),
+ SCUBA_GEAR_FALSE(-5),
+
+ // id:6 text:Recommended for kids
+ RECOMMENDED_FOR_KIDS_TRUE(6),
+ RECOMMENDED_FOR_KIDS_FALSE(-6),
+
+ // id:7 text:Takes less than an hour
+ TAKES_LESS_THAN_AN_HOUR_TRUE(7),
+ TAKES_LESS_THAN_AN_HOUR_FALSE(-7),
+
+ // id:8 text:Scenic view
+ SCENIC_VIEW_TRUE(8),
+ SCENIC_VIEW_FALSE(-8),
+
+ // id:9 text:Significant Hike
+ SIGNIFICANT_HIKE_TRUE(9),
+ SIGNIFICANT_HIKE_FALSE(-9),
+
+ // id:10 text:Difficult climbing
+ DIFFICULT_CLIMBING_TRUE(10),
+ DIFFICULT_CLIMBING_FALSE(-10),
+
+ // id:11 text:May require wading
+ MAY_REQUIRE_WADING_TRUE(11),
+ MAY_REQUIRE_WADING_FALSE(-11),
+
+ // id:12 text:May require swimming
+ MAY_REQUIRE_SWIMMING_TRUE(12),
+ MAY_REQUIRE_SWIMMING_FALSE(-12),
+
+ // id:13 text:Available at all times
+ AVAILABLE_AT_ALL_TIMES_TRUE(13),
+ AVAILABLE_AT_ALL_TIMES_FALSE(-13),
+
+ // id:14 text:Recommended at night
+ RECOMMENDED_AT_NIGHT_TRUE(14),
+ RECOMMENDED_AT_NIGHT_FALSE(-14),
+
+ // id:15 text:Available during winter
+ AVAILABLE_DURING_WINTER_TRUE(15),
+ AVAILABLE_DURING_WINTER_FALSE(-15),
+
+ // id:17 text:Poison plants
+ POISON_PLANTS_TRUE(17),
+ POISON_PLANTS_FALSE(-17),
+
+ // id:18 text:Dangerous Animals
+ DANGEROUS_ANIMALS_TRUE(18),
+ DANGEROUS_ANIMALS_FALSE(-18),
+
+ // id:19 text:Ticks
+ TICKS_TRUE(19),
+ TICKS_FALSE(-19),
+
+ // id:20 text:Abandoned mines
+ ABANDONED_MINES_TRUE(20),
+ ABANDONED_MINES_FALSE(-20),
+
+ // id:21 text:Cliff / falling rocks
+ CLIFF_FALLING_ROCKS_TRUE(21),
+ CLIFF_FALLING_ROCKS_FALSE(-21),
+
+ // id:22 text:Hunting
+ HUNTING_TRUE(22),
+ HUNTING_FALSE(-22),
+
+ // id:23 text:Dangerous area
+ DANGEROUS_AREA_TRUE(23),
+ DANGEROUS_AREA_FALSE(-23),
+
+ // id:24 text:Wheelchair accessible
+ WHEELCHAIR_ACCESSIBLE_TRUE(24),
+ WHEELCHAIR_ACCESSIBLE_FALSE(-24),
+
+ // id:25 text:Parking available
+ PARKING_AVAILABLE_TRUE(25),
+ PARKING_AVAILABLE_FALSE(-25),
+
+ // id:26 text:Public transportation
+ PUBLIC_TRANSPORTATION_TRUE(26),
+ PUBLIC_TRANSPORTATION_FALSE(-26),
+
+ // id:27 text:Drinking water nearby
+ DRINKING_WATER_NEARBY_TRUE(27),
+ DRINKING_WATER_NEARBY_FALSE(-27),
+
+ // id:28 text:Public restrooms nearby
+ PUBLIC_RESTROOMS_NEARBY_TRUE(28),
+ PUBLIC_RESTROOMS_NEARBY_FALSE(-28),
+
+ // id:29 text:Telephone nearby
+ TELEPHONE_NEARBY_TRUE(29),
+ TELEPHONE_NEARBY_FALSE(-29),
+
+ // id:30 text:Picnic tables nearby
+ PICNIC_TABLES_NEARBY_TRUE(30),
+ PICNIC_TABLES_NEARBY_FALSE(-30),
+
+ // id:31 text:Camping available
+ CAMPING_AVAILABLE_TRUE(31),
+ CAMPING_AVAILABLE_FALSE(-31),
+
+ // id:32 text:Bicycles
+ BICYCLES_TRUE(32),
+ BICYCLES_FALSE(-32),
+
+ // id:33 text:Motorcycles
+ MOTORCYCLES_TRUE(33),
+ MOTORCYCLES_FALSE(-33),
+
+ // id:34 text:Quads
+ QUADS_TRUE(34),
+ QUADS_FALSE(-34),
+
+ // id:35 text:Off-road vehicles
+ OFF_ROAD_VEHICLES_TRUE(35),
+ OFF_ROAD_VEHICLES_FALSE(-35),
+
+ // id:36 text:Snowmobiles
+ SNOWMOBILES_TRUE(36),
+ SNOWMOBILES_FALSE(-36),
+
+ // id:37 text:Horses
+ HORSES_TRUE(37),
+ HORSES_FALSE(-37),
+
+ // id:38 text:Campfires
+ CAMPFIRES_TRUE(38),
+ CAMPFIRES_FALSE(-38),
+
+ // id:39 text:Thorns
+ THORNS_TRUE(39),
+ THORNS_FALSE(-39),
+
+ // id:40 text:Stealth required
+ STEALTH_REQUIRED_TRUE(40),
+ STEALTH_REQUIRED_FALSE(-40),
+
+ // id:41 text:Stroller accessible
+ STROLLER_ACCESSIBLE_TRUE(41),
+ STROLLER_ACCESSIBLE_FALSE(-41),
+
+ // id:43 text:Watch for livestock
+ WATCH_FOR_LIVESTOCK_TRUE(43),
+ WATCH_FOR_LIVESTOCK_FALSE(-43),
+
+ // id:42 text:Needs maintenance
+ NEEDS_MAINTENANCE_TRUE(42),
+ NEEDS_MAINTENANCE_FALSE(-42),
+
+ // id:44 text:Flashlight required
+ FLASHLIGHT_REQUIRED_TRUE(44),
+ FLASHLIGHT_REQUIRED_FALSE(-44),
+
+ // id:45 text:Lost and Found Tour
+ LOST_AND_FOUND_TOUR_TRUE(45),
+ LOST_AND_FOUND_TOUR_FALSE(-45),
+
+ // id:46 text:Truck Driver/RV
+ TRUCK_DRIVER_RV_TRUE(46),
+ TRUCK_DRIVER_RV_FALSE(-46),
+
+ // id:47 text:Field Puzzle
+ FIELD_PUZZLE_TRUE(47),
+ FIELD_PUZZLE_FALSE(-47),
+
+ // id:48 text:UV Light Required
+ UV_LIGHT_REQUIRED_TRUE(48),
+ UV_LIGHT_REQUIRED_FALSE(-48),
+
+ // id:49 text:Snowshoes
+ SNOWSHOES_TRUE(49),
+ SNOWSHOES_FALSE(-49),
+
+ // id:50 text:Cross Country Skis
+ CROSS_COUNTRY_SKIS_TRUE(50),
+ CROSS_COUNTRY_SKIS_FALSE(-50),
+
+ // id:51 text:Special Tool Required
+ SPECIAL_TOOL_REQUIRED_TRUE(51),
+ SPECIAL_TOOL_REQUIRED_FALSE(-51),
+
+ // id:52 text:Night Cache
+ NIGHT_CACHE_TRUE(52),
+ NIGHT_CACHE_FALSE(-52),
+
+ // id:53 text:Park and Grab
+ PARK_AND_GRAB_TRUE(53),
+ PARK_AND_GRAB_FALSE(-53),
+
+ // id:54 text:Abandoned Structure
+ ABANDONED_STRUCTURE_TRUE(54),
+ ABANDONED_STRUCTURE_FALSE(-54),
+
+ // id:55 text:Short hike (less than 1km)
+ SHORT_HIKE_LESS_THAN_1KM_TRUE(55),
+ SHORT_HIKE_LESS_THAN_1KM_FALSE(-55),
+
+ // id:56 text:Medium hike (1km-10km)
+ MEDIUM_HIKE_1KM_10KM_TRUE(56),
+ MEDIUM_HIKE_1KM_10KM_FALSE(-56),
+
+ // id:57 text:Long Hike (+10km)
+ LONG_HIKE_10KM_TRUE(57),
+ LONG_HIKE_10KM_FALSE(-57),
+
+ // id:58 text:Fuel Nearby
+ FUEL_NEARBY_TRUE(58),
+ FUEL_NEARBY_FALSE(-58),
+
+ // id:59 text:Food Nearby
+ FOOD_NEARBY_TRUE(59),
+ FOOD_NEARBY_FALSE(-59),
+
+ // id:60 text:Wireless Beacon
+ WIRELESS_BEACON_TRUE(60),
+ WIRELESS_BEACON_FALSE(-60),
+
+ // id:61 text:Partnership cache
+ PARTNERSHIP_CACHE_TRUE(61),
+ PARTNERSHIP_CACHE_FALSE(-61),
+
+ // id:62 text:Seasonal Access
+ SEASONAL_ACCESS_TRUE(62),
+ SEASONAL_ACCESS_FALSE(-62),
+
+ // id:63 text:Tourist Friendly
+ TOURIST_FRIENDLY_TRUE(63),
+ TOURIST_FRIENDLY_FALSE(-63),
+
+ // id:64 text:Tree Climbing
+ TREE_CLIMBING_TRUE(64),
+ TREE_CLIMBING_FALSE(-64),
+
+ // id:65 text:Front Yard (Private Residence)
+ FRONT_YARD_PRIVATE_RESIDENCE_TRUE(65),
+ FRONT_YARD_PRIVATE_RESIDENCE_FALSE(-65),
+
+ // id:66 text:Teamwork Required
+ TEAMWORK_REQUIRED_TRUE(66),
+ TEAMWORK_REQUIRED_FALSE(-66),
+
+ // id:67 text:geotour
+ GEOTOUR_TRUE(67),
+ GEOTOUR_FALSE(-67);
+
+
+
+
+ private final static List attributes = new ArrayList<>();
+
+ private int id;
+
+ private Attribute(int id) {
this.id = id;
}
- public boolean isInc() {
- return inc;
+ public int getId() {
+ return id;
}
- public void setInc(boolean inc) {
- this.inc = inc;
+ public void setId(int id) {
+ this.id = id;
}
- public String getText() {
- return text;
- }
+ public static Attribute groundspeakAttributeToAttribute(Long id, boolean inc, String text) {
- public void setText(String text) {
- this.text = text;
+ int idToCompare = id.intValue();
+
+ if (!inc) {
+ idToCompare = -idToCompare;
+ }
+
+ for (Attribute t: Attribute.values()) {
+ if (t.getId() == idToCompare) {
+ return t;
+ }
+ }
+
+ if (!attributes.contains(id)) {
+ attributes.add(id);
+ System.out.println();
+ System.out.println("// id:"+id+" text:"+text);
+ System.out.println(text.toUpperCase().replace(' ','_') + "_TRUE" + "(" + id + "),");
+ System.out.println(text.toUpperCase().replace(' ','_') + "_FALSE" + "(-" + id + "),");
+ }
+
+ throw new IllegalArgumentException("unknown attribute id:"+id+" inc:"+inc+" text:"+text);
}
}
diff --git a/src/de/geofroggerfx/model/Cache.java b/src/de/geofroggerfx/model/Cache.java
index 29020d9..609c33a 100644
--- a/src/de/geofroggerfx/model/Cache.java
+++ b/src/de/geofroggerfx/model/Cache.java
@@ -25,22 +25,22 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.*;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
import java.util.List;
/**
* @author Andreas Billmann
*/
-@Entity
public class Cache {
- @Id
private Long id;
private boolean available;
private boolean archived;
private boolean found;
private String name;
private String placedBy;
+ @OneToOne(orphanRemoval = true)
private User owner;
private Type type;
private String container;
@@ -54,11 +54,13 @@ public class Cache {
private String longDescription;
private boolean longDescriptionHtml;
private String encodedHints;
+ @OneToMany(orphanRemoval = true)
private List logs;
+ @OneToMany(orphanRemoval = true)
private List travelBugs;
+ @OneToOne(orphanRemoval = true)
private Waypoint mainWayPoint;
- @OneToOne(fetch=FetchType.LAZY)
public Waypoint getMainWayPoint() {
return mainWayPoint;
}
@@ -107,7 +109,6 @@ public class Cache {
this.placedBy = placedBy;
}
- @OneToOne(fetch=FetchType.LAZY)
public User getOwner() {
return owner;
}
@@ -116,7 +117,6 @@ public class Cache {
this.owner = owner;
}
- @Enumerated(EnumType.STRING)
public Type getType() {
return type;
}
@@ -133,7 +133,6 @@ public class Cache {
this.container = container;
}
- @ManyToMany(fetch=FetchType.LAZY)
public List getAttributes() {
return attributes;
}
@@ -214,7 +213,6 @@ public class Cache {
this.encodedHints = encodedHints;
}
- @OneToMany(fetch=FetchType.LAZY)
public List getLogs() {
return logs;
}
@@ -223,7 +221,6 @@ public class Cache {
this.logs = logs;
}
- @OneToMany(fetch=FetchType.LAZY)
public List getTravelBugs() {
return travelBugs;
}
diff --git a/src/de/geofroggerfx/model/CacheList.java b/src/de/geofroggerfx/model/CacheList.java
index ab6e754..42d6725 100644
--- a/src/de/geofroggerfx/model/CacheList.java
+++ b/src/de/geofroggerfx/model/CacheList.java
@@ -25,19 +25,13 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
import java.util.List;
/**
* @author Andreas Billmann
*/
-@Entity
public class CacheList {
- @Id
private String name;
private List caches;
@@ -50,7 +44,6 @@ public class CacheList {
this.name = name;
}
- @OneToMany(fetch= FetchType.LAZY)
public List getCaches() {
return caches;
}
diff --git a/src/de/geofroggerfx/model/Log.java b/src/de/geofroggerfx/model/Log.java
index aed96d0..c369890 100644
--- a/src/de/geofroggerfx/model/Log.java
+++ b/src/de/geofroggerfx/model/Log.java
@@ -25,19 +25,19 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.*;
+import javax.persistence.OneToOne;
import java.time.LocalDateTime;
+import java.util.Date;
/**
* @author Andreas Billmann
*/
-@Entity
public class Log {
- @Id
private Long id;
- private LocalDateTime date;
+ private Date date;
private String type;
+ @OneToOne(orphanRemoval = true)
private User finder;
private boolean textEncoded;
private String text;
@@ -50,11 +50,11 @@ public class Log {
this.id = id;
}
- public LocalDateTime getDate() {
+ public Date getDate() {
return date;
}
- public void setDate(LocalDateTime date) {
+ public void setDate(Date date) {
this.date = date;
}
@@ -66,7 +66,6 @@ public class Log {
this.type = type;
}
- @OneToOne(cascade = CascadeType.PERSIST)
public User getFinder() {
return finder;
}
diff --git a/src/de/geofroggerfx/model/Settings.java b/src/de/geofroggerfx/model/Settings.java
index 172c2c9..e06998b 100644
--- a/src/de/geofroggerfx/model/Settings.java
+++ b/src/de/geofroggerfx/model/Settings.java
@@ -1,17 +1,12 @@
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
/**
* This class represents the application settings, like current user, etc.
*
* @author abi
*/
-@Entity
public class Settings {
- @Id
private Long id;
private Long currentUserID = new Long(3906456);
diff --git a/src/de/geofroggerfx/model/TravelBug.java b/src/de/geofroggerfx/model/TravelBug.java
index c144186..8ccaa26 100644
--- a/src/de/geofroggerfx/model/TravelBug.java
+++ b/src/de/geofroggerfx/model/TravelBug.java
@@ -25,16 +25,11 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
/**
* @author Andreas Billmann
*/
-@Entity
public class TravelBug {
- @Id
private Long id;
private String ref;
private String name;
diff --git a/src/de/geofroggerfx/model/User.java b/src/de/geofroggerfx/model/User.java
index 60596fd..5536f51 100644
--- a/src/de/geofroggerfx/model/User.java
+++ b/src/de/geofroggerfx/model/User.java
@@ -25,16 +25,11 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
/**
* @author Andreas Billmann
*/
-@Entity
public class User {
- @Id
private Long id;
private String name;
diff --git a/src/de/geofroggerfx/model/Waypoint.java b/src/de/geofroggerfx/model/Waypoint.java
index 28a0df4..067189a 100644
--- a/src/de/geofroggerfx/model/Waypoint.java
+++ b/src/de/geofroggerfx/model/Waypoint.java
@@ -25,25 +25,22 @@
*/
package de.geofroggerfx.model;
-import javax.persistence.Entity;
-import javax.persistence.Id;
import java.net.URL;
import java.time.LocalDateTime;
+import java.util.Date;
/**
* @author Andreas Billmann
*/
-@Entity
public class Waypoint {
- @Id
private Long id;
private double latitude;
private double longitude;
private String name;
- private LocalDateTime time;
+ private Date time;
private String description;
- private URL url;
+ private String url;
private String urlName;
private String symbol;
private String type;
@@ -72,11 +69,11 @@ public class Waypoint {
this.longitude = longitude;
}
- public void setTime(LocalDateTime time) {
+ public void setTime(Date time) {
this.time = time;
}
- public LocalDateTime getTime() {
+ public Date getTime() {
return time;
}
@@ -96,11 +93,11 @@ public class Waypoint {
this.description = description;
}
- public URL getUrl() {
+ public String getUrl() {
return url;
}
- public void setUrl(URL url) {
+ public void setUrl(String url) {
this.url = url;
}
diff --git a/src/de/geofroggerfx/service/CacheService.java b/src/de/geofroggerfx/service/CacheService.java
index 3177d45..037b5a8 100644
--- a/src/de/geofroggerfx/service/CacheService.java
+++ b/src/de/geofroggerfx/service/CacheService.java
@@ -43,6 +43,13 @@ public interface CacheService {
*/
void storeCaches(List caches);
+ /**
+ * find a single cache by id
+ * @param id id of the cache
+ * @return single cache
+ */
+ Cache findCacheById(Long id);
+
/**
* Receive all caches from the database
* @param sortField sort the list based on the field
diff --git a/src/de/geofroggerfx/service/CacheServiceImpl.java b/src/de/geofroggerfx/service/CacheServiceImpl.java
index a94c433..40fd349 100644
--- a/src/de/geofroggerfx/service/CacheServiceImpl.java
+++ b/src/de/geofroggerfx/service/CacheServiceImpl.java
@@ -1,17 +1,39 @@
/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+ * Copyright (c) 2013, Andreas Billmann
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
package de.geofroggerfx.service;
+import com.orientechnologies.orient.core.intent.OIntentMassiveInsert;
+import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
+import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import de.geofroggerfx.application.ProgressEvent;
import de.geofroggerfx.application.ProgressListener;
import de.geofroggerfx.model.*;
import de.geofroggerfx.sql.DatabaseService;
import javax.inject.Inject;
-import javax.persistence.EntityManager;
import java.util.ArrayList;
import java.util.List;
@@ -20,8 +42,6 @@ import java.util.List;
*/
public class CacheServiceImpl implements CacheService {
- private static final int TRANSACTION_SIZE = 100;
-
@Inject
private DatabaseService dbService;
private final List listeners = new ArrayList<>();
@@ -35,72 +55,79 @@ public class CacheServiceImpl implements CacheService {
@Override
public void storeCaches(List caches) {
- EntityManager em = dbService.getEntityManager();
+ OObjectDatabaseTx database = dbService.getDatabase();
try {
- int transactionNumber = 0;
+ long start = System.currentTimeMillis();
+ for (Cache cache : caches) {
+ Cache existingCache = findCacheById(cache.getId());
+ if (existingCache != null) {
+ database.delete(existingCache);
+ }
+ }
+
+ long deletes = System.currentTimeMillis();
+
int currentCacheNumber = 0;
int numberOfCaches = caches.size();
+ database.declareIntent( new OIntentMassiveInsert() );
for (Cache cache : caches) {
- currentCacheNumber++;
- fireEvent(new ProgressEvent("Database",
- ProgressEvent.State.RUNNING,
- "Save caches to Database " + currentCacheNumber + " / " + numberOfCaches,
- (double) currentCacheNumber / (double) numberOfCaches));
-
- // begin transaction if the transaction counter is set to zero
- if (transactionNumber == 0) { em.getTransaction().begin(); }
- transactionNumber++;
-
- em.merge(cache.getOwner());
- em.merge(cache.getMainWayPoint());
-
- for (Log log: cache.getLogs()) {
- em.merge(log);
- em.merge(log.getFinder());
- }
-
- for (Attribute attribute: cache.getAttributes()) {
- em.merge(attribute);
- }
-
- for (TravelBug bug: cache.getTravelBugs()) {
- em.merge(bug);
- }
-
- em.merge(cache);
-
- // comit every X caches
- if (transactionNumber == TRANSACTION_SIZE) {
- em.getTransaction().commit();
- transactionNumber = 0;
- }
+ currentCacheNumber++;
+ fireEvent(new ProgressEvent("Database",
+ ProgressEvent.State.RUNNING,
+ "Save caches to Database " + currentCacheNumber + " / " + numberOfCaches,
+ (double) currentCacheNumber / (double) numberOfCaches));
+ database.save(cache);
}
- // if there wasn?t a commit right before, commit the rest
- if (transactionNumber != 0) {
- em.getTransaction().commit();
- }
+
+ long saves = System.currentTimeMillis();
+
+ System.out.println("Time to delete: "+(deletes-start));
+ System.out.println("Time to save: "+(saves-deletes));
+ System.out.println("Time total: "+(saves-start));
+
} catch (Exception e) {
e.printStackTrace();
- em.getTransaction().rollback();
+ } finally {
+ database.declareIntent( null );
}
+ System.out.println("cache count: " + database.countClass(Cache.class));
+ System.out.println("Log count: "+ database.countClass(Log.class));
+ System.out.println("Waypoint count: "+ database.countClass(Waypoint.class));
+
fireEvent(new ProgressEvent("Database",
ProgressEvent.State.FINISHED,
"Caches are saved to Database"));
}
@Override
- @SuppressWarnings("unchecked")
+ public Cache findCacheById(Long id) {
+ Cache foundCache = null;
+
+ try {
+ OObjectDatabaseTx database = dbService.getDatabase();
+ String query = "select * from Cache where id="+id;
+ List result = database.query(new OSQLSynchQuery(query));
+ if (result != null && result.size() > 0) {
+ foundCache = result.get(0);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return foundCache;
+ }
+
+
+ @Override
public List getAllCaches(CacheSortField sortField, SortDirection direction) {
List caches = new ArrayList<>();
-
try {
- EntityManager em = dbService.getEntityManager();
- String query = "select c from Cache c order by c."+sortField.getFieldName()+" "+direction.toString();
- List result = em.createQuery(query).getResultList();
+ OObjectDatabaseTx database = dbService.getDatabase();
+ String query = "select * from Cache order by "+sortField.getFieldName()+" "+direction.toString();
+ List result = database.query(new OSQLSynchQuery(query));
if (result != null) {
caches = result;
}
@@ -122,9 +149,9 @@ public class CacheServiceImpl implements CacheService {
public List getAllCacheLists() {
List lists = new ArrayList<>();
try {
- EntityManager em = dbService.getEntityManager();
- String query = "select l from CacheList l order by l.name";
- List result = em.createQuery(query).getResultList();
+ OObjectDatabaseTx database = dbService.getDatabase();
+ String query = "select * from CacheList order by name";
+ List result = database.query(new OSQLSynchQuery(query));
if (result != null) {
lists = result;
}
@@ -139,10 +166,12 @@ public class CacheServiceImpl implements CacheService {
public boolean doesCacheListNameExist(String name) {
boolean doesExist = false;
try {
- EntityManager em = dbService.getEntityManager();
- String query = "select count(l) from CacheList l where l.name = :name";
- Long result = (Long)em.createQuery(query).setParameter("name", name).getSingleResult();
- doesExist = result > 0;
+ OObjectDatabaseTx database = dbService.getDatabase();
+ String query = "select * from CacheList l where l.name = :name";
+ List result = database.query(new OSQLSynchQuery(query));
+ if (result != null) {
+ doesExist = result.size() > 0;
+ }
} catch (Exception e) {
e.printStackTrace();
}
@@ -151,30 +180,21 @@ public class CacheServiceImpl implements CacheService {
@Override
public void deleteCacheList(CacheList cacheList) {
- EntityManager em = dbService.getEntityManager();
+ OObjectDatabaseTx database = dbService.getDatabase();
try {
- em.getTransaction().begin();
- em.remove(cacheList);
- em.getTransaction().commit();
+ database.delete(cacheList);
} catch (Exception e) {
e.printStackTrace();
- em.getTransaction().rollback();
}
}
- /**
- * {@inheritDoc}
- */
@Override
public void storeCacheList(CacheList list) {
- EntityManager em = dbService.getEntityManager();
+ OObjectDatabaseTx database = dbService.getDatabase();
try {
- em.getTransaction().begin();
- em.merge(list);
- em.getTransaction().commit();
+ database.save(list);
} catch (Exception e) {
e.printStackTrace();
- em.getTransaction().rollback();
}
}
}
diff --git a/src/de/geofroggerfx/sql/DatabaseService.java b/src/de/geofroggerfx/sql/DatabaseService.java
index 0c4eb0f..d62de3c 100644
--- a/src/de/geofroggerfx/sql/DatabaseService.java
+++ b/src/de/geofroggerfx/sql/DatabaseService.java
@@ -25,11 +25,13 @@
*/
package de.geofroggerfx.sql;
-import javax.persistence.EntityManager;
+
+import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
/**
* @author Andreas
*/
public interface DatabaseService {
- EntityManager getEntityManager();
+ OObjectDatabaseTx getDatabase();
+ void close();
}
diff --git a/src/de/geofroggerfx/sql/DatabaseServiceImpl.java b/src/de/geofroggerfx/sql/DatabaseServiceImpl.java
index 7b08019..f7d1697 100644
--- a/src/de/geofroggerfx/sql/DatabaseServiceImpl.java
+++ b/src/de/geofroggerfx/sql/DatabaseServiceImpl.java
@@ -25,9 +25,9 @@
*/
package de.geofroggerfx.sql;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
+import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
+import com.orientechnologies.orient.core.db.record.ODatabaseRecord;
+import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
/**
* @author Andreas
@@ -35,18 +35,34 @@ import javax.persistence.Persistence;
public class DatabaseServiceImpl implements DatabaseService {
private static final String PERSISTENCE_UNIT_NAME = "geocaches";
- private EntityManagerFactory factory;
- private EntityManager em;
+ private OObjectDatabaseTx db ;
public DatabaseServiceImpl() {
- factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
- em = factory.createEntityManager();
+ db = new OObjectDatabaseTx("plocal:./"+PERSISTENCE_UNIT_NAME);
+ if (!db.exists()) {
+ db.create();
+ } else {
+ db.open("admin", "admin");
+ }
+
+
+ db.getEntityManager().registerEntityClasses("de.geofroggerfx.model");
+ }
+
+
+ @Override
+ public OObjectDatabaseTx getDatabase() {
+ assert (db != null) : "no database available";
+ ODatabaseRecordThreadLocal.INSTANCE.set(db.getUnderlying().getUnderlying());
+ return db;
}
@Override
- public EntityManager getEntityManager() {
- assert (em != null) : "no entity manager available";
- return em;
+ public void close() {
+ assert (db != null) : "no database available";
+ if (!db.isClosed()) {
+ db.close();
+ }
}
}