1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/**
* Copyright (C) 2013 TomTom International B.V.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.genivi.tpegtecfeed.refimpl;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.genivi.trafficincidentsservice.TrafficIncidentFeedStatus;
import org.genivi.trafficincidentsservice.TrafficIncidentsStatus;
import org.genivi.trafficincidentsservice.TrafficIncidentFeed;
import org.genivi.trafficincidentsservice.trafficincidentfeed.trafficincident.TrafficIncident;
import org.genivi.trafficincidentsservice.trafficincidentfeed.trafficincident.XTrafficIncidentFactory;
import org.genivi.trafficinfo.tpeg.tec.event.TECMessage;
import org.genivi.trafficinfo.tpeg.tpegfwktypes.MMCSwitch;
import org.genivi.trafficinfo.tpeg.tpegfwktypes.MessageManagementContainer;
import org.genivi.trafficinfo.tpeg.tpegfwktypes.ServiceIdentifier;
public class TpegTecMessageHandlerRefImpl extends EObjectImpl implements TpegTecMessageHandler {
private final static Logger LOGGER = Logger.getLogger(TpegTecMessageHandlerRefImpl.class.getName());
private final static XTrafficIncidentFactory factory = XTrafficIncidentFactory.eINSTANCE;
private int feedId;
private String communicationChannelName;
TrafficIncidentsStatus trafficIncidentsStatus = TrafficIncidentsStatus.UNAVAILABLE;
private TrafficIncidentFeed trafficIncidentFeed;
private TecEventToTrafficIncidentConversion tecEventToTrafficIncidentConversion;
private ServiceIdentifier originatorSID;
private byte COID;
private EList<String> cancels;
private EList<TrafficIncident> updates;
public TpegTecMessageHandlerRefImpl(TrafficIncidentFeed trafficIncidentFeed, String communicationChannelName, int feedId) {
LOGGER.setLevel(Level.SEVERE);
LOGGER.info("=> trafficIncidentFeed = " + trafficIncidentFeed +
", communicationChannelName = " + communicationChannelName + ", feedId = " + feedId);
this.trafficIncidentFeed = trafficIncidentFeed;
this.feedId = feedId;
this.communicationChannelName = communicationChannelName;
tecEventToTrafficIncidentConversion = new TecEventToTrafficIncidentConversion();
}
public void languageChanged(String languageCode, String countryCode) {
LOGGER.info("=> languageCode = " + languageCode + ", countryCode = " + countryCode);
tecEventToTrafficIncidentConversion.setLanguage(languageCode, countryCode);
}
@Override
public void handleMessagesStart(long channelId, String communicationChannelName, ServiceIdentifier originatorSID, byte COID) {
LOGGER.info("handleMessagesStart => communicationChannelName = " + communicationChannelName);
if (!communicationChannelName.equals(this.communicationChannelName)) {
LOGGER.severe("Unexpected communicationChannelName: " + communicationChannelName);
}
updateStatus();
this.originatorSID = originatorSID;
this.COID = COID;
cancels = new BasicEList<String>();
updates = new BasicEList<TrafficIncident>();
}
private void updateStatus() {
LOGGER.info("=>");
if (trafficIncidentsStatus == TrafficIncidentsStatus.UNAVAILABLE) {
trafficIncidentsStatus = TrafficIncidentsStatus.PARTLY_AVAILABLE;
LOGGER.info("Switching to PARTLY_AVAILABLE.");
} else {
trafficIncidentsStatus = TrafficIncidentsStatus.AVAILABLE;
LOGGER.info("Switching to AVAILABLE.");
}
trafficIncidentFeed.updateStatus(feedId, TrafficIncidentFeedStatus.CONNECTED, trafficIncidentsStatus);
LOGGER.info("<=");
}
@Override
public void handleMessage(TECMessage tecMessage) {
LOGGER.info("Going to handle TECMessage.");
MMCSwitch mmcSwitch = tecMessage.getMmt();
String trafficIncidentManagementId = TecUtil.createMessageId(originatorSID, COID, mmcSwitch.getMessageID());
MessageManagementContainer messageManagementContainer = (MessageManagementContainer) mmcSwitch;
if (messageManagementContainer.isCancelFlag()) {
cancels.add(trafficIncidentManagementId);
} else {
TrafficIncident managedTrafficIncident = factory.createTrafficIncident();
managedTrafficIncident.setTrafficIncidentId(trafficIncidentManagementId);
managedTrafficIncident.setExpirationTime(mmcSwitch.getMessageExpiryTime());
tecEventToTrafficIncidentConversion.convertTecMessageToManagedTrafficIncident(managedTrafficIncident, tecMessage);
updates.add(managedTrafficIncident);
}
}
@Override
public void handleMessagesEnd() {
LOGGER.info("=> feedId = " + feedId);
if (!cancels.isEmpty() || !updates.isEmpty()) {
trafficIncidentFeed.updateIncidents(feedId, cancels, updates);
}
}
}
|