diff --git a/src/main/java/de/geofroggerfx/dao/jdbc/JdbcCacheDAO.java b/src/main/java/de/geofroggerfx/dao/jdbc/JdbcCacheDAO.java index a7f5798..53c8218 100644 --- a/src/main/java/de/geofroggerfx/dao/jdbc/JdbcCacheDAO.java +++ b/src/main/java/de/geofroggerfx/dao/jdbc/JdbcCacheDAO.java @@ -26,10 +26,7 @@ package de.geofroggerfx.dao.jdbc; import de.geofroggerfx.dao.CacheDAO; -import de.geofroggerfx.model.Attribute; -import de.geofroggerfx.model.Cache; -import de.geofroggerfx.model.CacheListEntry; -import de.geofroggerfx.model.Waypoint; +import de.geofroggerfx.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -57,6 +54,7 @@ public class JdbcCacheDAO implements CacheDAO { private static final String CACHE_TABLE = "cache"; private static final String WAYPOINT_TABLE = "waypoint"; private static final String ATTRIBUTE_TABLE = "attribute"; + private static final String LOG_TABLE = "log"; private String[] columnListCache = new String[] { "id", @@ -94,6 +92,15 @@ public class JdbcCacheDAO implements CacheDAO { "id", "cache_id"}; + private String[] columnListLog = new String[] { + "id", + "cache_id", + "date", + "user_id", + "type", + "text"}; + + private JdbcTemplate jdbcTemplate; @Autowired @@ -107,6 +114,7 @@ public class JdbcCacheDAO implements CacheDAO { batchInsertCaches(listOfCaches); batchInsertAttributes(listOfCaches); batchInsertWaypoints(listOfCaches); + batchInsertLogs(listOfCaches); } @Override @@ -144,6 +152,8 @@ public class JdbcCacheDAO implements CacheDAO { waypoint.setCache(cache); List attributes = getAttributesForCacheId(cache.getId()); cache.getAttributes().setAll(attributes); + List logs = getLogsForCacheId(cache.getId()); + cache.getLogs().setAll(logs); return cache; }); } @@ -253,6 +263,33 @@ public class JdbcCacheDAO implements CacheDAO { LOGGER.info("try to save "+batch.size()+" attributes -> done in "+(endInsert-startInsert)+" ms"); } + private void batchInsertLogs(List listOfCaches) { + long startInsert = System.currentTimeMillis(); + + List batch = listOfCaches. + parallelStream(). + flatMap(cache -> cache.getLogs().stream().map(log -> valuesFromLog(cache, log))). + collect(Collectors.toList()); + LOGGER.info("try to save "+batch.size()+" logs"); + + try { + String insertSQL = generateInsertSQL(LOG_TABLE, columnListLog); + int[] updateCounts = jdbcTemplate.batchUpdate( + insertSQL, + batch); + int updatedRows = 0; + for (int count:updateCounts) { + updatedRows += count; + } + LOGGER.info("batch inserted "+updatedRows+" logs"); + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, e.getMessage(), e); + } + + long endInsert = System.currentTimeMillis(); + LOGGER.info("try to save "+batch.size()+" logs -> done in "+(endInsert-startInsert)+" ms"); + } + private Waypoint getWaypointForCacheId(long cacheId) { return this.jdbcTemplate.queryForObject( generateSelectSQL(WAYPOINT_TABLE, columnListWaypoint) + " WHERE cache_id=?", @@ -273,6 +310,17 @@ public class JdbcCacheDAO implements CacheDAO { } + private List getLogsForCacheId(long cacheId) { + return this.jdbcTemplate.query( + generateSelectSQL(LOG_TABLE, columnListLog) + " WHERE cache_id=?", + new Object[]{cacheId}, + (rs, rowNum) -> { + return getLogFromResultSet(rs); + }); + + } + + private Cache getCacheFromResultSet(ResultSet rs) throws SQLException { @@ -339,6 +387,15 @@ public class JdbcCacheDAO implements CacheDAO { return attribute; } + private Log getLogFromResultSet(ResultSet rs) throws SQLException { + Log log = new Log(); + log.setId(rs.getLong("id")); + log.setDate(rs.getDate("date")); + log.setText(rs.getString("text")); + log.setType(LogType.groundspeakStringToType(rs.getString("type"))); + return log; + } + private Object[] valuesFromWaypoint(Cache cache) { return new Object[]{ @@ -362,6 +419,16 @@ public class JdbcCacheDAO implements CacheDAO { }; } + private Object[] valuesFromLog(Cache cache, Log log) { + return new Object[]{ + log.getId(), + cache.getId(), + log.getDate(), + null, //log.getFinder().getId(), + log.getType().toGroundspeakString(), + log.getText() + }; + } private Object[] valuesFromCache(Cache cache, long id) { return Arrays.asList(valuesFromCache(cache), id).toArray(); diff --git a/src/main/java/de/geofroggerfx/gpx/GroundspeakGPXReader.java b/src/main/java/de/geofroggerfx/gpx/GroundspeakGPXReader.java index b589449..ffd8e9f 100644 --- a/src/main/java/de/geofroggerfx/gpx/GroundspeakGPXReader.java +++ b/src/main/java/de/geofroggerfx/gpx/GroundspeakGPXReader.java @@ -119,6 +119,7 @@ public class GroundspeakGPXReader implements GPXReader { Waypoint waypoint = null; Cache cache = null; + Log log = null; String currentLevel = null; String startTag; StringBuffer tagContent = new StringBuffer(); @@ -150,6 +151,9 @@ public class GroundspeakGPXReader implements GPXReader { break; case LOG: currentLevel = LOG; + log = new Log(); + log.setId(Long.parseLong(reader.getAttributeValue(0))); + cache.getLogs().add(log); break; case ATTRIBUTE: cache.getAttributes().add( @@ -207,7 +211,9 @@ public class GroundspeakGPXReader implements GPXReader { case TYPE: if (CACHE.equals(currentLevel)) { cache.setType(Type.groundspeakStringToType(tagContent.toString())); - } + } else if (LOG.equals(currentLevel)) { + log.setType(LogType.groundspeakStringToType(tagContent.toString())); + } else break; case PLACED_BY: cache.setPlacedBy(tagContent.toString()); @@ -241,6 +247,13 @@ public class GroundspeakGPXReader implements GPXReader { case ENCODED_HINTS: cache.setEncodedHints(tagContent.toString()); break; + case DATE: + log.setDate(DATE_FORMAT.parse(tagContent.toString())); + break; + case TEXT: + log.setText(tagContent.toString()); + break; + } break; } diff --git a/src/main/java/de/geofroggerfx/model/Cache.java b/src/main/java/de/geofroggerfx/model/Cache.java index a80fcfc..0bd2cb7 100644 --- a/src/main/java/de/geofroggerfx/model/Cache.java +++ b/src/main/java/de/geofroggerfx/model/Cache.java @@ -50,6 +50,7 @@ public class Cache { private BooleanProperty longDescriptionHtml = new SimpleBooleanProperty(); private StringProperty encodedHints = new SimpleStringProperty(); private ObjectProperty mainWayPoint = new SimpleObjectProperty<>(); + private ObjectProperty> logs = new SimpleObjectProperty<>(FXCollections.observableArrayList()); public long getId() { return id.get(); @@ -291,6 +292,18 @@ public class Cache { this.mainWayPoint.set(mainWayPoint); } + public ObservableList getLogs() { + return logs.get(); + } + + public ObjectProperty> logsProperty() { + return logs; + } + + public void setLogs(ObservableList logs) { + this.logs.set(logs); + } + @Override public String toString() { return "Cache{" + diff --git a/src/main/java/de/geofroggerfx/model/Log.java b/src/main/java/de/geofroggerfx/model/Log.java new file mode 100644 index 0000000..da9a7c9 --- /dev/null +++ b/src/main/java/de/geofroggerfx/model/Log.java @@ -0,0 +1,77 @@ +package de.geofroggerfx.model; + +import javafx.beans.property.*; + +import java.util.Date; + +/** + * Created by Andreas on 25.03.2015. + */ +public class Log { + + private LongProperty id = new SimpleLongProperty(); + private ObjectProperty date = new SimpleObjectProperty<>(); + private ObjectProperty type = new SimpleObjectProperty<>(); + private ObjectProperty finder = new SimpleObjectProperty<>(); + private StringProperty text = new SimpleStringProperty(); + + public long getId() { + return id.get(); + } + + public LongProperty idProperty() { + return id; + } + + public void setId(long id) { + this.id.set(id); + } + + public LogType getType() { + return type.get(); + } + + public ObjectProperty typeProperty() { + return type; + } + + public void setType(LogType type) { + this.type.set(type); + } + + public User getFinder() { + return finder.get(); + } + + public ObjectProperty finderProperty() { + return finder; + } + + public void setFinder(User finder) { + this.finder.set(finder); + } + + public String getText() { + return text.get(); + } + + public StringProperty textProperty() { + return text; + } + + public void setText(String text) { + this.text.set(text); + } + + public Date getDate() { + return date.get(); + } + + public ObjectProperty dateProperty() { + return date; + } + + public void setDate(Date date) { + this.date.set(date); + } +} diff --git a/src/main/java/de/geofroggerfx/model/LogType.java b/src/main/java/de/geofroggerfx/model/LogType.java new file mode 100644 index 0000000..9b7d44b --- /dev/null +++ b/src/main/java/de/geofroggerfx/model/LogType.java @@ -0,0 +1,44 @@ +package de.geofroggerfx.model; + +/** + * Created by Andreas on 25.03.2015. + */ +public enum LogType { + FOUND_IT("Found it"), + WRITE_NOTE("Write note"), + ATTENDED("Attended"), + WILL_ATTEND("Will Attend"), + OWNER_MAINTENANCE("Owner Maintenance"), + DIDNT_FIND_IT("Didn't find it"), + ENABLE_LISTING("Enable Listing"), + PUBLISH_LISTING("Publish Listing"), + Needs_Maintenance("Needs Maintenance"), + TEMPORARILY_DISABLE_LISTING("Temporarily Disable Listing"), + POST_REVIEWER_NOTE("Post Reviewer Note"), + ARCHIVE("Archive"), + ANNOUNCEMENT("Announcement"), + NEEDS_ARCHIVED("Needs Archived"), + UPDATE_COORDINATES("Update Coordinates"), + WEBCAM_PHOTO_TAKEN("Webcam Photo Taken"), + UNARCHIVE("Unarchive"), + RETRACT_LISTING("Retract Listing"); + + private String groundspeakString; + + private LogType(String groundspeakString) { + this.groundspeakString = groundspeakString; + } + + public String toGroundspeakString() { + return groundspeakString; + } + + public static LogType groundspeakStringToType(String groundspeakString) { + for (LogType t : LogType.values()) { + if (t.toGroundspeakString().equals(groundspeakString)) { + return t; + } + } + throw new IllegalArgumentException("unknown logtype:" + groundspeakString); + } +} diff --git a/src/main/java/de/geofroggerfx/model/Type.java b/src/main/java/de/geofroggerfx/model/Type.java index 13329bd..7330bee 100644 --- a/src/main/java/de/geofroggerfx/model/Type.java +++ b/src/main/java/de/geofroggerfx/model/Type.java @@ -45,7 +45,6 @@ public enum Type { MEGA_EVENT("Mega-Event Cache"), MYSTERY_CACHE("Mystery Cache"); - private int id; private String groundspeakString; private Type(String groundspeakString) { diff --git a/src/main/resources/de/geofroggerfx/dao/jdbc/updates/3.sql b/src/main/resources/de/geofroggerfx/dao/jdbc/updates/3.sql new file mode 100644 index 0000000..75377d9 --- /dev/null +++ b/src/main/resources/de/geofroggerfx/dao/jdbc/updates/3.sql @@ -0,0 +1,11 @@ +CREATE TABLE log ( + id INT PRIMARY KEY , + cache_id INT, + date DATETIME, + user_id INT, + type VARCHAR(100), + text VARCHAR(2147483647), + FOREIGN KEY(cache_id) REFERENCES cache(id) ON DELETE CASCADE +); + +UPDATE version SET version=3; \ No newline at end of file