Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Introduction

On this day we will focus on preparing the initial implementation of our first component. By the end of the day, we expect the groups to:

...

First we create the directory for the IDL:

Code Block
languagebash
> getTemplateForDirectory MODROOT_WS idlHelloComp
> cd idlHelloComp/src
> touch ../idl/HelloComponent.idl

...

Code Block
languagecpp
titleidlHelloComp/idl/HelloComponent.idl
linenumberstrue
collapsetrue
#ifndef _HELLOCOMPONENT_IDL_
#define _HELLOCOMPONENT_IDL_

#pragma prefix "acsws"

#include <acscomponent.idl>

module workshop {
    interface HelloComponent : ACS::ACSComponent {
        voidstring printHello();
    };
};

#endif

...

We then compile and install the IDL definitions:

Code Block
languagebash
titleCompilation
make -j> make all install

Configuration

The following image depicts the deployment configuration needed:

...

Add the following configuration in the $ACS_CDB/CDB/MACI/Components/Components.xml:

...

Implementation

Python

Code Block
languagebash
titlepyHelloComp
> getTemplateForDirectory MODROOT_WS pyHelloComp
> cd pyHelloComp/src
> mkdir ws
> touch ws/__init__.py
> touch ws/HelloComponentImpl.py

We modify the Makefile for this component:

Code Block
titlepyHelloComponentpyHelloComp/src/Makefile
...
PY_PACKAGES = ws
...

...

Code Block
languagepy
titlepyHelloComponentpyHelloComp/src/workshopws/HelloComponentImpl.py
linenumberstrue
collapsetrue
#Client# Client stubs and definitions, such as structs, enums, etc.
import workshop
#Skeleton# Skeleton infrastructure for server implementation
import workshop__POA
 
#Base# Base component implementation
from Acspy.Servants.ACSComponent import ACSComponent
#Services# Services provided by the container to the component
from Acspy.Servants.ContainerServices import ContainerServices
#Basic# Basic component lifecycle (initialize, execute, cleanUp and aboutToAbort methods)
from Acspy.Servants.ComponentLifecycle import ComponentLifecycle
 
class HelloComponentImpl(workshop__POA.HelloComponent, ACSComponent, ContainerServices, ComponentLifecycle):
    def __init__(self):
        ACSComponent.__init__(self)
        ContainerServices.__init__(self)
        self._logger = self.getLogger()
    def printHello(self):
            print("Just printing 'Hello World!'")
        return "Hello World!"

Java

Code Block
languagebash
titlejHelloComp
> getTemplateForDirectory MODROOT_WS jHelloComp
> cd jHelloComp/src
> mkdir -p acsws/workshop/HelloComponentImpl
> touch acsws/workshop/HelloComponentImpl/HelloComponentImpl.java
> cp ../../idlHelloComp/src/acsws/workshop/HelloComponentImpl/HelloComponentComponentHelper.java.tpl acsws/workshop/HelloComponentImpl/HelloComponentComponentHelper.java

We modify the Makefile for this component:

Code Block
titlejHelloComponentjHelloComp/src/Makefile
...
JARFILES = HelloComponentImpl
HelloComponentImpl_DIRS = acsws
...

...

Code Block
languagejava
titlejHelloComponentjHelloComp/src/acsws/workshop/HelloComponentImpl/HelloComponentImpl.java
linenumberstrue
collapsetrue
//Suggested: import alma.<Module>.<Interface>Impl; //But anything, really
package acsws.workshop.HelloComponentImpl;
 
//Base component implementation, including container services and component lifecycle infrastructure
import alma.acs.component.ComponentImplBase;
 
//Skeleton interface for server implementation
import acsws.workshop.HelloComponentOperations;


//ClassName usually is <Interface>Impl, but can be anything
public class HelloComponentImpl extends ComponentImplBase implements HelloComponentOperations {
    public HelloComponentImpl() {
    }
    public voidString printHello() {
        System.out.println("Just printing 'Hello World!'");
        return new String("Hello World!");
    }
}

