Sunday, 29 June 2014

Price Generation in ATG

ATG Commerce pricing services are based on below two complementary elements:
  1. Pricing engines.
  2. Pricing calculators.
1. Pricing engines.
  •     Retrieving any promotions that are available to site visitors.
  •     Determining which pricing calculators generate prices.
  •     Invoking the calculators in the correct order.
 2. Pricing calculators.
  •     Looking up the price.
  •     Using information they receive from the pricing engines, promotions, and the qualifier service to determine prices. 

Before pricing happens, the following steps take place:

1. On a scheduled basis, the pricing engines load global promotions (those defined as applying automatically to all customers). An engine builds its list by using its globalPromotionsQuery property to query the Promotions repository, searching for any promotion where the Automatically Give to All Customers (global) property is set to true.

2. At the start of the customer session, a PricingModelHolder instance is created. PricingModelHolder calls each pricing engine’s getPricingModels() method.

3. The pricing engine getPricingModels() method gets any promotions listed in the activePromotions property of the current customer’s profile and merges them with the global promotions list it previously created.

4. PricingModelHolder periodically updates both the global and active promotions.

The result is that PricingModelHolder has a merged list of global and active promotions for each pricing engine. When the customer performs an action that prompts a pricing operation, such as adding an item to their cart, the following steps are performed:

1. The business layer logic (such as a PriceItem servlet bean in a page) invokes a pricing engine.

2. The pricing operation invokes PricingTools which then gets the PricingModelHolder for that customer.

3. PricingTools gets the promotions from the PricingModelHolder and calls the pricing engine’s priceItems method, passing in the promotions as a list.

4. The pricing engine applies its configured precalculators in the order in which they appear in its preCalculators property. A precalculator modifies a price without using any associated promotions. Each type of engine calls its corresponding type of precalculator.

5. The pricing engine then takes the promotions list that was passed in and can again veto promotions from that list. The remaining promotions are sorted by priority and then evaluated.

For each available promotion, ATG Commerce does the following:
  • The pricing engine calls the appropriate helper method (findQualifyingItems, findQualifyingOrder, or findQualifyingShipping) in the Qualifier class to determine which items should be discounted. The pricing engine passes the current pricing context into the helper method’s input parameters.
  • The findQualifyingItems() method calls evaluateTarget(), which returns a Collection of QualfiedItem objects, representing CommerceItem objects. The findQualifyingOrder() and findQualifyingShipping() methods return a single MatchingObject.
  • The QualifiedItem and MatchingObject include discount information such as the PMDL discount structure. 
  • The QualifiedItem or MatchingObject information is returned to the pricing engine, which uses the discount information to determine which calculator to use.
  • The pricing engine calls the calculator and passes in the items to be discounted and the discount information.
  • The calculator marks items that have received a discount, which might not be eligible for further promotions.
  • The qualifier marks items that have already been used as qualifiers for the promotion. This prevents the qualifier items from being used again during the same price calculation.
  • The calculator applies the discount to the list of objects.

6. The pricing engine applies its configured PostCalculators, which make any necessary modifications to the price after discounts have been applied. Each pricing engine calls postcalculators of its own type.
7. The pricing engine returns an updated PriceInfo object.

