The following is an SBB that implements a Pet Store using the Pet Store API.
To develop the Pet Store SBB you must:
|
|
Learn about Rhino TAS - Telecom Application Server and the JAIN SLEE (JSR 240). |
Create an SBB class and define slee-annotations
Create an abstract class that implements javax.slee.sbb.
This class will be the root SBB of the Pet Store service and should implement the SBB lifecycle operations.
Define slee annotations on your abstract class that define: the Pet Store service, the root sbb and a resource adaptor type binding for the Pet Store REST API.
@SleeService(
id = @ComponentId(name = "@component.name@",
vendor = "@component.vendor@",
version = "@component.version@"),
rootSbb = @RootSBB(
sbb = @ComponentId(name = "@component.name@-sbb",
vendor = "@component.vendor@",
version = "@component.version@"))
)
@SBB(
id = @ComponentId(name = "@component.name@-sbb",
vendor = "@component.vendor@",
version = "@component.version@"),
sbbClasses = @SBBClasses(abstractClass = @SBBAbstractClass(reentrant = true)),
libraryRefs = {
@LibraryReference(
library = @ComponentId(name = "@rest-api-common.LibraryID.rest-api-common.name@",
vendor = "@rest-api-common.LibraryID.rest-api-common.vendor@",
version = "@rest-api-common.LibraryID.rest-api-common.version@"))
}
)
@RATypeBindings(
raTypeBindings = {
@RATypeBinding(
raType = @ComponentId(name = "petstore-api-server", vendor = "ExampleCo", version = "1.0"),
resourceAdaptorObjectName = MockPetstoreSbb.petstore_PROVIDER_JNDI_NAME,
resourceAdaptorEntityLink = "unified-rest-ra"
)
}
)
public abstract class MockPetstoreSbb implements javax.slee.Sbb {
Implement setSbbContext() and other SBB lifecycle operations
Rhino invokes the setSbbContext() method on instances of your SBB abstract class.
Initialize state that can be held by the SBB object during its lifetime.
|
|
Such state cannot be specific to an SBB entity because the SBB object might be reused during its lifetime to serve multiple SBB entities. |
The MockPetstoreSbb creates a Tracer, does a JNDI lookup to get a Pet Store API provider object and finally
creates a Pets API object.
public void setSbbContext(SbbContext context) {
sbbContext = (RhinoSbbContext) context;
tracer = (ExtendedTracer) sbbContext.getTracer(sbbContext.getSbb().getName());
tracer.finest("setSbbContext");
try {
final Context env = (Context) new InitialContext().lookup("java:comp/env");
this.apiProvider = (PetstoreApiServerProvider)
env.lookup(petstore_PROVIDER_JNDI_NAME);
}
catch (NamingException e) {
throw new RuntimeException("NamingException locating PetstoreApiServerProvider", e);
}
// get a pet store API instance
this.petsApi = apiProvider.getApiClient(
ApiConfiguration.standardConfiguration()).getPetsApi();
}
Implement event handlers
|
|
Speed up your development by referring to the generated sbbpart superclass.
The generated event handlers in the Petstore API sbbpart superclass can be copied directly to MockPetstoreSbb.
|
On receipt of a CreatePet request event, call handleCreatePetRequest().
If there is any failure then call rejectCreatePetRequest().
@EventMethod(
eventType = @ComponentId(name = "com.exampleco.petstore.api.CreatePetRequest",
vendor = "ExampleCo",
version = "1.0"),
initialEvent = true,
initialEventSelectVariable = IESVariableType.ActivityContext
)
public void onCreatePetRequest(CreatePetRequest request,
ActivityContextInterface aci,
EventContext eventContext)
{
tracer.finest("Received: {}", request);
try {
handleCreatePetRequest(request, aci);
}
catch(IOException e) {
tracer.finest("Failed to handle: {}", request, e);
rejectCreatePetRequest(request, aci);
}
}
Process a CreatePet request by updating the Pets DB.
If updating the DB is successful, then send a success response (request.create_204_SuccessResponse()).
Otherwise send a 501 error response.
private void handleCreatePetRequest(CreatePetRequest request,
ActivityContextInterface aci) throws IOException
{
if (addPet(request.getPet())) {
tracer.finest("Added pet: {}", request.getPet());
sendResponse(request.create_204_SuccessResponse(), aci);
}
else {
final RestResponseBuilder errorResponse = request.createDefaultResponse(
501,"application/json",
new Error().code(501)
.message("Pet already exists with id: " + request.getPet().getId()));
sendResponse(errorResponse, aci);
}
}
Reject a CreatePet request, by sending a 501 error response.
private void rejectCreatePetRequest(CreatePetRequest request, ActivityContextInterface aci) {
final RestResponseBuilder errorResponse = request.createDefaultResponse(
501,"application/json",
new Error().code(501).message("Failed to create pet: " + request.getPet()));
sendResponse(errorResponse, aci);
}
private void sendResponse(RestResponseBuilder response, ActivityContextInterface aci) {
try { petsApi.sendResponse(response, aci); }
catch (IOException e) {
tracer.finest("Failed to send response. Api = {} , OperationId = {}",
response.getApi(), response.getOperationId(), e);
}
}
Implementation of the ListPetsRequest and ShowPetByIdRequest event handlers follows the same pattern.
@EventMethod(
eventType = @ComponentId(name = "com.exampleco.petstore.api.ListPetsRequest",
vendor = "ExampleCo",
version = "1.0"),
initialEvent = true,
initialEventSelectVariable = IESVariableType.ActivityContext
)
public void onListPetsRequest(ListPetsRequest request,
ActivityContextInterface aci,
EventContext eventContext)
{
tracer.finest("Received: {}", request);
try {
handleListPetsRequest(request, aci);
}
catch(IOException e) {
tracer.finest("Failed to handle: {}", request, e);
rejectListPetsRequest(request, aci);
}
}
@EventMethod(
eventType = @ComponentId(name = "com.exampleco.petstore.api.ShowPetByIdRequest",
vendor = "ExampleCo",
version = "1.0"),
initialEvent = true,
initialEventSelectVariable = IESVariableType.ActivityContext
)
public void onShowPetByIdRequest(ShowPetByIdRequest request,
ActivityContextInterface aci,
EventContext eventContext)
{
tracer.finest("Received: {}", request);
try {
handleShowPetByIdRequest(request, aci);
}
catch(IOException e) {
tracer.finest("Failed to handle: {}", request, e);
rejectShowPetByIdRequest(request, aci);
}
}
