Wednesday, September 30, 2020

Creating a new entity bean or EJB in IBM WCS

The best source for this task is the info center so refer below link:

https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.tutorial.doc/tutorial/ttd18.html

I will share some points on this for each step that will help in completing this task while referring to Infocenter.

Most Important: 

Before starting EJB Creation finalize the table structure and data model as some steps cannot be corrected rather have to restart the complete process of EJB Creation.

Note:  Every step below please save your changes without fail. 


Step-1: Start the server in normal mode or debug mode. 

Step-2: Creating Table structure 

  • Create a table as per your requirement, define the data model finalize the table structure.
  • Use SQL client or the db.jsp to run the new table creation Query        

Step-3, 4: Creating table in the Database

Enter and Execute/Run the query, commit the changes in SQL client or db.jsp

Step-5: Creating BEAN and its CMP fields 

In this follow info center till steps d.

- Create all the primary keys if your table has multiple primary keys and for all primary key cmp creation select Key Field checkbox, all other checkboxes by default will be disabled.

- Select corresponding datatypes accordingly.

-  For fields other than primary keys, select Access with getter and setter methods checkbox.

- Clear the Promote getter and setter methods to remote interface checkbox, select only if it's applicable only in your case. refer info center for an explanation.

- Create all the fields as per your table defined (refer screenshot).

- Creating optcounter field is optional but preferred.

- Follow this step 'E' as is.

- The four files must be created  as shown in the below screenshot, if not then something is messed while creating and saving. Restart the EJB creation process in the fresh workspace (else it may lead to conflicts).

Step-6, 7, 8, 9: Follow steps as mentioned in the info center, those are pretty straightforward.

Step-10: Creating/Generating the getters
-
In this step, we should create or add the getters for all the primary key fields

- Create getters to all the primary key fields, can create getters manually or by generating the code.

- To generate the code right-click in the bean class, and choose the option as shown below


- Select fields for which you need the getters and select only getter methods.

Step-11: Creating finders

- Follow all the steps until step 'F'.

- In step f, if the table would have multiple rows for the field whose finder is being created then should select the return type as "java.util.Enumeration".

Refer Detailed info center link on how to create finders:

https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.doc/tasks/tdecreateentitybean_6.html

- Follow other steps as is.

Step-12: Creating new ejbCreate and ejbPostCreate methods

- The initial ejbCreate() method that gets generated might not initialize all non-nullable fields so write a custom overridden method with all the non-nullable fields.

- ejbCreate() is for creating the row in DB with all necessary parameters/fields.

- If any modifications in ejbCreate() after promoting it to the home interface, then we should demote make changes and promote it again.

Detailed link on Creating ejbCreate method:

https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.doc/tasks/tdecreateentitybean_7.html

- All other steps should be followed as mentioned in the info center.

Step-13: Adding getOwner() and fulfills() methods

- Add these methods only if the table is independent and has no foreign key reference

- If the table has a foreign key reference then these two methods are not needed still they get autogenerated in the access bean after it is generated.

- If still need to add these methods then as in the shown example just create the methods following the info center steps.


Step-14: Creating a database and table definition

- In This, The info center steps 'A' till 'F' are not needed if the Schema was already created (follow info center steps to create the schema if not present).

- Follow the step 'G' to navigate to data models

- Don't have to follow step 'H' if the Schema was already created rather select the schema.

- Follow steps 'I' and 'J' as in from the info center.

- In Step 'J', The table fields/parameters while creating the table should match with the database table field names else it fails. 

Step-15: Mapping table fields and java fields

- This step is crucial to map the java fields and DB fields (Created in step 14) that were created above.

- Follow the steps as is, if the backend folder is already there then you just select it and proceed.

-Here while mapping can use any type of mapping such that match by type or match by name, preferable is match by type as this would map most of the fields.

- Once it has mapped cross-check if the mapping is right if not drag-drop and match the fields appropriately and save the file.

Step-16: Enabling Optimistic Locking

- Follow the steps as is in the info center

Step-17: Set the optimistic predicate value of the optcounter field

- Follow the steps as is in the info center

Step-18: Editing methods to call optimistic locking classes.

- Follow the steps as is in the info center.

- In Step C, for adding the below code
 BonusKey myNewKey = new BonusKey();
 this.initializeOptCounter(myNewKey);

- In the above reference instead of the memberId, pass all the primary keys.

- If you have one primary key pass that or if you have multiple then pass those all in the right order, for the order check the beanKey class.

Step-19: Creating an access bean

- Just follow the steps in the info center

Step-20: Generating the deploy code

- Just follow the steps in the info center

Step-21: Generating the Access Bean

- Just follow the steps in the info center

References:

Creating Entity Beans infocenter link:
https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.tutorial.doc/tutorial/ttd18.html