C++

We create the needed directories:

Code Block
languagebash
titlecppHelloComp
> getTemplateForDirectory MODROOT_WS cppHelloComp
> cd cppHelloComp/src
> touch HelloComponentImpl.cpp
> touch ../include/HelloComponentImpl.h

We modify the Makefile for this component:

Code Block
titlecppHelloComponentcppHelloComp/src/Makefile
...
INCLUDES = HelloComponentImpl.h
...
LIBRARIES = HelloComponentImpl
HelloComponentImpl_OBJECTS = HelloComponentImpl
HelloComponentImpl_LIBS = HelloComponentStubs acscomponent
...

...

Code Block
languagecpp
titlecppHelloComponentcppHelloComp/include/HelloComponentImpl.h
linenumberstrue
collapsetrue
#ifndef _HELLO_COMPONENT_IMPL_H
#define _HELLO_COMPONENT_IMPL_H

#ifndef __cplusplus
#error This is a C++ include file and cannot be used from plain C
#endif

//Base component implementation, including container services and component lifecycle infrastructure
#include <acscomponentImpl.h>

//Skeleton interface for server implementation
#include <HelloComponentS.h>

//Error definitions for catching and raising exceptions
class HelloComponentImpl : public virtual acscomponent::ACSComponentImpl, public virtual POA_workshop::HelloComponent {
  public:
    HelloComponentImpl(const ACE_CString& name, maci::ContainerServices * containerServices);
    virtual ~HelloComponentImpl();
    voidchar* printHello();
};

#endif
Code Block
languagecpp
titlecppHelloComponentcppHelloComp/src/HelloComponentImpl.cpp
linenumberstrue
collapsetrue
#include <HelloComponentImpl.h>

HelloComponentImpl::HelloComponentImpl(const ACE_CString& name, maci::ContainerServices * containerServices) : ACSComponentImpl(name, containerServices) {
}

HelloComponentImpl::~HelloComponentImpl() {
}

voidchar* HelloComponentImpl::printHello() {
    std::cout << "Just printing 'Hello World!'" << std::endl;
    return CORBA::string_dup("Hello World!");
}

/* --------------- [ MACI DLL support functions ] -----------------*/
#include <maciACSComponentDefines.h>
MACI_DLL_SUPPORT_FUNCTIONS(HelloComponentImpl)
/* ----------------------------------------------------------------*/

With this information we are ready to compile our first component that will print the "Hello World" message.

Client

First launch your acs container with the modified ACS CDB

Code Block
languagebash
titleStart container
acsStartContainer -py aragornContainer
acsStartContainer -java frodoContainer
acsStartContainer -cpp bilboContainer

For simplicity, we implement a simple client in Python to communicate with the 3 programming languages:

Code Block
languagepy
linenumberstrue
collapsetrue
from Acspy.Clients.SimpleClient import PySimpleClient

client = PySimpleClient()

hc_py = cclient.getComponent("PY_HELLO_COMP")
print(hc_py.printHello())

hc_java = cclient.getComponent("JAVA_HELLO_COMP")
print(hc_java.printHello())

hc_cpp = cclient.getComponent("CPP_HELLO_COMP")

print(hc_pycpp.printHello()
hc_java.printHello()
hc_cpp.printHello()

Output

The output is seen on each container:

...

Code Block
...
2020-07-28T21:19:53.080 [Container-ActivationMethod - maci::ActivationMethod::call] Calling maci::CBComponentInfo::done with descOut.id_tag = 4.
2020-07-28T21:19:53.082 [Container-ActivationMethod - maci::ActivationMethod::call] Call to maci::CBComponentInfo::done with descOut.id_tag = 4 completed.
Just saying 'Hello World!'
...

PySimpleClient

Code Block
...
Hello World!
Hello World!
Hello World!
...