summaryrefslogtreecommitdiff
path: root/test/traffic-incidents-service/feed/org.genivi.trafficincidentsfeed.tpegtec/src/main/java/org/genivi/tpegtecfeed/refimpl/TpegTecMessageHandlerRefImpl.java
blob: 0f3f792db83a30059f4677ef2c39605ac7215421 (plain)
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);
    }
  }
}