/ Development  

The art of creating a singleton entity

Hi there AppWorks fans,

Welcome to a new installment of AppWorks tips.

And a good Monday morning on this sunny day (at my place!). A great start to play with a design pattern called ‘Singleton’. Read more about the pattern on this wiki page

Feature description: Make sure only 1 instance of the entity can be created in the solution.


Let get right into it…

Several steps need to be done to make this all happen. Don’t worry…This post will give you the steps required to accomplish it. First spin up your VM, open your workspace with your beloved project where you have the control as the ‘Developer’ role.

Create a ‘config’ entity and update the entity properties

Easy peasy…Enter the ‘entities’ folder of the project and just create a new entity with the name ‘config’. After this creation update the entity properties like this.

singleton_001

And update the ‘Identity’ building block like this so it’s in line with our other entities.

singleton_002

Add properties

Time for some properties. Make it as fancy as you like, but for me a ‘Name’ is sufficient.

singleton_003

Create forms (Create/Default)

Also here nothing fancy, but it’s required otherwise we can’t create a new instance and view it!

The ‘Create’ form (don’t forget the capital ‘C’)

singleton_004

And the ‘Default’ form (that includes the ‘Create’ form! and don’t forget the capital ‘D’)

singleton_005

Add a list (All Configurations)

I guess only the screenshot tells you enough…correct!?

singleton_006

Add webservices with an ‘AllConfigs’ operation

Now add also the ‘Web service’ building block to the entity and add an extra operation ‘AllConfigs’ from the ‘Advanced configuration’

singleton_007

Add a Security building block

This is required to expose that ‘AllConfigs’ find operation for our end user.

singleton_008

Now add the ‘Identity User’ role to the list with the green ‘plus’ button

singleton_009

And mark all the options available for now (especially the ‘Use’ for the ‘AllConfigs’ webservice!)

singleton_010

Save, publish, and do the first tests

Now do your cycle of save, publish, and see if we can create a new instance of the ‘config’ entity.

It’s a green light for me…

singleton_011

And for our service endpoint?

Let’s see on this URL: http://192.168.56.107:8080/home/appworks_tips/services/

singleton_012

You see my service has more operations, but that is because I played with it before! You probably need to clean some cache to get rid of them, but that’s not for this post now.

Add a BPM ‘check_singleton’

Now for the BPM! Go to you ‘bpms’ folder in the project and create a new ‘Business Process Model’ with the name ‘check_singleton’.

singleton_013

Set the ‘execution’ mode to ‘Short Lived’ what makes the BPM interactive with the front-end (there is more information about this setting in the previous post!).

singleton_014

Next step is to drag the green ‘Start’ construct on the main panel and insert our ‘AllConfigs’ webservice

singleton_015

Search for ‘AllConfigs’ to find the correct one and add it to the BPM. Also connect it to the ‘Start’ construct.

singleton_016

Next step is to add an ‘Exclusive’ decision with a descriptive name ‘Config instance found?’

singleton_017

And we end with 2 endpoints where our ‘YES’ will give an error like this

singleton_018

With also some more error details…

singleton_019

Back to the properties of our ‘Decision’ split to tell what should happen for both ‘End’ constructs in the ‘Conditions’ tab.

singleton_020

This is the value to copy from if you want boolean(ns2:AllConfigsOutput/ns2:AllConfigsResponse/ns4:config/ns4:config-id)

Make sure it’s on the ‘YES’ condition where the ‘NO’ condition is the ‘Default’ fallback scenario when the ‘YES’ condition is not met.

Now save, publish, validate & build, and do a quick debug on your craftsmanship!

singleton_021

You can Search for ‘Debug’ on this site to help your further. Or let me know in the comments if want to have it within this post!?

Start BPM from rule ‘OnInitCheckSingleton’

When all is fine we need to create a new ‘Rule’ building block (of type ‘Event’) with the name of ‘OnInitCheckSingleton’ where we configure the rule to start our BPM.

singleton_022

Deploy, save and retest

Now we can save and deploy our entity…and…check the result in runtime!

Make sure to delete the old created instances of the ‘Config’ entity so you get an error the second time you create a new instance!

singleton_023

And that’s it! 💪

Extend the feature (singleton 2.0?)

I nice extra feature I thought of during the creation of this blog is adding an extra property called ‘conf_is_singleton’. This makes the entity a bit more reusable for more configuration instances in the solution (but it also breaks the ‘real’ singleton principle). And you also need to add more complexity in the related BPM as you need to check if the instance ‘name’ already exists and if the ‘Is singleton’ mark is set to TRUE. As always, this all depends on what you want to do…


Again, a greatly earned ‘DONE’ for our singleton implementation on our entity creation. Is there more to say? Well, what about all the other design patterns that our available for you to explore! Curious? Have a read session at the Gang of Four. I see U in the next post on a brand-new installment of AppWorks Tips…Cheers!

Don’t forget to subscribe to get updates on the activities happening on this site. Have you noticed the quiz where you find out if you are also “The AppWorks guy”?