Sunday, 17 August 2014

Introduction to Endeca Tools and Framework

Oracle Endeca Tools and Frameworks enable the dynamic presentation of content across all channels.
Deployments That Use Oracle Endeca Experience Manager Require the Tools and Frameworks package for  Oracle Endeca Commerce with Experience Manager. Deployments That Do not include Experience Manager Require the Tools and Frameworks package for Oracle Endeca Commerce with Guided Search.

Both versions of the package include the Following:

• Oracle Endeca Workbench, a tools suite That enables merchandising Content Spotlighting, and search  Configuration for cross-channel applications.
• The Endeca Assembler, an API for controlling the presentation of commerce sites and collecting usage information across all channels.
• The Endeca Tools Service.
• The Endeca Deployment Template, A Collection of operational components That Provides a Starting Point  for Developing and deploying Endeca applications.
• The Discover Electronics Reference Application.

Tuesday, 29 July 2014

Introduction to Endeca Content Acquisition System (CAS)

The Endeca Content Acquisition System (CAS) is a set of Components That add, configure, and crawl data sources for use in an application.The Endeca Content Acquisition System crawls data sources, Converts documents and files to Endeca records, and stores them for Use in an Forge pipeline.Output of CAS is number of Record Store instances (one per data source).

Below are Important Points Related to CAS.



  • The Endeca CAS service is a servlet container That runs the CAS Server, the Component Instance.Manager, and any number of Record Store instances (one per data source).
  • The CAS Server is the component That Manages all file systems and CMS crawling operations.
  • The CAS Console Endeca Workbench is a Web-based application used to crawl various data sources including file systems and content management systems.
  • The CAS Server API allows users to write programs That Communicate With The CAS server.The Server API has a WSDL interface and a CAS Server Command-Line Utility.
  • The Dimension Value Id Manager is a CAS Component That Creates, stores dimension value identifiers.
  • The Endeca Web Crawler manages all Web crawl-related operations.
  • The Component Instance Manager Creates, lists, and deletes Record Store instances. The Component Instance Manager has a WSDL interface and overpriced a CIM Command-Line Utility.
  • The Endeca Record Store Provides persistent storage for generation of Records. The Record Store has a WSDL interface and Also a Record Store Command-line Utility.The CAS Server writes crawl output from each data source to a unique Record Store instance.
  • Endeca CMS connectors are available for use in the CAS Console Endeca Workbench or the CAS Server API. CMS Connectors Provide a means to access and crawl data sources in a wide variety of CMS types.
  • List and Remove Endeca application flags

    Below are useful eaccmd command options to list and remove Endeca application flags.

    1. List all flags.
              Syntax    : eaccmd list-flags --app AppicationName

              Example : eaccmd list-flags --app Discover

        2.   Remove particular flag.

              Syntax    : eaccmd remove-flag --app AppicationName --flag <flagName>

              Example : eaccmd remove-flag --app Discover --flag setbaselinedatareadyflag

        3.   Remove all flags.

             Syntax   : eaccmd remove-flag --app AppicationName 

            Example : eaccmd remove-flag --app Discover 

    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.