From fdde2e8018ff85e78993f21592e6ea8bd11645d3 Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Fri, 4 Jun 2021 11:24:08 +0100 Subject: [PATCH 01/41] refactor(Added new GTFS tables): Added attributions and translations tables with related patch tests --- pom.xml | 3 +- .../datatools/editor/models/transit/Stop.java | 4 +- .../datatools/manager/DataManager.java | 3 +- .../controllers/api/EditorControllerTest.java | 70 +++++++++++++----- .../com/conveyal/datatools/gtfs/bart_old.zip | Bin 456744 -> 456412 bytes src/test/resources/graphql/attributions.txt | 18 +++++ src/test/resources/graphql/translations.txt | 14 ++++ 7 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 src/test/resources/graphql/attributions.txt create mode 100644 src/test/resources/graphql/translations.txt diff --git a/pom.xml b/pom.xml index 0a90ae2d1..2f7267353 100644 --- a/pom.xml +++ b/pom.xml @@ -268,9 +268,10 @@ - AWS S3 SDK - putting/getting objects into/out of S3. --> + com.github.conveyal gtfs-lib - 6.2.2 + fce6e8e744 diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java index ebc7ece23..87cb8a095 100755 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java +++ b/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java @@ -70,7 +70,7 @@ public Stop(com.conveyal.gtfs.model.Stop stop, GeometryFactory geometryFactory, this.parentStation = stop.parent_station; this.pickupType = StopTimePickupDropOffType.SCHEDULED; this.dropOffType = StopTimePickupDropOffType.SCHEDULED; - this.wheelchairBoarding = stop.wheelchair_boarding != null ? AttributeAvailabilityType.fromGtfs(Integer.valueOf(stop.wheelchair_boarding)) : null; + this.wheelchairBoarding = AttributeAvailabilityType.fromGtfs(stop.wheelchair_boarding); this.location = geometryFactory.createPoint(new Coordinate(stop.stop_lon,stop.stop_lat)); @@ -119,7 +119,7 @@ public com.conveyal.gtfs.model.Stop toGtfs() { ret.stop_lon = location.getX(); // TODO: gtfs-lib value needs to be int if (wheelchairBoarding != null) { - ret.wheelchair_boarding = String.valueOf(wheelchairBoarding.toGtfs()); + ret.wheelchair_boarding = wheelchairBoarding.toGtfs(); } if (stopName != null && !stopName.isEmpty()) diff --git a/src/main/java/com/conveyal/datatools/manager/DataManager.java b/src/main/java/com/conveyal/datatools/manager/DataManager.java index 0f4a7fb5c..a073430fc 100644 --- a/src/main/java/com/conveyal/datatools/manager/DataManager.java +++ b/src/main/java/com/conveyal/datatools/manager/DataManager.java @@ -27,7 +27,6 @@ import com.conveyal.datatools.manager.extensions.transitfeeds.TransitFeedsFeedResource; import com.conveyal.datatools.manager.extensions.transitland.TransitLandFeedResource; import com.conveyal.datatools.manager.jobs.FeedUpdater; -import com.conveyal.datatools.manager.persistence.FeedStore; import com.conveyal.datatools.manager.persistence.Persistence; import com.conveyal.gtfs.GTFS; import com.conveyal.gtfs.GraphQLController; @@ -228,6 +227,7 @@ static void registerRoutes() throws IOException { String gtfs = IOUtils.toString(DataManager.class.getResourceAsStream("/gtfs/gtfs.yml")); gtfsConfig = yamlMapper.readTree(gtfs); new EditorControllerImpl(EDITOR_API_PREFIX, Table.AGENCY, DataManager.GTFS_DATA_SOURCE); + new EditorControllerImpl(EDITOR_API_PREFIX, Table.ATTRIBUTIONS, DataManager.GTFS_DATA_SOURCE); new EditorControllerImpl(EDITOR_API_PREFIX, Table.CALENDAR, DataManager.GTFS_DATA_SOURCE); // NOTE: fare_attributes controller handles updates to nested table fare_rules. new EditorControllerImpl(EDITOR_API_PREFIX, Table.FARE_ATTRIBUTES, DataManager.GTFS_DATA_SOURCE); @@ -237,6 +237,7 @@ static void registerRoutes() throws IOException { new EditorControllerImpl(EDITOR_API_PREFIX, Table.PATTERNS, DataManager.GTFS_DATA_SOURCE); new EditorControllerImpl(EDITOR_API_PREFIX, Table.SCHEDULE_EXCEPTIONS, DataManager.GTFS_DATA_SOURCE); new EditorControllerImpl(EDITOR_API_PREFIX, Table.STOPS, DataManager.GTFS_DATA_SOURCE); + new EditorControllerImpl(EDITOR_API_PREFIX, Table.TRANSLATIONS, DataManager.GTFS_DATA_SOURCE); new EditorControllerImpl(EDITOR_API_PREFIX, Table.TRIPS, DataManager.GTFS_DATA_SOURCE); // TODO: Add transfers.txt controller? } diff --git a/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java b/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java index b94ee28a5..679afde36 100644 --- a/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java +++ b/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java @@ -14,14 +14,19 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spark.utils.IOUtils; import java.io.IOException; import java.util.Date; +import java.util.stream.Stream; import static com.conveyal.datatools.TestUtils.createFeedVersionFromGtfsZip; import static com.conveyal.datatools.manager.auth.Auth0Users.USERS_API_PATH; @@ -34,6 +39,8 @@ public class EditorControllerTest extends UnitTest { private static final Logger LOG = LoggerFactory.getLogger(EditorControllerTest.class); private static Project project; + private static FeedSource feedSource; + private static FeedSource freshFeedSource; private static FeedVersion feedVersion; private static final ObjectMapper mapper = new ObjectMapper(); @@ -51,7 +58,7 @@ public static void setUp() throws Exception { project = new Project(); project.name = String.format("Test %s", new Date().toString()); Persistence.projects.create(project); - FeedSource feedSource = new FeedSource("BART"); + feedSource = new FeedSource("BART"); feedSource.projectId = project.id; Persistence.feedSources.create(feedSource); feedVersion = createFeedVersionFromGtfsZip(feedSource, "bart_old.zip"); @@ -64,26 +71,53 @@ public static void setUp() throws Exception { LOG.info("{} setup completed in {} ms", EditorControllerTest.class.getSimpleName(), System.currentTimeMillis() - startTime); } + @AfterAll + public static void tearDown() { + project.delete(); + feedSource.delete(); + } + + private static Stream createPatchTableTests() { + return Stream.of( + Arguments.of("route_short_name", "route", 6, "graphql/routes.txt", "routes"), + Arguments.of("organization_name", "attribution", 1, "graphql/attributions.txt", "attributions"), + Arguments.of("translation", "translation", 3, "graphql/translations.txt", "translations") + ); + } + + @ParameterizedTest + @MethodSource("createPatchTableTests") + public void canPatchTableTests( + String field, + String entity, + int expectedCount, + String graphQLQueryFile, + String table) throws IOException { + canPatchTable(field, entity, expectedCount, graphQLQueryFile, table); + } + /** - * Make sure the patch table endpoint can patch routes table. + * Confirm that the provided table endpoint can be patched. */ - @Test - public void canPatchRoutes() throws IOException { - LOG.info("Making patch routes request"); - ObjectNode jsonBody = mapper.createObjectNode(); - String field = "route_short_name"; + private void canPatchTable( + String field, + String entity, + int expectedCount, + String graphQLQueryFile, + String table + ) throws IOException { + LOG.info("Making patch {} request", table); String value = "NEW"; + ObjectNode jsonBody = mapper.createObjectNode(); jsonBody.put(field, value); - int count = patchTableRequest("route", feedVersion.feedSourceId, null, jsonBody); - // Assert that all six routes contained within BART feed were modified. - assertThat(count, equalTo(6)); - // Check GraphQL to verify that route_short_name has indeed been updated. + int count = patchTableRequest(entity, feedVersion.feedSourceId, null, jsonBody); + // Assert that the correct table within the BART feed was modified. + assertThat(count, equalTo(expectedCount)); // Get fresh feed source so that editor namespace was updated after snapshot. - FeedSource feedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); - JsonNode graphQL = graphqlQuery(feedSource.editorNamespace, "graphql/routes.txt"); - // Every route should now have the short name defined in the patch JSON body above. - for (JsonNode route : graphQL.get("data").get("feed").get("routes")) { - assertThat(route.get(field).asText(), equalTo(value)); + freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); + JsonNode graphQL = graphqlQuery(freshFeedSource.editorNamespace, graphQLQueryFile); + for (JsonNode node : graphQL.get("data").get("feed").get(table)) { + assertThat(node.get(field).asText(), equalTo(value)); } } @@ -106,8 +140,8 @@ public void canPatchStopsConditionally() throws IOException { assertThat(count, equalTo(34)); // Check GraphQL to verify that stop_desc has indeed been updated. // Get fresh feed source so that editor namespace was updated after snapshot. - FeedSource feedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); - JsonNode graphQL = graphqlQuery(feedSource.editorNamespace, "graphql/stops.txt"); + freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); + JsonNode graphQL = graphqlQuery(freshFeedSource.editorNamespace, "graphql/stops.txt"); // Every stop meeting the stop_lon condition should now have the desc defined in the patch JSON body above. for (JsonNode stop : graphQL.get("data").get("feed").get("stops")) { double filteredValue = stop.get(queryField).asDouble(); diff --git a/src/test/resources/com/conveyal/datatools/gtfs/bart_old.zip b/src/test/resources/com/conveyal/datatools/gtfs/bart_old.zip index 3ec68c91135b413054c9392bd740c144210bb1fc..80f8f66d09fbcdccae8815631ddef61bd30161c6 100644 GIT binary patch literal 456412 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ⅅDpc_ykICp#cn$|lX4f`%lf{|mX&^P6$%K8 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≀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%0Ael=)Mm0Ht43ncY~VS>j@8OumU8 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 FxB$wSGWq}j literal 456744 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

HW1|M{LT)t0e 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

5~iINjgnee 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

Ne;t{!= zcfCTu=Mf5;vP-_mv6#e%9jYxO%N>Vd-BM)t zI>dwkdLZaN*I5lh8wS66_QWTHVNEjb&CaO+;#=r2%^P38uDJKs#?Dx-gUFNlkyQmP zTCn8#?k-2a{Xi!tDd}PGd0=K^d)uF`!xX_?EFozQ>`x&irM5k^|Egr$Ke(-e*q`gbk%IGj_{2K8_2lZhG_NHZ0$T6it^qEVH_t*{IN9zAO_5bFkGz{ z$o-dsXYy;2kV)3?{Mvnf}TAjD?*J`VT{ zT!r60Zh76w4Ah+YyL!yrAcz#<*DJUe_QO3?GbH&F`WsoHz9}yFyiyO&p1>6D&sSXT z#V<#;x!6|t2_lK)TkgEaQD+lA;BUfbldQ0$AiG7{bQ!#i!w=;9BS)_!IMe<%utm-NcTYeX$j$?ybN7OA?@K z?@3dizzyv6tN0Ia#NOnV$DEQdi=OsiE&mECBh5BDx24tH%P09l`$JN`OC|D2+S zd#~Z@g8wVma>u6cKUSD?ayy_}cz?&)X60YC4hZgGjSF zpkn?!4|!CJ?gDDy(^*4`vNPB>uQ>%qnE+Ok(Bj@ove#Z1W0w zq;xkM$c%0I8#uu1Efp9<_QAe6DF2YHl-a;z65k-Zrvfj#0Jk3p<<=62SQ}!{>MZ+C z#EU=x%kMDUUxYL?=DokOpSrLKX>t9QhpG7UPBIe*2*A3G0sJK!E=�=Cz-*orfhhZ`-4xZ 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 sYAd}8)(vgr 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
a5(cr^%t2u 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 z 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 diff --git a/src/test/resources/graphql/attributions.txt b/src/test/resources/graphql/attributions.txt new file mode 100644 index 000000000..6972e2757 --- /dev/null +++ b/src/test/resources/graphql/attributions.txt @@ -0,0 +1,18 @@ +query ($namespace: String) { + feed(namespace: $namespace) { + feed_version + attributions { + attribution_id + agency_id + route_id + trip_id + organization_name + is_producer + is_operator + is_authority + attribution_url + attribution_email + attribution_phone + } + } +} \ No newline at end of file diff --git a/src/test/resources/graphql/translations.txt b/src/test/resources/graphql/translations.txt new file mode 100644 index 000000000..4933e2e12 --- /dev/null +++ b/src/test/resources/graphql/translations.txt @@ -0,0 +1,14 @@ +query ($namespace: String) { + feed(namespace: $namespace) { + feed_version + translations { + table_name + field_name + language + translation + record_id + record_sub_id + field_value + } + } +} \ No newline at end of file From 733d2f8175199b57d7dc6de231f5c0c9a8917141 Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Fri, 4 Jun 2021 13:55:03 +0100 Subject: [PATCH 02/41] refactor(bart_old.zip): Updated the agency id reference in attributions to resolve referential integ --- .../com/conveyal/datatools/gtfs/bart_old.zip | Bin 456412 -> 456450 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/test/resources/com/conveyal/datatools/gtfs/bart_old.zip b/src/test/resources/com/conveyal/datatools/gtfs/bart_old.zip index 80f8f66d09fbcdccae8815631ddef61bd30161c6..79007ae14aef0f2616f8f8a5bd51e2244df15b6e 100644 GIT binary patch delta 441 zcmccfR=Vk(^n^L}A$doFwt8;O>SSPGxC+DqK%7`oQk0ogT9TQcSFBf3Q4-pBkn4~G zkIVa}dZDPQuS@EhD)bAbZ#CT2xtTNl*VlJpE#FM^XEsWj1lOr1f3)RqP_En_7UbzB z+9kiLtMA3n=IASreGY8o*K#geGF5fLqLasFEuhrpXVOM5o(*0V?=5 zJ@X5jHRHYMOTVyLF*Z$q@P*BW@!E9RuWaUw2Gc`96zBBbuWSyC^QNEs3RKBAo$DK$ u8Kcj1$8SIlZ>HCLW3yH6In2fY4Eh3as0VnnvVoi@2!xU>3=Ee)fw%y>AEv(m delta 410 zcmZpACw=Fw^n^L}E}^S}l4ePKYiD3!xCq1oK%7`oQk0ogT9TQcSFBf3Q4-p>k?XJl zkIQ$b|1K&iZ?F7wekm2=ex&J^(WW^QYHE|67tVY)*RP;G?bQ1uox&%a1o%-P^d=jfZ8<@g+v0?op9KnzKxfCB;q2W&WeB@k`sXlIz5C?@vN6t0WT` z8m@o7cxCp|n%BQeV|O3jU_Grt`=-i-vY91`?%(4-GyT#n>>N?JJuN z+Z9a)hNArG2fwn3Opp1>Cda5Zz4|MgIV1b@&0m3f=1l+c6{v@2y1_R#Ge)oJ>ED1_ cUrk^1jm?&^Yx;w4Y!X~wnSsIoi4ABE03HXPm;e9( From e3c5aa6ec6de8b877e51a8afd149e2585d9e6caa Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Fri, 4 Jun 2021 14:39:07 +0100 Subject: [PATCH 03/41] refactor(Removal of the transit package): Deleted all classes in the transit package and all depende --- .../editor/datastore/DatabaseTx.java | 135 ---- .../datatools/editor/datastore/FeedTx.java | 695 ------------------ .../datatools/editor/datastore/GlobalTx.java | 36 - .../editor/datastore/MigrateToMapDB.java | 644 ---------------- .../editor/datastore/SnapshotTx.java | 176 ----- .../editor/datastore/VersionedDataStore.java | 316 -------- .../editor/jobs/ConvertEditorMapDBToSQL.java | 354 --------- .../datatools/editor/models/Snapshot.java | 135 ---- .../editor/models/transit/Agency.java | 90 --- .../transit/AttributeAvailabilityType.java | 29 - .../editor/models/transit/EditorFeed.java | 52 -- .../datatools/editor/models/transit/Fare.java | 80 -- .../editor/models/transit/GtfsRouteType.java | 88 --- .../editor/models/transit/HvtRouteType.java | 65 -- .../editor/models/transit/LocationType.java | 6 - .../editor/models/transit/Route.java | 240 ------ .../editor/models/transit/RouteType.java | 32 - .../models/transit/ScheduleException.java | 123 ---- .../models/transit/ServiceCalendar.java | 232 ------ .../editor/models/transit/StatusType.java | 21 - .../datatools/editor/models/transit/Stop.java | 220 ------ .../editor/models/transit/StopTime.java | 62 -- .../transit/StopTimePickupDropOffType.java | 24 - .../editor/models/transit/StopType.java | 13 - .../datatools/editor/models/transit/Trip.java | 144 ---- .../editor/models/transit/TripDirection.java | 14 - .../editor/models/transit/TripPattern.java | 347 --------- .../models/transit/TripPatternStop.java | 39 - .../editor/utils/JacksonSerializers.java | 153 ---- .../datatools/manager/ConvertMain.java | 176 ----- .../manager/utils/json/JsonManager.java | 4 - 31 files changed, 4745 deletions(-) delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/DatabaseTx.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/FeedTx.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/GlobalTx.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/MigrateToMapDB.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/SnapshotTx.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/datastore/VersionedDataStore.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/jobs/ConvertEditorMapDBToSQL.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/models/Snapshot.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/Agency.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/AttributeAvailabilityType.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/models/transit/EditorFeed.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/models/transit/Fare.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/GtfsRouteType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/HvtRouteType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/LocationType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/Route.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/RouteType.java delete mode 100644 src/main/java/com/conveyal/datatools/editor/models/transit/ScheduleException.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/ServiceCalendar.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/StatusType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/StopTime.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/StopTimePickupDropOffType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/StopType.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/Trip.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/TripDirection.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/TripPattern.java delete mode 100755 src/main/java/com/conveyal/datatools/editor/models/transit/TripPatternStop.java delete mode 100644 src/main/java/com/conveyal/datatools/manager/ConvertMain.java diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/DatabaseTx.java b/src/main/java/com/conveyal/datatools/editor/datastore/DatabaseTx.java deleted file mode 100644 index 1f8723f9a..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/DatabaseTx.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.google.common.base.Function; -import com.google.common.collect.Iterators; -import org.mapdb.BTreeMap; -import org.mapdb.DB; -import org.mapdb.DB.BTreeMapMaker; -import org.mapdb.Fun.Tuple2; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.conveyal.datatools.editor.utils.ClassLoaderSerializer; - -import java.util.Iterator; -import java.util.Map.Entry; -import java.util.NavigableSet; - -/** A wrapped transaction, so the database just looks like a POJO */ -public class DatabaseTx { - private static final Logger LOG = LoggerFactory.getLogger(DatabaseTx.class); - - /** the database (transaction). subclasses must initialize. */ - protected final DB tx; - - /** has this transaction been closed? */ - boolean closed = false; - - /** is this transaction read-only? */ - protected boolean readOnly; - - /** Convenience function to retrieve a map */ - protected final BTreeMap getMap (String name) { - try { - return getMapMaker(tx, name) - .makeOrGet(); - } catch (UnsupportedOperationException e) { - // read-only data store - return null; - } - } - - /** retrieve a map maker, that can then be further modified */ - private static final BTreeMapMaker getMapMaker (DB tx, String name) { - return tx.createTreeMap(name) - // use java serialization to allow for schema upgrades - .valueSerializer(new ClassLoaderSerializer()); - } - - /** - * Convenience function to retrieve a set. These are used as indices so they use the default serialization; - * if we make a schema change we drop and recreate them. - */ - protected final NavigableSet getSet (String name) { - try { - return tx.createTreeSet(name) - .makeOrGet(); - } catch (UnsupportedOperationException e) { - // read-only data store - return null; - } - } - - protected DatabaseTx (DB tx) { - this.tx = tx; - } - - public void commit() { - try { - tx.commit(); - } catch (UnsupportedOperationException e) { - // probably read only, but warn - LOG.warn("Rollback failed; if this is a read-only database this is not unexpected"); - } - closed = true; - } - - public void rollback() { - try { - tx.rollback(); - } catch (UnsupportedOperationException e) { - // probably read only, but warn - LOG.warn("Rollback failed; if this is a read-only database this is not unexpected"); - } - closed = true; - } - - /** roll this transaction back if it has not been committed or rolled back already */ - public void rollbackIfOpen () { - if (!closed) rollback(); - } - - /** efficiently copy a btreemap into this database */ - protected int pump(String mapName, BTreeMap source) { - return pump(tx, mapName, source); - } - - /** from a descending order iterator fill a new map in the specified database */ - protected static int pump(DB tx, String mapName, Iterator> pumpSource) { - if (!pumpSource.hasNext()) - return 0; - - return getMapMaker(tx, mapName) - .pumpSource(pumpSource) - .make() - .size(); - } - - /** efficiently create a BTreeMap in the specified database from another BTreeMap */ - protected static int pump (DB tx, String mapName, BTreeMap source) { - if (source.size() == 0) - return 0; - - return pump(tx, mapName, pumpSourceForMap(source)); - } - - /** retrieve a pump source from a map */ - protected static Iterator> pumpSourceForMap(BTreeMap source) { - Iterator> values = source.descendingMap().entrySet().iterator(); - Iterator> valueTuples = Iterators.transform(values, new Function, Tuple2>() { - @Override - public Tuple2 apply(Entry input) { - return new Tuple2(input.getKey(), input.getValue()); - } - }); - - return valueTuples; - } - - protected final void finalize () { - if (!closed) { - LOG.error("DB transaction left unclosed, this signifies a memory leak!"); - rollback(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/FeedTx.java b/src/main/java/com/conveyal/datatools/editor/datastore/FeedTx.java deleted file mode 100644 index ddaea5764..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/FeedTx.java +++ /dev/null @@ -1,695 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.conveyal.datatools.editor.models.transit.*; -import com.conveyal.datatools.editor.utils.GeoUtils; -import com.conveyal.gtfs.GTFSFeed; -import com.conveyal.gtfs.model.CalendarDate; -import com.conveyal.gtfs.model.Entity; -import com.conveyal.gtfs.model.Frequency; -import com.conveyal.gtfs.model.ShapePoint; -import com.google.common.base.Function; -import com.google.common.collect.Iterators; -import java.time.LocalDate; - -import com.google.common.collect.Maps; -import com.vividsolutions.jts.geom.Coordinate; -import org.mapdb.Atomic; -import org.mapdb.BTreeMap; -import org.mapdb.Bind; -import org.mapdb.DB; -import org.mapdb.Fun; -import org.mapdb.Fun.Tuple2; -import com.conveyal.datatools.editor.utils.BindUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.NavigableSet; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; - -/** a transaction in an agency database */ -public class FeedTx extends DatabaseTx { - private static final Logger LOG = LoggerFactory.getLogger(FeedTx.class); - // primary com.conveyal.datatools.editor.datastores - // if you add another, you MUST update SnapshotTx.java - // if you don't, not only will your new data not be backed up, IT WILL BE THROWN AWAY WHEN YOU RESTORE! - // AND ALSO the duplicate() function below - public BTreeMap tripPatterns; - public BTreeMap routes; - public BTreeMap trips; - public BTreeMap calendars; - public BTreeMap exceptions; - public BTreeMap stops; - public BTreeMap agencies; - public BTreeMap fares; - // if you add anything here, see warning above! - - // secondary indices - - /** Set containing tuples */ - public NavigableSet> tripsByRoute; - - /** */ - public NavigableSet> tripPatternsByRoute; - - /** */ - public NavigableSet> tripsByTripPattern; - - /** */ - public NavigableSet> tripsByCalendar; - - /** */ - public NavigableSet> exceptionsByCalendar; - - /** <, trip id> */ - public NavigableSet, String>> tripsByPatternAndCalendar; - - /** major stops for this agency */ - public NavigableSet majorStops; - - /** trip patterns using each stop */ - public NavigableSet> tripPatternsByStop; - - /** number of schedule exceptions on each date - this will always be null, 0, or 1, as we prevent save of others */ - public ConcurrentMap scheduleExceptionCountByDate; - - /** number of trips on each tuple2 */ - public ConcurrentMap, Long> tripCountByPatternAndCalendar; - - /** number of trips on each calendar */ - public ConcurrentMap tripCountByCalendar; - - /** - * Spatial index of stops. Set, stop ID>> - * This is not a true spatial index, but should be sufficiently efficient for our purposes. - * Jan Kotek describes this approach here, albeit in Czech: https://groups.google.com/forum/#!msg/mapdb/ADgSgnXzkk8/Q8J9rWAWXyMJ - */ - public NavigableSet, String>> stopsGix; - - /** snapshot versions. we use an atomic value so that they are (roughly) sequential, instead of using unordered UUIDs */ - private Atomic.Integer snapshotVersion; - -// public Atomic.Boolean editedSinceSnapshot; - /** - * Create a feed tx. - */ - public FeedTx(DB tx) { - this(tx, true); - } - - /** Create a feed tx, optionally without secondary indices */ - public FeedTx(DB tx, boolean buildSecondaryIndices) { - super(tx); - - tripPatterns = getMap("tripPatterns"); - routes = getMap("routes"); - trips = getMap("trips"); - calendars = getMap("calendars"); - exceptions = getMap("exceptions"); - snapshotVersion = tx.getAtomicInteger("snapshotVersion"); - stops = getMap("stops"); - agencies = getMap("agencies"); - fares = getMap("fares"); - - if (buildSecondaryIndices) - buildSecondaryIndices(); - -// editedSinceSnapshot = tx.getAtomicBoolean("editedSinceSnapshot") == null ? tx.createAtomicBoolean("editedSinceSnapshot", false) : editedSinceSnapshot; - } - - private static int toGtfsDate (LocalDate date) { - return date.getYear() * 10000 + date.getMonthValue() * 100 + date.getDayOfMonth(); - } - - public void commit () { - try { -// editedSinceSnapshot.set(true); - tx.commit(); - } catch (UnsupportedOperationException e) { - // probably read only, but warn - LOG.warn("Rollback failed; if this is a read-only database this is not unexpected"); - } - closed = true; - } - - public void buildSecondaryIndices () { - // build secondary indices - // we store indices in the mapdb not because we care about persistence, but because then they - // will be managed within the context of MapDB transactions - tripsByRoute = getSet("tripsByRoute"); - - // bind the trips to the routes - Bind.secondaryKeys(trips, tripsByRoute, (tripId, trip) -> new String[] { trip.routeId }); - - tripPatternsByRoute = getSet("tripPatternsByRoute"); - Bind.secondaryKeys(tripPatterns, tripPatternsByRoute, (tripId, trip) -> new String[] { trip.routeId }); - - tripsByTripPattern = getSet("tripsByTripPattern"); - Bind.secondaryKeys(trips, tripsByTripPattern, (tripId, trip) -> new String[] { trip.patternId }); - - tripsByCalendar = getSet("tripsByCalendar"); - Bind.secondaryKeys(trips, tripsByCalendar, (tripId, trip) -> new String[] { trip.calendarId }); - - exceptionsByCalendar = getSet("exceptionsByCalendar"); - Bind.secondaryKeys(exceptions, exceptionsByCalendar, (key, ex) -> { - if (ex.customSchedule == null) return new String[0]; - - return ex.customSchedule.toArray(new String[ex.customSchedule.size()]); - }); - - tripsByPatternAndCalendar = getSet("tripsByPatternAndCalendar"); - Bind.secondaryKeys(trips, tripsByPatternAndCalendar, (key, trip) -> new Tuple2[] { new Tuple2(trip.patternId, trip.calendarId) }); - - majorStops = getSet("majorStops"); - BindUtils.subsetIndex(stops, majorStops, (key, val) -> val.majorStop != null && val.majorStop); - - tripPatternsByStop = getSet("tripPatternsByStop"); - Bind.secondaryKeys(tripPatterns, tripPatternsByStop, (key, tp) -> { - String[] stops1 = new String[tp.patternStops.size()]; - - for (int i = 0; i < stops1.length; i++) { - stops1[i] = tp.patternStops.get(i).stopId; - } - - return stops1; - }); - - tripCountByPatternAndCalendar = getMap("tripCountByPatternAndCalendar"); - Bind.histogram(trips, tripCountByPatternAndCalendar, (tripId, trip) -> new Tuple2(trip.patternId, trip.calendarId)); - - // getting schedule exception map appears to be causing issues for some feeds - // The names of the code writers have been changed to protect the innocent. - try { - scheduleExceptionCountByDate = getMap("scheduleExceptionCountByDate"); - } catch (RuntimeException e1) { - LOG.error("Error getting scheduleExceptionCountByDate map. Getting a new one."); - int count = 0; - final int NEW_MAP_LIMIT = 100; - while (true) { - try { - scheduleExceptionCountByDate = getMap("scheduleExceptionCountByDateMapDBIsTheWORST" + count); - } catch (RuntimeException e2) { - LOG.error("Error getting {} scheduleExceptionCountByDateMapDBIsTheWORST map. Getting a new one.", count); - count++; - if (count > NEW_MAP_LIMIT) { - LOG.error("Cannot create new map. Reached limit of {}", NEW_MAP_LIMIT); - throw e2; - } - continue; - } - break; - } - } - BindUtils.multiHistogram(exceptions, scheduleExceptionCountByDate, (id, ex) -> ex.dates.toArray(new LocalDate[ex.dates.size()])); - - tripCountByCalendar = getMap("tripCountByCalendar"); - BindUtils.multiHistogram(trips, tripCountByCalendar, (key, trip) -> { - if (trip.calendarId == null) - return new String[] {}; - else - return new String[] { trip.calendarId }; - }); - - // "spatial index" - stopsGix = getSet("stopsGix"); - Bind.secondaryKeys(stops, stopsGix, (stopId, stop) -> new Tuple2[] { new Tuple2(stop.location.getX(), stop.location.getY()) }); - } - - public Collection getTripsByPattern(String patternId) { - Set> matchedKeys = tripsByTripPattern.subSet(new Tuple2(patternId, null), new Tuple2(patternId, Fun.HI)); - - return matchedKeys.stream() - .map(input -> trips.get(input.b)) - .collect(Collectors.toList()); - } - - public Collection getTripsByRoute(String routeId) { - Set> matchedKeys = tripsByRoute.subSet(new Tuple2(routeId, null), new Tuple2(routeId, Fun.HI)); - - return matchedKeys.stream().map(input -> trips.get(input.b)).collect(Collectors.toList()); - } - - public Collection getTripsByCalendar(String calendarId) { - Set> matchedKeys = tripsByCalendar.subSet(new Tuple2(calendarId, null), new Tuple2(calendarId, Fun.HI)); - - return matchedKeys.stream().map(input -> trips.get(input.b)).collect(Collectors.toList()); - } - - public Collection getExceptionsByCalendar(String calendarId) { - Set> matchedKeys = exceptionsByCalendar.subSet(new Tuple2(calendarId, null), new Tuple2(calendarId, Fun.HI)); - - return matchedKeys.stream().map(input -> exceptions.get(input.b)).collect(Collectors.toList()); - } - - public Collection getTripsByPatternAndCalendar(String patternId, String calendarId) { - Set, String>> matchedKeys = - tripsByPatternAndCalendar.subSet(new Tuple2(new Tuple2(patternId, calendarId), null), new Tuple2(new Tuple2(patternId, calendarId), Fun.HI)); - - return matchedKeys.stream().map(input -> trips.get(input.b)).collect(Collectors.toList()); - } - - public Collection getStopsWithinBoundingBox (double north, double east, double south, double west) { - // find all the stops in this bounding box - // avert your gaze please as I write these generic types - Tuple2 min = new Tuple2(west, south); - Tuple2 max = new Tuple2(east, north); - - Set, String>> matchedKeys = - stopsGix.subSet(new Tuple2(min, null), new Tuple2(max, Fun.HI)); - - Collection matchedStops = matchedKeys.stream().map(input -> stops.get(input.b)).collect(Collectors.toList()); - - return matchedStops; - } - - public Collection getTripPatternsByStop (String id) { - Collection> matchedPatterns = tripPatternsByStop.subSet(new Tuple2(id, null), new Tuple2(id, Fun.HI)); - return matchedPatterns.stream() - .map(input -> tripPatterns.get(input.b)) - .collect(Collectors.toList()); - } - - /** return the version number of the next snapshot */ - public int getNextSnapshotId () { - return snapshotVersion.incrementAndGet(); - } - - /** duplicate an EditorFeed in its entirety. Return the new feed ID */ - public static String duplicate (String feedId) { - final String newId = UUID.randomUUID().toString(); - - FeedTx feedTx = VersionedDataStore.getFeedTx(feedId); - - DB newDb = VersionedDataStore.getRawFeedTx(newId); - - copy(feedTx, newDb, newId); - - // rebuild indices - FeedTx newTx = new FeedTx(newDb); - newTx.commit(); - - feedTx.rollback(); - - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - EditorFeed feedCopy; - - try { - feedCopy = gtx.feeds.get(feedId).clone(); - } catch (CloneNotSupportedException e) { - // not likely - e.printStackTrace(); - gtx.rollback(); - return null; - } - - feedCopy.id = newId; -// a2.name = Messages.retrieveById("agency.copy-of", a2.name); - - gtx.feeds.put(feedCopy.id, feedCopy); - - gtx.commit(); - - return newId; - } - - /** copy a feed database */ - static void copy (FeedTx feedTx, DB newDb, final String newFeedId) { - // copy everything - try { - Iterator> stopSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.stops), - (Function, Tuple2>) input -> { - Stop st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "stops", stopSource); - - Iterator> tripSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.trips), - (Function, Tuple2>) input -> { - Trip st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "trips", tripSource); - - Iterator> pattSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.tripPatterns), - (Function, Tuple2>) input -> { - TripPattern st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "tripPatterns", pattSource); - - Iterator> routeSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.routes), - (Function, Tuple2>) input -> { - Route st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "routes", routeSource); - - Iterator> calSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.calendars), - (Function, Tuple2>) input -> { - ServiceCalendar st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "calendars", calSource); - - Iterator> exSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.exceptions), - (Function, Tuple2>) input -> { - ScheduleException st; - try { - st = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - st.feedId = newFeedId; - return new Tuple2(input.a, st); - }); - pump(newDb, "exceptions", exSource); - - Iterator> agencySource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.agencies), - new Function, Tuple2>() { - @Override - public Tuple2 apply(Tuple2 input) { - Agency agency; - try { - agency = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - agency.feedId = newFeedId; - return new Tuple2(input.a, agency); - } - }); - pump(newDb, "agencies", agencySource); - - Iterator> fareSource = Iterators.transform( - FeedTx.pumpSourceForMap(feedTx.agencies), - new Function, Tuple2>() { - @Override - public Tuple2 apply(Tuple2 input) { - Fare fare; - try { - fare = input.b.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - fare.feedId = newFeedId; - return new Tuple2(input.a, fare); - } - }); - pump(newDb, "fares", fareSource); - - // copy histograms - pump(newDb, "tripCountByCalendar", (BTreeMap) feedTx.tripCountByCalendar); - pump(newDb, "scheduleExceptionCountByDate", (BTreeMap) feedTx.scheduleExceptionCountByDate); - pump(newDb, "tripCountByPatternAndCalendar", (BTreeMap) feedTx.tripCountByPatternAndCalendar); - - } - catch (Exception e) { - newDb.rollback(); - feedTx.rollback(); - throw new RuntimeException(e); - } - } - - /** - * Convert Editor MapDB database (snapshot or active buffer) into a {@link com.conveyal.gtfs.GTFSFeed} object. This - * should be run in an asynchronously executed {@link com.conveyal.datatools.common.status.MonitorableJob} - * (see {@link com.conveyal.datatools.editor.jobs.ProcessGtfsSnapshotExport} to avoid consuming resources. - * @return - */ - public GTFSFeed toGTFSFeed(boolean ignoreRouteStatus) { - GTFSFeed feed = new GTFSFeed(); - if (agencies != null) { - LOG.info("Exporting {} agencies", agencies.size()); - for (Agency agency : agencies.values()) { - // if agencyId is null (allowed if there is only a single agency), set to empty string - if (agency.agencyId == null) { - if (feed.agency.containsKey("")) { - LOG.error("Agency with empty id field already exists. Skipping agency {}", agency); - continue; - } else { - agency.agencyId = ""; - } - } - // write the agency.txt entry - feed.agency.put(agency.agencyId, agency.toGtfs()); - } - } else { - LOG.error("Agency table should not be empty!"); - } - - if (fares != null) { - LOG.info("Exporting {} fares", fares.values().size()); - for (Fare fare : fares.values()) { - com.conveyal.gtfs.model.Fare gtfsFare = fare.toGtfs(); - - // write the fares.txt entry - feed.fares.put(fare.gtfsFareId, gtfsFare); - } - } - - // write all of the calendars and calendar dates - if (calendars != null) { - for (ServiceCalendar cal : calendars.values()) { - - int start = toGtfsDate(cal.startDate); - int end = toGtfsDate(cal.endDate); - com.conveyal.gtfs.model.Service gtfsService = cal.toGtfs(start, end); - // note: not using user-specified IDs - - // add calendar dates - if (exceptions != null) { - for (ScheduleException ex : exceptions.values()) { - if (ex.equals(ScheduleException.ExemplarServiceDescriptor.SWAP) && !ex.addedService.contains(cal.id) && !ex.removedService.contains(cal.id)) - // skip swap exception if cal is not referenced by added or removed service - // this is not technically necessary, but the output is cleaner/more intelligible - continue; - - for (LocalDate date : ex.dates) { - if (date.isBefore(cal.startDate) || date.isAfter(cal.endDate)) - // no need to write dates that do not apply - continue; - - CalendarDate cd = new CalendarDate(); - cd.date = date; - cd.service_id = gtfsService.service_id; - cd.exception_type = ex.serviceRunsOn(cal) ? 1 : 2; - - if (gtfsService.calendar_dates.containsKey(date)) - throw new IllegalArgumentException("Duplicate schedule exceptions on " + date.toString()); - - gtfsService.calendar_dates.put(date, cd); - } - } - } - feed.services.put(gtfsService.service_id, gtfsService); - } - } - - Map gtfsRoutes = Maps.newHashMap(); - - // write the routes - if(routes != null) { - LOG.info("Exporting {} routes", routes.size()); - for (Route route : routes.values()) { - // only export approved routes - // TODO: restore route approval check? - if (ignoreRouteStatus || route.status == StatusType.APPROVED) { - com.conveyal.gtfs.model.Agency agency = route.agencyId != null ? agencies.get(route.agencyId).toGtfs() : null; - com.conveyal.gtfs.model.Route gtfsRoute = route.toGtfs(agency); - feed.routes.put(route.getGtfsId(), gtfsRoute); - gtfsRoutes.put(route.id, gtfsRoute); - } else { - LOG.warn("Route {} not approved", route.gtfsRouteId); - } - } - } - - // write the trips on those routes - // we can't use the trips-by-route index because we may be exporting a snapshot database without indices - if(trips != null) { - LOG.info("Exporting {} trips", trips.size()); - for (Trip trip : trips.values()) { - if (!gtfsRoutes.containsKey(trip.routeId)) { - LOG.warn("Trip {} has no matching route. This may be because route {} was not approved", trip, trip.routeId); - continue; - } - - com.conveyal.gtfs.model.Route gtfsRoute = gtfsRoutes.get(trip.routeId); - Route route = routes.get(trip.routeId); - - com.conveyal.gtfs.model.Trip gtfsTrip = new com.conveyal.gtfs.model.Trip(); - - gtfsTrip.block_id = trip.blockId; - gtfsTrip.route_id = gtfsRoute.route_id; - gtfsTrip.trip_id = trip.getGtfsId(); - // TODO: figure out where a "" trip_id might have come from - if (gtfsTrip.trip_id == null || gtfsTrip.trip_id.equals("")) { - LOG.warn("Trip {} has no id for some reason (trip_id = {}). Skipping.", trip, gtfsTrip.trip_id); - continue; - } - // not using custom ids for calendars - gtfsTrip.service_id = feed.services.get(trip.calendarId).service_id; - gtfsTrip.trip_headsign = trip.tripHeadsign; - gtfsTrip.trip_short_name = trip.tripShortName; - - TripPattern pattern = tripPatterns.get(trip.patternId); - - // assign pattern direction if not null - if (pattern.patternDirection != null) { - gtfsTrip.direction_id = pattern.patternDirection.toGtfs(); - } - else if (trip.tripDirection != null) { - gtfsTrip.direction_id = trip.tripDirection.toGtfs(); - } - Tuple2 nextKey = feed.shape_points.ceilingKey(new Tuple2(pattern.id, null)); - if ((nextKey == null || !pattern.id.equals(nextKey.a)) && pattern.shape != null && !pattern.useStraightLineDistances) { - // this shape has not yet been saved - double[] coordDistances = GeoUtils.getCoordDistances(pattern.shape); - - for (int i = 0; i < coordDistances.length; i++) { - Coordinate coord = pattern.shape.getCoordinateN(i); - ShapePoint shape = new ShapePoint(pattern.id, coord.y, coord.x, i + 1, coordDistances[i]); - feed.shape_points.put(new Tuple2(pattern.id, shape.shape_pt_sequence), shape); - } - } - - if (pattern.shape != null && !pattern.useStraightLineDistances) - gtfsTrip.shape_id = pattern.id; - - // prefer trip wheelchair boarding value if available and not UNKNOWN - if (trip.wheelchairBoarding != null && !trip.wheelchairBoarding.equals(AttributeAvailabilityType.UNKNOWN)) { - gtfsTrip.wheelchair_accessible = trip.wheelchairBoarding.toGtfs(); - } else if (route.wheelchairBoarding != null) { - gtfsTrip.wheelchair_accessible = route.wheelchairBoarding.toGtfs(); - } - - feed.trips.put(gtfsTrip.trip_id, gtfsTrip); - - TripPattern patt = tripPatterns.get(trip.patternId); - - Iterator psi = patt.patternStops.iterator(); - - int stopSequence = 1; - - // write the stop times - int cumulativeTravelTime = 0; - for (StopTime st : trip.stopTimes) { - // FIXME: set ID field - TripPatternStop ps = psi.hasNext() ? psi.next() : null; - if (st == null) - continue; - - Stop stop = stops.get(st.stopId); - - if (!st.stopId.equals(ps.stopId)) { - throw new IllegalStateException("Trip " + trip.id + " does not match its pattern!"); - } - - com.conveyal.gtfs.model.StopTime gst = new com.conveyal.gtfs.model.StopTime(); - if (pattern.useFrequency) { - // If parent pattern uses frequencies, use absolute travel/dwell times from pattern - // stops for arrival/departure times. - gst.arrival_time = cumulativeTravelTime = cumulativeTravelTime + ps.defaultTravelTime; - gst.departure_time = cumulativeTravelTime = cumulativeTravelTime + ps.defaultDwellTime; - } else { - // Otherwise, apply trip's stop time arrival/departure times. - gst.arrival_time = st.arrivalTime != null ? st.arrivalTime : Entity.INT_MISSING; - gst.departure_time = st.departureTime != null ? st.departureTime : Entity.INT_MISSING; - } - - if (st.dropOffType != null) - gst.drop_off_type = st.dropOffType.toGtfsValue(); - else if (stop.dropOffType != null) - gst.drop_off_type = stop.dropOffType.toGtfsValue(); - - if (st.pickupType != null) - gst.pickup_type = st.pickupType.toGtfsValue(); - else if (stop.dropOffType != null) - gst.drop_off_type = stop.dropOffType.toGtfsValue(); - - gst.shape_dist_traveled = ps.shapeDistTraveled; - gst.stop_headsign = st.stopHeadsign; - gst.stop_id = stop.getGtfsId(); - - // write the stop as needed - if (!feed.stops.containsKey(gst.stop_id)) { - feed.stops.put(gst.stop_id, stop.toGtfs()); - } - - gst.stop_sequence = stopSequence++; - - if (ps.timepoint != null) - gst.timepoint = ps.timepoint ? 1 : 0; - else - gst.timepoint = Entity.INT_MISSING; - - gst.trip_id = gtfsTrip.trip_id; - - feed.stop_times.put(new Tuple2(gtfsTrip.trip_id, gst.stop_sequence), gst); - } - - // create frequencies as needed - if (trip.useFrequency != null && trip.useFrequency) { - Frequency f = new Frequency(); - f.trip_id = gtfsTrip.trip_id; - f.start_time = trip.startTime; - f.end_time = trip.endTime; - f.exact_times = 0; - f.headway_secs = trip.headway; - feed.frequencies.add(Fun.t2(gtfsTrip.trip_id, f)); - } - } - } - return feed; - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/GlobalTx.java b/src/main/java/com/conveyal/datatools/editor/datastore/GlobalTx.java deleted file mode 100644 index 448855e29..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/GlobalTx.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.conveyal.datatools.editor.models.Snapshot; -import com.conveyal.datatools.editor.models.transit.EditorFeed; -import com.conveyal.datatools.editor.models.transit.RouteType; -import com.conveyal.datatools.manager.models.FeedSource; -import org.mapdb.BTreeMap; -import org.mapdb.DB; -import org.mapdb.Fun.Tuple2; - -/** a transaction in the global database */ -public class GlobalTx extends DatabaseTx { - public BTreeMap feeds; - - /** Accounts */ -// public BTreeMap accounts; - - /** OAuth tokens */ -// public BTreeMap tokens; - - /** Route types */ - public BTreeMap routeTypes; - - /** Snapshots of agency DBs, keyed by agency_id, version */ - public BTreeMap, Snapshot> snapshots; - - public GlobalTx (DB tx) { - super(tx); - - feeds = getMap("feeds"); -// accounts = getMap("accounts"); -// tokens = getMap("tokens"); - routeTypes = getMap("routeTypes"); - snapshots = getMap("snapshots"); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/MigrateToMapDB.java b/src/main/java/com/conveyal/datatools/editor/datastore/MigrateToMapDB.java deleted file mode 100644 index d5d27401a..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/MigrateToMapDB.java +++ /dev/null @@ -1,644 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.beust.jcommander.internal.Maps; -import com.csvreader.CsvReader; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.io.WKTReader; -import gnu.trove.map.TLongLongMap; -import gnu.trove.map.hash.TLongLongHashMap; -//import com.conveyal.datatools.editor.models.Account; -import com.conveyal.datatools.editor.models.transit.*; -import java.time.LocalDate; -import org.mapdb.DBMaker; -import org.mapdb.Fun; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Map; -import java.util.NavigableMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -//import static org.opentripplanner.common.LoggingUtil.human; - -/** - * Migrate a Postgres database dump to the MapDB format. - */ -public class MigrateToMapDB { -// private GlobalTx gtx; -// private File fromDirectory; -// -// private static GeometryFactory gf = new GeometryFactory(); -// -// /** keep track of transactions for all feeds */ -// private Map atxes = Maps.newHashMap(); -// -// /** cache shapes; use a mapdb so it's not huge */ -// private Map shapeCache = DBMaker.newTempHashMap(); -// -// /** cache stop times: Tuple2 -> StopTime */ -// private NavigableMap, StopTime> stopTimeCache = DBMaker.newTempTreeMap(); -// -// /** cache stop times: Tuple2 -> TripPatternStop */ -// private NavigableMap, TripPatternStop> patternStopCache = DBMaker.newTempTreeMap(); -// -// /** cache exception dates, Exception ID -> Date */ -// private Multimap exceptionDates = HashMultimap.create(); -// -// /** cache custom calendars, exception ID -> calendar ID*/ -// private Multimap exceptionCalendars = HashMultimap.create(); -// -// /** route ID -> agency ID, needed because we need the agency ID to retrieve a reference to the route . . . */ -// TLongLongMap routeAgencyMap = new TLongLongHashMap(); -// -// /** pattern ID -> agency ID */ -// TLongLongMap patternAgencyMap = new TLongLongHashMap(); -// -// /** actually perform the migration */ -// public void migrate(File fromDirectory) throws Exception { -// // import global stuff first: easy-peasy lemon squeezee -// gtx = VersionedDataStore.getGlobalTx(); -// this.fromDirectory = fromDirectory; -// -// try { -// readAgencies(); -// readAccounts(); -// readRouteTypes(); -// -// readStops(); -// -// readRoutes(); -// -// readShapes(); -// readPatternStops(); -// readTripPatterns(); -// -// readStopTimes(); -// readTrips(); -// -// readCalendars(); -// -// readExceptionDates(); -// readExceptionCustomCalendars(); -// readExceptions(); -// -// gtx.commit(); -// -// for (FeedTx atx : atxes.values()) { -// atx.commit(); -// } -// } finally { -// gtx.rollbackIfOpen(); -// -// for (FeedTx atx : atxes.values()) { -// atx.rollbackIfOpen(); -// } -// } -// } -// -// private void readAgencies () throws Exception { -// System.out.println("Reading feeds"); -// -// DatabaseCsv reader = getCsvReader("agency.csv"); -// -// reader.readHeaders(); -// -// int count = 0; -// while (reader.readRecord()) { -// Agency a = new Agency(); -// a.id = reader.retrieve("id"); -// a.color = reader.retrieve("color"); -// a.defaultLon = reader.getDouble("defaultlon"); -// a.defaultLat = reader.getDouble("defaultlat"); -// a.gtfsAgencyId = reader.retrieve("gtfsagencyid"); -// a.lang = reader.retrieve("lang"); -// a.name = reader.retrieve("name"); -// a.phone = reader.retrieve("phone"); -// a.timezone = reader.retrieve("timezone"); -// a.url = reader.retrieve("url"); -// // easy to maintain referential integrity; we're retaining DB IDs. -// a.routeTypeId = reader.retrieve("defaultroutetype_id"); -// -// gtx.feeds.put(a.id, a); -// count++; -// } -// -// System.out.println("imported " + count + " feeds"); -// } -// -// private void readAccounts () throws Exception { -// System.out.println("Reading accounts"); -// -// DatabaseCsv reader = getCsvReader("account.csv"); -// reader.readHeaders(); -// int count = 0; -// -// while (reader.readRecord()) { -// String username = reader.retrieve("username"); -// Boolean admin = reader.getBoolean("admin"); -// String email = reader.retrieve("email"); -// String agencyId = reader.retrieve("agency_id"); -// Account a = new Account(username, "password", email, admin, agencyId); -// a.password = reader.retrieve("password"); -// a.active = reader.getBoolean("active"); -// a.id = a.username; -// -// gtx.accounts.put(a.id, a); -// -// count++; -// } -// -// System.out.println("Imported " + count + " accounts"); -// } -// -// private void readStops () throws Exception { -// System.out.println("reading stops"); -// -// DatabaseCsv reader = getCsvReader("stop.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// Stop s = new Stop(); -// s.location = gf.createPoint(new Coordinate(reader.getDouble("lon"), reader.getDouble("lat"))); -// s.agencyId = reader.retrieve("agency_id"); -// s.bikeParking = reader.getAvail("bikeparking"); -// s.carParking = reader.getAvail("carparking"); -// s.dropOffType = reader.getPdType("dropofftype"); -// s.pickupType = reader.getPdType("pickuptype"); -// s.gtfsStopId = reader.retrieve("gtfsstopid"); -// s.locationType = reader.getLocationType("locationtype"); -// s.majorStop = reader.getBoolean("majorstop"); -// s.parentStation = reader.retrieve("parentstation"); -// s.stopCode = reader.retrieve("stopcode"); -// s.stopIconUrl = reader.retrieve("stopiconurl"); -// s.stopDesc = reader.retrieve("stopdesc"); -// s.stopName = reader.retrieve("stopname"); -// s.stopUrl = reader.retrieve("stopurl"); -// s.wheelchairBoarding = reader.getAvail("wheelchairboarding"); -// s.zoneId = reader.retrieve("zoneid"); -// s.id = reader.retrieve("id"); -// -// getFeedTx(s.agencyId).stops.put(s.id, s); -// count ++; -// } -// -// System.out.println("Read " + count + " stops"); -// -// } -// -// /** Read the routes */ -// private void readRoutes () throws Exception { -// System.out.println("Reading routes"); -// DatabaseCsv reader = getCsvReader("route.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// Route r = new Route(); -// r.id = reader.retrieve("id"); -// r.comments = reader.retrieve("comments"); -// r.gtfsRouteId = reader.retrieve("gtfsrouteid"); -// r.routeColor = reader.retrieve("routecolor"); -// r.routeDesc = reader.retrieve("routedesc"); -// r.routeLongName = reader.retrieve("routelongname"); -// r.routeShortName = reader.retrieve("routeshortname"); -// r.routeTextColor = reader.retrieve("routetextcolor"); -// r.routeUrl = reader.retrieve("routeurl"); -// String status = reader.retrieve("status"); -// r.status = status != null ? StatusType.valueOf(status) : null; -// r.wheelchairBoarding = reader.getAvail("wheelchairboarding"); -// r.agencyId = reader.retrieve("agency_id"); -// r.routeTypeId = reader.retrieve("routetype_id"); -// -// // cache the agency ID -// routeAgencyMap.put(Long.parseLong(r.id), Long.parseLong(r.agencyId)); -// -// getFeedTx(r.agencyId).routes.put(r.id, r); -// count++; -// } -// -// System.out.println("Read " + count + " routes"); -// } -// -// /** -// * Read in the trip shapes. We put them in a MapDB keyed by Shape ID, because we don't store them directly; -// * rather, we copy them into their respective trip patterns when we import the patterns. -// */ -// private void readShapes () throws Exception { -// System.out.println("Reading shapes"); -// DatabaseCsv reader = getCsvReader("shapes.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// shapeCache.put(reader.retrieve("id"), reader.getLineString("shape")); -// count++; -// } -// -// System.out.println("Read " + count + " shapes"); -// } -// -// /** read and cache the trip pattern stops */ -// private void readPatternStops () throws Exception { -// System.out.println("Reading trip pattern stops"); -// DatabaseCsv reader = getCsvReader("patternstop.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// TripPatternStop tps = new TripPatternStop(); -// Integer dtt = reader.getInteger("defaulttraveltime"); -// tps.defaultTravelTime = dtt != null ? dtt : 0; -// Integer ddt = reader.getInteger("defaultdwelltime"); -// tps.defaultDwellTime = ddt != null ? ddt : 0; -// tps.timepoint = reader.getBoolean("timepoint"); -// tps.stopId = reader.retrieve("stop_id"); -// // note: not reading shape_dist_traveled as it was incorrectly computed. We'll recompute at the end. -// -// Fun.Tuple2 key = new Fun.Tuple2(reader.retrieve("pattern_id"), reader.getInteger("stopsequence")); -// -// // make sure that we don't have a mess on our hands due to data import issues far in the past. -// if (patternStopCache.containsKey(key)) { -// throw new IllegalStateException("Duplicate pattern stops!"); -// } -// -// patternStopCache.put(key, tps); -// count++; -// } -// -// System.out.println("Read " + count + " pattern stops"); -// } -// -// /** Read the trip patterns */ -// private void readTripPatterns () throws Exception { -// System.out.println("Reading trip patterns"); -// DatabaseCsv reader = getCsvReader("trippattern.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// TripPattern p = new TripPattern(); -// p.id = reader.retrieve("id"); -// p.headsign = reader.retrieve("headsign"); -// p.name = reader.retrieve("name"); -// p.routeId = reader.retrieve("route_id"); -// String shapeId = reader.retrieve("shape_id"); -// p.shape = shapeId != null ? shapeCache.retrieve(shapeId) : null; -// -// // retrieve the pattern stops -// p.patternStops = new ArrayList(); -// p.patternStops.addAll(patternStopCache.subMap(new Fun.Tuple2(p.id, null), new Fun.Tuple2(p.id, Fun.HI)).values()); -// -// p.agencyId = routeAgencyMap.retrieve(Long.parseLong(p.routeId)) + ""; -// patternAgencyMap.put(Long.parseLong(p.id), Long.parseLong(p.agencyId)); -// -// p.calcShapeDistTraveled(getFeedTx(p.agencyId)); -// -// getFeedTx(p.agencyId).tripPatterns.put(p.id, p); -// count++; -// } -// -// System.out.println("Read " + count + " trip patterns"); -// } -// -// /** Read the stop times and cache them */ -// private void readStopTimes () throws Exception { -// System.out.println("Reading stop times (this could take a while) . . ."); -// DatabaseCsv reader = getCsvReader("stoptime.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// if (++count % 100000 == 0) { -// System.out.println(count + " stop times read . . ."); -// } -// -// StopTime st = new StopTime(); -// st.arrivalTime = reader.getInteger("arrivaltime"); -// st.departureTime = reader.getInteger("departuretime"); -// // note: not reading shape_dist_traveled as it was incorrectly computed. We'll recompute at the end. -// -// st.stopHeadsign = reader.retrieve("stopheadsign"); -// st.dropOffType = reader.getPdType("dropofftype"); -// st.pickupType = reader.getPdType("pickuptype"); -// st.stopId = reader.retrieve("stop_id"); -// -// Fun.Tuple2 key = new Fun.Tuple2(reader.retrieve("trip_id"), reader.getInteger("stopsequence")); -// -// if (stopTimeCache.containsKey(key)) { -// throw new IllegalStateException("Duplicate stop times!"); -// } -// -// stopTimeCache.put(key, st); -// } -// -// System.out.println("read " + count + " stop times"); -// } -// -// private void readTrips () throws Exception { -// DatabaseCsv reader = getCsvReader("trip.csv"); -// reader.readHeaders(); -// int count = 0; -// int stCount = 0; -// -// while (reader.readRecord()) { -// Trip t = new Trip(); -// t.id = reader.retrieve("id"); -// t.blockId = reader.retrieve("blockid"); -// t.endTime = reader.getInteger("endtime"); -// t.gtfsTripId = reader.retrieve("gtfstripid"); -// t.headway = reader.getInteger("headway"); -// t.invalid = reader.getBoolean("invalid"); -// t.startTime = reader.getInteger("starttime"); -// t.tripDescription = reader.retrieve("tripdescription"); -// String dir = reader.retrieve("tripdirection"); -// t.tripDirection = dir != null ? TripDirection.valueOf(dir) : null; -// t.tripHeadsign = reader.retrieve("tripheadsign"); -// t.tripShortName = reader.retrieve("tripshortname"); -// t.useFrequency = reader.getBoolean("usefrequency"); -// t.wheelchairBoarding = reader.getAvail("wheelchairboarding"); -// t.patternId = reader.retrieve("pattern_id"); -// t.routeId = reader.retrieve("route_id"); -// t.calendarId = reader.retrieve("servicecalendar_id"); -// t.agencyId = routeAgencyMap.retrieve(Long.parseLong(t.routeId)) + ""; -// -// // retrieve stop times -// // make sure we put nulls in as needed for skipped stops -// t.stopTimes = new ArrayList(); -// -// // loop over the pattern stops and find the stop times that match -// for (Map.Entry, TripPatternStop> entry : -// patternStopCache.subMap(new Fun.Tuple2(t.patternId, null), new Fun.Tuple2(t.patternId, Fun.HI)).entrySet()) { -// // retrieve the appropriate stop time, or null if the stop is skipped -// StopTime st = stopTimeCache.retrieve(new Fun.Tuple2(t.id, entry.getKey().b)); -// t.stopTimes.add(st); -// -// if (st != null) -// stCount++; -// } -// -// count++; -// -// getFeedTx(t.agencyId).trips.put(t.id, t); -// } -// -// System.out.println("Read " + count + " trips"); -// System.out.println("Associated " + stCount + " stop times with trips"); -// } -// -// private void readRouteTypes () throws Exception { -// System.out.println("Reading route types"); -// -// DatabaseCsv reader = getCsvReader("routetype.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// RouteType rt = new RouteType(); -// rt.id = reader.retrieve("id"); -// rt.description = reader.retrieve("description"); -// String grt = reader.retrieve("gtfsroutetype"); -// rt.gtfsRouteType = grt != null ? GtfsRouteType.valueOf(grt) : null; -// String hvt = reader.retrieve("hvtroutetype"); -// rt.hvtRouteType = hvt != null ? HvtRouteType.valueOf(hvt) : null; -// rt.localizedVehicleType = reader.retrieve("localizedvehicletype"); -// gtx.routeTypes.put(rt.id, rt); -// count++; -// } -// -// System.out.println("Imported " + count + " route types"); -// } -// -// private void readCalendars () throws Exception { -// System.out.println("Reading calendars"); -// DatabaseCsv reader = getCsvReader("servicecalendar.csv"); -// reader.readHeaders(); -// int count = 0; -// -// while (reader.readRecord()) { -// ServiceCalendar c = new ServiceCalendar(); -// c.id = reader.retrieve("id"); -// c.description = reader.retrieve("description"); -// c.endDate = reader.getLocalDate("enddate"); -// c.startDate = reader.getLocalDate("startdate"); -// c.gtfsServiceId = reader.retrieve("gtfsserviceid"); -// c.monday = reader.getBoolean("monday"); -// c.tuesday = reader.getBoolean("tuesday"); -// c.wednesday = reader.getBoolean("wednesday"); -// c.thursday = reader.getBoolean("thursday"); -// c.friday = reader.getBoolean("friday"); -// c.saturday = reader.getBoolean("saturday"); -// c.sunday = reader.getBoolean("sunday"); -// c.agencyId = reader.retrieve("agency_id"); -// -// getFeedTx(c.agencyId).calendars.put(c.id, c); -// count++; -// } -// -// System.out.println("Imported " + count + " calendars"); -// } -// -// private void readExceptionDates () throws Exception { -// System.out.println("Reading exception dates"); -// DatabaseCsv reader = getCsvReader("exception_dates.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// exceptionDates.put(reader.retrieve("scheduleexception_id"), reader.getLocalDate("dates")); -// count++; -// } -// -// System.out.println("Read " + count + " exception dates"); -// } -// -// private void readExceptionCustomCalendars () throws Exception { -// System.out.println("Reading exception calendars"); -// DatabaseCsv reader = getCsvReader("exception_calendars.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// exceptionCalendars.put(reader.retrieveById("scheduleexception_id"), reader.retrieveById("customschedule_id")); -// count++; -// } -// -// System.out.println("Read " + count + " exception calendars"); -// } -// -// private void readExceptions () throws Exception { -// System.out.println("Reading exceptions"); -// DatabaseCsv reader = getCsvReader("exception.csv"); -// reader.readHeaders(); -// -// int count = 0; -// -// while (reader.readRecord()) { -// ScheduleException e = new ScheduleException(); -// e.id = reader.retrieve("id"); -// e.exemplar = ScheduleException.ExemplarServiceDescriptor.valueOf(reader.retrieve("exemplar")); -// e.name = reader.retrieve("name"); -// e.agencyId = reader.retrieve("agency_id"); -// -// e.dates = new ArrayList(exceptionDates.retrieve(e.id)); -// e.customSchedule = new ArrayList(exceptionCalendars.retrieve(e.id)); -// -// getFeedTx(e.agencyId).exceptions.put(e.id, e); -// count++; -// } -// -// System.out.println("Read " + count + " exceptions"); -// } -// -// private DatabaseCsv getCsvReader(String file) { -// try { -// InputStream is = new FileInputStream(new File(fromDirectory, file)); -// return new DatabaseCsv(new CsvReader(is, ',', Charset.forName("UTF-8"))); -// } catch (Exception e) { -// e.printStackTrace(); -// throw new RuntimeException(e); -// } -// } -// -// private FeedTx getFeedTx (String agencyId) { -// if (!atxes.containsKey(agencyId)) -// atxes.put(agencyId, VersionedDataStore.getFeedTx(agencyId)); -// -// return atxes.retrieve(agencyId); -// } -// -// private static class DatabaseCsv { -// private CsvReader reader; -// -// private static Pattern datePattern = Pattern.compile("^([1-9][0-9]{3})-([0-9]{2})-([0-9]{2})"); -// -// public DatabaseCsv(CsvReader reader) { -// this.reader = reader; -// } -// -// public boolean readHeaders() throws IOException { -// return reader.readHeaders(); -// } -// -// public boolean readRecord () throws IOException { -// return reader.readRecord(); -// } -// -// public String retrieve (String column) throws IOException { -// String ret = reader.retrieve(column); -// if (ret.isEmpty()) -// return null; -// -// return ret; -// } -// -// public Double getDouble(String column) { -// try { -// String dbl = reader.retrieve(column); -// return Double.parseDouble(dbl); -// } catch (Exception e) { -// return null; -// } -// } -// -// public StopTimePickupDropOffType getPdType (String column) throws Exception { -// String val = reader.retrieve(column); -// -// try { -// return StopTimePickupDropOffType.valueOf(val); -// } catch (Exception e) { -// return null; -// } -// } -// -// public Boolean getBoolean (String column) throws Exception { -// String val = retrieve(column); -// -// if (val == null) -// return null; -// -// switch (val.charAt(0)) { -// case 't': -// return Boolean.TRUE; -// case 'f': -// return Boolean.FALSE; -// default: -// return null; -// } -// -// } -// -// public LineString getLineString (String column) throws Exception { -// String val = reader.retrieve(column); -// -// try { -// return (LineString) new WKTReader().read(val); -// } catch (Exception e) { -// return null; -// } -// } -// -// public AttributeAvailabilityType getAvail (String column) throws Exception { -// String val = reader.retrieve(column); -// -// try { -// return AttributeAvailabilityType.valueOf(val); -// } catch (Exception e) { -// return null; -// } -// } -// -// public Integer getInteger (String column) throws Exception { -// String val = reader.retrieve(column); -// -// try { -// return Integer.parseInt(val); -// } catch (Exception e) { -// return null; -// } -// } -// -// public LocationType getLocationType (String column) throws Exception { -// String val = reader.retrieve(column); -// -// try { -// return LocationType.valueOf(val); -// } catch (Exception e) { -// return null; -// } -// } -// -// public LocalDate getLocalDate (String column) throws Exception { -// String val = retrieve(column); -// -// try { -// Matcher m = datePattern.matcher(val); -// -// if (!m.matches()) -// return null; -// -// return LocalDate.of(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3))); -// } catch (Exception e) { -// return null; -// } -// } -// } -} diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/SnapshotTx.java b/src/main/java/com/conveyal/datatools/editor/datastore/SnapshotTx.java deleted file mode 100644 index 5ebbb55d0..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/SnapshotTx.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.conveyal.gtfs.model.Calendar; -import com.conveyal.datatools.editor.models.transit.Route; -import com.conveyal.datatools.editor.models.transit.ScheduleException; -import com.conveyal.datatools.editor.models.transit.Stop; -import com.conveyal.datatools.editor.models.transit.Trip; -import com.conveyal.datatools.editor.models.transit.TripPattern; -import com.conveyal.datatools.editor.models.transit.TripPatternStop; -import org.mapdb.BTreeMap; -import org.mapdb.DB; -import org.mapdb.Fun.Tuple2; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -/** represents a snapshot database. It's generally not actually a transaction, but rather writing to a transactionless db, for speed */ -public class SnapshotTx extends DatabaseTx { - /** create a snapshot database */ - public static final Logger LOG = LoggerFactory.getLogger(SnapshotTx.class); - public SnapshotTx(DB tx) { - super(tx); - } - - /** make the snapshot */ - public void make (FeedTx master) { - // make sure it's empty - if (tx.getAll().size() != 0) - throw new IllegalStateException("Cannot snapshot into non-empty db"); - - int acount = pump("agencies", (BTreeMap) master.agencies); - LOG.info("Snapshotted {} agencies", acount); - int rcount = pump("routes", (BTreeMap) master.routes); - LOG.info("Snapshotted {} routes", rcount); - int ccount = pump("calendars", (BTreeMap) master.calendars); - LOG.info("Snapshotted {} calendars", ccount); - int ecount = pump("exceptions", (BTreeMap) master.exceptions); - LOG.info("Snapshotted {} schedule exceptions", ecount); - int tpcount = pump("tripPatterns", (BTreeMap) master.tripPatterns); - LOG.info("Snapshotted {} patterns", tpcount); - int tcount = pump("trips", (BTreeMap) master.trips); - LOG.info("Snapshotted {} trips", tcount); - int scount = pump("stops", (BTreeMap) master.stops); - LOG.info("Snapshotted {} stops", scount); - int fcount = pump("fares", (BTreeMap) master.fares); - LOG.info("Snapshotted {} fares", fcount); - - // while we don't snapshot indices, we do need to snapshot histograms as they aren't restored - // (mapdb ticket 453) - pump("tripCountByCalendar", (BTreeMap) master.tripCountByCalendar); - pump("scheduleExceptionCountByDate", (BTreeMap) master.scheduleExceptionCountByDate); - pump("tripCountByPatternAndCalendar", (BTreeMap) master.tripCountByPatternAndCalendar); - - this.commit(); - LOG.info("Snapshot finished"); - } - - /** - * restore into an agency. this will OVERWRITE ALL DATA IN THE AGENCY's MASTER BRANCH, with the exception of stops - * @return any stop IDs that had been deleted and were restored so that this snapshot would be valid. - */ - public List restore (String agencyId) { - DB targetTx = VersionedDataStore.getRawFeedTx(agencyId); - try { - targetTx.getAll(); - } catch (RuntimeException e) { - LOG.error("Target FeedTX for feed restore may be corrupted. Consider wiping feed database editor/$FEED_ID/master.db*", e); - } - for (String obj : targetTx.getAll().keySet()) { - if (obj.equals("snapshotVersion") -// || obj.equals("stops") - ) - // except don't overwrite the counter that keeps track of snapshot versions - // we also don't overwrite the stops completely, as we need to merge them - // NOTE: we are now overwriting the stops completely... - continue; - else - targetTx.delete(obj); - } - - int acount, rcount, ccount, ecount, pcount, tcount, fcount, scount; - - if (tx.exists("agencies")) - acount = pump(targetTx, "agencies", (BTreeMap) this.getMap("agencies")); - else - acount = 0; - LOG.info("Restored {} agencies", acount); - - if (tx.exists("routes")) - rcount = pump(targetTx, "routes", (BTreeMap) this.getMap("routes")); - else - rcount = 0; - LOG.info("Restored {} routes", rcount); - - if (tx.exists("stops")) - scount = pump(targetTx, "stops", (BTreeMap) this.getMap("stops")); - else - scount = 0; - LOG.info("Restored {} stops", scount); - - if (tx.exists("calendars")) - ccount = pump(targetTx, "calendars", (BTreeMap) this.getMap("calendars")); - else - ccount = 0; - LOG.info("Restored {} calendars", ccount); - - if (tx.exists("exceptions")) - ecount = pump(targetTx, "exceptions", (BTreeMap) this.getMap("exceptions")); - else - ecount = 0; - LOG.info("Restored {} schedule exceptions", ecount); - - if (tx.exists("tripPatterns")) - pcount = pump(targetTx, "tripPatterns", (BTreeMap) this.getMap("tripPatterns")); - else - pcount = 0; - LOG.info("Restored {} patterns", pcount); - - if (tx.exists("trips")) - tcount = pump(targetTx, "trips", (BTreeMap) this.getMap("trips")); - else - tcount = 0; - LOG.info("Restored {} trips", tcount); - - if (tx.exists("fares")) - fcount = pump(targetTx, "fares", (BTreeMap) this.getMap("fares")); - else - fcount = 0; - LOG.info("Restored {} fares", fcount); - - // restore histograms, see jankotek/mapdb#453 - if (tx.exists("tripCountByCalendar")) - pump(targetTx, "tripCountByCalendar", (BTreeMap) this.getMap("tripCountByCalendar")); - - if (tx.exists("tripCountByPatternAndCalendar")) - pump(targetTx, "tripCountByPatternAndCalendar", - (BTreeMap) this., Long>getMap("tripCountByPatternAndCalendar")); - - // make an FeedTx to build indices and restore stops - LOG.info("Rebuilding indices, this could take a little while . . . "); - FeedTx atx = new FeedTx(targetTx); - LOG.info("done."); - - LOG.info("Restoring deleted stops"); - -// // restore any stops that have been deleted -// List restoredStops = new ArrayList(); -// if (tx.exists("stops")) { -// BTreeMap oldStops = this.getMap("stops"); -// -// for (TripPattern tp : atx.tripPatterns.values()) { -// for (TripPatternStop ps : tp.patternStops) { -// if (!atx.stops.containsKey(ps.stopId)) { -// Stop stop = oldStops.retrieve(ps.stopId); -// atx.stops.put(ps.stopId, stop); -// restoredStops.add(stop); -// } -// } -// } -// } -// LOG.info("Restored {} deleted stops", restoredStops.size()); -// - atx.commit(); -// -// return restoredStops; - return new ArrayList<>(); - } - - /** close the underlying data store */ - public void close () { - tx.close(); - closed = true; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/datastore/VersionedDataStore.java b/src/main/java/com/conveyal/datatools/editor/datastore/VersionedDataStore.java deleted file mode 100644 index 91853e5f0..000000000 --- a/src/main/java/com/conveyal/datatools/editor/datastore/VersionedDataStore.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.conveyal.datatools.editor.datastore; - -import com.conveyal.datatools.manager.DataManager; -import com.conveyal.datatools.editor.models.Snapshot; -import com.conveyal.datatools.editor.models.transit.Stop; -import com.google.common.collect.Maps; -import org.mapdb.BTreeMap; -import org.mapdb.DB; -import org.mapdb.DBMaker; -import org.mapdb.TxMaker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.conveyal.datatools.editor.utils.ClassLoaderSerializer; - -import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.NavigableSet; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Create a new versioned com.conveyal.datatools.editor.datastore. A versioned data store handles multiple databases, - * the global DB and the agency-specific DBs. It handles creating transactions, and saving and restoring - * snapshots. - * @author mattwigway - * - */ -public class VersionedDataStore { - public static final Logger LOG = LoggerFactory.getLogger(VersionedDataStore.class); - private static File dataDirectory = new File(DataManager.getConfigPropertyAsText("application.data.editor_mapdb")); - private static TxMaker globalTxMaker; - - // FIXME: is changing from Maps.newConcurrentMap() suitable here? Check with mattwigway. - private static ConcurrentHashMap feedTxMakers = new ConcurrentHashMap<>(); - - static { - File globalDataDirectory = new File(dataDirectory, "global"); - globalDataDirectory.mkdirs(); - - // initialize the global database - globalTxMaker = DBMaker.newFileDB(new File(globalDataDirectory, "global.db")) - .mmapFileEnable() - .asyncWriteEnable() - .compressionEnable() - .closeOnJvmShutdown() - .makeTxMaker(); - } - - /** Start a transaction in the global database */ - public static GlobalTx getGlobalTx () { - return new GlobalTx(globalTxMaker.makeTx()); - } - - /** - * Start a transaction in an agency database. No checking is done to ensure the agency exists; - * if it does not you will retrieveById a (hopefully) empty DB, unless you've done the same thing previously. - */ - public static FeedTx getFeedTx(String feedId) { - return new FeedTx(getRawFeedTx(feedId)); - } - - /** - * Get a raw MapDB transaction for the given database. Use at your own risk - doesn't properly handle indexing, etc. - * Intended for use primarily with database restore - */ - static DB getRawFeedTx(String feedId) { - if (!feedTxMakers.containsKey(feedId)) { - synchronized (feedTxMakers) { - if (!feedTxMakers.containsKey(feedId)) { - File path = new File(dataDirectory, feedId); - path.mkdirs(); - - TxMaker agencyTxm = DBMaker.newFileDB(new File(path, "master.db")) - .mmapFileEnable() - .compressionEnable() - .asyncWriteEnable() - .closeOnJvmShutdown() - .asyncWriteFlushDelay(5) - .makeTxMaker(); - - feedTxMakers.put(feedId, agencyTxm); - } - } - } - - return feedTxMakers.get(feedId).makeTx(); - } - - /** - * WARNING: do not use unless you absolutely intend to delete active editor data for a given feedId. - * This function will delete the mapdb files for the specified feedId, but leave the snapshots for - * this feed intact. So this should only really be used for if/when an editor feed becomes corrupted. - * In that case, the steps to follow are: - * 1. Create snapshot of latest changes for feed. - * 2. Call this function. - * 3. Restore latest snapshot (new feed DB will be created where the deleted one once lived). - */ - public static void wipeFeedDB(String feedId) { - File path = new File(dataDirectory, feedId); - String[] extensions = {".db", ".db.p", ".db.t"}; - LOG.warn("Permanently deleting Feed DB for {}", feedId); - - // remove entry for feedId in feedTxMaker - feedTxMakers.remove(feedId); - // delete local cache files (including zip) when feed removed from cache - for (String type : extensions) { - File file = new File(path, "master" + type); - file.delete(); - } - } - - public static Snapshot takeSnapshot (String feedId, String name, String comment) { - return takeSnapshot(feedId, null, name, comment); - } - - /** Take a snapshot of an agency database. The snapshot will be saved in the global database. */ - public static Snapshot takeSnapshot (String feedId, String feedVersionId, String name, String comment) { - FeedTx tx = null; - GlobalTx gtx = null; - boolean transactionCommitError = false; - int version = -1; - DB snapshot = null; - Snapshot ret; - try { - tx = getFeedTx(feedId); - gtx = getGlobalTx(); - version = tx.getNextSnapshotId(); - LOG.info("Creating snapshot {} for feed {}", version, feedId); - long startTime = System.currentTimeMillis(); - - ret = new Snapshot(feedId, version); - - // if we encounter a duplicate snapshot ID, increment until there is a safe one - if (gtx.snapshots.containsKey(ret.id)) { - LOG.error("Duplicate snapshot IDs, incrementing until we have a fresh one."); - while(gtx.snapshots.containsKey(ret.id)) { - version = tx.getNextSnapshotId(); - LOG.info("Attempting to create snapshot {} for feed {}", version, feedId); - ret = new Snapshot(feedId, version); - } - } - - ret.snapshotTime = System.currentTimeMillis(); - ret.feedVersionId = feedVersionId; - ret.name = name; - ret.comment = comment; - ret.current = true; - - snapshot = getSnapshotDb(feedId, version, false); - - // if snapshot contains maps, increment the version ID until we find a snapshot that is empty - while (snapshot.getAll().size() != 0) { - version = tx.getNextSnapshotId(); - LOG.info("Attempting to create snapshot {} for feed {}", version, feedId); - ret = new Snapshot(feedId, version); - snapshot = getSnapshotDb(feedId, version, false); - } - - new SnapshotTx(snapshot).make(tx); - // for good measure - snapshot.commit(); - snapshot.close(); - - gtx.snapshots.put(ret.id, ret); - gtx.commit(); - - // unfortunately if a mapdb gets corrupted, trying to commit this transaction will cause things - // to go all haywired. Further, if we try to rollback after this commit, the snapshot will fail. - // So we keep track of transactionCommitError here and avoid rollback if an error is encountered. - // This will throw an unclosed transaction error, but since the - try { - tx.commit(); - } catch (Exception e) { - transactionCommitError = true; - LOG.error("Error committing feed transaction", e); - } - String snapshotMessage = String.format("Saving snapshot took %.2f seconds", (System.currentTimeMillis() - startTime) / 1000D); - LOG.info(snapshotMessage); - - - return ret; - } catch (Exception e) { - // clean up - if (snapshot != null && !snapshot.isClosed()) - snapshot.close(); - - if (version >= 0) { - File snapshotDir = getSnapshotDir(feedId, version); - - if (snapshotDir.exists()) { - for (File file : snapshotDir.listFiles()) { - file.delete(); - } - } - } -// if (tx != null) tx.rollbackIfOpen(); -// gtx.rollbackIfOpen(); - // re-throw - throw new RuntimeException(e); - } finally { - if (tx != null && !transactionCommitError) tx.rollbackIfOpen(); - if (gtx != null) gtx.rollbackIfOpen(); - } - } - - /** - * restore a snapshot. - * @return a list of stops that were restored from deletion to make this snapshot valid. - */ - public static List restore (Snapshot s) { - SnapshotTx tx = new SnapshotTx(getSnapshotDb(s.feedId, s.version, true)); - try { - LOG.info("Restoring snapshot {} of agency {}", s.version, s.feedId); - long startTime = System.currentTimeMillis(); - List ret = tx.restore(s.feedId); - LOG.info(String.format("Restored snapshot in %.2f seconds", (System.currentTimeMillis() - startTime) / 1000D)); - return ret; - } finally { - tx.close(); - } - } - - /** retrieveById the directory in which to store a snapshot */ - public static DB getSnapshotDb (String feedId, int version, boolean readOnly) { - File thisSnapshotDir = getSnapshotDir(feedId, version); - thisSnapshotDir.mkdirs(); - File snapshotFile = new File(thisSnapshotDir, "snapshot_" + version + ".db"); - - // we don't use transactions for snapshots - makes them faster - // and smaller. - // at the end everything gets committed and flushed to disk, so this thread - // will not complete until everything is done. - // also, we compress the snapshot databases - DBMaker maker = DBMaker.newFileDB(snapshotFile) - .compressionEnable(); - - if (readOnly) - maker.readOnly(); - - return maker.make(); - } - - /** retrieveById the directory in which a snapshot is stored */ - public static File getSnapshotDir (String feedId, int version) { - File agencyDir = new File(dataDirectory, feedId); - File snapshotsDir = new File(agencyDir, "snapshots"); - return new File(snapshotsDir, "" + version); - } - - /** Convenience function to check if a feed exists */ - public static boolean feedExists(String feedId) { - GlobalTx tx = getGlobalTx(); - boolean exists = tx.feeds.containsKey(feedId); - tx.rollback(); - return exists; - } - - /** Get a (read-only) agency TX into a particular snapshot version of an agency */ - public static FeedTx getFeedTx(String feedId, int version) { - DB db = getSnapshotDb(feedId, version, true); - return new FeedTx(db, false); - } - - /** A wrapped transaction, so the database just looks like a POJO */ - public static class DatabaseTx { - /** the database (transaction). subclasses must initialize. */ - protected final DB tx; - - /** has this transaction been closed? */ - boolean closed = false; - - /** Convenience function to retrieveById a map */ - protected final BTreeMap getMap (String name) { - return tx.createTreeMap(name) - // use java serialization to allow for schema upgrades - .valueSerializer(new ClassLoaderSerializer()) - .makeOrGet(); - } - - /** - * Convenience function to retrieveById a set. These are used as indices so they use the default serialization; - * if we make a schema change we drop and recreate them. - */ - protected final NavigableSet getSet (String name) { - return tx.createTreeSet(name) - .makeOrGet(); - } - - protected DatabaseTx (DB tx) { - this.tx = tx; - } - - public void commit() { - tx.commit(); - closed = true; - } - - public void rollback() { - tx.rollback(); - closed = true; - } - - /** roll this transaction back if it has not been committed or rolled back already */ - public void rollbackIfOpen () { - if (!closed) rollback(); - } - - protected final void finalize () { - if (!closed) { - LOG.error("DB transaction left unclosed, this signifies a memory leak!"); - rollback(); - } - } - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/jobs/ConvertEditorMapDBToSQL.java b/src/main/java/com/conveyal/datatools/editor/jobs/ConvertEditorMapDBToSQL.java deleted file mode 100644 index 50eb5ac48..000000000 --- a/src/main/java/com/conveyal/datatools/editor/jobs/ConvertEditorMapDBToSQL.java +++ /dev/null @@ -1,354 +0,0 @@ -package com.conveyal.datatools.editor.jobs; - -import com.conveyal.datatools.common.status.MonitorableJob; -import com.conveyal.datatools.editor.datastore.FeedTx; -import com.conveyal.datatools.editor.datastore.VersionedDataStore; -import com.conveyal.datatools.editor.models.transit.Route; -import com.conveyal.datatools.editor.models.transit.ScheduleException; -import com.conveyal.datatools.editor.models.transit.ServiceCalendar; -import com.conveyal.datatools.editor.models.transit.Trip; -import com.conveyal.datatools.editor.models.transit.TripPattern; -import com.conveyal.datatools.editor.models.transit.TripPatternStop; -import com.conveyal.datatools.manager.DataManager; -import com.conveyal.datatools.manager.auth.Auth0UserProfile; -import com.conveyal.datatools.manager.models.FeedSource; -import com.conveyal.datatools.manager.models.Snapshot; -import com.conveyal.datatools.manager.persistence.Persistence; -import com.conveyal.gtfs.GTFSFeed; -import com.conveyal.gtfs.loader.FeedLoadResult; -import com.conveyal.gtfs.loader.JdbcGtfsLoader; -import com.conveyal.gtfs.loader.Table; -import org.apache.commons.dbutils.DbUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.sql.DataSource; -import java.sql.Array; -import java.sql.Connection; -import java.sql.JDBCType; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.Iterator; -import java.util.List; - -import static com.conveyal.gtfs.loader.DateField.GTFS_DATE_FORMATTER; -import static com.mongodb.client.model.Filters.and; -import static com.mongodb.client.model.Filters.eq; - -public class ConvertEditorMapDBToSQL extends MonitorableJob { - private final String feedId; - private final Integer versionNumber; - private static final Logger LOG = LoggerFactory.getLogger(ConvertEditorMapDBToSQL.class); - private Connection connection; - private DataSource dataSource; - - public ConvertEditorMapDBToSQL(String feedId, Integer versionNumber) { - // FIXME owner and job name - super(Auth0UserProfile.createSystemUser(), "Create snapshot from legacy editor", JobType.CONVERT_EDITOR_MAPDB_TO_SQL); - this.feedId = feedId; - this.versionNumber = versionNumber; - } - - @Override - public void jobLogic() { - try { - // Iterate over the provided snapshots and convert each one. Note: this will skip snapshots for feed IDs that - // don't exist as feed sources in MongoDB. - FeedSource feedSource = Persistence.feedSources.getById(feedId); - if (feedSource == null) { - LOG.warn("Not converting snapshot. Feed source Id {} does not exist in application data", feedId); - return; - } - Snapshot matchingSnapshot = Persistence.snapshots.getOneFiltered( - and( - eq("version", versionNumber), - eq(Snapshot.FEED_SOURCE_REF, feedId) - ) - ); - boolean snapshotExists = true; - if (matchingSnapshot == null) { - snapshotExists = false; - matchingSnapshot = new Snapshot("Imported", feedId, "mapdb_editor"); - } - FeedTx feedTx; - // FIXME: This needs to share a connection with the snapshotter. - // Create connection for each snapshot - // FIXME: use GTFS_DATA_SOURCE - dataSource = DataManager.GTFS_DATA_SOURCE; - connection = dataSource.getConnection(); // DataManager.GTFS_DATA_SOURCE.getConnection(); - - // retrieveById present feed database if no snapshot version provided - boolean setEditorBuffer = false; - if (versionNumber == null) { - setEditorBuffer = true; - feedTx = VersionedDataStore.getFeedTx(feedId); - } - // else retrieveById snapshot version data - else { - feedTx = VersionedDataStore.getFeedTx(feedId, versionNumber); - } - - LOG.info("Converting {}.{} to SQL", feedId, versionNumber); - // Convert mapdb to SQL - FeedLoadResult convertFeedResult = convertFeed(feedId, versionNumber, feedTx); - // Update manager snapshot with result details. - matchingSnapshot.snapshotOf = "mapdb_editor"; - matchingSnapshot.namespace = convertFeedResult.uniqueIdentifier; - matchingSnapshot.feedLoadResult = convertFeedResult; - LOG.info("Storing snapshot {}", matchingSnapshot.id); - if (snapshotExists) Persistence.snapshots.replace(matchingSnapshot.id, matchingSnapshot); - else Persistence.snapshots.create(matchingSnapshot); - if (setEditorBuffer) { - // If there is no version, that indicates that this was from the editor buffer for that feedId. - // Make this snapshot the editor namespace buffer. - LOG.info("Updating active snapshot to {}", matchingSnapshot.id); - FeedSource updatedFeedSource = Persistence.feedSources.updateField( - feedSource.id, "editorNamespace", matchingSnapshot.namespace); - LOG.info("Editor namespace: {}", updatedFeedSource.editorNamespace); - } - connection.commit(); - } catch (SQLException e) { - e.printStackTrace(); - try { - connection.rollback(); - } catch (SQLException e1) { - e1.printStackTrace(); - } - } finally { - DbUtils.closeQuietly(connection); - } - } - - /** - * Convert a single MapDB Editor feed (snapshot or no) to a SQL-backed snapshot. - */ - private FeedLoadResult convertFeed(String feedId, Integer version, FeedTx feedTx) throws SQLException { - GTFSFeed feed; - - feed = feedTx.toGTFSFeed(true); - - // STEP 1: Write GTFSFeed into SQL database. There are some gaps remaining after this process wraps up: - // - Routes doesn't have publicly_visible and status fields - // - Patterns do not exist - // - Pattern stops table does not exist, so it needs to be created and populated. - // - FIXME No schedule exceptions.... ugh... - // - Trips need pattern ID - - // FIXME Does FeedLoadResult need to be populated with more info about the load? (Currently it's just - // namespace and load time. - FeedLoadResult feedLoadResult = feed.toSQL(dataSource); - if (feedLoadResult.fatalException != null) { - throw new SQLException(String.format("Fatal exception converting %s.%d to SQL", feedId, version)); - } - String namespace = feedLoadResult.uniqueIdentifier; - - // FIXME: This needs to be done in the same transaction as the above operation. - // Iterate over routes and update - int batchSize = 0; - String tableName = String.join(".", namespace, Table.ROUTES.name); - String updateSql = String.format("update %s set status=?, publicly_visible=? where route_id = ?", tableName); - PreparedStatement updateRouteStatement = connection.prepareStatement(updateSql); - if (feedTx.routes != null) { - LOG.info("Updating status, publicly_visible for {} routes", feedTx.routes.size()); // FIXME NPE if (feedTx.routes != null) - for (com.conveyal.datatools.editor.models.transit.Route route : feedTx.routes.values()) { - // FIXME: Maybe it's risky to update on gtfs route ID (which may not be unique for some feeds). - // Could we alternatively update on ID field (not sure what the value for each route will be after - // insertion)? - updateRouteStatement.setInt(1, route.status == null ? 0 : route.status.toInt()); - int publiclyVisible = route.publiclyVisible == null ? 0 : route.publiclyVisible ? 1 : 0; - updateRouteStatement.setInt(2, publiclyVisible); - updateRouteStatement.setString(3, route.gtfsRouteId); - // FIXME: Do something with the return value? E.g., rollback if it hits more than one route. - // FIXME: Do this in batches? - updateRouteStatement.addBatch(); - batchSize += 1; - batchSize = handleBatchExecution(batchSize, updateRouteStatement); - } - // Handle any remaining updates. - updateRouteStatement.executeBatch(); - } else { - LOG.warn("Skipping routes conversion (feedTx.routes is null)"); - } - - // Annoyingly, a number of fields on the Editor Trip class differ from the gtfs-lib Trip class (e.g., - // patternId and calendarId refer to the editor Model#ID field not the GTFS key field). So we first - // convert the trips to gtfs trips and then insert them into the database. And while we're at it, we do - // this with stop times, too. - // OLD COMMENT: we can't use the trips-by-route index because we may be exporting a snapshot database without indices - if (feedTx.trips != null) { - batchSize = 0; - // Update pattern_id for trips. - String tripsTableName = String.join(".", namespace, Table.TRIPS.name); - LOG.info("Updating pattern_id for {} trips", feedTx.trips.size()); - String updateTripsSql = String.format("update %s set pattern_id=? where trip_id=?", tripsTableName); - PreparedStatement updateTripsStatement = connection.prepareStatement(updateTripsSql); - for (Trip trip : feedTx.trips.values()) { - TripPattern pattern = feedTx.tripPatterns.get(trip.patternId); - // FIXME: Should we exclude patterns from the original insert (GTFSFeed.toSQL)? These pattern IDs - // will not match those found in the GTFSFeed patterns. However, FeedTx.toGTFSFeed doesn't - // actually create patterns, so there are no patterns loaded to begin with. - updateTripsStatement.setString(1, pattern.id); - updateTripsStatement.setString(2, trip.gtfsTripId); - // FIXME: Do something with the return value? E.g., rollback if it hits more than one trip. - updateTripsStatement.addBatch(); - batchSize += 1; - // If we've accumulated a lot of prepared statement calls, pass them on to the database backend. - batchSize = handleBatchExecution(batchSize, updateTripsStatement); - // FIXME Need to cherry-pick frequency fixes made for Izmir/WRI - } - // Handle remaining updates. - updateTripsStatement.executeBatch(); - } - - // Pattern stops table has not yet been created because pattern stops do not exist in - // GTFSFeed. Note, we want this table to be created regardless of whether patterns exist or not - // (which is why it is outside of the check for null pattern map). - Table.PATTERN_STOP.createSqlTable(connection, namespace, true); - - // Insert all trip patterns and pattern stops into database (tables have already been created). - if (feedTx.tripPatterns != null) { - batchSize = 0; - // Handle inserting patterns - PreparedStatement insertPatternStatement = connection.prepareStatement( - Table.PATTERNS.generateInsertSql(namespace, true)); - // Handle inserting pattern stops - PreparedStatement insertPatternStopStatement = connection.prepareStatement( - Table.PATTERN_STOP.generateInsertSql(namespace, true)); - LOG.info("Inserting {} patterns", feedTx.tripPatterns.size()); - for (TripPattern pattern : feedTx.tripPatterns.values()) { - Route route = feedTx.routes.get(pattern.routeId); - insertPatternStatement.setString(1, pattern.id); - insertPatternStatement.setString(2, route.gtfsRouteId); - insertPatternStatement.setString(3, pattern.name); - if (pattern.patternDirection != null) { - insertPatternStatement.setInt(4, pattern.patternDirection.toGtfs()); - } else { - insertPatternStatement.setNull(4, JDBCType.INTEGER.getVendorTypeNumber()); - } - insertPatternStatement.setInt(5, pattern.useFrequency ? 1 : 0); - // Shape ID will match the pattern id for pattern geometries that have been converted to shapes. - // This process happens in FeedTx.toGTFSFeed. - insertPatternStatement.setString(6, pattern.id); - insertPatternStatement.addBatch(); - batchSize += 1; - // stop_sequence must be zero-based and incrementing to match stop_times values. - int stopSequence = 0; - for (TripPatternStop tripPatternStop : pattern.patternStops) { - // TripPatternStop's stop ID needs to be mapped to GTFS stop ID. - // FIXME Possible NPE? - String stopId = feedTx.stops.get(tripPatternStop.stopId).gtfsStopId; - insertPatternStopStatement.setString(1, pattern.id); - insertPatternStopStatement.setInt(2, stopSequence); - insertPatternStopStatement.setString(3, stopId); - insertPatternStopStatement.setInt(4, tripPatternStop.defaultTravelTime); - insertPatternStopStatement.setInt(5, tripPatternStop.defaultDwellTime); - insertPatternStopStatement.setInt(6, 0); - insertPatternStopStatement.setInt(7, 0); - if (tripPatternStop.shapeDistTraveled == null) { - insertPatternStopStatement.setNull(8, JDBCType.DOUBLE.getVendorTypeNumber()); - } else { - insertPatternStopStatement.setDouble(8, tripPatternStop.shapeDistTraveled); - } - if (tripPatternStop.timepoint == null) { - insertPatternStopStatement.setNull(9, JDBCType.INTEGER.getVendorTypeNumber()); - } else { - insertPatternStopStatement.setInt(9, tripPatternStop.timepoint ? 1 : 0); - } - insertPatternStopStatement.addBatch(); - batchSize += 1; - stopSequence += 1; - // If we've accumulated a lot of prepared statement calls, pass them on to the database backend. - batchSize = handleBatchExecution(batchSize, insertPatternStatement, insertPatternStopStatement); - } - // Handle remaining updates. - insertPatternStatement.executeBatch(); - insertPatternStopStatement.executeBatch(); - } - } - - - // FIXME: Handle calendars/service exceptions.... - // Add service calendars FIXME: delete calendars already in the table? - if (feedTx.calendars != null) { - // Handle inserting pattern stops - PreparedStatement insertCalendar = connection.prepareStatement( - Table.CALENDAR.generateInsertSql(namespace, true)); - batchSize = 0; - LOG.info("Inserting {} calendars", feedTx.calendars.size()); - for (ServiceCalendar cal : feedTx.calendars.values()) { - insertCalendar.setString(1, cal.gtfsServiceId); - insertCalendar.setInt(2, cal.monday ? 1 : 0); - insertCalendar.setInt(3, cal.tuesday ? 1 : 0); - insertCalendar.setInt(4, cal.wednesday ? 1 : 0); - insertCalendar.setInt(5, cal.thursday ? 1 : 0); - insertCalendar.setInt(6, cal.friday ? 1 : 0); - insertCalendar.setInt(7, cal.saturday ? 1 : 0); - insertCalendar.setInt(8, cal.sunday ? 1 : 0); - insertCalendar.setString(9, cal.startDate != null ? cal.startDate.format(GTFS_DATE_FORMATTER) : null); - insertCalendar.setString(10, cal.endDate != null ? cal.endDate.format(GTFS_DATE_FORMATTER) : null); - insertCalendar.setString(11, cal.description); - - insertCalendar.addBatch(); - batchSize += 1; - // If we've accumulated a lot of prepared statement calls, pass them on to the database backend. - batchSize = handleBatchExecution(batchSize, insertCalendar); - } - // Handle remaining updates. - insertCalendar.executeBatch(); - } - - // Create schedule exceptions table. - Table.SCHEDULE_EXCEPTIONS.createSqlTable(connection, namespace, true); - - // Add schedule exceptions (Note: calendar dates may be carried over from GTFSFeed.toSql, but these will - // ultimately be overwritten by schedule exceptions during Editor feed export. - if (feedTx.exceptions != null) { - batchSize = 0; - PreparedStatement insertException = connection.prepareStatement(Table.SCHEDULE_EXCEPTIONS.generateInsertSql(namespace, true)); - LOG.info("Inserting {} schedule exceptions", feedTx.exceptions.size()); - for (ScheduleException ex : feedTx.exceptions.values()) { - String[] dates = ex.dates != null - ? ex.dates.stream() - .map(localDate -> localDate.format(GTFS_DATE_FORMATTER)) - .toArray(String[]::new) - : new String[]{}; - Array datesArray = connection.createArrayOf("text", dates); - Array customArray = connection.createArrayOf("text", ex.customSchedule != null - ? ex.customSchedule.toArray(new String[0]) - : new String[]{}); - Array addedArray = connection.createArrayOf("text", ex.addedService != null - ? ex.addedService.toArray(new String[0]) - : new String[]{}); - Array removedArray = connection.createArrayOf("text", ex.removedService != null - ? ex.removedService.toArray(new String[0]) - : new String[]{}); - insertException.setString(1, ex.name); - insertException.setArray(2, datesArray); - insertException.setInt(3, ex.exemplar.toInt()); - insertException.setArray(4, customArray); - insertException.setArray(5, addedArray); - insertException.setArray(6, removedArray); - - insertException.addBatch(); - batchSize += 1; - // If we've accumulated a lot of prepared statement calls, pass them on to the database backend. - batchSize = handleBatchExecution(batchSize, insertException); - } - - // Handle remaining updates. - insertException.executeBatch(); - } - return feedLoadResult; - } - - private int handleBatchExecution(int batchSize, PreparedStatement ... preparedStatements) throws SQLException { - if (batchSize > JdbcGtfsLoader.INSERT_BATCH_SIZE) { - for (PreparedStatement statement : preparedStatements) { - statement.executeBatch(); - } - return 0; - } else { - return batchSize; - } - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/Snapshot.java b/src/main/java/com/conveyal/datatools/editor/models/Snapshot.java deleted file mode 100644 index 99d71a6c2..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/Snapshot.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.conveyal.datatools.editor.models; - -import com.conveyal.datatools.editor.datastore.GlobalTx; -import com.conveyal.datatools.editor.datastore.VersionedDataStore; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import java.io.File; -import java.io.IOException; -import java.time.LocalDate; - -import org.mapdb.Fun; -import org.mapdb.Fun.Tuple2; -import com.conveyal.datatools.editor.utils.JacksonSerializers; - -import java.io.Serializable; -import java.util.Collection; - -/** - * Represents a snapshot of an agency database. - * @author mattwigway - * - */ -public class Snapshot implements Cloneable, Serializable { - public static final long serialVersionUID = -2450165077572197392L; - - /** Is this snapshot the current snapshot - the most recently created or restored (i.e. the most current view of what's in master */ - public boolean current; - - /** The version of this snapshot */ - public int version; - - /** The name of this snapshot */ - public String name; - - /** The comment of this snapshot */ - public String comment; - - /** ID: agency ID, version */ - @JsonSerialize(using=JacksonSerializers.Tuple2IntSerializer.class) - @JsonDeserialize(using=JacksonSerializers.Tuple2IntDeserializer.class) - public Tuple2 id; - - /** The feed associated with this */ - public String feedId; - - /** The feed version this snapshot was generated from or published to, if any */ - public String feedVersionId; - - /** the date/time this snapshot was taken (millis since epoch) */ - public long snapshotTime; - - // TODO: these should become java.time.LocalDate - /** When is the earliest date that schedule information contained in this snapshot is valid? */ - @JsonSerialize(using = JacksonSerializers.LocalDateIsoSerializer.class) - @JsonDeserialize(using = JacksonSerializers.LocalDateIsoDeserializer.class) - public LocalDate validFrom; - - /** When is the last date that schedule information contained in this snapshot is valid? */ - @JsonSerialize(using = JacksonSerializers.LocalDateIsoSerializer.class) - @JsonDeserialize(using = JacksonSerializers.LocalDateIsoDeserializer.class) - public LocalDate validTo; - - /** Used for Jackson deserialization */ - public Snapshot () {} - - public Snapshot (String feedId, int version) { - this.feedId = feedId; - this.version = version; - this.computeId(); - } - - /** create an ID for this snapshot based on agency ID and version */ - public void computeId () { - this.id = new Tuple2(feedId, version); - } - - public Snapshot clone () { - try { - return (Snapshot) super.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - - public String generateFileName () { - return this.feedId + "_" + this.snapshotTime + ".zip"; - } - - @JsonIgnore - public static Collection getSnapshots (String feedId) { - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - return gtx.snapshots.subMap(new Tuple2(feedId, null), new Tuple2(feedId, Fun.HI)).values(); - } - - public static void deactivateSnapshots (String feedId, Snapshot ignore) { - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - Collection snapshots = Snapshot.getSnapshots(feedId); - try { - for (Snapshot o : snapshots) { - if (ignore != null && o.id.equals(ignore.id)) - continue; - - Snapshot cloned = o.clone(); - cloned.current = false; - gtx.snapshots.put(o.id, cloned); - } - gtx.commit(); - } catch (Exception e) { - throw new RuntimeException(e); - } finally { - gtx.rollbackIfOpen(); - } - } - - public static Snapshot get(String snapshotId) { - Tuple2 decodedId; - try { - decodedId = JacksonSerializers.Tuple2IntDeserializer.deserialize(snapshotId); - } catch (IOException e) { - return null; - } - - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - if (!gtx.snapshots.containsKey(decodedId)) return null; - return gtx.snapshots.get(decodedId); - } - - public static Snapshot get(Tuple2 decodedId) { - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - if (!gtx.snapshots.containsKey(decodedId)) return null; - return gtx.snapshots.get(decodedId); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Agency.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Agency.java deleted file mode 100755 index 3fc117c08..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Agency.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.datatools.editor.models.Model; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.URL; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Agency extends Model implements Cloneable, Serializable, Comparable { - public static final long serialVersionUID = 1; - public static final Logger LOG = LoggerFactory.getLogger(Agency.class); - - public String agencyId; - public String name; - public String url; - public String timezone; - public String lang; - public String phone; - public String email; - public String feedId; - public String agencyBrandingUrl; - public String agencyFareUrl; - - public Agency(com.conveyal.gtfs.model.Agency agency, EditorFeed feed) { - this.agencyId = agency.agency_id; - this.name = agency.agency_name; - this.url = agency.agency_url != null ? agency.agency_url.toString() : null; - this.timezone = agency.agency_timezone; - this.lang = agency.agency_lang; - this.phone = agency.agency_phone; - this.feedId = feed.id; - this.email = agency.agency_email; - } - - public Agency () {} - - public com.conveyal.gtfs.model.Agency toGtfs() { - com.conveyal.gtfs.model.Agency ret = new com.conveyal.gtfs.model.Agency(); - - ret.agency_id = agencyId; - ret.agency_name = name; - try { - ret.agency_url = url == null ? null : new URL(url); - } catch (MalformedURLException e) { - LOG.warn("Unable to coerce agency URL {} to URL", url); - ret.agency_url = null; - } - try { - ret.agency_branding_url = agencyBrandingUrl == null ? null : new URL(agencyBrandingUrl); - } catch (MalformedURLException e) { - LOG.warn("Unable to coerce agency branding URL {} to URL", agencyBrandingUrl); - ret.agency_branding_url = null; - } - try { - ret.agency_fare_url = agencyFareUrl == null ? null : new URL(agencyFareUrl); - } catch (MalformedURLException e) { - LOG.warn("Unable to coerce agency fare URL {} to URL", agencyFareUrl); - ret.agency_fare_url = null; - } - ret.agency_timezone = timezone; - ret.agency_lang = lang; - ret.agency_phone = phone; - ret.agency_email = email; - - return ret; - } - - public int compareTo (Object other) { - if (!(other instanceof Agency)) - return -1; - - Agency o = (Agency) other; - - if (this.name == null) - return -1; - - if (o.name == null) - return 1; - - return this.name.compareTo(o.name); - } - - public Agency clone () throws CloneNotSupportedException { - return (Agency) super.clone(); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/AttributeAvailabilityType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/AttributeAvailabilityType.java deleted file mode 100755 index 7a4ed3298..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/AttributeAvailabilityType.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum AttributeAvailabilityType { - UNKNOWN, - AVAILABLE, - UNAVAILABLE; - - public int toGtfs () { - switch (this) { - case AVAILABLE: - return 1; - case UNAVAILABLE: - return 2; - default: // if value is UNKNOWN or missing - return 0; - } - } - - public static AttributeAvailabilityType fromGtfs (int availabilityType) { - switch (availabilityType) { - case 1: - return AVAILABLE; - case 2: - return UNAVAILABLE; - default: // if value is UNKNOWN or missing - return UNKNOWN; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/EditorFeed.java b/src/main/java/com/conveyal/datatools/editor/models/transit/EditorFeed.java deleted file mode 100644 index a9e39be2b..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/EditorFeed.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.datatools.editor.models.Model; - -import java.io.Serializable; -import java.net.URL; -import java.time.LocalDate; - -/** - * Created by demory on 6/8/16. - */ -public class EditorFeed extends Model implements Cloneable, Serializable { - private static final long serialVersionUID = 1L; - - // GTFS Editor defaults - public String color; - public Double defaultLat; - public Double defaultLon; - public GtfsRouteType defaultRouteType; - - // feed-info.txt fields - public String feedPublisherName; - public URL feedPublisherUrl; - public String feedLang; - public String feedVersion; - public LocalDate feedStartDate; - public LocalDate feedEndDate; - -// public transient int numberOfRoutes, numberOfStops; -// @JsonProperty("numberOfRoutes") -// public int jsonGetNumberOfRoutes() { return numberOfRoutes; } -// -// @JsonProperty("numberOfStops") -// public int jsonGetNumberOfStops() { return numberOfStops; } -// -// // Add information about the days of week this route is active -// public void addDerivedInfo(final FeedTx tx) { -// numberOfRoutes = tx.routes.size(); -// numberOfStops = tx.stops.size(); -// } - - public EditorFeed() {} - - public EditorFeed(String id) { - this.id = id; - } - - public EditorFeed clone () throws CloneNotSupportedException { - return (EditorFeed) super.clone(); - } - -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Fare.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Fare.java deleted file mode 100644 index 1a7dcc933..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Fare.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.datatools.editor.models.Model; -import com.conveyal.gtfs.model.FareRule; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.google.common.collect.Lists; - -import java.io.Serializable; -import java.util.List; - -/** - * Created by landon on 6/22/16. - */ - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Fare extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - public String feedId; - public String gtfsFareId; - public String description; - public Double price; - public String currencyType; - public Integer paymentMethod; - public Integer transfers; - public Integer transferDuration; - public List fareRules = Lists.newArrayList(); - - public Fare() {} - - public Fare(com.conveyal.gtfs.model.FareAttribute fare, List rules, EditorFeed feed) { - this.gtfsFareId = fare.fare_id; - this.price = fare.price; - this.currencyType = fare.currency_type; - this.paymentMethod = fare.payment_method; - this.transfers = fare.transfers; - this.transferDuration = fare.transfer_duration; - this.fareRules.addAll(rules); - this.feedId = feed.id; - inferName(); - } - - /** - * Infer the name of this calendar - */ - public void inferName () { - StringBuilder sb = new StringBuilder(14); - - if (price != null) - sb.append(price); - if (currencyType != null) - sb.append(currencyType); - - this.description = sb.toString(); - - if (this.description.equals("") && this.gtfsFareId != null) - this.description = gtfsFareId; - } - - public Fare clone () throws CloneNotSupportedException { - Fare f = (Fare) super.clone(); - f.fareRules.addAll(fareRules); - return f; - } - - public com.conveyal.gtfs.model.Fare toGtfs() { - com.conveyal.gtfs.model.Fare fare = new com.conveyal.gtfs.model.Fare(this.gtfsFareId); - fare.fare_attribute = new com.conveyal.gtfs.model.FareAttribute(); - fare.fare_attribute.fare_id = this.gtfsFareId; - fare.fare_attribute.price = this.price == null ? Double.NaN : this.price; - fare.fare_attribute.currency_type = this.currencyType; - fare.fare_attribute.payment_method = this.paymentMethod == null ? Integer.MIN_VALUE : this.paymentMethod; - fare.fare_attribute.transfers = this.transfers == null ? Integer.MIN_VALUE : this.transfers; - fare.fare_attribute.transfer_duration = this.transferDuration == null ? Integer.MIN_VALUE : this.transferDuration; - fare.fare_attribute.feed_id = this.feedId; - - fare.fare_rules.addAll(this.fareRules); - return fare; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/GtfsRouteType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/GtfsRouteType.java deleted file mode 100755 index b64c8aaa6..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/GtfsRouteType.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.gtfs.model.Entity; - -public enum GtfsRouteType { - TRAM, - SUBWAY, - RAIL, - BUS, - FERRY, - CABLECAR, - GONDOLA, - FUNICULAR; - - public int toGtfs() { - switch(this) - { - case TRAM: - return 0; - case SUBWAY: - return 1; - case RAIL: - return 2; - case BUS: - return 3; - case FERRY: - return 4; - case CABLECAR: - return 5; - case GONDOLA: - return 6; - case FUNICULAR: - return 7; - default: - // can't happen - return Entity.INT_MISSING; - - } - } - - public static GtfsRouteType fromGtfs (int gtfsType) { - switch (gtfsType) - { - case 0: - return TRAM; - case 1: - return SUBWAY; - case 2: - return RAIL; - case 3: - return BUS; - case 4: - return FERRY; - case 5: - return CABLECAR; - case 6: - return GONDOLA; - case 7: - return FUNICULAR; - default: - return null; - } - } - - public HvtRouteType toHvt () { - switch (this) { - case TRAM: - return HvtRouteType.TRAM; - case SUBWAY: - return HvtRouteType.URBANRAIL_METRO; - case RAIL: - return HvtRouteType.RAIL; - case BUS: - // TODO overly specific - return HvtRouteType.BUS_LOCAL; - case FERRY: - return HvtRouteType.WATER; - case CABLECAR: - return HvtRouteType.MISCELLANEOUS_CABLE_CAR; - case GONDOLA: - return HvtRouteType.MISCELLANEOUS; - case FUNICULAR: - return HvtRouteType.FUNICULAR; - default: - return null; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/HvtRouteType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/HvtRouteType.java deleted file mode 100755 index 68a3527a7..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/HvtRouteType.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum HvtRouteType { - - // using the TPEG/HVT "standard" as documented in the 3/20/08 Google Group message from Joe Hughes. Oddly, this seems to be the document of record for this change! - // https://groups.google.com/forum/?fromgroups=#!msg/gtfs-changes/keT5rTPS7Y0/71uMz2l6ke0J - - RAIL, // 100 Railway Service - RAIL_HS, // 101 High Speed Rail Service - RAIL_LD, // 102 Long Distance Trains - RAIL_SHUTTLE, // 108 Rail Shuttle (within complex) - RAIL_SUBURBAN, // 109 Suburban Railway - - COACH, // 200 Coach Service - COACH_INTERNATIONAL, // 201 International Coach Service - COACH_NATIONAL, // 202 National Coach Service - COACH_REGIONAL, // 204 Regional Coach Service - COACH_COMMUTER, // 208 Commuter Coach Service - - URBANRAIL, // 400 Urban Railway Service - URBANRAIL_METRO, // 401 Metro Service - URBANRAIL_UNDERGROUND, // 402 Underground Service - URBANRAIL_MONORAIL, // 405 Monorail - - BUS, // 700 Bus Service - BUS_REGIONAL, // 701 Regional Bus Service - BUS_EXPRESS, // 702 Express Bus Service - BUS_LOCAL, // 704 Local Bus Service - BUS_UNSCHEDULED, // 70X Unscheduled Bus Service (used for "informal" services like jeepneys, collectivos, etc.) - // need to formally assign HVT id to this type -- unclear how to do this given there's no registry. - - TROLLEYBUS, // 800 Trolleybus Service - - TRAM, // 900 Tram Service - - WATER, // 1000 Water Transport Service - - AIR, // 1100 Air Service - - TELECABIN, // 1300 Telecabin Service - FUNICULAR, // 1400 Funicular Service - - MISCELLANEOUS, // 1700 Miscellaneous Service - MISCELLANEOUS_CABLE_CAR, //1701 Cable Car - MISCELLANEOUS_HORSE_CARRIAGE, // 1702 Horse-Drawn Carriage -} - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/LocationType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/LocationType.java deleted file mode 100755 index 89c915036..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/LocationType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum LocationType { - STOP, - STATION -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Route.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Route.java deleted file mode 100755 index 228808413..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Route.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.gtfs.model.Entity; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.conveyal.datatools.editor.datastore.FeedTx; -import com.conveyal.datatools.editor.datastore.GlobalTx; -import com.conveyal.datatools.editor.models.Model; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -public class Route extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - public static final Logger LOG = LoggerFactory.getLogger(Route.class); - public String gtfsRouteId; - public String routeShortName; - public String routeLongName; - - public String routeDesc; - - public String routeTypeId; - public GtfsRouteType gtfsRouteType; - public String routeUrl; - public String routeColor; - public String routeTextColor; - public String routeBrandingUrl; - - // Custom Fields - public String comments; - - public StatusType status; - - public Boolean publiclyVisible; - - public String agencyId; - public String feedId; - - //public GisRoute gisRoute; - - //public GisUpload gisUpload; - - public AttributeAvailabilityType wheelchairBoarding; - - /** on which days does this route have service? Derived from calendars on render */ - public transient Boolean monday, tuesday, wednesday, thursday, friday, saturday, sunday; - public transient int numberOfTrips = 0; - - // add getters so Jackson will serialize - - @JsonProperty("monday") - public Boolean jsonGetMonday() { - return monday; - } - - @JsonProperty("tuesday") - public Boolean jsonGetTuesday() { - return tuesday; - } - - @JsonProperty("wednesday") - public Boolean jsonGetWednesday() { - return wednesday; - } - - @JsonProperty("thursday") - public Boolean jsonGetThursday() { - return thursday; - } - - @JsonProperty("friday") - public Boolean jsonGetFriday() { - return friday; - } - - @JsonProperty("saturday") - public Boolean jsonGetSaturday() { - return saturday; - } - - @JsonProperty("sunday") - public Boolean jsonGetSunday() { - return sunday; - } - - @JsonProperty("numberOfTrips") - public int jsonGetNumberOfTrips() { - return numberOfTrips; - } - - public Route () {} - - /** - * Construct editor route from gtfs-lib representation. - * @param route - * @param feed - * @param agency - */ - public Route(com.conveyal.gtfs.model.Route route, EditorFeed feed, Agency agency) { - this.gtfsRouteId = route.route_id; - this.routeShortName = route.route_short_name; - this.routeLongName = route.route_long_name; - this.routeDesc = route.route_desc; - - this.gtfsRouteType = GtfsRouteType.fromGtfs(route.route_type); - - this.routeUrl = route.route_url != null ? route.route_url.toString() : null; - this.routeColor = route.route_color; - this.routeTextColor = route.route_text_color; - - this.feedId = feed.id; - this.agencyId = agency != null ? agency.id : null; - } - - - public Route(String routeShortName, String routeLongName, int routeType, String routeDescription, EditorFeed feed, Agency agency) { - this.routeShortName = routeShortName; - this.routeLongName = routeLongName; - this.gtfsRouteType = GtfsRouteType.fromGtfs(routeType); - this.routeDesc = routeDescription; - - this.feedId = feed.id; - this.agencyId = agency != null ? agency.id : null; - } - - public com.conveyal.gtfs.model.Route toGtfs(com.conveyal.gtfs.model.Agency a) { - com.conveyal.gtfs.model.Route ret = new com.conveyal.gtfs.model.Route(); - ret.agency_id = a != null ? a.agency_id : ""; - ret.route_color = routeColor; - ret.route_desc = routeDesc; - ret.route_id = getGtfsId(); - ret.route_long_name = routeLongName; - ret.route_short_name = routeShortName; - ret.route_text_color = routeTextColor; - ret.route_type = gtfsRouteType != null ? gtfsRouteType.toGtfs() : Entity.INT_MISSING; - try { - ret.route_url = routeUrl == null ? null : new URL(routeUrl); - } catch (MalformedURLException e) { - LOG.warn("Cannot coerce route URL {} to URL", routeUrl); - ret.route_url = null; - } - try { - ret.route_branding_url = routeBrandingUrl == null ? null : new URL(routeBrandingUrl); - } catch (MalformedURLException e) { - LOG.warn("Unable to coerce route branding URL {} to URL", routeBrandingUrl); - ret.route_branding_url = null; - } - return ret; - } - - @JsonIgnore - public String getGtfsId() { - if(gtfsRouteId != null && !gtfsRouteId.isEmpty()) - return gtfsRouteId; - else - return id; - } - - - /** - * Get a name for this combining the short name and long name as available. - * @return combined route short and long names - */ - @JsonIgnore - public String getName() { - if (routeShortName == null && routeLongName == null) - return id; - else if (routeShortName == null) - return routeLongName; - else if (routeLongName == null) - return routeShortName; - else - return routeShortName + " " + routeLongName; - - } - - // Add information about the days of week this route is active - public void addDerivedInfo(final FeedTx tx) { - - monday = false; - tuesday = false; - wednesday = false; - thursday = false; - friday = false; - saturday = false; - sunday = false; - Set calendars = new HashSet<>(); - - Collection tripsForRoute = tx.getTripsByRoute(this.id); - numberOfTrips = tripsForRoute == null ? 0 : tripsForRoute.size(); - - for (Trip trip : tripsForRoute) { - ServiceCalendar cal = null; - try { - if (calendars.contains(trip.calendarId)) continue; - cal = tx.calendars.get(trip.calendarId); - if (cal.monday) - monday = true; - - if (cal.tuesday) - tuesday = true; - - if (cal.wednesday) - wednesday = true; - - if (cal.thursday) - thursday = true; - - if (cal.friday) - friday = true; - - if (cal.saturday) - saturday = true; - - if (cal.sunday) - sunday = true; - - if (monday && tuesday && wednesday && thursday && friday && saturday && sunday) { - // optimization: no point in continuing - break; - } - } catch (Exception e) { - LOG.error("Could not process trip {} or cal {} for route {}", trip, cal, this); - } - - // track which calendars we've processed to avoid redundancy - calendars.add(trip.calendarId); - } - } - - public Route clone () throws CloneNotSupportedException { - return (Route) super.clone(); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/RouteType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/RouteType.java deleted file mode 100755 index 974755417..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/RouteType.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.conveyal.datatools.editor.models.Model; - -import java.io.Serializable; - -// TODO: destroy route type and replace with ENUM -public class RouteType extends Model implements Serializable { - public static final long serialVersionUID = 1; - - public String localizedVehicleType; - public String description; - - public GtfsRouteType gtfsRouteType; - - public HvtRouteType hvtRouteType; - - /* - @JsonCreator - public static RouteType factory(long id) { - return RouteType.findById(id); - } - - @JsonCreator - public static RouteType factory(String id) { - return RouteType.findById(Long.parseLong(id)); - } - */ - - -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/ScheduleException.java b/src/main/java/com/conveyal/datatools/editor/models/transit/ScheduleException.java deleted file mode 100644 index e01a9a881..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/ScheduleException.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.conveyal.datatools.editor.models.Model; -import java.time.LocalDate; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * Represents an exception to the schedule, which could be "On January 18th, run a Sunday schedule" - * (useful for holidays), or could be "on June 23rd, run the following services" (useful for things - * like early subway shutdowns, re-routes, etc.) - * - * Unlike the GTFS schedule exception model, we assume that these special calendars are all-or-nothing; - * everything that isn't explicitly running is not running. That is, creating special service means the - * user starts with a blank slate. - * - * @author mattwigway - */ - -public class ScheduleException extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - /** The agency whose service this schedule exception describes */ - public String feedId; - - /** - * If non-null, run service that would ordinarily run on this day of the week. - * Takes precedence over any custom schedule. - */ - public ExemplarServiceDescriptor exemplar; - - /** The name of this exception, for instance "Presidents' Day" or "Early Subway Shutdowns" */ - public String name; - - /** The dates of this service exception */ - public List dates; - - /** A custom schedule. Only used if like == null */ - public List customSchedule; - - public List addedService; - - public List removedService; - - public boolean serviceRunsOn(ServiceCalendar service) { - switch (exemplar) { - case MONDAY: - return service.monday; - case TUESDAY: - return service.tuesday; - case WEDNESDAY: - return service.wednesday; - case THURSDAY: - return service.thursday; - case FRIDAY: - return service.friday; - case SATURDAY: - return service.saturday; - case SUNDAY: - return service.sunday; - case NO_SERVICE: - // special case for quickly turning off all service. - return false; - case CUSTOM: - return customSchedule.contains(service.id); - case SWAP: - // new case to either swap one service id for another or add/remove a specific service - if (addedService != null && addedService.contains(service.id)) { - return true; - } - else if (removedService != null && removedService.contains(service.id)) { - return false; - } - default: - // can't actually happen, but java requires a default with a return here - return false; - } - } - - /** - * Represents a desire about what service should be like on a particular day. - * For example, run Sunday service on Presidents' Day, or no service on New Year's Day. - */ - public enum ExemplarServiceDescriptor { - MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, NO_SERVICE, CUSTOM, SWAP; - - public int toInt () { - switch (this) { - case MONDAY: - return 0; - case TUESDAY: - return 1; - case WEDNESDAY: - return 2; - case THURSDAY: - return 3; - case FRIDAY: - return 4; - case SATURDAY: - return 5; - case SUNDAY: - return 6; - case NO_SERVICE: - return 7; - case CUSTOM: - return 8; - case SWAP: - return 9; - default: - return 0; - } - } - } - - public ScheduleException clone () throws CloneNotSupportedException { - ScheduleException c = (ScheduleException) super.clone(); - c.dates = new ArrayList<>(this.dates); - c.customSchedule = new ArrayList<>(this.customSchedule); - return c; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/ServiceCalendar.java b/src/main/java/com/conveyal/datatools/editor/models/transit/ServiceCalendar.java deleted file mode 100755 index 05b6ea55e..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/ServiceCalendar.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.beust.jcommander.internal.Sets; -import com.conveyal.gtfs.model.Calendar; -import com.conveyal.gtfs.model.Service; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.conveyal.datatools.editor.datastore.FeedTx; -import com.conveyal.datatools.editor.models.Model; -import java.time.LocalDate; - -import java.io.Serializable; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -public class ServiceCalendar extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - public String feedId; - public String gtfsServiceId; - public String description; - public Boolean monday; - public Boolean tuesday; - public Boolean wednesday; - public Boolean thursday; - public Boolean friday; - public Boolean saturday; - public Boolean sunday; - public LocalDate startDate; - public LocalDate endDate; - - public ServiceCalendar() {} - - public ServiceCalendar(Calendar calendar, EditorFeed feed) { - this.gtfsServiceId = calendar.service_id; - this.monday = calendar.monday == 1; - this.tuesday = calendar.tuesday == 1; - this.wednesday = calendar.wednesday == 1; - this.thursday = calendar.thursday == 1; - this.friday = calendar.friday == 1; - this.saturday = calendar.saturday == 1; - this.sunday = calendar.sunday == 1; - this.startDate = calendar.start_date; - this.endDate = calendar.end_date; - inferName(); - this.feedId = feed.id; - } - - public ServiceCalendar clone () throws CloneNotSupportedException { - return (ServiceCalendar) super.clone(); - } - - // TODO: time zones - private static LocalDate fromGtfs(int date) { - int day = date % 100; - date -= day; - int month = (date % 10000) / 100; - date -= month * 100; - int year = date / 10000; - - return LocalDate.of(year, month, day); - } - - // give the UI a little information about the content of this calendar - public transient Long numberOfTrips; - - @JsonProperty("numberOfTrips") - public Long jsonGetNumberOfTrips () { - return numberOfTrips; - } - - public transient Map routes; - - @JsonProperty("routes") - public Map jsonGetRoutes () { - return routes; - } - - // do-nothing setters - @JsonProperty("numberOfTrips") - public void jsonSetNumberOfTrips(Long numberOfTrips) { } - - @JsonProperty("routes") - public void jsonSetRoutes(Collection routes) { } - - /** - * Infer the name of this calendar - */ - public void inferName () { - StringBuilder sb = new StringBuilder(14); - - if (monday) - sb.append("Mo"); - - if (tuesday) - sb.append("Tu"); - - if (wednesday) - sb.append("We"); - - if (thursday) - sb.append("Th"); - - if (friday) - sb.append("Fr"); - - if (saturday) - sb.append("Sa"); - - if (sunday) - sb.append("Su"); - - this.description = sb.toString(); - - if (this.description.equals("") && this.gtfsServiceId != null) - this.description = gtfsServiceId; - } - - public String toString() { - - String str = ""; - - if(this.monday) - str += "Mo"; - - if(this.tuesday) - str += "Tu"; - - if(this.wednesday) - str += "We"; - - if(this.thursday) - str += "Th"; - - if(this.friday) - str += "Fr"; - - if(this.saturday) - str += "Sa"; - - if(this.sunday) - str += "Su"; - - return str; - } - - /** - * Convert this service to a GTFS service calendar. - * @param startDate int, in GTFS format: YYYYMMDD - * @param endDate int, again in GTFS format - */ - public Service toGtfs(int startDate, int endDate) { - Service ret = new Service(id); - ret.calendar = new Calendar(); - ret.calendar.service_id = ret.service_id; - ret.calendar.start_date = fromGtfs(startDate); - ret.calendar.end_date = fromGtfs(endDate); - ret.calendar.sunday = sunday ? 1 : 0; - ret.calendar.monday = monday ? 1 : 0; - ret.calendar.tuesday = tuesday ? 1 : 0; - ret.calendar.wednesday = wednesday ? 1 : 0; - ret.calendar.thursday = thursday ? 1 : 0; - ret.calendar.friday = friday ? 1 : 0; - ret.calendar.saturday = saturday ? 1 : 0; - - // TODO: calendar dates - return ret; - } - - // equals and hashcode use DB ID; they are used to put service calendar dates into a HashMultimap in ProcessGtfsSnapshotExport - public int hashCode () { - return id.hashCode(); - } - - public boolean equals(Object o) { - if (o instanceof ServiceCalendar) { - ServiceCalendar c = (ServiceCalendar) o; - - return id.equals(c.id); - } - - return false; - } - - /** - * Used to represent a service calendar and its service on a particular route. - */ - public static class ServiceCalendarForPattern { - public String description; - public String id; - public long routeTrips; - - public ServiceCalendarForPattern(ServiceCalendar cal, TripPattern patt, long routeTrips ) { - this.description = cal.description; - this.id = cal.id; - this.routeTrips = routeTrips; - } - } - - /** add transient info for UI with number of routes, number of trips */ - public void addDerivedInfo(final FeedTx tx) { - this.numberOfTrips = tx.tripCountByCalendar.get(this.id); - - if (this.numberOfTrips == null) - this.numberOfTrips = 0L; - - // note that this is not ideal as we are fetching all of the trips. however, it's not really very possible - // with MapDB to have an index involving three tables. - Map tripsForRoutes = new HashMap<>(); - for (Trip trip : tx.getTripsByCalendar(this.id)) { - if (trip == null) continue; - Long count = 0L; - - /** - * if for some reason, routeId ever was set to null (or never properly initialized), - * take care of that here so we don't run into null map errors. - */ - if (trip.routeId == null) { - trip.routeId = tx.tripPatterns.get(trip.patternId).routeId; - } - if (tripsForRoutes.containsKey(trip.routeId)) { - count = tripsForRoutes.get(trip.routeId); - } - if (trip.routeId != null) { - tripsForRoutes.put(trip.routeId, count + 1); - } - } - this.routes = tripsForRoutes; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/StatusType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/StatusType.java deleted file mode 100755 index 92a7b5745..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/StatusType.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum StatusType { - IN_PROGRESS, - PENDING_APPROVAL, - APPROVED, - DISABLED; - - public int toInt () { - switch (this) { - case APPROVED: - return 2; - case IN_PROGRESS: - return 1; - case PENDING_APPROVAL: - return 0; - default: - return 0; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java deleted file mode 100755 index 87cb8a095..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Stop.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.PrecisionModel; -import com.conveyal.datatools.editor.datastore.FeedTx; -import com.conveyal.datatools.editor.models.Model; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class Stop extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - public static final Logger LOG = LoggerFactory.getLogger(Stop.class); - private static GeometryFactory geometryFactory = new GeometryFactory(); - - public String gtfsStopId; - public String stopCode; - public String stopName; - public String stopDesc; - public String zoneId; - public String stopUrl; - - public String stopIconUrl; - - //public String agencyId; - public String feedId; - - public LocationType locationType; - - public AttributeAvailabilityType bikeParking; - - public AttributeAvailabilityType carParking; - - public AttributeAvailabilityType wheelchairBoarding; - - public StopTimePickupDropOffType pickupType; - - public StopTimePickupDropOffType dropOffType; - - public String parentStation; - - public String stopTimezone; - - // Major stop is a custom field; it has no corrolary in the GTFS. - public Boolean majorStop; - - @JsonIgnore - public Point location; - - public Stop(com.conveyal.gtfs.model.Stop stop, GeometryFactory geometryFactory, EditorFeed feed) { - - this.gtfsStopId = stop.stop_id; - this.stopCode = stop.stop_code; - this.stopName = stop.stop_name; - this.stopDesc = stop.stop_desc; - this.zoneId = stop.zone_id; - this.stopUrl = stop.stop_url != null ? stop.stop_url.toString() : null; - this.locationType = stop.location_type == 1 ? LocationType.STATION : LocationType.STOP; - this.parentStation = stop.parent_station; - this.pickupType = StopTimePickupDropOffType.SCHEDULED; - this.dropOffType = StopTimePickupDropOffType.SCHEDULED; - this.wheelchairBoarding = AttributeAvailabilityType.fromGtfs(stop.wheelchair_boarding); - - this.location = geometryFactory.createPoint(new Coordinate(stop.stop_lon,stop.stop_lat)); - - this.feedId = feed.id; - } - - public Stop(EditorFeed feed, String stopName, String stopCode, String stopUrl, String stopDesc, Double lat, Double lon) { - this.feedId = feed.id; - this.stopCode = stopCode; - this.stopName = stopName; - this.stopDesc = stopDesc; - this.stopUrl = stopUrl; - this.locationType = LocationType.STOP; - this.pickupType = StopTimePickupDropOffType.SCHEDULED; - this.dropOffType = StopTimePickupDropOffType.SCHEDULED; - - GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); - - this.location = geometryFactory.createPoint(new Coordinate(lon, lat)); - } - - /** Create a stop. Note that this does *not* generate an ID, as you have to set the agency first */ - public Stop () {} - - public double getLat () { - return location.getY(); - } - - public double getLon () { - return location.getX(); - } - - @JsonCreator - public static Stop fromJson(@JsonProperty("lat") double lat, @JsonProperty("lon") double lon) { - Stop ret = new Stop(); - ret.location = geometryFactory.createPoint(new Coordinate(lon, lat)); - return ret; - } - - public com.conveyal.gtfs.model.Stop toGtfs() { - com.conveyal.gtfs.model.Stop ret = new com.conveyal.gtfs.model.Stop(); - ret.stop_id = getGtfsId(); - ret.stop_code = stopCode; - ret.stop_desc = stopDesc; - ret.stop_lat = location.getY(); - ret.stop_lon = location.getX(); - // TODO: gtfs-lib value needs to be int - if (wheelchairBoarding != null) { - ret.wheelchair_boarding = wheelchairBoarding.toGtfs(); - } - - if (stopName != null && !stopName.isEmpty()) - ret.stop_name = stopName; - else - ret.stop_name = id; - - try { - ret.stop_url = stopUrl == null ? null : new URL(stopUrl); - } catch (MalformedURLException e) { - LOG.warn("Unable to coerce stop URL {} to URL", stopUrl); - ret.stop_url = null; - } - - return ret; - } - - /** Merge the given stops IDs within the given FeedTx, deleting stops and updating trip patterns and trips */ - public static void merge (List stopIds, FeedTx tx) { - Stop target = tx.stops.get(stopIds.get(0)); - for (int i = 1; i < stopIds.size(); i++) { - Stop source = tx.stops.get(stopIds.get(i)); - - // find all the patterns that stop at this stop - Collection tps = tx.getTripPatternsByStop(source.id); - - List tpToSave = new ArrayList<>(); - - // update them - for (TripPattern tp : tps) { - try { - tp = tp.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - tx.rollback(); - throw new RuntimeException(e); - } - tp.patternStops.stream() - .filter(ps -> source.id.equals(ps.stopId)) - .forEach(ps -> ps.stopId = target.id); - - // batch them for save at the end, as all of the sets we are working with still refer to the db, - // so changing it midstream is a bad idea - tpToSave.add(tp); - - // update the trips - List tripsToSave = new ArrayList<>(); - for (Trip trip : tx.getTripsByPattern(tp.id)) { - try { - trip = trip.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - tx.rollback(); - throw new RuntimeException(e); - } - - // stop times have been cloned, so this is safe - trip.stopTimes.stream() - .filter(st -> source.id.equals(st.stopId)) - .forEach(st -> { - // stop times have been cloned, so this is safe - st.stopId = target.id; - }); - - tripsToSave.add(trip); - } - - for (Trip trip : tripsToSave) { - tx.trips.put(trip.id, trip); - } - } - - for (TripPattern tp : tpToSave) { - tx.tripPatterns.put(tp.id, tp); - } - - if (!tx.getTripPatternsByStop(source.id).isEmpty()) { - throw new IllegalStateException("Tried to move all trip patterns when merging stops but was not successful"); - } - - tx.stops.remove(source.id); - } - } - - @JsonIgnore - public String getGtfsId() { - if(gtfsStopId != null && !gtfsStopId.isEmpty()) - return gtfsStopId; - else - return "STOP_" + id; - } - - public Stop clone () throws CloneNotSupportedException { - Stop s = (Stop) super.clone(); - s.location = (Point) location.clone(); - return s; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/StopTime.java b/src/main/java/com/conveyal/datatools/editor/models/transit/StopTime.java deleted file mode 100755 index bdbee3aaf..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/StopTime.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -import java.io.Serializable; - -/** - * Represents a stop time. This is not a model, as it is stored directly as a list in Trip. - * @author mattwigway - * - */ -public class StopTime implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - public Integer arrivalTime; - public Integer departureTime; - - public String stopHeadsign; - - /* reference to trip pattern stop is implied based on position, no stop sequence needed */ - - public StopTimePickupDropOffType pickupType; - - public StopTimePickupDropOffType dropOffType; - - public String stopId; - - public StopTime() - { - - } - - public StopTime(com.conveyal.gtfs.model.StopTime stopTime, String stopId) { - - this.arrivalTime = stopTime.arrival_time; - this.departureTime = stopTime.departure_time; - this.stopHeadsign = stopTime.stop_headsign; - this.pickupType = mapGtfsPickupDropOffType(stopTime.pickup_type); - this.dropOffType = mapGtfsPickupDropOffType(stopTime.drop_off_type); - - this.stopId = stopId; - } - - public static StopTimePickupDropOffType mapGtfsPickupDropOffType(Integer pickupDropOffType) - { - switch(pickupDropOffType) - { - case 0: - return StopTimePickupDropOffType.SCHEDULED; - case 1: - return StopTimePickupDropOffType.NONE; - case 2: - return StopTimePickupDropOffType.AGENCY; - case 3: - return StopTimePickupDropOffType.DRIVER; - default: - return null; - } - } - - public StopTime clone () throws CloneNotSupportedException { - return (StopTime) super.clone(); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/StopTimePickupDropOffType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/StopTimePickupDropOffType.java deleted file mode 100755 index 44a4475d8..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/StopTimePickupDropOffType.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum StopTimePickupDropOffType { - SCHEDULED, - NONE, - AGENCY, - DRIVER; - - public Integer toGtfsValue() { - switch (this) { - case SCHEDULED: - return 0; - case NONE: - return 1; - case AGENCY: - return 2; - case DRIVER: - return 3; - default: - // can't happen, but Java requires a default statement - return null; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/StopType.java b/src/main/java/com/conveyal/datatools/editor/models/transit/StopType.java deleted file mode 100755 index eda17faea..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/StopType.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.conveyal.datatools.editor.models.Model; - -public class StopType extends Model { - - public String stopType; - public String description; - - public Boolean interpolated; - public Boolean majorStop; -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/Trip.java b/src/main/java/com/conveyal/datatools/editor/models/transit/Trip.java deleted file mode 100755 index ae77e612c..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/Trip.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.conveyal.gtfs.model.Frequency; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.conveyal.datatools.editor.models.Model; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - - -public class Trip extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - public String gtfsTripId; - public String tripHeadsign; - public String tripShortName; - - public String tripDescription; - - public TripDirection tripDirection; - - public String blockId; - - public String routeId; - - public String patternId; - - public String calendarId; - - public AttributeAvailabilityType wheelchairBoarding; - - public Boolean useFrequency; - - public Integer startTime; - public Integer endTime; - - public Integer headway; - public Boolean invalid; - - public List stopTimes; - - public String feedId; - - public Trip () {} - - /** Create a trips entry from a GTFS trip. Does not import stop times. */ - public Trip(com.conveyal.gtfs.model.Trip trip, Route route, TripPattern pattern, ServiceCalendar serviceCalendar) { - gtfsTripId = trip.trip_id; - tripHeadsign = trip.trip_headsign; - tripShortName = trip.trip_short_name; - tripDirection = TripDirection.fromGtfs(trip.direction_id); - blockId = trip.block_id; - this.routeId = route.id; - this.patternId = pattern.id; - this.calendarId = serviceCalendar.id; - this.feedId = route.feedId; - this.stopTimes = new ArrayList(); - - if (trip.wheelchair_accessible == 1) - this.wheelchairBoarding = AttributeAvailabilityType.AVAILABLE; - else if (trip.wheelchair_accessible == 2) - this.wheelchairBoarding = AttributeAvailabilityType.UNAVAILABLE; - else - this.wheelchairBoarding = AttributeAvailabilityType.UNKNOWN; - - useFrequency = false; - } - - @JsonIgnore - public String getGtfsId () { - if (gtfsTripId != null && !gtfsTripId.isEmpty()) - return gtfsTripId; - else - return id.toString(); - } - - /*public com.conveyal.gtfs.model.Trip toGtfs(com.conveyal.gtfs.model.Route route, Service service) { - com.conveyal.gtfs.model.Trip ret = new com.conveyal.gtfs.model.Trip(); - - ret.block_id = blockId; - ret.route = route; - ret.trip_id = getGtfsId(); - ret.service = service; - ret.trip_headsign = tripHeadsign; - ret.trip_short_name = tripShortName; - ret.direction_id = tripDirection == tripDirection.A ? 0 : 1; - ret.block_id = blockId; - - - if (wheelchairBoarding != null) { - if (wheelchairBoarding.equals(AttributeAvailabilityType.AVAILABLE)) - ret.wheelchair_accessible = 1; - - else if (wheelchairBoarding.equals(AttributeAvailabilityType.UNAVAILABLE)) - ret.wheelchair_accessible = 2; - - else - ret.wheelchair_accessible = 0; - - } - else if (pattern.route.wheelchairBoarding != null) { - if(pattern.route.wheelchairBoarding.equals(AttributeAvailabilityType.AVAILABLE)) - ret.wheelchair_accessible = 1; - - else if (pattern.route.wheelchairBoarding.equals(AttributeAvailabilityType.UNAVAILABLE)) - ret.wheelchair_accessible = 2; - - else - ret.wheelchair_accessible = 0; - - } - - return ret; - }*/ - - /** retrieveById the frequencies.txt entry for this trip, or null if this trip should not be in frequencies.txt */ - public Frequency getFrequency(com.conveyal.gtfs.model.Trip trip) { - if (useFrequency == null || !useFrequency || headway <= 0 || trip.trip_id != getGtfsId()) - return null; - - Frequency ret = new Frequency(); - ret.start_time = startTime; - ret.end_time = endTime; - ret.headway_secs = headway; - ret.trip_id = trip.trip_id; - - return ret; - } - - public Trip clone () throws CloneNotSupportedException { - Trip ret = (Trip) super.clone(); - - // duplicate the stop times - ret.stopTimes = new ArrayList(); - - for (StopTime st : stopTimes) { - ret.stopTimes.add(st == null ? null : st.clone()); - } - - return ret; - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/TripDirection.java b/src/main/java/com/conveyal/datatools/editor/models/transit/TripDirection.java deleted file mode 100755 index e17faa837..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/TripDirection.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - -public enum TripDirection { - A, - B; - - public int toGtfs () { - return this == TripDirection.A ? 0 : 1; - } - - public static TripDirection fromGtfs (int dir) { - return dir == 0 ? TripDirection.A : TripDirection.B; - } -} \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/TripPattern.java b/src/main/java/com/conveyal/datatools/editor/models/transit/TripPattern.java deleted file mode 100755 index c0c8a6b01..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/TripPattern.java +++ /dev/null @@ -1,347 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.conveyal.datatools.editor.datastore.FeedTx; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.linearref.LinearLocation; -import com.conveyal.datatools.editor.models.Model; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class TripPattern extends Model implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - public static final Logger LOG = LoggerFactory.getLogger(TripPattern.class); - public String name; - public String headsign; - - public LineString shape; - - // if true, use straight-line rather than shape-based distances - public boolean useStraightLineDistances; - - public boolean useFrequency; - - public String routeId; - - public String feedId; - - public TripDirection patternDirection; - - public List patternStops = new ArrayList<>(); - - // give the UI a little information about the content of this trip pattern - public transient int numberOfTrips; - public transient Map tripCountByCalendar; - - - @JsonProperty("numberOfTrips") - public int jsonGetNumberOfTrips () { - return numberOfTrips; - } - - @JsonProperty("tripCountByCalendar") - Map jsonGetTripCountByCalendar () { return tripCountByCalendar; } - - // do-nothing setters - @JsonProperty("numberOfTrips") - public void jsonSetNumberOfTrips(int numberOfTrips) { } - - @JsonProperty("tripCountByCalendar") - public void jsonSetTripCountByCalendar(Map tripCountByCalendar) { } - - /** add transient info for UI with number of routes, number of trips */ - public void addDerivedInfo(final FeedTx tx) { - Collection trips = tx.getTripsByPattern(this.id); - numberOfTrips = trips.size(); - tripCountByCalendar = trips.stream() - .filter(t -> t != null && t.calendarId != null) - .collect(Collectors.groupingBy(t -> t.calendarId, Collectors.counting())); - } - -// /** -// * Lines showing how stops are being snapped to the shape. -// * @return array of LineStrings showing how stops connect to shape -// */ -// @JsonProperty("stopConnections") -// public LineString[] jsonGetStopConnections () { -// if (useStraightLineDistances || shape == null) -// return null; -// -// final FeedTx tx = VersionedDataStore.getFeedTx(this.feedId); -// -// try { -// LineString[] ret = new LineString[patternStops.size()]; -// -// double[] coordDistances = getCoordDistances(shape); -// LocationIndexedLine shapeIdx = new LocationIndexedLine(shape); -// -// for (int i = 0; i < ret.length; i++) { -// TripPatternStop ps = patternStops.retrieveById(i); -// -// if (ps.shapeDistTraveled == null) { -// return null; -// } -// -// Coordinate snapped = shapeIdx.extractPoint(getLoc(coordDistances, ps.shapeDistTraveled)); -// // offset it slightly so that line creation does not fail if the stop is coincident -// snapped.x = snapped.x - 0.00000001; -// Stop st = tx.stops.retrieveById(ps.stopId); -// Coordinate stop = st.location.getCoordinate(); -// ret[i] = GeoUtils.geometyFactory.createLineString(new Coordinate[] {stop, snapped}); -// } -// -// return ret; -// } finally { -// tx.rollback(); -// } -// -// } - - public TripPattern() {} - - public TripPattern(String name, String headsign, LineString shape, Route route) { - this.name = name; - this.headsign = headsign; - this.shape = shape; - this.routeId = route.id; - } - - public TripPattern clone() throws CloneNotSupportedException { - TripPattern ret = (TripPattern) super.clone(); - - if (this.shape != null) - ret.shape = (LineString) this.shape.clone(); - else - ret.shape = null; - - ret.patternStops = new ArrayList<>(); - - for (TripPatternStop ps : this.patternStops) { - ret.patternStops.add(ps.clone()); - } - - return ret; - } - - - - /** - * update the trip pattern stops and the associated stop times - * see extensive discussion in ticket #102 - * basically, we assume only one stop has changed---either it's been removed, added or moved - * this is consistent with the use of Backbone.save in the UI, and - * also with the principle of least magic possible - * of course, we check to ensure that that is the case and fail if it's not - * this lets us easily detect what has happened simply by length - */ - public static void reconcilePatternStops(TripPattern originalTripPattern, TripPattern newTripPattern, FeedTx tx) { - // convenience - List originalStops = originalTripPattern.patternStops; - List newStops = newTripPattern.patternStops; - - // no need to do anything - // see #174 - if (originalStops.size() == 0) - return; - - // ADDITIONS (IF DIFF == 1) - if (originalStops.size() == newStops.size() - 1) { - // we have an addition; find it - - int differenceLocation = -1; - for (int i = 0; i < newStops.size(); i++) { - if (differenceLocation != -1) { - // we've already found the addition - if (i < originalStops.size() && !originalStops.get(i).stopId.equals(newStops.get(i + 1).stopId)) { - // there's another difference, which we weren't expecting - throw new IllegalStateException("Multiple differences found when trying to detect stop addition"); - } - } - - // if we've reached where one trip has an extra stop, or if the stops at this position differ - else if (i == newStops.size() - 1 || !originalStops.get(i).stopId.equals(newStops.get(i).stopId)) { - // we have found the difference - differenceLocation = i; - } - } - - // insert a skipped stop at the difference location - - for (Trip trip : tx.getTripsByPattern(originalTripPattern.id)) { - trip.stopTimes.add(differenceLocation, null); - // TODO: safe? - tx.trips.put(trip.id, trip); - } - } - - // DELETIONS - else if (originalStops.size() == newStops.size() + 1) { - // we have an deletion; find it - int differenceLocation = -1; - for (int i = 0; i < originalStops.size(); i++) { - if (differenceLocation != -1) { - if (!originalStops.get(i).stopId.equals(newStops.get(i - 1).stopId)) { - // there is another difference, which we were not expecting - throw new IllegalStateException("Multiple differences found when trying to detect stop removal"); - } - } - - // we've reached the end and the only difference is length (so the last stop is the different one) - // or we've found the difference - else if (i == originalStops.size() - 1 || !originalStops.get(i).stopId.equals(newStops.get(i).stopId)) { - differenceLocation = i; - } - } - - // remove stop times for removed pattern stop - String removedStopId = originalStops.get(differenceLocation).stopId; - - for (Trip trip : tx.getTripsByPattern(originalTripPattern.id)) { - StopTime removed = trip.stopTimes.remove(differenceLocation); - - // the removed stop can be null if it was skipped. trip.stopTimes.remove will throw an exception - // rather than returning null if we try to do a remove out of bounds. - if (removed != null && !removed.stopId.equals(removedStopId)) { - throw new IllegalStateException("Attempted to remove wrong stop!"); - } - - // TODO: safe? - tx.trips.put(trip.id, trip); - } - } - - // TRANSPOSITIONS - else if (originalStops.size() == newStops.size()) { - // Imagine the trip patterns pictured below (where . is a stop, and lines indicate the same stop) - // the original trip pattern is on top, the new below - // . . . . . . . . - // | | \ \ \ | | - // * * * * * * * * - // also imagine that the two that are unmarked are the same - // (the limitations of ascii art, this is prettier on my whiteboard) - // There are three regions: the beginning and end, where stopSequences are the same, and the middle, where they are not - // The same is true of trips where stops were moved backwards - - // find the left bound of the changed region - int firstDifferentIndex = 0; - while (originalStops.get(firstDifferentIndex).stopId.equals(newStops.get(firstDifferentIndex).stopId)) { - firstDifferentIndex++; - - if (firstDifferentIndex == originalStops.size()) - // trip patterns do not differ at all, nothing to do - return; - } - - // find the right bound of the changed region - int lastDifferentIndex = originalStops.size() - 1; - while (originalStops.get(lastDifferentIndex).stopId.equals(newStops.get(lastDifferentIndex).stopId)) { - lastDifferentIndex--; - } - - // TODO: write a unit test for this - if (firstDifferentIndex == lastDifferentIndex) { - throw new IllegalStateException("stop substitutions are not supported, region of difference must have length > 1"); - } - - // figure out whether a stop was moved left or right - // note that if the stop was only moved one position, it's impossible to tell, and also doesn't matter, - // because the requisite operations are equivalent - int from, to; - - // TODO: ensure that this is all that happened (i.e. verify stop ID map inside changed region) - if (originalStops.get(firstDifferentIndex).stopId.equals(newStops.get(lastDifferentIndex).stopId)) { - // stop was moved right - from = firstDifferentIndex; - to = lastDifferentIndex; - } - - else if (newStops.get(firstDifferentIndex).stopId.equals(originalStops.get(lastDifferentIndex).stopId)) { - // stop was moved left - from = lastDifferentIndex; - to = firstDifferentIndex; - } - - else { - throw new IllegalStateException("not a simple, single move!"); - } - - for (Trip trip : tx.getTripsByPattern(originalTripPattern.id)) { - StopTime moved = trip.stopTimes.remove(from); - trip.stopTimes.add(to, moved); - trip.invalid = true; - - // TODO: safe? - tx.trips.put(trip.id, trip); - } - } - // CHECK IF SET OF STOPS ADDED TO END OF LIST - else if (originalStops.size() < newStops.size()) { - // find the left bound of the changed region to check that no stops have changed in between - int firstDifferentIndex = 0; - while (firstDifferentIndex < originalStops.size() && originalStops.get(firstDifferentIndex).stopId.equals(newStops.get(firstDifferentIndex).stopId)) { - firstDifferentIndex++; - } - if (firstDifferentIndex != originalStops.size()) - throw new IllegalStateException("When adding multiple stops to patterns, new stops must all be at the end"); - - for (Trip trip : tx.getTripsByPattern(originalTripPattern.id)) { - - // insert a skipped stop for each new element in newStops - for (int i = firstDifferentIndex; i < newStops.size(); i++) { - trip.stopTimes.add(i, null); - } - // TODO: safe? - tx.trips.put(trip.id, trip); - } - } - // OTHER STUFF IS NOT SUPPORTED - else { - throw new IllegalStateException("Changes to trip pattern stops must be made one at a time"); - } - } - - /** - * From an array of distances at coordinates and a distance, retrieveById a linear location for that distance. - */ - private static LinearLocation getLoc(double[] distances, double distTraveled) { - if (distTraveled < 0) - return null; - - // this can happen due to rounding errors - else if (distTraveled >= distances[distances.length - 1]) { - LOG.warn("Shape dist traveled past end of shape, was {}, expected max {}, clamping", distTraveled, distances[distances.length - 1]); - return new LinearLocation(distances.length - 1, 0); - } - - for (int i = 1; i < distances.length; i++) { - if (distTraveled <= distances[i]) { - // we have found the appropriate segment - double frac = (distTraveled - distances[i - 1]) / (distances[i] - distances[i - 1]); - return new LinearLocation(i - 1, frac); - } - } - - return null; - } - - /** - * From an array of distances at coordinates and linear locs, retrieveById a distance for that location. - */ - private static double getDist(double[] distances, LinearLocation loc) { - if (loc.getSegmentIndex() == distances.length - 1) - return distances[distances.length - 1]; - - return distances[loc.getSegmentIndex()] + (distances[loc.getSegmentIndex() + 1] - distances[loc.getSegmentIndex()]) * loc.getSegmentFraction(); - } -} diff --git a/src/main/java/com/conveyal/datatools/editor/models/transit/TripPatternStop.java b/src/main/java/com/conveyal/datatools/editor/models/transit/TripPatternStop.java deleted file mode 100755 index 42d77c84a..000000000 --- a/src/main/java/com/conveyal/datatools/editor/models/transit/TripPatternStop.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.conveyal.datatools.editor.models.transit; - - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -import java.io.Serializable; - -/** A stop on a trip pattern. This is not a model, as it is stored in a list within trippattern */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class TripPatternStop implements Cloneable, Serializable { - public static final long serialVersionUID = 1; - - public String stopId; - - public int defaultTravelTime; - public int defaultDwellTime; - - /** - * Is this stop a timepoint? - * - * If null, no timepoint information will be exported for this stop. - */ - public Boolean timepoint; - - public Double shapeDistTraveled; - - public TripPatternStop() {} - - public TripPatternStop(Stop stop, Integer defaultTravelTime) { - this.stopId = stop.id; - this.defaultTravelTime = defaultTravelTime; - } - - public TripPatternStop clone () throws CloneNotSupportedException { - return (TripPatternStop) super.clone(); - } -} - - diff --git a/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java b/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java index e723a3500..a8f7eea36 100644 --- a/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java +++ b/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java @@ -1,6 +1,5 @@ package com.conveyal.datatools.editor.utils; -import com.conveyal.datatools.editor.models.transit.GtfsRouteType; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; @@ -9,12 +8,10 @@ import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.google.common.io.BaseEncoding; -import org.mapdb.Fun.Tuple2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneOffset; @@ -24,95 +21,6 @@ public class JacksonSerializers { private static final Logger LOG = LoggerFactory.getLogger(JacksonSerializers.class); private static final BaseEncoding encoder = BaseEncoding.base64Url(); - public static class Tuple2Serializer extends StdScalarSerializer> { - private static final long serialVersionUID = 884752482339455539L; - - public Tuple2Serializer () { - super(Tuple2.class, true); - } - - @Override - public void serialize(Tuple2 t2, JsonGenerator jgen, - SerializerProvider arg2) throws IOException { - jgen.writeString(serialize(t2)); - } - - public static String serialize (Tuple2 t2) { - try { - return encoder.encode(t2.a.getBytes("UTF-8")) + ":" + encoder.encode(t2.b.getBytes("UTF-8")); - } catch (UnsupportedEncodingException e) { - throw new UnsupportedOperationException(e); - } - } - } - - public static class Tuple2Deserializer extends StdScalarDeserializer> { - private static final long serialVersionUID = -9155687065800376769L; - - public Tuple2Deserializer () { - super(Tuple2.class); - } - - @Override - public Tuple2 deserialize(JsonParser jp, - DeserializationContext arg1) throws IOException { - return deserialize(jp.readValueAs(String.class)); - } - - public static Tuple2 deserialize (String serialized) throws IOException { - String[] val = serialized.split(":"); - if (val.length != 2) { - throw new IOException("Unable to parse value"); - } - - return new Tuple2<>(new String(encoder.decode(val[0]), "UTF-8"), new String(encoder.decode(val[1]), "UTF-8")); - } - } - - public static class Tuple2IntSerializer extends StdScalarSerializer> { - private static final long serialVersionUID = 3201085724165980819L; - - public Tuple2IntSerializer () { - super(Tuple2.class, true); - } - - @Override - public void serialize(Tuple2 t2, JsonGenerator jgen, - SerializerProvider arg2) throws IOException { - jgen.writeString(serialize(t2)); - } - - public static String serialize (Tuple2 t2) { - try { - return encoder.encode(t2.a.getBytes("UTF-8")) + ":" + t2.b.toString(); - } catch (UnsupportedEncodingException e) { - throw new UnsupportedOperationException(e); - } - } - } - - public static class Tuple2IntDeserializer extends StdScalarDeserializer> { - private static final long serialVersionUID = -6787630225359327452L; - - public Tuple2IntDeserializer () { - super(Tuple2.class); - } - - @Override - public Tuple2 deserialize(JsonParser jp, DeserializationContext arg1) throws IOException { - return deserialize(jp.readValueAs(String.class)); - } - - public static Tuple2 deserialize (String serialized) throws IOException { - String[] val = serialized.split(":"); - if (val.length != 2) { - throw new IOException("Unable to parse value"); - } - - return new Tuple2<>(new String(encoder.decode(val[0]), "UTF-8"), Integer.parseInt(val[1])); - } - } - /** serialize local dates as noon GMT epoch times */ public static class LocalDateSerializer extends StdScalarSerializer { private static final long serialVersionUID = 3153194744968260324L; @@ -155,43 +63,10 @@ public LocalDate deserialize(JsonParser jp, DeserializationContext arg1) throws e.printStackTrace(); } } - -// System.out.println(jp.getValueAsLong()); -// System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE)); return null; } } - /** serialize GtfsRouteType as GTFS integer value */ - public static class GtfsRouteTypeSerializer extends StdScalarSerializer { - private static final long serialVersionUID = -8179814233698591433L; - - public GtfsRouteTypeSerializer() { - super(GtfsRouteType.class, false); - } - - @Override - public void serialize(GtfsRouteType gtfsRouteType, JsonGenerator jsonGenerator, - SerializerProvider arg2) throws IOException { - jsonGenerator.writeNumber(gtfsRouteType.toGtfs()); - } - } - - /** serialize GTFS integer value to GtfsRouteType */ - public static class GtfsRouteTypeDeserializer extends StdScalarDeserializer { - private static final long serialVersionUID = 2771914080477037467L; - - public GtfsRouteTypeDeserializer () { - super(GtfsRouteType.class); - } - - @Override - public GtfsRouteType deserialize(JsonParser jp, - DeserializationContext arg1) throws IOException { - return GtfsRouteType.fromGtfs(jp.getValueAsInt()); - } - } - public static class MyDtoNullKeySerializer extends StdSerializer { private static final long serialVersionUID = -8104007875350340832L; @@ -212,32 +87,4 @@ public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerPro public static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - /** Serialize a local date to an ISO date (year-month-day) */ - public static class LocalDateIsoSerializer extends StdScalarSerializer { - private static final long serialVersionUID = 6365116779135936730L; - - public LocalDateIsoSerializer () { - super(LocalDate.class, false); - } - - @Override - public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - jsonGenerator.writeString(localDate.format(format)); - } - } - - /** Deserialize an ISO date (year-month-day) */ - public static class LocalDateIsoDeserializer extends StdScalarDeserializer { - private static final long serialVersionUID = -1703584495462802108L; - - public LocalDateIsoDeserializer () { - super(LocalDate.class); - } - - @Override - public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { - return LocalDate.parse(jsonParser.getValueAsString(), format); - } - - } } diff --git a/src/main/java/com/conveyal/datatools/manager/ConvertMain.java b/src/main/java/com/conveyal/datatools/manager/ConvertMain.java deleted file mode 100644 index 5923ec9d0..000000000 --- a/src/main/java/com/conveyal/datatools/manager/ConvertMain.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.conveyal.datatools.manager; - -import com.conveyal.datatools.common.status.MonitorableJob; -import com.conveyal.datatools.editor.datastore.GlobalTx; -import com.conveyal.datatools.editor.datastore.VersionedDataStore; -import com.conveyal.datatools.editor.jobs.ConvertEditorMapDBToSQL; -import com.conveyal.datatools.editor.models.Snapshot; -import com.conveyal.datatools.manager.controllers.DumpController; -import com.conveyal.datatools.manager.controllers.api.StatusController; -import com.conveyal.datatools.manager.models.FeedSource; -import com.conveyal.datatools.manager.persistence.Persistence; -import org.apache.commons.io.FileUtils; -import org.mapdb.Fun; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static com.conveyal.datatools.manager.DataManager.initializeApplication; -import static com.conveyal.datatools.manager.DataManager.registerRoutes; - -/** - * Main method to run the data migration process from the v2 MapDB based application to the v3 Mongo and SQL-based - * application. The program first seeds the MongoDB with data from a JSON dump of the manager MapDB database. It then - * loads/validates each feed version into the SQL database, and finally it migrates the Editor MapDB to SQL. The JSON - * dump file is provided as a program argument. The Editor MapDB directory is specified in the server.yml config file at - * "application.data.editor_mapdb". This is all run as MonitorableJobs executed through the application's thread pool - * executor. Once all jobs are queued, The application runs on a loop until there are no more active jobs in the jobs - * list. - * - * Run instructions: - * - * java -Xmx6G -cp datatools.jar com.conveyal.datatools.manager.ConvertMain /path/to/env.yml /path/to/server.yml /path/to/dump.json - * - * An optional fourth argument can be provided to force the application to reprocess (load/validate) feed versions that - * have already been processed. - * - * The primary method to run this migration is: - * 1. First run the above java command to migrate the JSON dump and convert the editor mapdb to new snapshots. - * 2. Next run the following java command to clean up the snapshots (the snapshots imported from the JSON dump are not - * updated during the editor MapDB conversion. Rather, MongoDB records are created separately, so the JSON-sourced - * duplicate records need to be deleted and the newly generate records updated with the JSON data): - * java -Xmx6G -cp datatools.jar com.conveyal.datatools.manager.ConvertMain /path/to/env.yml /path/to/server.yml updateSnapshotMetadata=true /path/to/dump.json - * - */ -public class ConvertMain { - public static final Logger LOG = LoggerFactory.getLogger(ConvertMain.class); - - // Feed ID constants for testing. - private static final String CORTLAND_FEED_ID = "c5bdff54-82fa-47ce-ad6e-3c6517563992"; - public static final String AMTRAK_FEED_ID = "be5b775b-6811-4522-bbf6-1a408e7cf3f8"; - public static void main(String[] args) throws Exception { - - // Migration code! - - // First, set up application. - initializeApplication(args); - // Register HTTP endpoints so that the status endpoint is available during migration. - registerRoutes(); - - long startTime = System.currentTimeMillis(); - - boolean snapshotsOnly = args.length > 2 && "snapshotsOnly=true".equals(args[2]); - boolean updateSnapshotMetadata = args.length > 2 && "updateSnapshotMetadata=true".equals(args[2]); - - // FIXME remove migrateSingleSnapshot (just for local testing) -// migrateSingleSnapshot(null); - if (updateSnapshotMetadata) { - String jsonString = FileUtils.readFileToString(new File(args[3]), Charset.defaultCharset()); - boolean result = DumpController.updateSnapshotMetadata(jsonString); - if (result) { - LOG.info("Snapshot metadata update successful!"); - } - // Done. - System.exit(0); - } else if (!snapshotsOnly) { - // STEP 1: Load in JSON dump into MongoDB (args 0 and 1 are the config files) - String jsonString = FileUtils.readFileToString(new File(args[2]), Charset.defaultCharset()); - // FIXME: Do we still need to map certain project fields? - DumpController.load(jsonString); - - // STEP 2: For each feed version, load GTFS in Postgres and validate. - boolean force = args.length > 3 && "true".equals(args[3]); - DumpController.validateAll(true, force, null); - } else { - LOG.info("Skipping JSON load and feed version load/validation due to snapshotsOnly flag"); - } - - // STEP 3: For each feed source in MongoDB, load all snapshots (and current editor buffer) into Postgres DB. - // STEP 3A: For each snapshot/editor DB, create a snapshot Mongo object for the feed source with the FeedLoadResult. - migrateEditorFeeds(); - LOG.info("Done queueing!!!!!!!!"); - int totalJobs = StatusController.getAllJobs().size(); - while (!StatusController.filterActiveJobs(StatusController.getAllJobs()).isEmpty()) { - // While there are still active jobs, continue waiting. - Set activeJobs = StatusController.filterActiveJobs(StatusController.getAllJobs()); - LOG.info(String.format("%d/%d jobs still active. Checking for completion again in 5 seconds...", activeJobs.size(), totalJobs)); -// LOG.info(String.join(", ", activeJobs.stream().map(job -> job.name).collect(Collectors.toList()))); - int jobsInExecutor = ((ThreadPoolExecutor) DataManager.heavyExecutor).getActiveCount(); - LOG.info(String.format("Jobs in thread pool executor: %d", jobsInExecutor)); - LOG.info(String.format("Jobs completed by executor: %d", ((ThreadPoolExecutor) DataManager.heavyExecutor).getCompletedTaskCount())); - Thread.sleep(5000); - } - long durationInMillis = System.currentTimeMillis() - startTime; - LOG.info("MIGRATION COMPLETED IN {} SECONDS.", TimeUnit.MILLISECONDS.toSeconds(durationInMillis)); - System.exit(0); - } - - public static boolean migrateEditorFeeds (String ...feedIdsToSkip) { - // Open the Editor MapDB and write a snapshot to the SQL database. - GlobalTx gtx = VersionedDataStore.getGlobalTx(); - try { - long startTime = System.currentTimeMillis(); - int count = 0; - int snapshotCount = gtx.snapshots.values().size(); - LOG.info(snapshotCount + " snapshots to convert"); - - Set feedSourcesEncountered = new HashSet<>(); - // Iterate over the provided snapshots and convert each one. Note: this will skip snapshots for feed IDs that - // don't exist as feed sources in MongoDB. - for (Map.Entry, Snapshot> entry : gtx.snapshots.entrySet()) { - Snapshot snapshot = entry.getValue(); - Fun.Tuple2 key = entry.getKey(); - String feedSourceId = key.a; - // Get feed source from MongoDB. - FeedSource feedSource = Persistence.feedSources.getById(feedSourceId); - if (feedSource != null) { - // Only migrate the feeds that have a feed source record in the MongoDB. - if (feedIdsToSkip != null && Arrays.asList(feedIdsToSkip).contains(feedSourceId)) { - // If list of feed IDs to skip is provided and the current feed ID matches, skip it. - LOG.info("Skipping feed. ID found in list to skip. id: " + feedSourceId); - continue; - } - if (!feedSourcesEncountered.contains(feedSource.id)) { - // If this is the first feed encountered, load the editor buffer. - ConvertEditorMapDBToSQL convertEditorBufferToSQL = new ConvertEditorMapDBToSQL(snapshot.id.a, null); - DataManager.heavyExecutor.execute(convertEditorBufferToSQL); - count++; - } - ConvertEditorMapDBToSQL convertEditorMapDBToSQL = new ConvertEditorMapDBToSQL(snapshot.id.a, snapshot.id.b); - DataManager.heavyExecutor.execute(convertEditorMapDBToSQL); - LOG.info(count + "/" + snapshotCount + " snapshot conversion queued"); - feedSourcesEncountered.add(feedSource.id); - count++; - } else { - LOG.info("Not converting snapshot. Feed source Id does not exist in application data" + feedSourceId); - } - } -// long duration = System.currentTimeMillis() - startTime; -// LOG.info("Converting " + snapshotCount + " snapshots took " + TimeUnit.MILLISECONDS.toMinutes(duration) + " minutes"); - return true; - } catch (Exception e) { - LOG.error("Migrating editor feeds FAILED"); - e.printStackTrace(); - return false; - } finally { - gtx.rollbackIfOpen(); - } - } - - public static boolean migrateSingleSnapshot (Fun.Tuple2 decodedId) { - if (decodedId == null) { - // Use Cortland if no feed provided - decodedId = new Fun.Tuple2<>(CORTLAND_FEED_ID, 12); - } - new ConvertEditorMapDBToSQL(decodedId.a, decodedId.b).run(); - return true; - } -} diff --git a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java index 2f4feab89..845b63b6f 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java @@ -6,7 +6,6 @@ import java.util.Collection; import java.util.Map; -import com.conveyal.datatools.editor.models.transit.GtfsRouteType; import com.conveyal.datatools.editor.utils.JacksonSerializers; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; @@ -46,9 +45,6 @@ public JsonManager (Class theClass, Class view) { deser.addDeserializer(LocalDate.class, new JacksonSerializers.LocalDateDeserializer()); deser.addSerializer(LocalDate.class, new JacksonSerializers.LocalDateSerializer()); - deser.addDeserializer(GtfsRouteType.class, new JacksonSerializers.GtfsRouteTypeDeserializer()); - deser.addSerializer(GtfsRouteType.class, new JacksonSerializers.GtfsRouteTypeSerializer()); - deser.addDeserializer(Rectangle2D.class, new Rectangle2DDeserializer()); om.registerModule(deser); om.getSerializerProvider().setNullKeySerializer(new JacksonSerializers.MyDtoNullKeySerializer()); From 646a0b7ab51b8c12b381ebad4e0e2b69893b29bd Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Mon, 7 Jun 2021 17:57:16 +0100 Subject: [PATCH 04/41] refactor(EditorControllerTest.java): Addressed PR feedback --- .../controllers/api/EditorControllerTest.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java b/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java index 679afde36..8e5cacc19 100644 --- a/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java +++ b/src/test/java/com/conveyal/datatools/editor/controllers/api/EditorControllerTest.java @@ -40,7 +40,6 @@ public class EditorControllerTest extends UnitTest { private static final Logger LOG = LoggerFactory.getLogger(EditorControllerTest.class); private static Project project; private static FeedSource feedSource; - private static FeedSource freshFeedSource; private static FeedVersion feedVersion; private static final ObjectMapper mapper = new ObjectMapper(); @@ -85,27 +84,19 @@ private static Stream createPatchTableTests() { ); } - @ParameterizedTest - @MethodSource("createPatchTableTests") - public void canPatchTableTests( - String field, - String entity, - int expectedCount, - String graphQLQueryFile, - String table) throws IOException { - canPatchTable(field, entity, expectedCount, graphQLQueryFile, table); - } - /** * Confirm that the provided table endpoint can be patched. */ - private void canPatchTable( + @ParameterizedTest + @MethodSource("createPatchTableTests") + public void canPatchTableTests( String field, String entity, int expectedCount, String graphQLQueryFile, String table ) throws IOException { + LOG.info("Making patch {} request", table); String value = "NEW"; ObjectNode jsonBody = mapper.createObjectNode(); @@ -114,7 +105,7 @@ private void canPatchTable( // Assert that the correct table within the BART feed was modified. assertThat(count, equalTo(expectedCount)); // Get fresh feed source so that editor namespace was updated after snapshot. - freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); + FeedSource freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); JsonNode graphQL = graphqlQuery(freshFeedSource.editorNamespace, graphQLQueryFile); for (JsonNode node : graphQL.get("data").get("feed").get(table)) { assertThat(node.get(field).asText(), equalTo(value)); @@ -140,7 +131,7 @@ public void canPatchStopsConditionally() throws IOException { assertThat(count, equalTo(34)); // Check GraphQL to verify that stop_desc has indeed been updated. // Get fresh feed source so that editor namespace was updated after snapshot. - freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); + FeedSource freshFeedSource = Persistence.feedSources.getById(feedVersion.feedSourceId); JsonNode graphQL = graphqlQuery(freshFeedSource.editorNamespace, "graphql/stops.txt"); // Every stop meeting the stop_lon condition should now have the desc defined in the patch JSON body above. for (JsonNode stop : graphQL.get("data").get("feed").get("stops")) { From b26c08976b81fb9b77b245aa209afbc5f9a4315c Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Tue, 8 Jun 2021 08:53:06 +0100 Subject: [PATCH 05/41] refactor(JsonManager.java): Removed the JacksonSerializers class and moved the serializer/deserializ --- .../editor/utils/JacksonSerializers.java | 90 ------------------- .../manager/utils/json/JsonManager.java | 64 ++++++++++++- 2 files changed, 61 insertions(+), 93 deletions(-) delete mode 100644 src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java diff --git a/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java b/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java deleted file mode 100644 index a8f7eea36..000000000 --- a/src/main/java/com/conveyal/datatools/editor/utils/JacksonSerializers.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.conveyal.datatools.editor.utils; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import com.google.common.io.BaseEncoding; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; - -public class JacksonSerializers { - private static final Logger LOG = LoggerFactory.getLogger(JacksonSerializers.class); - private static final BaseEncoding encoder = BaseEncoding.base64Url(); - - /** serialize local dates as noon GMT epoch times */ - public static class LocalDateSerializer extends StdScalarSerializer { - private static final long serialVersionUID = 3153194744968260324L; - - public LocalDateSerializer() { - super(LocalDate.class, false); - } - - @Override - public void serialize(LocalDate ld, JsonGenerator jgen, SerializerProvider arg2) throws IOException { - // YYYYMMDD - jgen.writeString(ld.format(DateTimeFormatter.BASIC_ISO_DATE)); - } - } - - /** deserialize local dates from GMT epochs */ - public static class LocalDateDeserializer extends StdScalarDeserializer { - private static final long serialVersionUID = -1855560624079270379L; - - public LocalDateDeserializer () { - super(LocalDate.class); - } - - @Override - public LocalDate deserialize(JsonParser jp, DeserializationContext arg1) throws IOException { - LocalDate date; - String dateText = jp.getText(); - try { - date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE); - return date; - } catch (Exception jsonException) { - // This is here to catch any loads of database dumps that happen to have the old java.util.Date - // field type in validationResult. God help us. - LOG.warn("Error parsing date value: `{}`, trying legacy java.util.Date date format", dateText); - try { - date = Instant.ofEpochMilli(jp.getValueAsLong()).atZone(ZoneOffset.UTC).toLocalDate(); - return date; - } catch (Exception e) { - LOG.warn("Error parsing date value: `{}`", dateText); - e.printStackTrace(); - } - } - return null; - } - } - - public static class MyDtoNullKeySerializer extends StdSerializer { - private static final long serialVersionUID = -8104007875350340832L; - - public MyDtoNullKeySerializer() { - this(null); - } - - public MyDtoNullKeySerializer(Class t) { - super(t); - } - - @Override - public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) - throws IOException { - jsonGenerator.writeFieldName(""); - } - } - - public static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - -} diff --git a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java index 845b63b6f..687a1ccc0 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java @@ -2,21 +2,31 @@ import java.awt.geom.Rectangle2D; import java.io.IOException; +import java.time.Instant; import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.Collection; import java.util.Map; -import com.conveyal.datatools.editor.utils.JacksonSerializers; +import com.conveyal.gtfs.util.json.JacksonSerializers; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Helper methods for writing REST API routines @@ -24,6 +34,7 @@ * */ public class JsonManager { + private static final Logger LOG = LoggerFactory.getLogger(JsonManager.class); private ObjectWriter ow; private ObjectMapper om; @@ -42,8 +53,8 @@ public JsonManager (Class theClass, Class view) { om.addMixIn(Rectangle2D.class, Rectangle2DMixIn.class); SimpleModule deser = new SimpleModule(); - deser.addDeserializer(LocalDate.class, new JacksonSerializers.LocalDateDeserializer()); - deser.addSerializer(LocalDate.class, new JacksonSerializers.LocalDateSerializer()); + deser.addDeserializer(LocalDate.class, new LocalDateDeserializer()); + deser.addSerializer(LocalDate.class, new LocalDateSerializer()); deser.addDeserializer(Rectangle2D.class, new Rectangle2DDeserializer()); om.registerModule(deser); @@ -101,4 +112,51 @@ public T read (JsonParser p) throws JsonParseException, JsonMappingException, IO public T read(JsonNode asJson) { return om.convertValue(asJson, theClass); } + + /** serialize local dates as noon GMT epoch times */ + public static class LocalDateSerializer extends StdScalarSerializer { + private static final long serialVersionUID = 3153194744968260324L; + + public LocalDateSerializer() { + super(LocalDate.class, false); + } + + @Override + public void serialize(LocalDate ld, JsonGenerator jgen, SerializerProvider arg2) throws IOException { + // YYYYMMDD + jgen.writeString(ld.format(DateTimeFormatter.BASIC_ISO_DATE)); + } + } + + /** deserialize local dates from GMT epochs */ + public static class LocalDateDeserializer extends StdScalarDeserializer { + private static final long serialVersionUID = -1855560624079270379L; + + public LocalDateDeserializer () { + super(LocalDate.class); + } + + @Override + public LocalDate deserialize(JsonParser jp, DeserializationContext arg1) throws IOException { + LocalDate date; + String dateText = jp.getText(); + try { + date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE); + return date; + } catch (Exception jsonException) { + // This is here to catch any loads of database dumps that happen to have the old java.util.Date + // field type in validationResult. God help us. + LOG.warn("Error parsing date value: `{}`, trying legacy java.util.Date date format", dateText); + try { + date = Instant.ofEpochMilli(jp.getValueAsLong()).atZone(ZoneOffset.UTC).toLocalDate(); + return date; + } catch (Exception e) { + LOG.warn("Error parsing date value: `{}`", dateText); + e.printStackTrace(); + } + } + return null; + } + } + } From 6da5e2d904b4a3498677c9614829e2d0634df62b Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Wed, 9 Jun 2021 08:19:44 +0100 Subject: [PATCH 06/41] refactor(JsonManager.java): Inlined all instances of local date --- .../conveyal/datatools/manager/utils/json/JsonManager.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java index 687a1ccc0..ed9da45dc 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java @@ -138,18 +138,15 @@ public LocalDateDeserializer () { @Override public LocalDate deserialize(JsonParser jp, DeserializationContext arg1) throws IOException { - LocalDate date; String dateText = jp.getText(); try { - date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE); - return date; + return LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE); } catch (Exception jsonException) { // This is here to catch any loads of database dumps that happen to have the old java.util.Date // field type in validationResult. God help us. LOG.warn("Error parsing date value: `{}`, trying legacy java.util.Date date format", dateText); try { - date = Instant.ofEpochMilli(jp.getValueAsLong()).atZone(ZoneOffset.UTC).toLocalDate(); - return date; + return Instant.ofEpochMilli(jp.getValueAsLong()).atZone(ZoneOffset.UTC).toLocalDate(); } catch (Exception e) { LOG.warn("Error parsing date value: `{}`", dateText); e.printStackTrace(); From caa9c41a2faebed8bacf5ff9b80a06efa49466da Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Fri, 11 Jun 2021 15:14:08 +0100 Subject: [PATCH 07/41] refactor(Fixed failing unit tests): Updated MergeFeedJobTest to use lite GTFS datasets --- pom.xml | 2 +- .../manager/jobs/MergeFeedsJobTest.java | 40 +++++++++++------- .../conveyal/datatools/gtfs/bart_new_lite.zip | Bin 0 -> 4153 bytes .../conveyal/datatools/gtfs/bart_old_lite.zip | Bin 0 -> 3897 bytes .../datatools/gtfs/caltrain_gtfs_lite.zip | Bin 0 -> 2375 bytes .../datatools/gtfs/napa-no-agency-id-lite.zip | Bin 0 -> 7150 bytes 6 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 src/test/resources/com/conveyal/datatools/gtfs/bart_new_lite.zip create mode 100644 src/test/resources/com/conveyal/datatools/gtfs/bart_old_lite.zip create mode 100644 src/test/resources/com/conveyal/datatools/gtfs/caltrain_gtfs_lite.zip create mode 100644 src/test/resources/com/conveyal/datatools/gtfs/napa-no-agency-id-lite.zip diff --git a/pom.xml b/pom.xml index 2f7267353..aa30c4dbd 100644 --- a/pom.xml +++ b/pom.xml @@ -271,7 +271,7 @@ com.github.conveyal gtfs-lib - fce6e8e744 + 9d0908945f diff --git a/src/test/java/com/conveyal/datatools/manager/jobs/MergeFeedsJobTest.java b/src/test/java/com/conveyal/datatools/manager/jobs/MergeFeedsJobTest.java index 7c6084007..ac9042dbd 100644 --- a/src/test/java/com/conveyal/datatools/manager/jobs/MergeFeedsJobTest.java +++ b/src/test/java/com/conveyal/datatools/manager/jobs/MergeFeedsJobTest.java @@ -38,8 +38,12 @@ public class MergeFeedsJobTest extends UnitTest { private static FeedVersion bartVersion1; private static FeedVersion bartVersion2; private static FeedVersion calTrainVersion; + private static FeedVersion bartVersionOldLite; + private static FeedVersion bartVersionNewLite; + private static FeedVersion calTrainVersionLite; private static Project project; private static FeedVersion napaVersion; + private static FeedVersion napaVersionLite; private static FeedVersion bothCalendarFilesVersion; private static FeedVersion bothCalendarFilesVersion2; private static FeedVersion bothCalendarFilesVersion3; @@ -64,16 +68,20 @@ public static void setUp() throws IOException { Persistence.feedSources.create(bart); bartVersion1 = createFeedVersionFromGtfsZip(bart, "bart_old.zip"); bartVersion2 = createFeedVersionFromGtfsZip(bart, "bart_new.zip"); + bartVersionOldLite = createFeedVersionFromGtfsZip(bart, "bart_old_lite.zip"); + bartVersionNewLite = createFeedVersionFromGtfsZip(bart, "bart_new_lite.zip"); // Caltrain FeedSource caltrain = new FeedSource("Caltrain", project.id, MANUALLY_UPLOADED); Persistence.feedSources.create(caltrain); calTrainVersion = createFeedVersionFromGtfsZip(caltrain, "caltrain_gtfs.zip"); + calTrainVersionLite = createFeedVersionFromGtfsZip(caltrain, "caltrain_gtfs_lite.zip"); // Napa FeedSource napa = new FeedSource("Napa", project.id, MANUALLY_UPLOADED); Persistence.feedSources.create(napa); napaVersion = createFeedVersionFromGtfsZip(napa, "napa-no-agency-id.zip"); + napaVersionLite = createFeedVersionFromGtfsZip(napa, "napa-no-agency-id-lite.zip"); // Fake agencies (for testing calendar service_id merges with MTC strategy). FeedSource fakeAgency = new FeedSource("Fake Agency", project.id, MANUALLY_UPLOADED); @@ -107,45 +115,45 @@ public static void setUp() throws IOException { public void canMergeRegional() throws SQLException { // Set up list of feed versions to merge. Set versions = new HashSet<>(); - versions.add(bartVersion1); - versions.add(calTrainVersion); - versions.add(napaVersion); + versions.add(bartVersionOldLite); + versions.add(calTrainVersionLite); + versions.add(napaVersionLite); FeedVersion mergedVersion = regionallyMergeVersions(versions); // Ensure the feed has the row counts we expect. assertEquals( - bartVersion1.feedLoadResult.trips.rowCount + calTrainVersion.feedLoadResult.trips.rowCount + napaVersion.feedLoadResult.trips.rowCount, + bartVersionOldLite.feedLoadResult.trips.rowCount + calTrainVersionLite.feedLoadResult.trips.rowCount + napaVersionLite.feedLoadResult.trips.rowCount, mergedVersion.feedLoadResult.trips.rowCount, "trips count for merged feed should equal sum of trips for versions merged." ); assertEquals( - bartVersion1.feedLoadResult.routes.rowCount + calTrainVersion.feedLoadResult.routes.rowCount + napaVersion.feedLoadResult.routes.rowCount, + bartVersionOldLite.feedLoadResult.routes.rowCount + calTrainVersionLite.feedLoadResult.routes.rowCount + napaVersionLite.feedLoadResult.routes.rowCount, mergedVersion.feedLoadResult.routes.rowCount, "routes count for merged feed should equal sum of routes for versions merged." ); assertEquals( mergedVersion.feedLoadResult.stops.rowCount, - bartVersion1.feedLoadResult.stops.rowCount + calTrainVersion.feedLoadResult.stops.rowCount + napaVersion.feedLoadResult.stops.rowCount, + bartVersionOldLite.feedLoadResult.stops.rowCount + calTrainVersionLite.feedLoadResult.stops.rowCount + napaVersionLite.feedLoadResult.stops.rowCount, "stops count for merged feed should equal sum of stops for versions merged." ); assertEquals( mergedVersion.feedLoadResult.agency.rowCount, - bartVersion1.feedLoadResult.agency.rowCount + calTrainVersion.feedLoadResult.agency.rowCount + napaVersion.feedLoadResult.agency.rowCount, + bartVersionOldLite.feedLoadResult.agency.rowCount + calTrainVersionLite.feedLoadResult.agency.rowCount + napaVersionLite.feedLoadResult.agency.rowCount, "agency count for merged feed should equal sum of agency for versions merged." ); assertEquals( mergedVersion.feedLoadResult.stopTimes.rowCount, - bartVersion1.feedLoadResult.stopTimes.rowCount + calTrainVersion.feedLoadResult.stopTimes.rowCount + napaVersion.feedLoadResult.stopTimes.rowCount, + bartVersionOldLite.feedLoadResult.stopTimes.rowCount + calTrainVersionLite.feedLoadResult.stopTimes.rowCount + napaVersionLite.feedLoadResult.stopTimes.rowCount, "stopTimes count for merged feed should equal sum of stopTimes for versions merged." ); assertEquals( mergedVersion.feedLoadResult.calendar.rowCount, - bartVersion1.feedLoadResult.calendar.rowCount + calTrainVersion.feedLoadResult.calendar.rowCount + napaVersion.feedLoadResult.calendar.rowCount, + bartVersionOldLite.feedLoadResult.calendar.rowCount + calTrainVersionLite.feedLoadResult.calendar.rowCount + napaVersionLite.feedLoadResult.calendar.rowCount, "calendar count for merged feed should equal sum of calendar for versions merged." ); assertEquals( mergedVersion.feedLoadResult.calendarDates.rowCount, - bartVersion1.feedLoadResult.calendarDates.rowCount + calTrainVersion.feedLoadResult.calendarDates.rowCount + napaVersion.feedLoadResult.calendarDates.rowCount, + bartVersionOldLite.feedLoadResult.calendarDates.rowCount + calTrainVersionLite.feedLoadResult.calendarDates.rowCount + napaVersionLite.feedLoadResult.calendarDates.rowCount, "calendarDates count for merged feed should equal sum of calendarDates for versions merged." ); // Ensure there are no referential integrity errors, duplicate ID, or wrong number of @@ -274,8 +282,8 @@ public void mergeMTCShouldFailOnDuplicateTrip() { @Test public void canMergeBARTFeeds() throws SQLException { Set versions = new HashSet<>(); - versions.add(bartVersion1); - versions.add(bartVersion2); + versions.add(bartVersionOldLite); + versions.add(bartVersionNewLite); MergeFeedsJob mergeFeedsJob = new MergeFeedsJob(user, versions, "merged_output", MergeFeedsType.SERVICE_PERIOD); // This time, turn off the failOnDuplicateTripId flag. mergeFeedsJob.failOnDuplicateTripId = false; @@ -295,24 +303,24 @@ public void canMergeBARTFeeds() throws SQLException { ); // Check GTFS file line numbers. assertEquals( - 4552, // Magic number represents the number of trips in the merged BART feed. + 3, // Magic number represents the number of trips in the merged BART feed. mergeFeedsJob.mergedVersion.feedLoadResult.trips.rowCount, "Merged feed trip count should equal expected value." ); assertEquals( - 9, // Magic number represents the number of routes in the merged BART feed. + 1, // Magic number represents the number of routes in the merged BART feed. mergeFeedsJob.mergedVersion.feedLoadResult.routes.rowCount, "Merged feed route count should equal expected value." ); assertEquals( // During merge, if identical shape_id is found in both feeds, active feed shape_id should be feed-scoped. - bartVersion1.feedLoadResult.shapes.rowCount + bartVersion2.feedLoadResult.shapes.rowCount, + bartVersionOldLite.feedLoadResult.shapes.rowCount + bartVersionNewLite.feedLoadResult.shapes.rowCount, mergeFeedsJob.mergedVersion.feedLoadResult.shapes.rowCount, "Merged feed shapes count should equal expected value." ); // Expect that two calendar dates are excluded from the past feed (because they occur after the first date of // the future feed) . - int expectedCalendarDatesCount = bartVersion1.feedLoadResult.calendarDates.rowCount + bartVersion2.feedLoadResult.calendarDates.rowCount - 2; + int expectedCalendarDatesCount = bartVersionOldLite.feedLoadResult.calendarDates.rowCount + bartVersionNewLite.feedLoadResult.calendarDates.rowCount - 2; assertEquals( // During merge, if identical shape_id is found in both feeds, active feed shape_id should be feed-scoped. expectedCalendarDatesCount, diff --git a/src/test/resources/com/conveyal/datatools/gtfs/bart_new_lite.zip b/src/test/resources/com/conveyal/datatools/gtfs/bart_new_lite.zip new file mode 100644 index 0000000000000000000000000000000000000000..493105c7bd1d501bb60be042aa64cc547ea5ad99 GIT binary patch literal 4153 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 VzH!i?A>aXthaQ8r+X8D~=ucK&Y<2(u literal 0 HcmV?d00001 diff --git a/src/test/resources/com/conveyal/datatools/gtfs/bart_old_lite.zip b/src/test/resources/com/conveyal/datatools/gtfs/bart_old_lite.zip new file mode 100644 index 0000000000000000000000000000000000000000..82303f3d21160d552b70828a8db167f0f6c037ca GIT binary patch literal 3897 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 O?i~fbcA#;inbW@-HAd0^ literal 0 HcmV?d00001 diff --git a/src/test/resources/com/conveyal/datatools/gtfs/napa-no-agency-id-lite.zip b/src/test/resources/com/conveyal/datatools/gtfs/napa-no-agency-id-lite.zip new file mode 100644 index 0000000000000000000000000000000000000000..4d54c510b865564c32ffd02dcdec0a9598afc482 GIT binary patch literal 7150 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 literal 0 HcmV?d00001 From 592a73b48644ac1bfab14461d463edb28634449f Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Wed, 16 Jun 2021 13:10:19 +0100 Subject: [PATCH 08/41] refactor(UpdateSQLFeedsMain.java): Update to allow multiple namespace references in SQL script. Plus --- .../conveyal/datatools/manager/UpdateSQLFeedsMain.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/UpdateSQLFeedsMain.java b/src/main/java/com/conveyal/datatools/manager/UpdateSQLFeedsMain.java index a5ab4943b..0f98ef87a 100644 --- a/src/main/java/com/conveyal/datatools/manager/UpdateSQLFeedsMain.java +++ b/src/main/java/com/conveyal/datatools/manager/UpdateSQLFeedsMain.java @@ -23,8 +23,8 @@ * Argument descriptions: * 1. path to env.yml * 2. path to server.yml - * 3. string update sql statement to apply to optionally filtered feeds (this should contain a {@link java.util.Formatter} - * compatible string substitution for the namespace argument). + * 3. string update sql statement to apply to optionally filtered feeds (this should contain a namespace wildcard + * {@link UpdateSQLFeedsMain#NAMESPACE_WILDCARD} string for the namespace argument substitution). * 4. string field to filter feeds on * 5. string value (corresponding to field in arg 3) to filter feeds on (omit to use NULL as value or comma separate to * include multiple values) @@ -38,6 +38,7 @@ * "/path/to/config/env.yml" "/path/to/config/server.yml" "alter table %s.routes add column some_column_name int" filename /tmp/gtfs.zip */ public class UpdateSQLFeedsMain { + public static final String NAMESPACE_WILDCARD = "#ns#"; public static void main(String[] args) throws IOException, SQLException { // First, set up application. @@ -77,7 +78,7 @@ private static List updateFeedsWhere(String updateSql, String field, Str // Add where in clause if field is not null // NOTE: if value is null, where clause will be executed accordingly (i.e., WHERE field = null) String operator = values == null - ? "IS NULL" + ? "" : String.format("in (%s)", String.join(", ", Collections.nCopies(values.length, "?"))); selectFeedsSql = String.format("%s where %s %s", selectFeedsSql, field, operator); } @@ -103,7 +104,7 @@ private static List updateFeedsWhere(String updateSql, String field, Str while (resultSet.next()) { // Use the string found in the result as the table prefix for the following update query. String namespace = resultSet.getString(1); - String updateTableSql = String.format(updateSql, namespace); + String updateTableSql = updateSql.replaceAll(NAMESPACE_WILDCARD, namespace); Statement statement = connection.createStatement(); try { System.out.println(updateTableSql); From 4445b680a832f12e2255f69e010b56e95e8d570b Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 16 Jun 2021 11:33:03 -0400 Subject: [PATCH 09/41] ci(gh): bump node to 14 for optional chaining A build error (https://github.com/ibi-group/datatools-server/runs/2839437265#step:17:42) was encountered which appears to be related to optional chaining not being supported by 12.x. --- .github/workflows/maven.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index fc764c0f9..d5b5577c2 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,11 +28,11 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - # Install node 12 for running e2e tests (and for maven-semantic-release). - - name: Use Node.js 12.x + # Install node 14 for running e2e tests (and for maven-semantic-release). + - name: Use Node.js 14.x uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 14.x - name: Start MongoDB uses: supercharge/mongodb-github-action@1.3.0 with: From 8c2e6e6a14c77b573bca870c937bff8aefe68bde Mon Sep 17 00:00:00 2001 From: Robin Beer Date: Thu, 22 Jul 2021 08:34:08 +0100 Subject: [PATCH 10/41] refactor(pom.xml): Bumped gtfs-lib version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 003cc6664..94cfa892e 100644 --- a/pom.xml +++ b/pom.xml @@ -271,7 +271,7 @@ com.github.conveyal gtfs-lib - 9d0908945f + a45e6f9323 From f802aa5650644172b2e649f07759e31d6b8786ac Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Thu, 29 Jul 2021 17:54:12 -0400 Subject: [PATCH 11/41] refactor: accomodate pelias update UI changes --- .../controllers/api/DeploymentController.java | 13 +++++++++++++ .../datatools/manager/models/Deployment.java | 4 ++++ .../conveyal/datatools/manager/models/Project.java | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 7b23b7765..aae6dc37b 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -218,6 +218,11 @@ private static Deployment createDeployment (Request req, Response res) { Project project = Persistence.projects.getById(projectId); Deployment newDeployment = new Deployment(project); + // Pre-populate the Pelias webhook URL from the project + if (project.lastUsedPeliasWebhookUrl != null) { + newDeployment.peliasWebhookUrl = project.lastUsedPeliasWebhookUrl; + } + // FIXME: Here we are creating a deployment and updating it with the JSON string (two db operations) // We do this because there is not currently apply JSON directly to an object (outside of Mongo codec // operations) @@ -311,6 +316,14 @@ private static Deployment updateDeployment (Request req, Response res) { List versionIds = versionsToInsert.stream().map(v -> v.id).collect(Collectors.toList()); Persistence.deployments.updateField(deploymentToUpdate.id, "feedVersionIds", versionIds); } + + // If Pelias Webhook URL is updated, set that to the project's as a helpful default + if (updateDocument.containsKey("peliasWebhookUrl")) { + Persistence.projects.updateField( + deploymentToUpdate.projectId, + "lastUsedPeliasWebhookUrl", + updateDocument.getString("peliasWebhookUrl")); + } Deployment updatedDeployment = Persistence.deployments.update(deploymentToUpdate.id, req.body()); // TODO: Should updates to the deployment's fields trigger a notification to subscribers? This could get // very noisy. diff --git a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java index 81e2bcb87..e207b798e 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java @@ -73,6 +73,10 @@ public class Deployment extends Model implements Serializable { private ObjectMapper otpConfigMapper = new ObjectMapper().setSerializationInclusion(Include.NON_NULL); + /* Pelias fields, used to determine where/if to send data to the Pelias webhook */ + public String peliasWebhookUrl; + public boolean peliasUpdate; + /** * Get parent project for deployment. Note: at one point this was a JSON property of this class, but severe * performance issues prevent this field from scaling to be fetched/assigned to a large collection of deployments. diff --git a/src/main/java/com/conveyal/datatools/manager/models/Project.java b/src/main/java/com/conveyal/datatools/manager/models/Project.java index 64063fea3..886a7f8fc 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Project.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Project.java @@ -45,6 +45,9 @@ public class Project extends Model { /** Last successful auto deploy. **/ public Date lastAutoDeploy; + /** The most recently entered Pelias webhook URL. Used when creating new Deployments */ + public String lastUsedPeliasWebhookUrl; + /** * A list of servers that are available to deploy project feeds/OSM to. This includes servers assigned to this * project as well as those that belong to no project. From 42b155a26304152cbcd83a8a4fd0a64976408c69 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Fri, 30 Jul 2021 14:53:31 -0400 Subject: [PATCH 12/41] feat(DeploymentController): add custom geocoder update job --- .../common/status/MonitorableJob.java | 3 +- .../controllers/api/DeploymentController.java | 28 +++++++++++++++++++ .../manager/jobs/PeliasUpdateJob.java | 19 +++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java diff --git a/src/main/java/com/conveyal/datatools/common/status/MonitorableJob.java b/src/main/java/com/conveyal/datatools/common/status/MonitorableJob.java index 6eba99768..a3e487cbd 100644 --- a/src/main/java/com/conveyal/datatools/common/status/MonitorableJob.java +++ b/src/main/java/com/conveyal/datatools/common/status/MonitorableJob.java @@ -78,7 +78,8 @@ public enum JobType { VALIDATE_ALL_FEEDS, MONITOR_SERVER_STATUS, MERGE_FEED_VERSIONS, - RECREATE_BUILD_IMAGE + RECREATE_BUILD_IMAGE, + UPDATE_PELIAS } public MonitorableJob(Auth0UserProfile owner, String name, JobType type) { diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index aae6dc37b..efc0f8647 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -8,6 +8,7 @@ import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.jobs.DeployJob; +import com.conveyal.datatools.manager.jobs.PeliasUpdateJob; import com.conveyal.datatools.manager.models.Deployment; import com.conveyal.datatools.manager.models.EC2InstanceSummary; import com.conveyal.datatools.manager.models.FeedSource; @@ -462,9 +463,36 @@ private static String deploy (Request req, Response res) { target); logMessageAndHalt(req, HttpStatus.ACCEPTED_202, message); } + + // If pelias update is requested, launch pelias update job + if (deployment.peliasUpdate) { + updatePelias(req, res); + } + return SparkUtils.formatJobMessage(job.jobId, "Deployment initiating."); } + /** + * Start an updatePelias job which will trigger the webhook, then check for status updates. + */ + private static String updatePelias (Request req, Response res) { + // Check parameters supplied in request for validity. + Auth0UserProfile userProfile = req.attribute("user"); + Deployment deployment = getDeploymentWithPermissions(req, res); + Project project = Persistence.projects.getById(deployment.projectId); + if (project == null) { + logMessageAndHalt(req, 400, "Internal reference error. Deployment's project ID is invalid"); + } + + // Check that permissions of user allow them to deploy to target. + boolean isProjectAdmin = userProfile.canAdministerProject(deployment.projectId, deployment.organizationId()); + + // Execute the pelias update job and keep track of it + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "what is this"); + JobUtils.heavyExecutor.execute(peliasUpdateJob); + return SparkUtils.formatJobMessage(peliasUpdateJob.jobId, "Pelias update initiating."); + } + public static void register (String apiPrefix) { // Construct JSON managers which help serialize the response. Slim JSON is the generic JSON view. Full JSON // contains additional fields (at the moment just #ec2Instances) and should only be used when the controller diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java new file mode 100644 index 000000000..1499065b6 --- /dev/null +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -0,0 +1,19 @@ +package com.conveyal.datatools.manager.jobs; + +import com.conveyal.datatools.common.status.MonitorableJob; +import com.conveyal.datatools.manager.auth.Auth0UserProfile; + +public class PeliasUpdateJob extends MonitorableJob { + public PeliasUpdateJob(Auth0UserProfile owner, String name) { + super(owner, name, JobType.UPDATE_PELIAS); + } + /** + * This method must be overridden by subclasses to perform the core steps of the job. + */ + @Override + public void jobLogic() throws Exception { + status.update("Here we go!", 5.0); + Thread.sleep(4000); + status.completeSuccessfully("it's all done :)"); + } +} From b3efc80938d3e52bac117298edbe0b5938af4003 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Fri, 30 Jul 2021 17:16:50 -0400 Subject: [PATCH 13/41] refactor(PeliasUpdateJob): make request to webhook --- .../controllers/api/DeploymentController.java | 5 +- .../manager/jobs/PeliasUpdateJob.java | 120 +++++++++++++++++- 2 files changed, 118 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index efc0f8647..5a607b0ef 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -484,11 +484,8 @@ private static String updatePelias (Request req, Response res) { logMessageAndHalt(req, 400, "Internal reference error. Deployment's project ID is invalid"); } - // Check that permissions of user allow them to deploy to target. - boolean isProjectAdmin = userProfile.canAdministerProject(deployment.projectId, deployment.organizationId()); - // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "what is this"); + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "Updating Custom Geocoder Database", deployment); JobUtils.heavyExecutor.execute(peliasUpdateJob); return SparkUtils.formatJobMessage(peliasUpdateJob.jobId, "Pelias update initiating."); } diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 1499065b6..850752c1c 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -1,19 +1,133 @@ package com.conveyal.datatools.manager.jobs; import com.conveyal.datatools.common.status.MonitorableJob; +import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; +import com.conveyal.datatools.manager.models.Deployment; +import com.conveyal.datatools.manager.models.FeedVersion; +import com.conveyal.datatools.manager.persistence.Persistence; +import com.conveyal.datatools.manager.utils.json.JsonUtil; +import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.stream.Collectors; + +import static com.mongodb.client.model.Filters.in; public class PeliasUpdateJob extends MonitorableJob { - public PeliasUpdateJob(Auth0UserProfile owner, String name) { + /** + * The deployment to send to Pelias + */ + private Deployment deployment; + + public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment) { super(owner, name, JobType.UPDATE_PELIAS); + this.deployment = deployment; } + /** * This method must be overridden by subclasses to perform the core steps of the job. */ @Override public void jobLogic() throws Exception { status.update("Here we go!", 5.0); - Thread.sleep(4000); + String workerId = this.makeWebhookRequest(this.deployment); + // TODO: Check status endpoint every few seconds and update status + Thread.sleep(1000); + status.update(workerId, 55.0); + Thread.sleep(8000); status.completeSuccessfully("it's all done :)"); } -} + + /** + * Make a request to Pelias update webhook + * + * @return The workerID of the run created on the Pelias server + */ + private String makeWebhookRequest(Deployment deployment) throws IOException { + URL url; + try { + url = new URL(deployment.peliasWebhookUrl); + } catch (MalformedURLException ex) { + status.fail("Webhook URL was not a valid URL", ex); + return null; + } + + // Convert from feedVersionIds to Pelias Config objects + List gtfsFeeds = Persistence.feedVersions.getFiltered(in("_id", deployment.feedVersionIds)) + .stream() + .map(PeliasWebhookGTFSFeedFormat::new) + .collect(Collectors.toList()); + + PeliasWebhookRequestBody peliasWebhookRequestBody = new PeliasWebhookRequestBody(); + peliasWebhookRequestBody.gtfsFeeds = gtfsFeeds; + + String query = JsonUtil.toJson(peliasWebhookRequestBody); + + HttpResponse response; + + try { + CloseableHttpClient client = HttpClientBuilder.create().build(); + HttpPost request = new HttpPost(deployment.peliasWebhookUrl); + StringEntity queryEntity = new StringEntity(query); + request.setEntity(queryEntity); + request.setHeader("Accept", "application/json"); + request.setHeader("Content-type", "application/json"); + + response = client.execute(request); + } catch (IOException ex) { + status.fail("Couldn't connect to webhook URL given.", ex); + return null; + } + + String json = EntityUtils.toString(response.getEntity()); + JsonNode webhookResponse = null; + try { + webhookResponse = JsonUtil.objectMapper.readTree(json); + } catch (IOException ex) { + status.fail("Webhook server returned error:", ex); + return null; + } + + return webhookResponse.get("workerId").asText(); + } + + + /** + * The request body required by the Pelias webhook + */ + private class PeliasWebhookRequestBody { + public List gtfsFeeds; + public List csvFiles; + } + + /** + * The GTFS feed info format the Pelias webhook requires + */ + private class PeliasWebhookGTFSFeedFormat { + public String uri; + public String name; + public String filename; + + public PeliasWebhookGTFSFeedFormat(FeedVersion feedVersion) { + uri = S3Utils.getS3FeedUri(feedVersion.id); + name = Persistence.feedSources.getById(feedVersion.feedSourceId).name; + filename = feedVersion.id; + } + } + + private class PeliasWebhookErrorMessage { + public Boolean completed; + public String error; + public String message; + } +} \ No newline at end of file From ce49da00e3fb39d7021b562c4a30fab42d060937 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Mon, 2 Aug 2021 12:16:30 -0400 Subject: [PATCH 14/41] refactor(PeliasUpdateJob): display webhook status --- .../manager/jobs/PeliasUpdateJob.java | 154 ++++++++++++++---- .../datatools/manager/utils/HttpUtils.java | 25 ++- 2 files changed, 143 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 850752c1c..22e0b4bf1 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -6,19 +6,21 @@ import com.conveyal.datatools.manager.models.Deployment; import com.conveyal.datatools.manager.models.FeedVersion; import com.conveyal.datatools.manager.persistence.Persistence; +import com.conveyal.datatools.manager.utils.HttpUtils; import com.conveyal.datatools.manager.utils.json.JsonUtil; import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.Header; import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.message.BasicHeader; import org.apache.http.util.EntityUtils; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; +import java.util.Timer; +import java.util.TimerTask; import java.util.stream.Collectors; import static com.mongodb.client.model.Filters.in; @@ -29,9 +31,21 @@ public class PeliasUpdateJob extends MonitorableJob { */ private Deployment deployment; + /** + * The workerId our request has on the webhook server. Used to get status updates + */ + private String workerId; + + + /** + * Timer used to poll the status endpoint + */ + Timer timer; + public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment) { super(owner, name, JobType.UPDATE_PELIAS); this.deployment = deployment; + this.timer = new Timer(); } /** @@ -39,13 +53,55 @@ public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deploymen */ @Override public void jobLogic() throws Exception { - status.update("Here we go!", 5.0); - String workerId = this.makeWebhookRequest(this.deployment); - // TODO: Check status endpoint every few seconds and update status + status.message = "Launching custom geocoder update request"; + workerId = this.makeWebhookRequest(); + status.percentComplete = 1.0; + + // Give server 1 second to create worker Thread.sleep(1000); - status.update(workerId, 55.0); - Thread.sleep(8000); - status.completeSuccessfully("it's all done :)"); + // Check status every 2 seconds + timer.schedule(new StatusChecker(), 0, 2000); + + } + + private void getWebhookStatus() { + URI url = getWebhookURI(deployment.peliasWebhookUrl + "/status/" + workerId); + HttpResponse response = HttpUtils.httpRequestRawResponse(url, 500, HttpUtils.REQUEST_METHOD.GET, null); + + // Convert raw body to JSON + String jsonResponse; + try { + jsonResponse = EntityUtils.toString(response.getEntity()); + } + catch (NullPointerException | IOException ex) { + status.fail("Webhook status did not provide a response!", ex); + return; + } + + // Parse JSON + PeliasWebhookStatusMessage statusResponse = null; + try { + statusResponse = JsonUtil.objectMapper.readValue(jsonResponse, PeliasWebhookStatusMessage.class); + } catch (IOException ex) { + status.fail("Status update wasn't in correct format:", ex); + return; + } + + if (!statusResponse.error.equals("false")) { + status.fail(statusResponse.error); + timer.cancel(); + return; + } + + if (statusResponse.completed) { + status.completeSuccessfully(statusResponse.message); + timer.cancel(); + return; + } + + status.message = statusResponse.message; + status.percentComplete = statusResponse.percentComplete; + status.completed = false; } /** @@ -53,14 +109,8 @@ public void jobLogic() throws Exception { * * @return The workerID of the run created on the Pelias server */ - private String makeWebhookRequest(Deployment deployment) throws IOException { - URL url; - try { - url = new URL(deployment.peliasWebhookUrl); - } catch (MalformedURLException ex) { - status.fail("Webhook URL was not a valid URL", ex); - return null; - } + private String makeWebhookRequest() { + URI url = getWebhookURI(deployment.peliasWebhookUrl); // Convert from feedVersionIds to Pelias Config objects List gtfsFeeds = Persistence.feedVersions.getFiltered(in("_id", deployment.feedVersionIds)) @@ -73,34 +123,63 @@ private String makeWebhookRequest(Deployment deployment) throws IOException { String query = JsonUtil.toJson(peliasWebhookRequestBody); - HttpResponse response; + // Create headers needed for Pelias webhook + List
headers = new ArrayList<>(); + headers.add(new BasicHeader("Accept", "application/json")); + headers.add(new BasicHeader("Content-type", "application/json")); + + // Get webhook response + HttpResponse response = HttpUtils.httpRequestRawResponse(url, 5000, HttpUtils.REQUEST_METHOD.POST, query, headers); + // Convert raw body to JSON + String jsonResponse; try { - CloseableHttpClient client = HttpClientBuilder.create().build(); - HttpPost request = new HttpPost(deployment.peliasWebhookUrl); - StringEntity queryEntity = new StringEntity(query); - request.setEntity(queryEntity); - request.setHeader("Accept", "application/json"); - request.setHeader("Content-type", "application/json"); - - response = client.execute(request); - } catch (IOException ex) { - status.fail("Couldn't connect to webhook URL given.", ex); + jsonResponse = EntityUtils.toString(response.getEntity()); + } + catch (NullPointerException | IOException ex) { + status.fail("Webhook server specified did not provide a response!", ex); return null; } - String json = EntityUtils.toString(response.getEntity()); + // Parse JSON JsonNode webhookResponse = null; try { - webhookResponse = JsonUtil.objectMapper.readTree(json); + webhookResponse = JsonUtil.objectMapper.readTree(jsonResponse); } catch (IOException ex) { status.fail("Webhook server returned error:", ex); return null; } + if (webhookResponse.get("error") != null) { + status.fail("Server returned an error: " + webhookResponse.get("error").asText()); + return null; + } + return webhookResponse.get("workerId").asText(); } + /** + * Helper function to convert Deployment webhook URL to URI object + * @param webhookUrlString String containing URL to parse + * @return URI object with webhook URL + */ + private URI getWebhookURI(String webhookUrlString) { + URI url; + try { + url = new URI(webhookUrlString); + } catch (URISyntaxException ex) { + status.fail("Webhook URL was not a valid URL", ex); + return null; + } + + return url; + } + + class StatusChecker extends TimerTask { + public void run() { + getWebhookStatus(); + } + } /** * The request body required by the Pelias webhook @@ -117,17 +196,24 @@ private class PeliasWebhookGTFSFeedFormat { public String uri; public String name; public String filename; + public String logUploadUrl; public PeliasWebhookGTFSFeedFormat(FeedVersion feedVersion) { uri = S3Utils.getS3FeedUri(feedVersion.id); name = Persistence.feedSources.getById(feedVersion.feedSourceId).name; filename = feedVersion.id; + // TODO: Where should the log be uploaded to? + logUploadUrl = ""; } } - private class PeliasWebhookErrorMessage { + /** + * The status object returned by the webhook/status endpoint + */ + public static class PeliasWebhookStatusMessage { public Boolean completed; public String error; public String message; + public Double percentComplete; } } \ No newline at end of file diff --git a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java index 0c1cde3d5..83358e14d 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java @@ -1,5 +1,6 @@ package com.conveyal.datatools.manager.utils; +import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -17,6 +18,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; +import java.util.ArrayList; +import java.util.List; public class HttpUtils { private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class); @@ -25,12 +28,26 @@ public enum REQUEST_METHOD {GET, POST, DELETE, PUT} /** * Makes an http get/post request and returns the response. The request is based on the provided params. */ - //TODO: Replace with java.net.http once migrated to JDK 11. See HttpUtils under otp-middleware. + public static HttpResponse httpRequestRawResponse( + URI uri, + int connectionTimeout, + REQUEST_METHOD method, + String bodyContent + ) { + return httpRequestRawResponse(uri, connectionTimeout, method, bodyContent, new ArrayList<>()); + } + + /** + * Makes an http get/post request and returns the response, including custom headers. + * The request is based on the provided params, including headers. + */ public static HttpResponse httpRequestRawResponse( URI uri, int connectionTimeout, REQUEST_METHOD method, - String bodyContent) { + String bodyContent, + List
headers + ) { RequestConfig timeoutConfig = RequestConfig.custom() .setConnectionRequestTimeout(connectionTimeout) @@ -51,6 +68,10 @@ public static HttpResponse httpRequestRawResponse( try { HttpPost postRequest = new HttpPost(uri); if (bodyContent != null) postRequest.setEntity(new StringEntity(bodyContent)); + for (Header header : headers) { + postRequest.setHeader(header); + } + postRequest.setConfig(timeoutConfig); httpUriRequest = postRequest; } catch (UnsupportedEncodingException e) { From d9352a919147e1f7fe98e64730547b0013da7553 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Mon, 2 Aug 2021 15:49:02 -0400 Subject: [PATCH 15/41] refactor: support webhook http authentication --- .../manager/jobs/PeliasUpdateJob.java | 23 ++++++++++++++++--- .../datatools/manager/models/Deployment.java | 2 ++ .../datatools/manager/utils/HttpUtils.java | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 22e0b4bf1..0884a09eb 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -18,6 +18,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -42,10 +43,19 @@ public class PeliasUpdateJob extends MonitorableJob { */ Timer timer; + /** + * Webhook authorization from username and password + */ + Header webhookAuthorization; + public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment) { super(owner, name, JobType.UPDATE_PELIAS); this.deployment = deployment; this.timer = new Timer(); + + String authorizationString = deployment.peliasUsername + ":" + deployment.peliasPassword; + authorizationString = "Basic " + Base64.getEncoder().encodeToString(authorizationString.getBytes()); + this.webhookAuthorization = new BasicHeader("Authorization", authorizationString); } /** @@ -66,7 +76,11 @@ public void jobLogic() throws Exception { private void getWebhookStatus() { URI url = getWebhookURI(deployment.peliasWebhookUrl + "/status/" + workerId); - HttpResponse response = HttpUtils.httpRequestRawResponse(url, 500, HttpUtils.REQUEST_METHOD.GET, null); + + List
headers = new ArrayList<>(); + headers.add(this.webhookAuthorization); + + HttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null, headers); // Convert raw body to JSON String jsonResponse; @@ -75,6 +89,7 @@ private void getWebhookStatus() { } catch (NullPointerException | IOException ex) { status.fail("Webhook status did not provide a response!", ex); + timer.cancel(); return; } @@ -83,7 +98,8 @@ private void getWebhookStatus() { try { statusResponse = JsonUtil.objectMapper.readValue(jsonResponse, PeliasWebhookStatusMessage.class); } catch (IOException ex) { - status.fail("Status update wasn't in correct format:", ex); + status.fail("Server refused to provide a valid status update. Are the credentials correct?", ex); + timer.cancel(); return; } @@ -127,6 +143,7 @@ private String makeWebhookRequest() { List
headers = new ArrayList<>(); headers.add(new BasicHeader("Accept", "application/json")); headers.add(new BasicHeader("Content-type", "application/json")); + headers.add(this.webhookAuthorization); // Get webhook response HttpResponse response = HttpUtils.httpRequestRawResponse(url, 5000, HttpUtils.REQUEST_METHOD.POST, query, headers); @@ -146,7 +163,7 @@ private String makeWebhookRequest() { try { webhookResponse = JsonUtil.objectMapper.readTree(jsonResponse); } catch (IOException ex) { - status.fail("Webhook server returned error:", ex); + status.fail("The Webhook server's response was invalid! Are the credentials correct?", ex); return null; } diff --git a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java index e207b798e..71352b241 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java @@ -75,6 +75,8 @@ public class Deployment extends Model implements Serializable { /* Pelias fields, used to determine where/if to send data to the Pelias webhook */ public String peliasWebhookUrl; + public String peliasUsername; + public String peliasPassword; public boolean peliasUpdate; /** diff --git a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java index 83358e14d..1df8a1fa6 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java @@ -61,6 +61,9 @@ public static HttpResponse httpRequestRawResponse( switch (method) { case GET: HttpGet getRequest = new HttpGet(uri); + for (Header header : headers) { + getRequest.setHeader(header); + } getRequest.setConfig(timeoutConfig); httpUriRequest = getRequest; break; From 7b6dad3c53ac11c33efa5b166176f5cdcb918cd8 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Mon, 2 Aug 2021 18:00:57 -0400 Subject: [PATCH 16/41] refactor(PeliasUpdateJob): pass log upload URI to webhook --- .../controllers/api/DeploymentController.java | 9 ++++--- .../manager/jobs/PeliasUpdateJob.java | 27 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 5a607b0ef..7c1707d67 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -466,7 +466,7 @@ private static String deploy (Request req, Response res) { // If pelias update is requested, launch pelias update job if (deployment.peliasUpdate) { - updatePelias(req, res); + updatePelias(req, res, job); } return SparkUtils.formatJobMessage(job.jobId, "Deployment initiating."); @@ -475,7 +475,7 @@ private static String deploy (Request req, Response res) { /** * Start an updatePelias job which will trigger the webhook, then check for status updates. */ - private static String updatePelias (Request req, Response res) { + private static String updatePelias (Request req, Response res, DeployJob deployJob) { // Check parameters supplied in request for validity. Auth0UserProfile userProfile = req.attribute("user"); Deployment deployment = getDeploymentWithPermissions(req, res); @@ -484,8 +484,11 @@ private static String updatePelias (Request req, Response res) { logMessageAndHalt(req, 400, "Internal reference error. Deployment's project ID is invalid"); } + // Get log upload URI from deploy job + AmazonS3URI logUploadS3URI = deployJob.getS3FolderURI(); + // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "Updating Custom Geocoder Database", deployment); + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "Updating Custom Geocoder Database", deployment, logUploadS3URI); JobUtils.heavyExecutor.execute(peliasUpdateJob); return SparkUtils.formatJobMessage(peliasUpdateJob.jobId, "Pelias update initiating."); } diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 0884a09eb..d83807457 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -1,5 +1,6 @@ package com.conveyal.datatools.manager.jobs; +import com.amazonaws.services.s3.AmazonS3URI; import com.conveyal.datatools.common.status.MonitorableJob; import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; @@ -41,21 +42,29 @@ public class PeliasUpdateJob extends MonitorableJob { /** * Timer used to poll the status endpoint */ - Timer timer; + private Timer timer; /** * Webhook authorization from username and password */ - Header webhookAuthorization; + private Header webhookAuthorization; - public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment) { + /** + * S3 URI to upload logs to + */ + private AmazonS3URI logUploadS3URI; + + public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment, AmazonS3URI logUploadS3URI) { super(owner, name, JobType.UPDATE_PELIAS); this.deployment = deployment; this.timer = new Timer(); + this.logUploadS3URI = logUploadS3URI; - String authorizationString = deployment.peliasUsername + ":" + deployment.peliasPassword; - authorizationString = "Basic " + Base64.getEncoder().encodeToString(authorizationString.getBytes()); - this.webhookAuthorization = new BasicHeader("Authorization", authorizationString); + if (deployment.peliasUsername != "" && deployment.peliasPassword != "") { + String authorizationString = deployment.peliasUsername + ":" + deployment.peliasPassword; + authorizationString = "Basic " + Base64.getEncoder().encodeToString(authorizationString.getBytes()); + this.webhookAuthorization = new BasicHeader("Authorization", authorizationString); + } } /** @@ -136,9 +145,11 @@ private String makeWebhookRequest() { PeliasWebhookRequestBody peliasWebhookRequestBody = new PeliasWebhookRequestBody(); peliasWebhookRequestBody.gtfsFeeds = gtfsFeeds; + peliasWebhookRequestBody.logUploadUrl = this.logUploadS3URI.toString(); String query = JsonUtil.toJson(peliasWebhookRequestBody); + // Create headers needed for Pelias webhook List
headers = new ArrayList<>(); headers.add(new BasicHeader("Accept", "application/json")); @@ -204,6 +215,7 @@ public void run() { private class PeliasWebhookRequestBody { public List gtfsFeeds; public List csvFiles; + public String logUploadUrl; } /** @@ -213,14 +225,11 @@ private class PeliasWebhookGTFSFeedFormat { public String uri; public String name; public String filename; - public String logUploadUrl; public PeliasWebhookGTFSFeedFormat(FeedVersion feedVersion) { uri = S3Utils.getS3FeedUri(feedVersion.id); name = Persistence.feedSources.getById(feedVersion.feedSourceId).name; filename = feedVersion.id; - // TODO: Where should the log be uploaded to? - logUploadUrl = ""; } } From 307d3a91e6e4c7a742daebb484852f5192f8bcc4 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 3 Aug 2021 10:58:29 -0400 Subject: [PATCH 17/41] refactor: add pelias csv file upload --- .../controllers/api/DeploymentController.java | 65 ++++++++++++++++++- .../datatools/manager/jobs/DeployJob.java | 2 +- .../manager/jobs/PeliasUpdateJob.java | 7 ++ .../datatools/manager/models/Deployment.java | 1 + 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 7c1707d67..44e2c926a 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -1,9 +1,12 @@ package com.conveyal.datatools.manager.controllers.api; +import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3URI; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.status.MonitorableJob; -import com.conveyal.datatools.common.utils.aws.CheckedAWSException; import com.conveyal.datatools.common.utils.SparkUtils; +import com.conveyal.datatools.common.utils.aws.CheckedAWSException; import com.conveyal.datatools.common.utils.aws.EC2Utils; import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; @@ -19,6 +22,7 @@ import com.conveyal.datatools.manager.persistence.Persistence; import com.conveyal.datatools.manager.utils.JobUtils; import com.conveyal.datatools.manager.utils.json.JsonManager; +import org.apache.commons.io.IOUtils; import org.bson.Document; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; @@ -26,9 +30,14 @@ import spark.Request; import spark.Response; +import javax.servlet.MultipartConfigElement; +import javax.servlet.ServletException; +import javax.servlet.http.Part; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -37,6 +46,7 @@ import static com.conveyal.datatools.common.utils.SparkUtils.logMessageAndHalt; import static com.conveyal.datatools.manager.DataManager.isExtensionEnabled; +import static com.conveyal.datatools.manager.jobs.DeployJob.bundlePrefix; import static com.mongodb.client.model.Filters.and; import static com.mongodb.client.model.Filters.eq; import static spark.Spark.delete; @@ -493,6 +503,57 @@ private static String updatePelias (Request req, Response res, DeployJob deployJ return SparkUtils.formatJobMessage(peliasUpdateJob.jobId, "Pelias update initiating."); } + /** + * Uploads a file from Spark request object to the s3 bucket of the deployment the Pelias Update Job is associated with. + * Follows https://github.com/ibi-group/datatools-server/blob/dev/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java#L111 + * @return S3 URL the file has been uploaded to + */ + private static String uploadToS3 (Request req, Response res) throws IOException { + // Check parameters supplied in request for validity. + Auth0UserProfile userProfile = req.attribute("user"); + Deployment deployment = getDeploymentWithPermissions(req, res); + + String url; + + // Get file from request + if (req.raw().getAttribute("org.eclipse.jetty.multipartConfig") == null) { + MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); + req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); + } + String extension = null; + File tempFile = null; + try { + Part part = req.raw().getPart("file"); + extension = "." + part.getContentType().split("/", 0)[1]; + tempFile = File.createTempFile(part.getName() + "_csv_upload", extension); + InputStream inputStream; + inputStream = part.getInputStream(); + FileOutputStream out = new FileOutputStream(tempFile); + IOUtils.copy(inputStream, out); + } catch (IOException | ServletException e) { + e.printStackTrace(); + } + + try { + String keyName = String.join("/", bundlePrefix, deployment.projectId, deployment.id, tempFile.getName()); + url = S3Utils.getDefaultBucketUrlForKey(keyName); + S3Utils.getDefaultS3Client().putObject(new PutObjectRequest( + S3Utils.DEFAULT_BUCKET, keyName, tempFile) + // Allow public read + // TODO: restrict? + .withCannedAcl(CannedAccessControlList.PublicRead)); + return url; + } catch (AmazonServiceException | CheckedAWSException e) { + e.printStackTrace(); + return null; + } finally { + boolean deleted = tempFile.delete(); + if (!deleted) { + throw new IOException("Failed to delete file temporarily stored on server"); + } + } + } + public static void register (String apiPrefix) { // Construct JSON managers which help serialize the response. Slim JSON is the generic JSON view. Full JSON // contains additional fields (at the moment just #ec2Instances) and should only be used when the controller @@ -518,5 +579,7 @@ public static void register (String apiPrefix) { post(apiPrefix + "secure/deployments", DeploymentController::createDeployment, fullJson::write); put(apiPrefix + "secure/deployments/:id", DeploymentController::updateDeployment, fullJson::write); post(apiPrefix + "secure/deployments/fromfeedsource/:id", DeploymentController::createDeploymentFromFeedSource, fullJson::write); + post(apiPrefix + "secure/deployments/:id/upload", DeploymentController::uploadToS3, slimJson::write); + } } diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index bfc7f6259..dd505350f 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -91,7 +91,7 @@ public class DeployJob extends MonitorableJob { private static final Logger LOG = LoggerFactory.getLogger(DeployJob.class); - private static final String bundlePrefix = "bundles"; + public static final String bundlePrefix = "bundles"; // Indicates whether EC2 instances should be EBS optimized. private static final boolean EBS_OPTIMIZED = "true".equals(DataManager.getConfigPropertyAsText("modules.deployment.ec2.ebs_optimized")); // Indicates the node.js version installed by nvm to set the PATH variable to point to diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index d83807457..0ebccb064 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -145,7 +145,10 @@ private String makeWebhookRequest() { PeliasWebhookRequestBody peliasWebhookRequestBody = new PeliasWebhookRequestBody(); peliasWebhookRequestBody.gtfsFeeds = gtfsFeeds; + peliasWebhookRequestBody.csvFiles = deployment.peliasCsvFiles; peliasWebhookRequestBody.logUploadUrl = this.logUploadS3URI.toString(); + peliasWebhookRequestBody.deploymentId = deployment.id; + String query = JsonUtil.toJson(peliasWebhookRequestBody); @@ -203,6 +206,9 @@ private URI getWebhookURI(String webhookUrlString) { return url; } + /** + * Class used to execute the status update + */ class StatusChecker extends TimerTask { public void run() { getWebhookStatus(); @@ -216,6 +222,7 @@ private class PeliasWebhookRequestBody { public List gtfsFeeds; public List csvFiles; public String logUploadUrl; + public String deploymentId; } /** diff --git a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java index 71352b241..7f0f97718 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java @@ -78,6 +78,7 @@ public class Deployment extends Model implements Serializable { public String peliasUsername; public String peliasPassword; public boolean peliasUpdate; + public List peliasCsvFiles; /** * Get parent project for deployment. Note: at one point this was a JSON property of this class, but severe From 12163e1851f28c1fba9403b6d86989dfcdb633ae Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 3 Aug 2021 11:42:29 -0400 Subject: [PATCH 18/41] refactor: adjust csv upload to match ui --- .../controllers/api/DeploymentController.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 44e2c926a..72b4b5bda 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -5,8 +5,8 @@ import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.status.MonitorableJob; -import com.conveyal.datatools.common.utils.SparkUtils; import com.conveyal.datatools.common.utils.aws.CheckedAWSException; +import com.conveyal.datatools.common.utils.SparkUtils; import com.conveyal.datatools.common.utils.aws.EC2Utils; import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; @@ -42,6 +42,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import static com.conveyal.datatools.common.utils.SparkUtils.logMessageAndHalt; @@ -530,12 +531,14 @@ private static String uploadToS3 (Request req, Response res) throws IOException inputStream = part.getInputStream(); FileOutputStream out = new FileOutputStream(tempFile); IOUtils.copy(inputStream, out); - } catch (IOException | ServletException e) { - e.printStackTrace(); - } - try { - String keyName = String.join("/", bundlePrefix, deployment.projectId, deployment.id, tempFile.getName()); + String keyName = String.join( + "/", + bundlePrefix, + deployment.projectId, + deployment.id, + UUID.randomUUID() + "_" + part.getSubmittedFileName() + ); url = S3Utils.getDefaultBucketUrlForKey(keyName); S3Utils.getDefaultS3Client().putObject(new PutObjectRequest( S3Utils.DEFAULT_BUCKET, keyName, tempFile) @@ -543,7 +546,7 @@ private static String uploadToS3 (Request req, Response res) throws IOException // TODO: restrict? .withCannedAcl(CannedAccessControlList.PublicRead)); return url; - } catch (AmazonServiceException | CheckedAWSException e) { + } catch (IOException | ServletException | AmazonServiceException | CheckedAWSException e) { e.printStackTrace(); return null; } finally { From d7c91a0c178b3f4071edea2b9b629fd44010e02c Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 3 Aug 2021 14:49:36 -0400 Subject: [PATCH 19/41] refactor: cleanup and remove duplicated features --- .../controllers/api/DeploymentController.java | 8 +-- .../datatools/manager/jobs/DeployJob.java | 59 +++++++++---------- .../manager/jobs/PeliasUpdateJob.java | 6 +- .../datatools/manager/utils/HttpUtils.java | 6 ++ 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 72b4b5bda..3e73033d5 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -5,8 +5,8 @@ import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.status.MonitorableJob; -import com.conveyal.datatools.common.utils.aws.CheckedAWSException; import com.conveyal.datatools.common.utils.SparkUtils; +import com.conveyal.datatools.common.utils.aws.CheckedAWSException; import com.conveyal.datatools.common.utils.aws.EC2Utils; import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; @@ -230,11 +230,6 @@ private static Deployment createDeployment (Request req, Response res) { Project project = Persistence.projects.getById(projectId); Deployment newDeployment = new Deployment(project); - // Pre-populate the Pelias webhook URL from the project - if (project.lastUsedPeliasWebhookUrl != null) { - newDeployment.peliasWebhookUrl = project.lastUsedPeliasWebhookUrl; - } - // FIXME: Here we are creating a deployment and updating it with the JSON string (two db operations) // We do this because there is not currently apply JSON directly to an object (outside of Mongo codec // operations) @@ -537,6 +532,7 @@ private static String uploadToS3 (Request req, Response res) throws IOException bundlePrefix, deployment.projectId, deployment.id, + // Where filenames are generated. Prepend random UUID to prevent overwriting UUID.randomUUID() + "_" + part.getSubmittedFileName() ); url = S3Utils.getDefaultBucketUrlForKey(keyName); diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index dd505350f..09d36486b 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -12,43 +12,14 @@ import com.amazonaws.services.ec2.model.InstanceType; import com.amazonaws.services.ec2.model.RunInstancesRequest; import com.amazonaws.services.ec2.model.Tag; -import com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancing; import com.amazonaws.services.ec2.model.TerminateInstancesResult; +import com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancing; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3URI; import com.amazonaws.services.s3.model.CopyObjectRequest; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.WritableByteChannel; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Scanner; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - import com.amazonaws.waiters.Waiter; import com.amazonaws.waiters.WaiterParameters; import com.conveyal.datatools.common.status.MonitorableJob; @@ -81,6 +52,34 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.WritableByteChannel; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Scanner; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + import static com.conveyal.datatools.manager.models.Deployment.DEFAULT_OTP_VERSION; /** diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 0ebccb064..4bc0acf26 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -87,7 +87,7 @@ private void getWebhookStatus() { URI url = getWebhookURI(deployment.peliasWebhookUrl + "/status/" + workerId); List
headers = new ArrayList<>(); - headers.add(this.webhookAuthorization); + headers.add(webhookAuthorization); HttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null, headers); @@ -146,7 +146,7 @@ private String makeWebhookRequest() { PeliasWebhookRequestBody peliasWebhookRequestBody = new PeliasWebhookRequestBody(); peliasWebhookRequestBody.gtfsFeeds = gtfsFeeds; peliasWebhookRequestBody.csvFiles = deployment.peliasCsvFiles; - peliasWebhookRequestBody.logUploadUrl = this.logUploadS3URI.toString(); + peliasWebhookRequestBody.logUploadUrl = logUploadS3URI.toString(); peliasWebhookRequestBody.deploymentId = deployment.id; @@ -157,7 +157,7 @@ private String makeWebhookRequest() { List
headers = new ArrayList<>(); headers.add(new BasicHeader("Accept", "application/json")); headers.add(new BasicHeader("Content-type", "application/json")); - headers.add(this.webhookAuthorization); + headers.add(webhookAuthorization); // Get webhook response HttpResponse response = HttpUtils.httpRequestRawResponse(url, 5000, HttpUtils.REQUEST_METHOD.POST, query, headers); diff --git a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java index 1df8a1fa6..a56784b71 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/HttpUtils.java @@ -85,6 +85,9 @@ public static HttpResponse httpRequestRawResponse( case PUT: try { HttpPut putRequest = new HttpPut(uri); + for (Header header : headers) { + putRequest.setHeader(header); + } putRequest.setEntity(new StringEntity(bodyContent)); putRequest.setConfig(timeoutConfig); httpUriRequest = putRequest; @@ -95,6 +98,9 @@ public static HttpResponse httpRequestRawResponse( break; case DELETE: HttpDelete deleteRequest = new HttpDelete(uri); + for (Header header : headers) { + deleteRequest.setHeader(header); + } deleteRequest.setConfig(timeoutConfig); httpUriRequest = deleteRequest; break; From f1161b34caf6da36319ce713f5f40308be7e73cf Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 3 Aug 2021 15:49:42 -0400 Subject: [PATCH 20/41] revert: remove username/password functionality --- .../conveyal/datatools/manager/jobs/PeliasUpdateJob.java | 6 ------ .../com/conveyal/datatools/manager/models/Deployment.java | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 4bc0acf26..3769dcacf 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -59,12 +59,6 @@ public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deploymen this.deployment = deployment; this.timer = new Timer(); this.logUploadS3URI = logUploadS3URI; - - if (deployment.peliasUsername != "" && deployment.peliasPassword != "") { - String authorizationString = deployment.peliasUsername + ":" + deployment.peliasPassword; - authorizationString = "Basic " + Base64.getEncoder().encodeToString(authorizationString.getBytes()); - this.webhookAuthorization = new BasicHeader("Authorization", authorizationString); - } } /** diff --git a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java index 7f0f97718..33be6d766 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java @@ -75,8 +75,6 @@ public class Deployment extends Model implements Serializable { /* Pelias fields, used to determine where/if to send data to the Pelias webhook */ public String peliasWebhookUrl; - public String peliasUsername; - public String peliasPassword; public boolean peliasUpdate; public List peliasCsvFiles; From ff4070cb2ba88c83030b129baf0caeca4117e05d Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 4 Aug 2021 08:30:19 -0400 Subject: [PATCH 21/41] refactor(DeploymentController): delete csv url from s3 when it is deleted --- .../controllers/api/DeploymentController.java | 32 +++++++++++++++++-- .../manager/jobs/PeliasUpdateJob.java | 3 -- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 3e73033d5..e10740ad9 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -3,6 +3,7 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3URI; import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.DeleteObjectRequest; import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.status.MonitorableJob; import com.conveyal.datatools.common.utils.SparkUtils; @@ -276,7 +277,7 @@ private static Deployment createDeploymentFromFeedSource (Request req, Response * Update a single deployment. If the deployment's feed versions are updated, checks to ensure that each * version exists and is a part of the same parent project are performed before updating. */ - private static Deployment updateDeployment (Request req, Response res) { + private static Deployment updateDeployment (Request req, Response res) throws CheckedAWSException { Deployment deploymentToUpdate = getDeploymentWithPermissions(req, res); Document updateDocument = Document.parse(req.body()); // FIXME use generic update hook, also feedVersions is getting serialized into MongoDB (which is undesirable) @@ -331,6 +332,26 @@ private static Deployment updateDeployment (Request req, Response res) { "lastUsedPeliasWebhookUrl", updateDocument.getString("peliasWebhookUrl")); } + + // If updatedDocument has deleted a CSV file, also delete that CSV file from S3 + if (updateDocument.containsKey("peliasCsvFiles")) { + List csvUrls = (List) updateDocument.get("peliasCsvFiles"); + // Only delete if the array differs + if (!csvUrls.equals(deploymentToUpdate.peliasCsvFiles)) { + for (String existingCsvUrl : deploymentToUpdate.peliasCsvFiles) { + // Only delete if the file does not exist in the deployment + if (!csvUrls.contains(existingCsvUrl)) { + try { + AmazonS3URI s3URIToDelete = new AmazonS3URI(existingCsvUrl); + S3Utils.getDefaultS3Client().deleteObject(new DeleteObjectRequest(s3URIToDelete.getBucket(), s3URIToDelete.getKey())); + } catch(Exception e) { + logMessageAndHalt(req, 500, "Failed to delete file from S3.", e); + } + } + } + + } + } Deployment updatedDeployment = Persistence.deployments.update(deploymentToUpdate.id, req.body()); // TODO: Should updates to the deployment's fields trigger a notification to subscribers? This could get // very noisy. @@ -510,6 +531,7 @@ private static String uploadToS3 (Request req, Response res) throws IOException Deployment deployment = getDeploymentWithPermissions(req, res); String url; + Exception failure = null; // Get file from request if (req.raw().getAttribute("org.eclipse.jetty.multipartConfig") == null) { @@ -544,11 +566,15 @@ private static String uploadToS3 (Request req, Response res) throws IOException return url; } catch (IOException | ServletException | AmazonServiceException | CheckedAWSException e) { e.printStackTrace(); + failure = e; return null; } finally { boolean deleted = tempFile.delete(); if (!deleted) { - throw new IOException("Failed to delete file temporarily stored on server"); + logMessageAndHalt(req, 500, "Failed to delete file temporarily stored on server"); + } + if (failure != null) { + logMessageAndHalt(req, 500, "Failed to upload file. Please try again"); } } } @@ -578,7 +604,7 @@ public static void register (String apiPrefix) { post(apiPrefix + "secure/deployments", DeploymentController::createDeployment, fullJson::write); put(apiPrefix + "secure/deployments/:id", DeploymentController::updateDeployment, fullJson::write); post(apiPrefix + "secure/deployments/fromfeedsource/:id", DeploymentController::createDeploymentFromFeedSource, fullJson::write); - post(apiPrefix + "secure/deployments/:id/upload", DeploymentController::uploadToS3, slimJson::write); + post(apiPrefix + "secure/deployments/:id/upload", DeploymentController::uploadToS3); } } diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 3769dcacf..70f2c88b1 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -19,7 +19,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.Base64; import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -143,10 +142,8 @@ private String makeWebhookRequest() { peliasWebhookRequestBody.logUploadUrl = logUploadS3URI.toString(); peliasWebhookRequestBody.deploymentId = deployment.id; - String query = JsonUtil.toJson(peliasWebhookRequestBody); - // Create headers needed for Pelias webhook List
headers = new ArrayList<>(); headers.add(new BasicHeader("Accept", "application/json")); From 7aab4a64041e70370cce800d09b930135cadc2d2 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Fri, 6 Aug 2021 08:16:38 -0400 Subject: [PATCH 22/41] revert: remove project webhook assistance feature --- .../manager/controllers/api/DeploymentController.java | 8 -------- .../com/conveyal/datatools/manager/models/Project.java | 3 --- 2 files changed, 11 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index e10740ad9..686ca85a7 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -325,14 +325,6 @@ private static Deployment updateDeployment (Request req, Response res) throws Ch Persistence.deployments.updateField(deploymentToUpdate.id, "feedVersionIds", versionIds); } - // If Pelias Webhook URL is updated, set that to the project's as a helpful default - if (updateDocument.containsKey("peliasWebhookUrl")) { - Persistence.projects.updateField( - deploymentToUpdate.projectId, - "lastUsedPeliasWebhookUrl", - updateDocument.getString("peliasWebhookUrl")); - } - // If updatedDocument has deleted a CSV file, also delete that CSV file from S3 if (updateDocument.containsKey("peliasCsvFiles")) { List csvUrls = (List) updateDocument.get("peliasCsvFiles"); diff --git a/src/main/java/com/conveyal/datatools/manager/models/Project.java b/src/main/java/com/conveyal/datatools/manager/models/Project.java index 886a7f8fc..64063fea3 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Project.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Project.java @@ -45,9 +45,6 @@ public class Project extends Model { /** Last successful auto deploy. **/ public Date lastAutoDeploy; - /** The most recently entered Pelias webhook URL. Used when creating new Deployments */ - public String lastUsedPeliasWebhookUrl; - /** * A list of servers that are available to deploy project feeds/OSM to. This includes servers assigned to this * project as well as those that belong to no project. From 3ed943abf53df3baa41486c2d6efee5f3ca257b3 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Fri, 6 Aug 2021 08:32:01 -0400 Subject: [PATCH 23/41] refactor: remove unused class fields, more lenient webhook status parsing --- .../datatools/manager/jobs/PeliasUpdateJob.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 70f2c88b1..c2cf65380 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -44,9 +44,9 @@ public class PeliasUpdateJob extends MonitorableJob { private Timer timer; /** - * Webhook authorization from username and password + * The number of webhook status requests allowed to fail before considering the server down */ - private Header webhookAuthorization; + private int webhookStatusFailuresAllowed = 3; /** * S3 URI to upload logs to @@ -79,10 +79,7 @@ public void jobLogic() throws Exception { private void getWebhookStatus() { URI url = getWebhookURI(deployment.peliasWebhookUrl + "/status/" + workerId); - List
headers = new ArrayList<>(); - headers.add(webhookAuthorization); - - HttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null, headers); + HttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null); // Convert raw body to JSON String jsonResponse; @@ -90,8 +87,10 @@ private void getWebhookStatus() { jsonResponse = EntityUtils.toString(response.getEntity()); } catch (NullPointerException | IOException ex) { - status.fail("Webhook status did not provide a response!", ex); - timer.cancel(); + if (--webhookStatusFailuresAllowed == 0) { + status.fail("Webhook status did not provide a response!", ex); + timer.cancel(); + } return; } @@ -148,7 +147,6 @@ private String makeWebhookRequest() { List
headers = new ArrayList<>(); headers.add(new BasicHeader("Accept", "application/json")); headers.add(new BasicHeader("Content-type", "application/json")); - headers.add(webhookAuthorization); // Get webhook response HttpResponse response = HttpUtils.httpRequestRawResponse(url, 5000, HttpUtils.REQUEST_METHOD.POST, query, headers); From 8d25ce26ad545a9a1c00258c8ca44dc152651f34 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Fri, 6 Aug 2021 08:42:27 -0400 Subject: [PATCH 24/41] refactor: cleanup --- .../controllers/api/FeedSourceController.java | 5 +---- .../datatools/manager/jobs/PeliasUpdateJob.java | 14 +++++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/FeedSourceController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/FeedSourceController.java index faba03200..c8420cbb6 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/FeedSourceController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/FeedSourceController.java @@ -2,8 +2,8 @@ import com.conveyal.datatools.common.utils.Scheduler; import com.conveyal.datatools.manager.DataManager; -import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.auth.Actions; +import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.extensions.ExternalFeedResource; import com.conveyal.datatools.manager.jobs.FetchSingleFeedJob; import com.conveyal.datatools.manager.jobs.NotifyUsersForSubscriptionJob; @@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; -import org.bson.conversions.Bson; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,8 +43,6 @@ import static com.conveyal.datatools.manager.models.ExternalFeedSourceProperty.constructId; import static com.conveyal.datatools.manager.models.transform.NormalizeFieldTransformation.getInvalidSubstitutionMessage; import static com.conveyal.datatools.manager.models.transform.NormalizeFieldTransformation.getInvalidSubstitutionPatterns; -import static com.mongodb.client.model.Filters.and; -import static com.mongodb.client.model.Filters.eq; import static com.mongodb.client.model.Filters.in; import static spark.Spark.delete; import static spark.Spark.get; diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 8f3dae42e..af9a057da 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -29,7 +29,7 @@ public class PeliasUpdateJob extends MonitorableJob { /** * The deployment to send to Pelias */ - private Deployment deployment; + private final Deployment deployment; /** * The workerId our request has on the webhook server. Used to get status updates @@ -40,7 +40,7 @@ public class PeliasUpdateJob extends MonitorableJob { /** * Timer used to poll the status endpoint */ - private Timer timer; + private final Timer timer; /** * The number of webhook status requests allowed to fail before considering the server down @@ -50,7 +50,7 @@ public class PeliasUpdateJob extends MonitorableJob { /** * S3 URI to upload logs to */ - private AmazonS3URI logUploadS3URI; + private final AmazonS3URI logUploadS3URI; public PeliasUpdateJob(Auth0UserProfile owner, String name, Deployment deployment, AmazonS3URI logUploadS3URI) { super(owner, name, JobType.UPDATE_PELIAS); @@ -94,7 +94,7 @@ private void getWebhookStatus() { } // Parse JSON - PeliasWebhookStatusMessage statusResponse = null; + PeliasWebhookStatusMessage statusResponse; try { statusResponse = JsonUtil.objectMapper.readValue(jsonResponse, PeliasWebhookStatusMessage.class); } catch (IOException ex) { @@ -161,7 +161,7 @@ private String makeWebhookRequest() { } // Parse JSON - JsonNode webhookResponse = null; + JsonNode webhookResponse; try { webhookResponse = JsonUtil.objectMapper.readTree(jsonResponse); } catch (IOException ex) { @@ -206,7 +206,7 @@ public void run() { /** * The request body required by the Pelias webhook */ - private class PeliasWebhookRequestBody { + private static class PeliasWebhookRequestBody { public List gtfsFeeds; public List csvFiles; public String logUploadUrl; @@ -216,7 +216,7 @@ private class PeliasWebhookRequestBody { /** * The GTFS feed info format the Pelias webhook requires */ - private class PeliasWebhookGTFSFeedFormat { + private static class PeliasWebhookGTFSFeedFormat { public String uri; public String name; public String filename; From 0ddf61f8d6e3a96db61d37545bebed5dfc25445f Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Mon, 9 Aug 2021 11:01:37 +0200 Subject: [PATCH 25/41] refactor(PeliasUpdateJob): catch non-checked exceptions --- .../manager/jobs/PeliasUpdateJob.java | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index af9a057da..29c2da0f9 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -78,31 +78,23 @@ public void jobLogic() throws Exception { private void getWebhookStatus() { URI url = getWebhookURI(deployment.peliasWebhookUrl + "/status/" + workerId); - SimpleHttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null); - // Convert raw body to JSON - String jsonResponse; + PeliasWebhookStatusMessage statusResponse; + try { - jsonResponse = response.body; - } - catch (NullPointerException ex) { + SimpleHttpResponse response = HttpUtils.httpRequestRawResponse(url, 1000, HttpUtils.REQUEST_METHOD.GET, null); + // Convert raw body to PeliasWebhookStatusMessage + String jsonResponse = response.body; + statusResponse = JsonUtil.objectMapper.readValue(jsonResponse, PeliasWebhookStatusMessage.class); + } catch (Exception ex) { + // Allow a set number of failed requests before showing the user failure message if (--webhookStatusFailuresAllowed == 0) { - status.fail("Webhook status did not provide a response!", ex); + status.fail("Webhook status did not provide a valid response!", ex); timer.cancel(); } return; } - // Parse JSON - PeliasWebhookStatusMessage statusResponse; - try { - statusResponse = JsonUtil.objectMapper.readValue(jsonResponse, PeliasWebhookStatusMessage.class); - } catch (IOException ex) { - status.fail("Server refused to provide a valid status update. Are the credentials correct?", ex); - timer.cancel(); - return; - } - if (!statusResponse.error.equals("false")) { status.fail(statusResponse.error); timer.cancel(); From 2c0f44d8258a6c6bf93526031b7ef88249cdcf2a Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 10 Aug 2021 20:33:37 +0200 Subject: [PATCH 26/41] refactor: remove reference to removed credentials feature --- .../com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java index 29c2da0f9..61e3d85bf 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/PeliasUpdateJob.java @@ -157,7 +157,7 @@ private String makeWebhookRequest() { try { webhookResponse = JsonUtil.objectMapper.readTree(jsonResponse); } catch (IOException ex) { - status.fail("The Webhook server's response was invalid! Are the credentials correct?", ex); + status.fail("The Webhook server's response was invalid! Is the server URL correct?", ex); return null; } From c33972ad417a9363df47b9863bc87936a61b2040 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Wed, 18 Aug 2021 10:30:40 -0400 Subject: [PATCH 27/41] build(deps): bump to gtfs-lib@7.0.0 --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a21ca8033..f93b1c49a 100644 --- a/pom.xml +++ b/pom.xml @@ -268,10 +268,9 @@ - AWS S3 SDK - putting/getting objects into/out of S3. --> - com.github.conveyal gtfs-lib - a45e6f9323 + 7.0.0 From ce48cea206b53840bdf605967275005230499af7 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 24 Aug 2021 09:22:24 +0100 Subject: [PATCH 28/41] refactor(DeploymentController): move csv upload replace code to server --- .../controllers/api/DeploymentController.java | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 1d647c3b3..fb4d1b20f 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -328,21 +328,7 @@ private static Deployment updateDeployment (Request req, Response res) throws Ch // If updatedDocument has deleted a CSV file, also delete that CSV file from S3 if (updateDocument.containsKey("peliasCsvFiles")) { List csvUrls = (List) updateDocument.get("peliasCsvFiles"); - // Only delete if the array differs - if (!csvUrls.equals(deploymentToUpdate.peliasCsvFiles)) { - for (String existingCsvUrl : deploymentToUpdate.peliasCsvFiles) { - // Only delete if the file does not exist in the deployment - if (!csvUrls.contains(existingCsvUrl)) { - try { - AmazonS3URI s3URIToDelete = new AmazonS3URI(existingCsvUrl); - S3Utils.getDefaultS3Client().deleteObject(new DeleteObjectRequest(s3URIToDelete.getBucket(), s3URIToDelete.getKey())); - } catch(Exception e) { - logMessageAndHalt(req, 500, "Failed to delete file from S3.", e); - } - } - } - - } + removeDeletedCsvFiles(csvUrls, deploymentToUpdate, req); } Deployment updatedDeployment = Persistence.deployments.update(deploymentToUpdate.id, req.body()); // TODO: Should updates to the deployment's fields trigger a notification to subscribers? This could get @@ -370,6 +356,29 @@ private static Deployment updateDeployment (Request req, Response res) throws Ch // // } + /** + * Helper method for update steps which removes all removed csv files from s3. + * @param csvUrls The new list of csv files + * @param deploymentToUpdate An existing deployment, which contains csv files to check changes against + * @param req A request object used to report failure + */ + private static void removeDeletedCsvFiles(List csvUrls, Deployment deploymentToUpdate, Request req) { + // Only delete if the array differs + if (!csvUrls.equals(deploymentToUpdate.peliasCsvFiles)) { + for (String existingCsvUrl : deploymentToUpdate.peliasCsvFiles) { + // Only delete if the file does not exist in the deployment + if (!csvUrls.contains(existingCsvUrl)) { + try { + AmazonS3URI s3URIToDelete = new AmazonS3URI(existingCsvUrl); + S3Utils.getDefaultS3Client().deleteObject(new DeleteObjectRequest(s3URIToDelete.getBucket(), s3URIToDelete.getKey())); + } catch(Exception e) { + logMessageAndHalt(req, 500, "Failed to delete file from S3.", e); + } + } + } + } + } + /** * HTTP endpoint to deregister and terminate a set of instance IDs that are associated with a particular deployment. * The intent here is to give the user a device by which they can terminate an EC2 instance that has started up, but @@ -517,7 +526,7 @@ private static String updatePelias (Request req, Response res, DeployJob deployJ * Follows https://github.com/ibi-group/datatools-server/blob/dev/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java#L111 * @return S3 URL the file has been uploaded to */ - private static String uploadToS3 (Request req, Response res) throws IOException { + private static Deployment uploadToS3 (Request req, Response res) { // Check parameters supplied in request for validity. Auth0UserProfile userProfile = req.attribute("user"); Deployment deployment = getDeploymentWithPermissions(req, res); @@ -530,6 +539,7 @@ private static String uploadToS3 (Request req, Response res) throws IOException MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); } + String extension = null; File tempFile = null; try { @@ -555,7 +565,21 @@ private static String uploadToS3 (Request req, Response res) throws IOException // Allow public read // TODO: restrict? .withCannedAcl(CannedAccessControlList.PublicRead)); - return url; + + // Update deployment csvs + List updatedCsvList = new ArrayList<>(deployment.peliasCsvFiles); + updatedCsvList.add(url); + + // If this is set, a file is being replaced + String s3FileToRemove = req.raw().getHeader("urlToDelete"); + if (s3FileToRemove != null) { + updatedCsvList.remove(s3FileToRemove); + } + + // Persist changes after removing deleted csv files from s3 + removeDeletedCsvFiles(updatedCsvList, deployment, req); + return Persistence.deployments.updateField(deployment.id, "peliasCsvFiles", updatedCsvList); + } catch (IOException | ServletException | AmazonServiceException | CheckedAWSException e) { e.printStackTrace(); failure = e; @@ -596,7 +620,7 @@ public static void register (String apiPrefix) { post(apiPrefix + "secure/deployments", DeploymentController::createDeployment, fullJson::write); put(apiPrefix + "secure/deployments/:id", DeploymentController::updateDeployment, fullJson::write); post(apiPrefix + "secure/deployments/fromfeedsource/:id", DeploymentController::createDeploymentFromFeedSource, fullJson::write); - post(apiPrefix + "secure/deployments/:id/upload", DeploymentController::uploadToS3); + post(apiPrefix + "secure/deployments/:id/upload", DeploymentController::uploadToS3, fullJson::write); } } From 1f5673d390acd5a8af7ad68b32260b14e5afe526 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 24 Aug 2021 09:32:53 +0100 Subject: [PATCH 29/41] refactor(DeploymentController): cleanup --- .../manager/controllers/api/DeploymentController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index fb4d1b20f..289355b2e 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -277,7 +277,7 @@ private static Deployment createDeploymentFromFeedSource (Request req, Response * Update a single deployment. If the deployment's feed versions are updated, checks to ensure that each * version exists and is a part of the same parent project are performed before updating. */ - private static Deployment updateDeployment (Request req, Response res) throws CheckedAWSException { + private static Deployment updateDeployment (Request req, Response res) { Deployment deploymentToUpdate = getDeploymentWithPermissions(req, res); Document updateDocument = Document.parse(req.body()); // FIXME use generic update hook, also feedVersions is getting serialized into MongoDB (which is undesirable) @@ -364,7 +364,7 @@ private static Deployment updateDeployment (Request req, Response res) throws Ch */ private static void removeDeletedCsvFiles(List csvUrls, Deployment deploymentToUpdate, Request req) { // Only delete if the array differs - if (!csvUrls.equals(deploymentToUpdate.peliasCsvFiles)) { + if (deploymentToUpdate.peliasCsvFiles != null && !csvUrls.equals(deploymentToUpdate.peliasCsvFiles)) { for (String existingCsvUrl : deploymentToUpdate.peliasCsvFiles) { // Only delete if the file does not exist in the deployment if (!csvUrls.contains(existingCsvUrl)) { From b17de71f83ac9c47b560d98d89b56e63205537a7 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 24 Aug 2021 09:38:45 +0100 Subject: [PATCH 30/41] refactor: only start pelias update job once OTP deployment completes --- .../controllers/api/DeploymentController.java | 28 ------------------- .../datatools/manager/jobs/DeployJob.java | 11 ++++++++ 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 289355b2e..5290fc79b 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -12,7 +12,6 @@ import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.jobs.DeployJob; -import com.conveyal.datatools.manager.jobs.PeliasUpdateJob; import com.conveyal.datatools.manager.models.Deployment; import com.conveyal.datatools.manager.models.EC2InstanceSummary; import com.conveyal.datatools.manager.models.FeedSource; @@ -491,36 +490,9 @@ private static String deploy (Request req, Response res) { target); logMessageAndHalt(req, HttpStatus.ACCEPTED_202, message); } - - // If pelias update is requested, launch pelias update job - if (deployment.peliasUpdate) { - updatePelias(req, res, job); - } - return SparkUtils.formatJobMessage(job.jobId, "Deployment initiating."); } - /** - * Start an updatePelias job which will trigger the webhook, then check for status updates. - */ - private static String updatePelias (Request req, Response res, DeployJob deployJob) { - // Check parameters supplied in request for validity. - Auth0UserProfile userProfile = req.attribute("user"); - Deployment deployment = getDeploymentWithPermissions(req, res); - Project project = Persistence.projects.getById(deployment.projectId); - if (project == null) { - logMessageAndHalt(req, 400, "Internal reference error. Deployment's project ID is invalid"); - } - - // Get log upload URI from deploy job - AmazonS3URI logUploadS3URI = deployJob.getS3FolderURI(); - - // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(userProfile, "Updating Custom Geocoder Database", deployment, logUploadS3URI); - JobUtils.heavyExecutor.execute(peliasUpdateJob); - return SparkUtils.formatJobMessage(peliasUpdateJob.jobId, "Pelias update initiating."); - } - /** * Uploads a file from Spark request object to the s3 bucket of the deployment the Pelias Update Job is associated with. * Follows https://github.com/ibi-group/datatools-server/blob/dev/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java#L111 diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index 09d36486b..a54883b7a 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -340,6 +340,17 @@ public void jobLogic () { // Set baseUrl after success. status.baseUrl = otpServer.publicUrl; } + + // Now that the main instance is updated successfully, update Pelias + if (deployment.peliasUpdate) { + // Get log upload URI from deploy job + AmazonS3URI logUploadS3URI = getS3FolderURI(); + + // Execute the pelias update job and keep track of it + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); + JobUtils.heavyExecutor.execute(peliasUpdateJob); + } + status.completed = true; } From 2abcd28674fc5e4185a71587c261094ec53700bd Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Tue, 24 Aug 2021 10:17:02 +0100 Subject: [PATCH 31/41] refactor: unify shared s3 upload code --- .../datatools/common/utils/SparkUtils.java | 52 +++++++++++++++++ .../datatools/common/utils/aws/S3Utils.java | 18 ++++++ .../controllers/api/EditorController.java | 57 +------------------ .../controllers/api/DeploymentController.java | 46 +-------------- 4 files changed, 74 insertions(+), 99 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java index 9dd8622d4..a60b4cb43 100644 --- a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java +++ b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java @@ -1,5 +1,8 @@ package com.conveyal.datatools.common.utils; +import com.amazonaws.AmazonServiceException; +import com.conveyal.datatools.common.utils.aws.CheckedAWSException; +import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.utils.ErrorUtils; import com.fasterxml.jackson.core.JsonProcessingException; @@ -7,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.io.ByteStreams; +import org.apache.commons.io.IOUtils; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,14 +18,18 @@ import spark.Request; import spark.Response; +import javax.servlet.MultipartConfigElement; +import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import static com.conveyal.datatools.manager.DataManager.getConfigPropertyAsText; @@ -265,6 +273,50 @@ public static void copyRequestStreamIntoFile(Request req, File file) { } } + /** + * Copies a multi-part file upload to disk, attempts to upload it to S3, then deletes the local file. + * @param req Request object containing file to upload + * @param uploadType A string to include in the uploaded filename. Will also be added to the temporary file + * which makes debugging easier should the upload fail. + * @param key The S3 key to upload the file to + * @return An HTTP S3 url containing the uploaded file + */ + public static String uploadMultipartRequestBodyToS3(Request req, String uploadType, String key) { + // Get file from request + if (req.raw().getAttribute("org.eclipse.jetty.multipartConfig") == null) { + MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); + req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); + } + String extension = null; + File tempFile = null; + String uploadedFileName = null; + try { + Part part = req.raw().getPart("file"); + uploadedFileName = part.getSubmittedFileName(); + + extension = "." + part.getContentType().split("/", 0)[1]; + tempFile = File.createTempFile(part.getName() + "_" + uploadType, extension); + InputStream inputStream; + inputStream = part.getInputStream(); + FileOutputStream out = new FileOutputStream(tempFile); + IOUtils.copy(inputStream, out); + } catch (IOException | ServletException e) { + e.printStackTrace(); + logMessageAndHalt(req, 400, "Unable to read uploaded file"); + } + try { + return S3Utils.uploadObject(key + "_" + uploadedFileName, tempFile); + } catch (AmazonServiceException | CheckedAWSException e) { + logMessageAndHalt(req, 500, "Error uploading file to S3", e); + return null; + } finally { + boolean deleted = tempFile.delete(); + if (!deleted) { + LOG.error("Could not delete s3 temporary upload file"); + } + } + } + private static String trimLines(String str) { if (str == null) return ""; String[] lines = str.split("\n"); diff --git a/src/main/java/com/conveyal/datatools/common/utils/aws/S3Utils.java b/src/main/java/com/conveyal/datatools/common/utils/aws/S3Utils.java index a5ee96bf9..078781132 100644 --- a/src/main/java/com/conveyal/datatools/common/utils/aws/S3Utils.java +++ b/src/main/java/com/conveyal/datatools/common/utils/aws/S3Utils.java @@ -7,7 +7,9 @@ import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; +import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.utils.SparkUtils; import com.conveyal.datatools.manager.DataManager; import com.conveyal.datatools.manager.models.OtpServer; @@ -192,6 +194,22 @@ public static String downloadObject( } } + /** + * Uploads a file to S3 using a given key + * @param keyName The s3 key to uplaod the file to + * @param fileToUpload The file to upload to S3 + * @return A URL where the file is publicly accessible + */ + public static String uploadObject(String keyName, File fileToUpload) throws AmazonServiceException, CheckedAWSException { + String url = S3Utils.getDefaultBucketUrlForKey(keyName); + // FIXME: This may need to change during feed store refactor + getDefaultS3Client().putObject(new PutObjectRequest( + S3Utils.DEFAULT_BUCKET, keyName, fileToUpload) + // grant public read + .withCannedAcl(CannedAccessControlList.PublicRead)); + return url; + } + public static AmazonS3 getDefaultS3Client() throws CheckedAWSException { return getS3Client (null, null); } diff --git a/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java b/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java index 7400fbeaf..ea73c0cdf 100644 --- a/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java +++ b/src/main/java/com/conveyal/datatools/editor/controllers/api/EditorController.java @@ -1,11 +1,6 @@ package com.conveyal.datatools.editor.controllers.api; -import com.amazonaws.AmazonServiceException; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.utils.SparkUtils; -import com.conveyal.datatools.common.utils.aws.CheckedAWSException; -import com.conveyal.datatools.common.utils.aws.S3Utils; import com.conveyal.datatools.editor.controllers.EditorLockController; import com.conveyal.datatools.manager.auth.Auth0UserProfile; import com.conveyal.datatools.manager.models.FeedSource; @@ -23,7 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.dbutils.DbUtils; -import org.apache.commons.io.IOUtils; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,14 +25,8 @@ import spark.Request; import spark.Response; -import javax.servlet.MultipartConfigElement; -import javax.servlet.ServletException; -import javax.servlet.http.Part; import javax.sql.DataSource; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -108,49 +96,6 @@ public abstract class EditorController { registerRoutes(); } - public static String uploadBranding(Request req, String key) { - String url; - - // Get file from request - if (req.raw().getAttribute("org.eclipse.jetty.multipartConfig") == null) { - MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); - req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); - } - String extension = null; - File tempFile = null; - try { - Part part = req.raw().getPart("file"); - extension = "." + part.getContentType().split("/", 0)[1]; - tempFile = File.createTempFile(key + "_branding", extension); - InputStream inputStream; - inputStream = part.getInputStream(); - FileOutputStream out = new FileOutputStream(tempFile); - IOUtils.copy(inputStream, out); - } catch (IOException | ServletException e) { - e.printStackTrace(); - logMessageAndHalt(req, 400, "Unable to read uploaded file"); - } - - try { - String keyName = "branding/" + key + extension; - url = S3Utils.getDefaultBucketUrlForKey(keyName); - // FIXME: This may need to change during feed store refactor - S3Utils.getDefaultS3Client().putObject(new PutObjectRequest( - S3Utils.DEFAULT_BUCKET, keyName, tempFile) - // grant public read - .withCannedAcl(CannedAccessControlList.PublicRead)); - return url; - } catch (AmazonServiceException | CheckedAWSException e) { - logMessageAndHalt(req, 500, "Error uploading file to S3", e); - return null; - } finally { - boolean deleted = tempFile.delete(); - if (!deleted) { - LOG.error("Could not delete s3 upload file."); - } - } - } - /** * Add static HTTP endpoints to Spark static instance. */ @@ -399,7 +344,7 @@ private String uploadEntityBranding (Request req, Response res) { int id = getIdFromRequest(req); String url; try { - url = uploadBranding(req, String.format("%s_%d", classToLowercase, id)); + url = SparkUtils.uploadMultipartRequestBodyToS3(req, "branding", String.format("%s_%d", classToLowercase, id)); } catch (HaltException e) { // Do not re-catch halts thrown for exceptions that have already been caught. throw e; diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 5290fc79b..781ae565d 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -2,9 +2,7 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3URI; -import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.DeleteObjectRequest; -import com.amazonaws.services.s3.model.PutObjectRequest; import com.conveyal.datatools.common.status.MonitorableJob; import com.conveyal.datatools.common.utils.SparkUtils; import com.conveyal.datatools.common.utils.aws.CheckedAWSException; @@ -22,7 +20,6 @@ import com.conveyal.datatools.manager.persistence.Persistence; import com.conveyal.datatools.manager.utils.JobUtils; import com.conveyal.datatools.manager.utils.json.JsonManager; -import org.apache.commons.io.IOUtils; import org.bson.Document; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; @@ -30,14 +27,9 @@ import spark.Request; import spark.Response; -import javax.servlet.MultipartConfigElement; -import javax.servlet.ServletException; -import javax.servlet.http.Part; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -500,28 +492,10 @@ private static String deploy (Request req, Response res) { */ private static Deployment uploadToS3 (Request req, Response res) { // Check parameters supplied in request for validity. - Auth0UserProfile userProfile = req.attribute("user"); Deployment deployment = getDeploymentWithPermissions(req, res); String url; - Exception failure = null; - - // Get file from request - if (req.raw().getAttribute("org.eclipse.jetty.multipartConfig") == null) { - MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); - req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); - } - - String extension = null; - File tempFile = null; try { - Part part = req.raw().getPart("file"); - extension = "." + part.getContentType().split("/", 0)[1]; - tempFile = File.createTempFile(part.getName() + "_csv_upload", extension); - InputStream inputStream; - inputStream = part.getInputStream(); - FileOutputStream out = new FileOutputStream(tempFile); - IOUtils.copy(inputStream, out); String keyName = String.join( "/", @@ -529,14 +503,9 @@ private static Deployment uploadToS3 (Request req, Response res) { deployment.projectId, deployment.id, // Where filenames are generated. Prepend random UUID to prevent overwriting - UUID.randomUUID() + "_" + part.getSubmittedFileName() + UUID.randomUUID() + "" ); - url = S3Utils.getDefaultBucketUrlForKey(keyName); - S3Utils.getDefaultS3Client().putObject(new PutObjectRequest( - S3Utils.DEFAULT_BUCKET, keyName, tempFile) - // Allow public read - // TODO: restrict? - .withCannedAcl(CannedAccessControlList.PublicRead)); + url = SparkUtils.uploadMultipartRequestBodyToS3(req, "csvUpload", keyName); // Update deployment csvs List updatedCsvList = new ArrayList<>(deployment.peliasCsvFiles); @@ -552,18 +521,9 @@ private static Deployment uploadToS3 (Request req, Response res) { removeDeletedCsvFiles(updatedCsvList, deployment, req); return Persistence.deployments.updateField(deployment.id, "peliasCsvFiles", updatedCsvList); - } catch (IOException | ServletException | AmazonServiceException | CheckedAWSException e) { + } catch (AmazonServiceException e) { e.printStackTrace(); - failure = e; return null; - } finally { - boolean deleted = tempFile.delete(); - if (!deleted) { - logMessageAndHalt(req, 500, "Failed to delete file temporarily stored on server"); - } - if (failure != null) { - logMessageAndHalt(req, 500, "Failed to upload file. Please try again"); - } } } From 164284c72332e390961ece9bf91e2bf7ff660eb3 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 1 Sep 2021 11:31:45 +0100 Subject: [PATCH 32/41] refactor: fix upload path regression in introducing s3 upload method --- .../java/com/conveyal/datatools/common/utils/SparkUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java index a60b4cb43..fa0a3f289 100644 --- a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java +++ b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java @@ -305,7 +305,7 @@ public static String uploadMultipartRequestBodyToS3(Request req, String uploadTy logMessageAndHalt(req, 400, "Unable to read uploaded file"); } try { - return S3Utils.uploadObject(key + "_" + uploadedFileName, tempFile); + return S3Utils.uploadObject(uploadType + "/" + key + "_" + uploadedFileName, tempFile); } catch (AmazonServiceException | CheckedAWSException e) { logMessageAndHalt(req, 500, "Error uploading file to S3", e); return null; From 4b73157ca781655923e944dad2ed1ccb0c32ce05 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 1 Sep 2021 11:35:42 +0100 Subject: [PATCH 33/41] refactor: address PR feedback --- .../manager/controllers/api/DeploymentController.java | 3 ++- .../java/com/conveyal/datatools/manager/jobs/DeployJob.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 781ae565d..1760908b4 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -503,7 +503,7 @@ private static Deployment uploadToS3 (Request req, Response res) { deployment.projectId, deployment.id, // Where filenames are generated. Prepend random UUID to prevent overwriting - UUID.randomUUID() + "" + UUID.randomUUID().toString() ); url = SparkUtils.uploadMultipartRequestBodyToS3(req, "csvUpload", keyName); @@ -523,6 +523,7 @@ private static Deployment uploadToS3 (Request req, Response res) { } catch (AmazonServiceException e) { e.printStackTrace(); + logMessageAndHalt(req, 500, "Failed to upload file to S3. Check server logs."); return null; } } diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index a54883b7a..ddcb2c09b 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -348,7 +348,7 @@ public void jobLogic () { // Execute the pelias update job and keep track of it PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); - JobUtils.heavyExecutor.execute(peliasUpdateJob); + this.addNextJob(peliasUpdateJob); } status.completed = true; From 0324eaca237755c1fe28292224ba8e76d97a95fa Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Thu, 2 Sep 2021 09:32:54 -0400 Subject: [PATCH 34/41] fix: remove blank line (dummy commit for #387) BREAKING CHANGE: updated gtfs-lib dep requires schema change for postgres db using UpdateSQLFeedsMain --- .../com/conveyal/datatools/manager/utils/json/JsonManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java index ed9da45dc..27f8b3b4a 100644 --- a/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java +++ b/src/main/java/com/conveyal/datatools/manager/utils/json/JsonManager.java @@ -31,7 +31,6 @@ /** * Helper methods for writing REST API routines * @author mattwigway - * */ public class JsonManager { private static final Logger LOG = LoggerFactory.getLogger(JsonManager.class); From 1a1cc856fb5ff2e183e176465a5fb4c499af0067 Mon Sep 17 00:00:00 2001 From: Landon Reed Date: Sat, 11 Sep 2021 09:44:01 -0400 Subject: [PATCH 35/41] refactor: tweaks for #408 --- .../com/conveyal/datatools/common/utils/SparkUtils.java | 6 +++++- .../manager/controllers/api/DeploymentController.java | 5 ++--- .../com/conveyal/datatools/manager/models/Deployment.java | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java index fa0a3f289..d93681227 100644 --- a/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java +++ b/src/main/java/com/conveyal/datatools/common/utils/SparkUtils.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.io.ByteStreams; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,7 +84,10 @@ public static String formatJSON (String key, String value) { * supplied details about the exception encountered. */ public static ObjectNode getObjectNode(String message, int code, Exception e) { - String detail = e != null ? e.getMessage() : null; + String detail = null; + if (e != null) { + detail = e.getMessage() != null ? e.getMessage() : ExceptionUtils.getStackTrace(e); + } return mapper.createObjectNode() .put("result", code >= 400 ? "ERR" : "OK") .put("message", message) diff --git a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java index 1760908b4..7ef59d772 100644 --- a/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java +++ b/src/main/java/com/conveyal/datatools/manager/controllers/api/DeploymentController.java @@ -521,9 +521,8 @@ private static Deployment uploadToS3 (Request req, Response res) { removeDeletedCsvFiles(updatedCsvList, deployment, req); return Persistence.deployments.updateField(deployment.id, "peliasCsvFiles", updatedCsvList); - } catch (AmazonServiceException e) { - e.printStackTrace(); - logMessageAndHalt(req, 500, "Failed to upload file to S3. Check server logs."); + } catch (Exception e) { + logMessageAndHalt(req, 500, "Failed to upload file to S3.", e); return null; } } diff --git a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java index 33be6d766..8541d5ddc 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/Deployment.java +++ b/src/main/java/com/conveyal/datatools/manager/models/Deployment.java @@ -76,7 +76,7 @@ public class Deployment extends Model implements Serializable { /* Pelias fields, used to determine where/if to send data to the Pelias webhook */ public String peliasWebhookUrl; public boolean peliasUpdate; - public List peliasCsvFiles; + public List peliasCsvFiles = new ArrayList<>(); /** * Get parent project for deployment. Note: at one point this was a JSON property of this class, but severe From 42c560a53bbc97648bf105fb85e31d091cafd6c0 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 22 Sep 2021 10:34:20 +0100 Subject: [PATCH 36/41] fix(FeedSource): resolve incorrectly thrown 404 when updating feed source closes #422 --- .../datatools/manager/models/FeedSource.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/models/FeedSource.java b/src/main/java/com/conveyal/datatools/manager/models/FeedSource.java index cdd7bc2a8..612e45049 100644 --- a/src/main/java/com/conveyal/datatools/manager/models/FeedSource.java +++ b/src/main/java/com/conveyal/datatools/manager/models/FeedSource.java @@ -42,6 +42,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static com.conveyal.datatools.manager.utils.StringUtils.getCleanName; @@ -339,18 +340,18 @@ public boolean equalsExceptLabels(FeedSource o) { // Compare every property other than labels return this.name.equals(o.name) && this.preserveStopTimesSequence == o.preserveStopTimesSequence && - this.transformRules.equals(o.transformRules) && + Objects.equals(this.transformRules, o.transformRules) && this.isPublic == o.isPublic && this.deployable == o.deployable && - this.retrievalMethod.equals(o.retrievalMethod) && - this.fetchFrequency.equals(o.fetchFrequency) && + Objects.equals(this.retrievalMethod, o.retrievalMethod) && + Objects.equals(this.fetchFrequency, o.fetchFrequency) && this.fetchInterval == o.fetchInterval && - this.lastFetched.equals(o.lastFetched) && - this.url.equals(o.url) && - this.s3Url.equals(o.s3Url) && - this.snapshotVersion.equals(o.snapshotVersion) && - this.publishedVersionId.equals(o.publishedVersionId) && - this.editorNamespace.equals(o.editorNamespace); + Objects.equals(this.lastFetched, o.lastFetched) && + Objects.equals(this.url, o.url) && + Objects.equals(this.s3Url, o.s3Url) && + Objects.equals(this.snapshotVersion, o.snapshotVersion) && + Objects.equals(this.publishedVersionId, o.publishedVersionId) && + Objects.equals(this.editorNamespace, o.editorNamespace); } public String toString () { From 429f41991890f798e7aab0b48e7fed396911e948 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 29 Sep 2021 11:30:10 +0100 Subject: [PATCH 37/41] fix(DeployJob): trigger pelias update even if server is already deployed --- .../datatools/manager/jobs/DeployJob.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index ddcb2c09b..acc4c4ccf 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -319,6 +319,16 @@ public void jobLogic () { } } + // Now that the build was successful, update Pelias + if (deployment.peliasUpdate) { + // Get log upload URI from deploy job + AmazonS3URI logUploadS3URI = getS3FolderURI(); + + // Execute the pelias update job and keep track of it + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); + addNextJob(peliasUpdateJob); + } + // Handle spinning up new EC2 servers for the load balancer's target group. if (otpServer.ec2Info != null) { if ("true".equals(DataManager.getConfigPropertyAsText("modules.deployment.ec2.enabled"))) { @@ -341,15 +351,6 @@ public void jobLogic () { status.baseUrl = otpServer.publicUrl; } - // Now that the main instance is updated successfully, update Pelias - if (deployment.peliasUpdate) { - // Get log upload URI from deploy job - AmazonS3URI logUploadS3URI = getS3FolderURI(); - - // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); - this.addNextJob(peliasUpdateJob); - } status.completed = true; } From b620d4a1a46b64cab37a46d7eff93ebbe017d300 Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Wed, 29 Sep 2021 13:31:39 +0100 Subject: [PATCH 38/41] refactor(DeployJob): correct pelias job launch location --- .../datatools/manager/jobs/DeployJob.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index acc4c4ccf..170e1a650 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -315,18 +315,17 @@ public void jobLogic () { } catch (Exception e) { status.fail(String.format("Error uploading/copying deployment bundle to s3://%s", s3Bucket), e); } - } - } - - // Now that the build was successful, update Pelias - if (deployment.peliasUpdate) { - // Get log upload URI from deploy job - AmazonS3URI logUploadS3URI = getS3FolderURI(); - - // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); - addNextJob(peliasUpdateJob); + + // Now that the build was successful, update Pelias + if (deployment.peliasUpdate) { + // Get log upload URI from deploy job + AmazonS3URI logUploadS3URI = getS3FolderURI(); + + // Execute the pelias update job and keep track of it + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); + addNextJob(peliasUpdateJob); + } } // Handle spinning up new EC2 servers for the load balancer's target group. From 697f96539f44aeb58dd00682074d6012debf2c6c Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 29 Sep 2021 10:46:09 -0400 Subject: [PATCH 39/41] fix(gtfs-lib): Upgrade to 7.0.1. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f93b1c49a..d270ba60a 100644 --- a/pom.xml +++ b/pom.xml @@ -270,7 +270,7 @@ com.github.conveyal gtfs-lib - 7.0.0 + 7.0.1 From 6039987e1b8c10a9f30001f204ca69b5a615a0cd Mon Sep 17 00:00:00 2001 From: miles-grant-ibi Date: Thu, 30 Sep 2021 10:27:46 +0100 Subject: [PATCH 40/41] refactor(DeployJob): launch pelias job for both new and existing server instances --- .../datatools/manager/jobs/DeployJob.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java index 170e1a650..c21892cee 100644 --- a/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java +++ b/src/main/java/com/conveyal/datatools/manager/jobs/DeployJob.java @@ -316,16 +316,6 @@ public void jobLogic () { status.fail(String.format("Error uploading/copying deployment bundle to s3://%s", s3Bucket), e); } } - - // Now that the build was successful, update Pelias - if (deployment.peliasUpdate) { - // Get log upload URI from deploy job - AmazonS3URI logUploadS3URI = getS3FolderURI(); - - // Execute the pelias update job and keep track of it - PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); - addNextJob(peliasUpdateJob); - } } // Handle spinning up new EC2 servers for the load balancer's target group. @@ -333,8 +323,6 @@ public void jobLogic () { if ("true".equals(DataManager.getConfigPropertyAsText("modules.deployment.ec2.enabled"))) { replaceEC2Servers(); tasksCompleted++; - // If creating a new server, there is no need to deploy to an existing one. - return; } else { status.fail("Cannot complete deployment. EC2 deployment disabled in server configuration."); return; @@ -350,6 +338,15 @@ public void jobLogic () { status.baseUrl = otpServer.publicUrl; } + // Now that the build + deployment was successful, update Pelias + if (deployment.peliasUpdate) { + // Get log upload URI from deploy job + AmazonS3URI logUploadS3URI = getS3FolderURI(); + + // Execute the pelias update job and keep track of it + PeliasUpdateJob peliasUpdateJob = new PeliasUpdateJob(owner, "Updating Custom Geocoder Database", deployment, logUploadS3URI); + addNextJob(peliasUpdateJob); + } status.completed = true; } From 83901adaf161f7fdb94d53608fb9aea2c7d4e6b3 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 30 Sep 2021 08:16:49 -0400 Subject: [PATCH 41/41] fix(gtfs-lib): Upgrade to version 7.0.2. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d270ba60a..20c67cbd4 100644 --- a/pom.xml +++ b/pom.xml @@ -270,7 +270,7 @@ com.github.conveyal gtfs-lib - 7.0.1 + 7.0.2

^9%?0+a&eYKvx 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