Note : This process is repeated every time a price is requested. Price requests are resource-intensive, and should be performed only when necessary.


    Sunday, 15 June 2014

    ATG 10.2 BCC transaction issue

    While setting up the CRS (ATG 10.2, MySQL and JBoss 5.1), I have faced few issues.Here I am sharing the solution of one of them.The execution of initial (first) deployement on BCC failed due to below exception.

    CONTAINER:atg.repository.RepositoryException; SOURCE:org.jboss.util.NestedSQLException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:c41a:5395f5cb:a16b status: ActionStatus.ABORT_ONLY >); - nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:c41a:5395f5cb:a16b status: ActionStatus.ABORT_ONLY >)) at atg.adapter.gsa.GSAItemDescriptor.getPersistentItem(GSAItemDescriptor.java:5549) at atg.adapter.gsa.GSAItemDescriptor.getOrWaitForPersistentItem(GSAItemDescriptor.java:5053) at atg.adapter.gsa.GSAItemDescriptor.getItem(GSAItemDescriptor.java:3275) at atg.adapter.gsa.GSARepository.getItem(GSARepository.java:353) at atg.deployment.repository.ReferenceItemGenerator.findReferenceItemInRepository(ReferenceItemGenerator.java:699) at ........................................

    The soltion to this issue is to update jboss connection datasource file (atg-ds.xml) for xa-datasource (replace local-tx-datasource with xa-datasource).Update the other elements of the file accordingly.

    Below is the sample connection detail.

    <xa-datasource>
    <jndi-name>ATGProductionDS</jndi-name>
    <xa-datasource-property name="URL">
                           jdbc:mysql://localhost:3306/Production
            </xa-datasource-property>
    <xa-datasource-class>
                           com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
            </xa-datasource-class>
    <xa-datasource-property name="User">CRS_Production</xa-datasource-property>
    <xa-datasource-property name="Password">CRS_Production</xa-datasource-property>
    <min-pool-size>5</min-pool-size>
            <!-- The maximum connections in a pool/sub-pool -->
           <max-pool-size>300</max-pool-size>
      <!-- To avoid deadlocks you need set this -->
      <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    </xa-datasource>

    Saturday, 17 May 2014

    Resolving access denied issue while running install_service script in windows.

    After installing Tools and Framework you need to run install_service script to install tools and framework as windows service.If you run this script as normal user(non administrator). You will face access denied issue.

    To resolve this issue run the script as administrator.Right click on script file then select run as administrator option.Now script will execute successfully.

    Wednesday, 7 May 2014

    Endeca CSV Indexing Issues

    I used csv file for indexing.Sometime I faced data corruption or indexing failure issues.Below are the possible reasons.

    Indexing fails due to any one of the below reasons.
    1.In csv format data,data contains extra column due to delimeter character presence in source data.
    2.In the case property length exceeds the configured value.

    Solution : Write the encoded delimeter from source data to csv file.Control the property length during csv file extraction.

    Data corruption issues are happening due to improper handling of empty columns in the csv file.Due to missing columns subsequent column values are assigned to missing column header property.For example you are having three column A,B and C in csv file.If some record r is not having value for column A then column B value is assigned to column A header and column C value is assigned to column B header source property.In this way it results in data corruption.In the case Endeca is not behaving as expected then verify the generated csv file.

    Note : When you are using csv file the number of column in each line of file must match the number of column in the header(source property values) line.For every empty or missing value put the empty column with proper delimeter. CSV file generation(extraction) code must be robust enough to handle these scenarios.

    Sunday, 16 March 2014

    Dyn/admin home page issue in ATG10.2

    I encountered below error while trying to open the home page of dyn/admin in ATG10.2.

    Unable to execute the command javac -classpath C:\apps\java\jre\lib\resources.jar;C:\apps\java\jre\lib\rt.jar;C:\apps\java\jre\lib\sunrsasign.jar;C:\apps\java\jre\lib\jsse.jar;C:\apps\java\jre\lib\jce.jar;........................................................................................................................./atg/dynamo/servlet/pagecompile/PageCompileServlet The detailed exception is: java.io.IOException: Cannot run program "javac": CreateProcess error=206, The filename or extension is too long.

    Follow below steps to resolve this issue.

    Add ExtendedJhtmlPageProcessor component at atg\dynamo\servlet\pagecompile\ location and restart the sever.
    Steps

    1. Navigate to ATG_HOME\localconfig directory.

    2. Create atg\dynamo\servlet\pagecompile directory structure there.

    3. CreateExtendedJhtmlPageProcessor.properties file with below content in that directory.

         #atg\dynamo\servlet\pagecompile\ExtendedJhtmlPageProcessor.properties
         $class=atg.servlet.pagecompile.jsp11.JSPPageProcessor
         javaCompilerClassName=atg.servlet.pagecompile.SunJavaSourceCompiler

    Saturday, 15 March 2014

    WebLogic Server getting boot identity from the user issue solution

    I have just started using WebLogic Server. I tried to start one of the managed server from command line it stucked at. 

    getting boot identity from the user

    I entered admin username followed by password then it continued.In this way every time you need to enter username/password.

    With below small  and easy configuration you can resolve this issue (Avoid authentication prompt).

    1. Create boot.properties in $DOMAIN_HOME/servers/[server_name]/security directory.

    2. Put content in below format in the file.
          username=[superuser with admin role]
          password=[password of user(admin role)]

    3. Alternatively you can copy boot.properties from  $DOMAIN_HOME/servers/AdminServer/security,then alter the file accordingly.

    Note : WebLogic only prompts for username/password when running in Production mode it won't prompt for username/password in development mode.


    Sunday, 9 March 2014

    Introduction to Endeca Application Controller (EAC)

    The EAC provides the infrastructure to support Endeca application.Endeca Application Controller (EAC) is a control system used to control, manage,and monitor components in Endeca implementation.

    There are two types of EAC instances.

    1. EAC Central Server
    2. EAC Agent

    1. EAC Central Server

    One instance of the EAC serves as the EAC Central Server.The EAC Central Server also contains a repository that stores provisioning information — such as, data about the hosts, components, applications and scripts.This instance includes and WSDL enabled public interface.Other applications communicates with EAC using this interface.EAC central server works as an controller of EAC agents.EAC central server communicates with EAC agents using internal web service interface.

    2. EAC Agents 

    EAC instances other then EAC Central server are EAC agents.These EAC agents instruct host machine for execution of actual task such Forging or Indexing.

    There are 3 ways to communicate with EAC.

    1. Endeca Workbench.
    2. The command line utility, eaccmd.
    3. Endeca WSDL-enabled interface(using language that supports web services).Endeca workbench and Endeca deployment template utilize this method.

    You can use below scripts to start and stop EAC from commandline.
    1. EAC start script.
       $ENDECA_ROOT/tools/server/bin/startup.sh
    2. EAC stop script.
       $ENDECA_ROOT/tools/server/bin/shutdown.sh
    Note : On windows EAC is created,configured and registered as "Endeca HTTP service".

    EAC configuration file
    EAC reads configuration from eac.properties file.This file is located in the $ENDECA_CONF/conf directory.

    EAC log file.
    EAC log file is located in the $ENDECA_CONF/logs directory.You can update EAC logging related configuration in the logging.properties file.This file is located under $ENDECA_CONF/conf.