Friday 15 December 2017

SAP Hybris ServiceLayer Architecture

 Service Layer Architecture

The ServiceLayer can be described as a layer of services on top of the persistence layer. The services themselves can be divided into subcomponents.



Components

Client 

A client in this context is any software component that uses the ServiceLayer, such as:

  1. Page Controllers of an MVC framework
  2. Web Service clients
  3. Scripts
  4. Other services

Services

A service holds the logic to perform business processes and provides this logic through a number of related public methods. These public methods usually are defined in a Java interface. Most often these methods operate on the same kind of model object, for example product, order, and so on.
Services are expected to abstract from the persistence layer, that is, to only contain functional logic and no persistence-related code. That means if you implement a service, make sure to implement it in a way that the underlying implementation is as loosely coupled to the persistence layer as possible.
SAP Hybris Commerce exposes all of its functionality through services. The following kinds of services are available:

  1. Business Services implement business use cases, such as cart handling or back order.
  2. Infrastructure Services provide the underlying technical foundation, such as internationalization, import, export, and so on.
  3. System services provide functionality required by the ServiceLayer, such as model handling and session handling.

The service methods should be as fine-grained as possible to enable reuse.
Extensions must provide their functionality as services. Per extension you may provide as many services as you deem necessary, not just one.
Services may use other services to perform their tasks but should keep their inter dependencies to a minimum to avoid overly tight coupling with other components.
In a project, you may write your own services to either provide unique functionality or to aggregate other services' functionality.
Although technically not necessary, Hybris recommends implementing services in terms of interfaces.   
Services interact with other components through models

Strategies

A service may delegate parts of its tasks to smaller micro-services, called strategies. The service then serves as a kind of facade to the strategies. Clients still use the service and its stable API. But under the hood the functionality is split into multiple parts. Because these parts are smaller and very focused to their task, it is easier to adapt or replace them. Strategies therefore help to further encapsulate behavior and make it more adaptable.

DAOs
A DAO (Data Access Object) is an interface to the storage back end system. DAOs store and retrieve objects. You use DAOs to save, remove, and find models. DAOs are the place to put SQL or FlexibleSearch statements and nowhere else. This is to ensure further decoupling from the underlying storage facility. DAOs interact with services via models and with the database via FlexibleSearch and SQL statements.

Models

Models are a new way to represent Hybris items. Each model contains all item attributes from all extensions thus unifying access to an item's data. Models are generated from the type system of SAP Hybris Commerce. Furthermore they are more or less simple POJOs (Plain Old Java Objects) that can be used without any storage facility. Thus, it's pretty easy to mock them up, for example for testing and debugging.  Models are used by DAOs, services, strategies, converters, and facades.


Tuesday 2 May 2017

Hybris - Data models




  Hybris data model 

Hybris Data Models are defined in the <extension>-items.xml file of each extension. 
Data model items(entities) are defined with itemtype elements.
Each item type is consist of a Java class and database Table.
items.xml  has six different tags and should be followed by same order 

automictypes 
collections
enumtypes
maptypes
relations
itemtypes

Atomic types: The item types which are primitive data types. 
For example, integer, float, double, boolean, Strings etc. They are defined in items.xml as follows.
<atomictype class=“java.lang.String” extends=“java.lang.Object” autocreate=“true” generate=“false”/>

Collection type: They are analogue of generic types in Java. A collection is a group of similiar type item types. Like a group of language used for a particular application could be stored as LanguageList.
<collectiontype code=”LanguageSet” elementtype=”Language” autocreate=”true” generate=”true” type=”set”/>

Enum types: The group of fixed constants are defined as enums, like any other language.
<enumtype code=“OrdStatus” autocreate=“true” generate=“true”>
<value code=“OPEN”/>
<value code=“IN-PROGRESS”/>
<value code=“CLOSE”/>
</enumtype>
Itemtypes: we need to define a new item type to specifies a specific ComposedType.

<itemtype code="OFFLineProduct" extends="Product"
                                  autocreate="true" generate="true"
                                  jaloclass="org.hm.core.jalo.OFFLineProduct">
                                  
<description>OFF Line product extension that contains additional attributes for off line.</description>
<deployment table="OFFLineProducts" typecode="10100" propertytable="ProductProps"/>
        <attributes>
                <attribute qualifier="store" type="java.lang.String">
                        <description> the products  store name </description>
                        <modifiers read="true" write="true" search="true" optional="false"/>
                        <persistence type="property" />
                </attribute>
                <attribute qualifier="intime" type="java.util.Date">
                        <description> the time stamp of the product  in </description>
                        <modifiers read="true" write="true" search="true" optional="false"/>
                        <persistence type="property" />
                </attribute>
                <attribute qualifier="outtime" type="java.util.Date">
                <description> the time stamp of the product  out </description>
                <modifiers read="true" write="true" search="true" optional="false"/>
                <persistence type="property" />
                </attribute>
        </attributes>
