/*******************************************************************************
* Copyright (c) 2011 protos software gmbh (http://www.protos.de).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* CONTRIBUTORS:
* Thomas Schuetz
*
*******************************************************************************/
package org.eclipse.etrice.runtime.java.messaging;
import java.util.ArrayList;
import java.util.List;
/**
* The MessageServiceController controls lifecycle of and access to all MessageServices in one SubSystem
*
* @author Thomas Schuetz
* @author Thomas Jung
*
*/
public class MessageServiceController {
public MessageServiceController(/*IRTObject parent*/){
// TODOTS: Who is parent of MessageServices and Controller?
// this.parent = parent;
messageServiceList = new ArrayList<MessageService>();
}
public void addMsgSvc(MessageService msgSvc){
// TODOTS: Who is parent of MessageServices ?
assert(msgSvc.getAddress().threadID == messageServiceList.size());
messageServiceList.add(msgSvc);
}
public MessageService getMsgSvc(int threadID){
assert(threadID < messageServiceList.size());
return messageServiceList.get(threadID);
}
//the connectAll method connects all messageServices
//it is included for test purposes
//currently it is not called
public void connectAll(){
for (int i=0; i < messageServiceList.size(); i++){
MessageDispatcher dispatcher = getMsgSvc(i).getMessageDispatcher();
for (int j=0;j < messageServiceList.size();j++){
if(i!=j){
dispatcher.addMessageReceiver(RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(j));
}
}
}
}
public void start() {
// start all message services
for (MessageService msgSvc : messageServiceList){
msgSvc.start();
// TODOTS: start in order of priorities
}
running = true;
}
public void stop() {
terminate();
waitTerminate();
}
private void terminate() {
if (!running){
return;
}
running = false;
// terminate all message services
for (MessageService msgSvc : messageServiceList){
msgSvc.terminate();
// TODOTS: stop in order of priorities
}
}
/**
* waitTerminate waits blocking for all MessageServices to terminate
* ! not threadsafe !
*/
public void waitTerminate() {
for (MessageService msgSvc : messageServiceList){
try {
msgSvc.join();
}
catch (InterruptedException e1) {
}
}
}
private List<MessageService> messageServiceList = null;
// private IRTObject parent = null;
private boolean running = false;
}