Details reference for creating finders:
https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.doc/tasks/tdecreateentitybean_6.html

Detailed link on Creating ejbCreate method:

https://help.hcltechsw.com/commerce/7.0.0/com.ibm.commerce.developer.doc/tasks/tdecreateentitybean_7.html 

Datatype mapping reference:

Which Files to commit after creating entity bean?



Thanks for reading my blog!!

Sharing Is Caring!!!!!!

Friday, September 25, 2020

Creating a new Registry to cache data from particular Table in WCS

Creating a new Registry to cache data from particular Table in WCS

Let's consider a Scenario:
We have a Table from which the data (data is not being changed frequently) is being fetched an enormous amount of time which leads to too many DB hits.

For this scenario/requirement, we can create a WCS registry which has the complete table data cached to the registry we are about to create.

In our case, 
Let's consider a table X_SHIPPINGPRICEEXCEPTION which has the shipping price of some items/products, The shipping price of these products is fixed (products shipping is not variable based on weight) and it is persisted in this X_SHIPPINGPRICEEXCEPTION table.

This table has only two fields ie PARTNUMBER and PRICE.

The requirement was to store the complete details of this table to the newly created REGISTRY and The data can be retrieved from this registry to avoid the DB Hits.

The registry name I have chosen will be XXXXShippingExceptionRegistry and the registry classname be XShippingExceptionRegistry.

Let's start creating a Registry class.

Create a Registry class (XShippingExceptionRegistry) that implements interface com.ibm.commerce.registry.Registry

The Registry class has below listed methods which we override and write our logic based on the requirements:
initialize() -- gets called when the server starts.
refresh() -- Gets called when user or admin tries to clear/refres/update the registry from admin console
Which imports to import?

import com.ibm.commerce.registry.Registry;
import com.ibm.commerce.registry.RegistryManager;

In my case the methods look like below: 

private Map mappingData ;
public Map getMappingData() {
    return mappingData;
}

@Override public void initialize() throws Exception { 
RegistryManager.singleton().addRegistry("XShippingExceptionRegistry", this); 
//This is the Custom method that is used to get the table contents using 
JDBC Helper loadContents(); 

private void loadContents() {
if(mappingData == null){ 
mappingData = new HashMap<>(); 
ServerJDBCHelperAccessBean jdbcHelper = new ServerJDBCHelperAccessBean();
List shippingExceptionPriceInfoList =null;
String getShippingExceptionPriceSql = "SELECT PARTNUMBER, PRICE FROM X_SHIPPINGPRICEEXCEPTION";
try {
shippingExceptionPriceInfoList = jdbcHelper.executeQuery(getShippingExceptionPriceSql); 
} catch (RemoteException | NamingException | SQLException | CreateException e) { 
//Add loggers here
}
processSqlResult(shippingExceptionPriceDBList); 
}

private void processSqlResult(List shippingExceptionPriceDBList) {
if (shippingExceptionPriceDBList != null && !shippingExceptionPriceDBList.isEmpty()) {
java.util.Iterator shipPriceIterator = shippingExceptionPriceDBList.iterator(); 
String skunumber = null; 
String shipExceptionPrice = null; 
while (shipPriceIterator.hasNext()) {
List vObj = (List) shipPriceIterator.next(); 
if (vObj.get(0) != null) { 
skunumber = vObj.get(0).toString();

if (vObj.get(1) != null) { 
shipExceptionPrice = vObj.get(1).toString(); 
if (skunumber != null && shipExceptionPrice != null) { 
mappingData.put(skunumber, shipExceptionPrice); 

//Add Logger to print the size of the list if required: "Populating registry is completed for total count : "+ mappingData.size()" 
}

The refresh method would look like below which clears and populates the data to the registry. @Override 
public void refresh() throws Exception { 
mappingData.clear(); 
loadContents();

We need to add entry in WC-server.xml for the Registry.

<Registries>
<registry name="XXXXShippingExceptionRegistry" regClassName="com.academy.commerce.shipping.registry.XShippingExceptionRegistry"/>
</Registries>

How to clear the registry or the cached data?

If we have to clear or refresh the Registry data, we can do it from the admin console with "registry refresh" option -> select the registry -> update the registry.

How to use this registry to retrive the data from shipping registry and use it?

XShippingExceptionRegistry XShippingExceptionRegistry = (XShippingExceptionRegistry) RegistryManager.singleton().getRegistry("XXXXShippingExceptionRegistry"); 
Map shippingExceptionMapping = academyXShippingExceptionRegistry.getMappingData(); 
xShippingExceptionPrice = new BigDecimal(shippingExceptionMapping.get(partnumber));


Thanks a lot for reading my Blog. 

Sharing Is Caring!!!!!!