Skip to content

Commit 9d3ff48

Browse files
authored
Merge pull request opentripplanner#6558 from entur/add_co2_emmistions
Cleanup CO₂ emissions
2 parents 7ad42e4 + 87a359a commit 9d3ff48

File tree

79 files changed

+1305
-978
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1305
-978
lines changed
Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,40 @@
11
package org.opentripplanner.ext.emissions;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4-
import static org.junit.jupiter.api.Assertions.assertTrue;
54

6-
import java.io.File;
5+
import java.io.FileNotFoundException;
76
import org.junit.jupiter.api.Test;
8-
import org.opentripplanner.graph_builder.issue.service.DefaultDataImportIssueStore;
7+
import org.opentripplanner.datastore.api.CompositeDataSource;
8+
import org.opentripplanner.datastore.api.FileType;
9+
import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore;
910
import org.opentripplanner.test.support.ResourceLoader;
1011

1112
public class Co2EmissionsDataReaderTest {
1213

1314
private static final ResourceLoader RES = ResourceLoader.of(Co2EmissionsDataReaderTest.class);
14-
private static final File CO2_GTFS_ZIP = RES.file("emissions-test-gtfs.zip");
15-
private static final File CO2_GTFS = RES.file("emissions-test-gtfs/");
16-
private static final File INVALID_CO2_GTFS = RES.file("emissions-invalid-test-gtfs/");
17-
private static final File CO2_MISSING_GTFS_ZIP = RES.file("emissions-missing-test-gtfs.zip");
18-
private static final File CO2_MISSING_GTFS = RES.file("emissions-missing-test-gtfs");
15+
private static final CompositeDataSource CO2_GTFS = RES.catalogDataSource(
16+
"emissions-test-gtfs",
17+
FileType.GTFS
18+
);
19+
private static final CompositeDataSource INVALID_CO2_GTFS = RES.catalogDataSource(
20+
"emissions-invalid-test-gtfs",
21+
FileType.GTFS
22+
);
23+
public static final String FEED_ID = "em";
1924

2025
private Co2EmissionsDataReader co2EmissionsDataReader = new Co2EmissionsDataReader(
21-
new DefaultDataImportIssueStore()
26+
DataImportIssueStore.NOOP
2227
);
2328

2429
@Test
25-
void testCo2EmissionsZipDataReading() {
26-
var emissions = co2EmissionsDataReader.readGtfsZip(CO2_GTFS_ZIP);
27-
assertEquals(6, emissions.size());
28-
}
29-
30-
@Test
31-
void testCo2EmissionsDataReading() {
32-
var emissions = co2EmissionsDataReader.readGtfs(CO2_GTFS);
30+
void testCo2EmissionsDataReading() throws FileNotFoundException {
31+
var emissions = co2EmissionsDataReader.read(CO2_GTFS, FEED_ID);
3332
assertEquals(6, emissions.size());
3433
}
3534

3635
@Test
37-
void testInvalidCo2EmissionsDataReading() {
38-
var emissions = co2EmissionsDataReader.readGtfs(INVALID_CO2_GTFS);
36+
void testInvalidCo2EmissionsDataReading() throws FileNotFoundException {
37+
var emissions = co2EmissionsDataReader.read(INVALID_CO2_GTFS, FEED_ID);
3938
assertEquals(0, emissions.size());
4039
}
41-
42-
@Test
43-
void testMissingCo2EmissionsZipDataReading() {
44-
var emissions = co2EmissionsDataReader.readGtfsZip(CO2_MISSING_GTFS_ZIP);
45-
assertTrue(emissions.isEmpty());
46-
}
47-
48-
@Test
49-
void testMissingCo2EmissionsDataReading() {
50-
var emissions = co2EmissionsDataReader.readGtfs(CO2_MISSING_GTFS);
51-
assertTrue(emissions.isEmpty());
52-
}
5340
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.opentripplanner.ext.emissions;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.opentripplanner.datastore.api.FileType.GTFS;
5+
6+
import java.util.List;
7+
import java.util.Optional;
8+
import org.junit.jupiter.api.Test;
9+
import org.opentripplanner.datastore.api.CompositeDataSource;
10+
import org.opentripplanner.ext.emissions.internal.DefaultEmissionsRepository;
11+
import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore;
12+
import org.opentripplanner.graph_builder.model.ConfiguredCompositeDataSource;
13+
import org.opentripplanner.gtfs.config.GtfsDefaultParameters;
14+
import org.opentripplanner.gtfs.config.GtfsFeedParameters;
15+
import org.opentripplanner.standalone.config.BuildConfig;
16+
import org.opentripplanner.test.support.ResourceLoader;
17+
import org.opentripplanner.transit.model.framework.FeedScopedId;
18+
19+
public class EmissionsGraphBuilderTest {
20+
21+
private final ResourceLoader RES = ResourceLoader.of(EmissionsGraphBuilderTest.class);
22+
private final CompositeDataSource CO2_GTFS_ZIP = RES.catalogDataSource(
23+
"emissions-test-gtfs.zip",
24+
GTFS
25+
);
26+
private final CompositeDataSource CO2_GTFS = RES.catalogDataSource("emissions-test-gtfs/", GTFS);
27+
28+
@Test
29+
void testMultipleGtfsDataReading() {
30+
var configuredDataSources = List.of(
31+
configuredDataSource(CO2_GTFS_ZIP),
32+
configuredDataSource(CO2_GTFS)
33+
);
34+
35+
var emissionsRepository = new DefaultEmissionsRepository();
36+
var emissionsGraphBuilder = new EmissionsGraphBuilder(
37+
configuredDataSources,
38+
BuildConfig.DEFAULT.emissions,
39+
emissionsRepository,
40+
DataImportIssueStore.NOOP
41+
);
42+
emissionsGraphBuilder.buildGraph();
43+
assertEquals(
44+
Optional.of(0.006),
45+
emissionsRepository.getCO2EmissionsById(new FeedScopedId("emissionstest", "1001"))
46+
);
47+
assertEquals(
48+
Optional.of(0.041),
49+
emissionsRepository.getCO2EmissionsById(new FeedScopedId("emissionstest1", "1002"))
50+
);
51+
}
52+
53+
private static ConfiguredCompositeDataSource<GtfsFeedParameters> configuredDataSource(
54+
CompositeDataSource dataSource
55+
) {
56+
return new ConfiguredCompositeDataSource<>(
57+
dataSource,
58+
GtfsDefaultParameters.DEFAULT.withFeedInfo().withSource(dataSource.uri()).build()
59+
);
60+
}
61+
}

application/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsModuleTest.java

Lines changed: 0 additions & 75 deletions
This file was deleted.

application/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsTest.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
import org.junit.jupiter.api.BeforeAll;
1414
import org.junit.jupiter.api.Test;
1515
import org.opentripplanner._support.time.ZoneIds;
16+
import org.opentripplanner.ext.emissions.internal.DefaultEmissionsRepository;
17+
import org.opentripplanner.ext.emissions.internal.DefaultEmissionsService;
18+
import org.opentripplanner.ext.emissions.itinerary.DecorateWithEmission;
1619
import org.opentripplanner.framework.model.Cost;
17-
import org.opentripplanner.framework.model.Grams;
20+
import org.opentripplanner.framework.model.Gram;
1821
import org.opentripplanner.model.StopTime;
1922
import org.opentripplanner.model.plan.Itinerary;
2023
import org.opentripplanner.model.plan.Leg;
@@ -62,23 +65,25 @@ static void SetUp() {
6265
Map<FeedScopedId, Double> emissions = new HashMap<>();
6366
emissions.put(new FeedScopedId("F", "1"), (0.12 / 12));
6467
emissions.put(new FeedScopedId("F", "2"), 0.0);
65-
EmissionsDataModel emissionsDataModel = new EmissionsDataModel(emissions, 0.131);
66-
eService = new DefaultEmissionsService(emissionsDataModel);
68+
EmissionsRepository emissionsRepository = new DefaultEmissionsRepository();
69+
emissionsRepository.setCo2Emissions(emissions);
70+
emissionsRepository.setCarAvgCo2PerMeter(0.131);
71+
eService = new DefaultEmissionsService(emissionsRepository);
6772
decorateWithEmission = new DecorateWithEmission(eService);
6873
}
6974

7075
@Test
7176
void testGetEmissionsForItinerary() {
7277
var i = createItinerary(createTransitLeg(ROUTE_WITH_EMISSIONS));
7378
i = decorateWithEmission.decorate(i);
74-
assertEquals(new Grams(2223.902), i.emissionsPerPerson().getCo2());
79+
assertEquals(new Gram(2223.902), i.emissionsPerPerson().getCo2());
7580
}
7681

7782
@Test
7883
void testGetEmissionsForCarRoute() {
7984
var i = createItinerary(STREET_LEG);
8085
i = decorateWithEmission.decorate(i);
81-
assertEquals(new Grams(28.0864), i.emissionsPerPerson().getCo2());
86+
assertEquals(new Gram(28.0864), i.emissionsPerPerson().getCo2());
8287
}
8388

8489
@Test
@@ -92,14 +97,14 @@ void testNoEmissionsForFeedWithoutEmissionsConfigured() {
9297
void testZeroEmissionsForItineraryWithZeroEmissions() {
9398
var i = createItinerary(createTransitLeg(ROUTE_WITH_ZERO_EMISSIONS));
9499
i = decorateWithEmission.decorate(i);
95-
assertEquals(new Grams(0.0), i.emissionsPerPerson().getCo2());
100+
assertEquals(new Gram(0.0), i.emissionsPerPerson().getCo2());
96101
}
97102

98103
@Test
99104
void testGetEmissionsForCombinedRoute() {
100105
var i = createItinerary(createTransitLeg(ROUTE_WITH_EMISSIONS), STREET_LEG);
101106
i = decorateWithEmission.decorate(i);
102-
assertEquals(new Grams(2251.9884), i.emissionsPerPerson().getCo2());
107+
assertEquals(new Gram(2251.9884), i.emissionsPerPerson().getCo2());
103108
}
104109

105110
@Test

application/src/ext-test/java/org/opentripplanner/ext/flex/FlexIntegrationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ private static void addGtfsToGraph(
183183
List<File> gtfsFiles
184184
) {
185185
// GTFS
186-
var gtfsBundles = gtfsFiles.stream().map(GtfsBundle::new).toList();
187-
GtfsModule gtfsModule = new GtfsModule(
186+
var gtfsBundles = gtfsFiles.stream().map(it -> GtfsBundle.forTest(it)).toList();
187+
GtfsModule gtfsModule = GtfsModule.forTest(
188188
gtfsBundles,
189189
timetableRepository,
190190
graph,

application/src/ext-test/java/org/opentripplanner/ext/flex/FlexIntegrationTestData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ private static TestOtpModel buildFlexGraph(File file) {
4444
var deduplicator = new Deduplicator();
4545
var graph = new Graph(deduplicator);
4646
var timetableRepository = new TimetableRepository(new SiteRepository(), deduplicator);
47-
GtfsBundle gtfsBundle = new GtfsBundle(file);
48-
GtfsModule module = new GtfsModule(
47+
GtfsBundle gtfsBundle = GtfsBundle.forTest(file);
48+
GtfsModule module = GtfsModule.forTest(
4949
List.of(gtfsBundle),
5050
timetableRepository,
5151
graph,

application/src/ext/java/org/opentripplanner/ext/emissions/Co2EmissionsDataReader.java

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package org.opentripplanner.ext.emissions;
22

33
import com.csvreader.CsvReader;
4-
import java.io.File;
5-
import java.io.FileInputStream;
64
import java.io.IOException;
75
import java.io.InputStream;
86
import java.nio.charset.StandardCharsets;
97
import java.util.HashMap;
108
import java.util.Map;
119
import java.util.Optional;
12-
import java.util.zip.ZipEntry;
13-
import java.util.zip.ZipFile;
10+
import org.opentripplanner.datastore.api.CompositeDataSource;
1411
import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore;
1512
import org.opentripplanner.transit.model.framework.FeedScopedId;
1613
import org.opentripplanner.utils.lang.Sandbox;
@@ -26,60 +23,27 @@
2623
public class Co2EmissionsDataReader {
2724

2825
private static final Logger LOG = LoggerFactory.getLogger(Co2EmissionsDataReader.class);
26+
private static final String EMISSIONS_FILE_NAME = "emissions.txt";
2927

3028
private final DataImportIssueStore issueStore;
3129

3230
public Co2EmissionsDataReader(DataImportIssueStore issueStore) {
3331
this.issueStore = issueStore;
3432
}
3533

36-
/**
37-
* Read files in a GTFS directory.
38-
* @param directory
39-
* @return emissions data
40-
*/
41-
public Map<FeedScopedId, Double> readGtfs(File directory) {
42-
String feedId = "";
43-
File feedFile = new File(directory + "/feed_info.txt");
44-
File emissionsFile = new File(directory + "/emissions.txt");
45-
if (feedFile.exists() && emissionsFile.exists()) {
46-
try (InputStream feedInfoStream = new FileInputStream(feedFile)) {
47-
feedId = readFeedId(feedInfoStream);
48-
} catch (IOException e) {
49-
issueStore.add("InvalidEmissionData", "Reading feed_info.txt failed.");
50-
LOG.error("InvalidEmissionData: reading feed_info.txt failed.", e);
51-
}
52-
try (InputStream stream = new FileInputStream(emissionsFile)) {
53-
return readEmissions(stream, feedId);
54-
} catch (IOException e) {
55-
issueStore.add("InvalidEmissionData", "Reading emissions.txt failed.");
56-
LOG.error("InvalidEmissionData: reading emissions.txt failed.", e);
57-
}
58-
}
59-
return Map.of();
60-
}
34+
public Map<FeedScopedId, Double> read(CompositeDataSource catalog, String resolvedFeedId) {
35+
try {
36+
var emissionsDataSource = catalog.entry(EMISSIONS_FILE_NAME);
6137

62-
/**
63-
* Read files in a GTFS zip file.
64-
* @param file
65-
* @return emissions data
66-
*/
67-
public Map<FeedScopedId, Double> readGtfsZip(File file) {
68-
try (ZipFile zipFile = new ZipFile(file, ZipFile.OPEN_READ)) {
69-
ZipEntry feedInfo = zipFile.getEntry("feed_info.txt");
70-
ZipEntry emissions = zipFile.getEntry("emissions.txt");
71-
if (emissions != null && feedInfo != null) {
72-
String feedId = readFeedId(zipFile.getInputStream(feedInfo));
73-
InputStream stream = zipFile.getInputStream(emissions);
74-
Map<FeedScopedId, Double> emissionsData = readEmissions(stream, feedId);
75-
zipFile.close();
76-
return emissionsData;
38+
if (emissionsDataSource.exists()) {
39+
return readEmissions(emissionsDataSource.asInputStream(), resolvedFeedId);
40+
} else {
41+
return Map.of();
7742
}
7843
} catch (IOException e) {
79-
issueStore.add("InvalidEmissionData", "Reading emissions data failed.");
80-
LOG.error("InvalidEmissionData: Reading emissions data failed.", e);
44+
LOG.error("Failed to read emission data. Details: " + e.getMessage(), e);
45+
return Map.of();
8146
}
82-
return Map.of();
8347
}
8448

8549
private Map<FeedScopedId, Double> readEmissions(InputStream stream, String feedId)

0 commit comments

Comments
 (0)