</itemtype>

Here we defined a new item type extending parent item or Generic item. 
GenericItem extends LocalizableItem extends ExtensibleItem extends Item
The jalo class, is the module class which creates the item. This class is auto generated. when you run ant build
Each of the characteristics of an item type is defined as attribute of item type. The attribute itself could be of any type.

autocreate - If 'true', the item will be created during initialization. Default is 'true'.
generate - If true, it generates constants for enum  and source code for item, it has no effect in automictypes,collections, maptype and relations.

attributes - Defines the list of item attributes.

read – If false, we cannot read this attribute, Defines if this attribute is readable or not.
write – If false,  we cannot write this attribute, Defines if this attribute is writable or not.
optional– if false, it is mandatory to initialize this attribute. Since it is not optional.
unique– if true, the attribute must hold a unique value. Similar to unique constraints in DBMS.
search – if true, the attribute is searchable through queries

persistence -
Defines how the values of the attribute will be stored. Possible values:  'property' (persistent), 'dynamic' (not persisted).

defaultvalue -Configures a default value for this attribute used if no value is provided. 

maptype: Like the java collection framework, a type, which defines map objects. 
<maptype code="localized:java.lang.String"
               argumenttype="Language"
               returntype="java.lang.String"
               autocreate="true"
               generate="false"/>

relationtype:
A RelationType defines a n-m or 1-n relation between types.

<relation code="OrderDiscountRelation" autocreate="true" generate="false" localized="false"
                deployment="de.hybris.platform.persistence.link.OrderDiscountRelation">
         <sourceElement qualifier="orders" type="AbstractOrder" cardinality="many" ordered="false">
            <modifiers read="true" write="true" search="true" optional="true"/>
         </sourceElement>
         <targetElement qualifier="discounts" type="Discount" cardinality="many" ordered="true" collectiontype="list">
            <modifiers read="true" write="true" search="true" optional="true"/>
         </targetElement>
      </relation>

Saturday 22 April 2017

Create and Sync Product Catalog from HMC

Create Product Catalog

Login to hmc with admin/nimda
localhost:9001/hmc

Right click on Catalogs and create Catalog













Provide required fields(ID and Name)
Create 2 catalog versions - Staged and Online - Make sure Online versions as active and save












Right click on Categories and create Category
Provide Identifier and Name fields
Select Catalog version as Catalog-Staged(Electronics-Staged) and Create.















Create another Category as Computers & Accessories














Create Category as Smartphones and Supercategories(Category system tab) as Mobiles & Tablets














Create Category as Tablets and Supercategories(Category system tab) as Mobiles & Tablets














Create Category as Smartphones and Supercategories(Category system tab) as Mobiles & Tablets



Create Category as Accessories and Supercategories(category system tab) as Mobiles & Tablets

Create Category as Desktops & Monitors and Supercategories(category system tab) as Computers & Accessories














Create Category as Laptops and Supercategories as Computers & Accessories

Create Category as Hard Drives and Supercategories as Computers & Accessories

Repeat the above steps to create more categories/sub categories.

Catalog, versions, categories, sub categories are ready.
We can see complete Catalog and categories hierarchic.















Right click on Catalogs and create Catalog














Provide Code, name, Catalog version, super category (Category system tab) etc to create product















Repeat the above step to create Lenovo-k2 and Lenovo-k3 products.




Provide Code, name, Catalog version, super category to create Dell XPS 1, Dell XPS  2, Dell XPS 3 products.















Repeat the above steps to create more products

Catalog, versions, categories, sub categories and products are ready.


We can see complete products hierarchic.














Create media. For this, right click on media in multimedia folder
Upload the required image and assign this media to product.

Create and assign the variants, click on the product variants tab.
Right click on the variants section and create the variants.















Repeat the above steps to create variants on other products.
Product Catalog structure for staged version is ready














Sync Catalog Staged to Online

Sync your data from staged to online, open your staged version and click on Catalog version tab















Create Synchronization on Dependent Catalog Version














Select Synchronization target as Online version and save














Click on Synchronize Catalog Version














Select Staged Version and click on start















After completing click on done.

















We can see complete Staged and Online products hierarchic.