AEM Commerce Framework
Paolo Mottadelli - Sr. Mgr. Technical Marketing
@paolomoz
Adobe® Marketing Cloud
Adobe® Experience ...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Architecture of the framework
1
Commerce Integrated Platform
JCR repo product DB
Experience Manager PIM/ecommerce
surfer
content editor PIM editor
1 2
PIM...
Commerce Integrated Platform
surfer
content editor PIM editor
1. Product display component
2. Shopping cart
3. Promotions ...
AEM eCommerce Integration Modules
1. The integration framework (API used for eCommerce implementations)
2. AEM native (JCR...
Architecture of the Commerce Framework
AEM Commerce API
Implementation
AEM Commerce Components
AEM native impl
JCR Reposit...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Commerce providers
With code samples
2
eCommerce Engine Selection
CommerceService commerceService =
resource.adaptTo(CommerceService.class);
CommerceSession sess...
Custom Commerce Provider: code samples
TrainingCommerceServiceFactory
@Component(metatype = true, label = "Day CQ Commerce Factory for Training")
@Service
@Prope...
Commerce Factory OSGi configuration
TrainingCommerceServiceImpl
public class TrainingCommerceServiceImpl extends AbstractJcrCommerceService implements
Commerc...
TrainingCommerceSessionImpl
public class TrainingCommerceSessionImpl extends AbstractJcrCommerceSession {
	 [..]
	
}
TrainingCommerceSessionImpl
public class TrainingCommerceSessionImpl extends AbstractJcrCommerceSession {
	 protected void...
TrainingCommerceServiceFactory
public class TrainingProductImpl extends AbstractJcrProduct {
[...]
	 public String getSKU(...
eCommerce Engine Selection
CommerceService commerceService =
resource.adaptTo(CommerceService.class);
CommerceSession sess...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
(more on) CommerceSession
With code samples
3
•updateOrderDetails(Map<String, String> orderDetails);
•getOrderDetails();
•submitOrder();
CommerceSession responsibilitie...
CommerceSession is RESTful style (1)
CommerceSession is RESTful style (2)
ORDER%3a%3dorderId%253d9c1346bf-3813-4205-80ec-2fdfd1644143%7cCART%3a
%3dquantity3%25...
CommerceSession is RESTful style (3)
protected void loadCart() {
[...]
//
// Load cart from the cookie:
//
Map<String, Str...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Managing products
Includes solutions for scala...
Products and Variants architecture:
- variant
- color: purple
- id: 397122.1
- variant
- size: S
- variant
- size: L
- var...
Product interface
public interface Product extends Adaptable {
public String getPath(); // path to specific variation
publ...
AxisFilter implements VariantFilter
public class AxisFilter implements VariantFilter {
...
public boolean includes(Product...
Product Data admin UI
•Double click from Content Finder to open
•Based on Scaffolding
•Create/Change data in /etc/commerce/...
PIM Data & Product References
1
1
1
1 1
1 1
1 1
1 1
1 /etc/commerce/products 2 /content
Proxy Product Pages
make editable
2 nodes
10 nodes
5.6.1
Hardening Product Importer
•ROBUSTNESS: product importer more flexible with products/variants
•EXTENSIBILITY: abstracted-o...
Catalog Generation V2
•Regional Catalog support (based on MSM)
•Catalog Design Changes support
•Custom Catalog Pages suppo...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Shopping cart
5
Shopping Cart architecture (CommerceSession)
The CommerceSession performs add, remove, etc.
The CommerceSession also perfo...
session.calcCart()
protected void calcCart() { ...
for (int i = 0; i < cart.size(); i++) { ...
for (Promotion p : promotio...
Shopping Cart architecture (Storage)
In AEM-native carts are stored in the
ClientContext
Personalization should always be ...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Checkout
6
Checkout architecture (order details)
Order details are not fixed by the API:
updateOrderDetails(Map<String, String> order...
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
7 Adobe &
hybris integration: product data flow
hybris:
Omni Commerce
Connect
CQ:
/etc/commerce/products
CQ:
/content/site
hybris im...
hybris integration: product data display
JCR repo
CQ
hybris
CQ hybris importer
CQ component volatile data
PIM data
hybris integration: user synchronisation
•Lazy import of hybris users into CQ
•Lazy creation of CQ users in hybris
•CQ sto...
hybris integration: customising the product import process
•Need to add PIM attributes? Extend HybrisResponseParser.
•Need...
hybris integration: customising the user import process
•ProfileSynchronizer#syncProfile is responsible for sync the user’...
hybris integration: customising product and price loading
•HybrisFactory#getProduct is responsible for creating Product in...
hybris integration: how to install
AEM 5.6.1
3
cq-hybris-content 5.6.22
cq-hybris-server 5.6.01
cq-geometrixx-hybris-conte...
hybris with AEM 5.6.1
•Supports hybris 5.0
•hybris 5.0 server embedded by default
•Backward compatible with hybris 4.8.1
•...
Geometrixx-specific hybris connector 5.6.1
Thank you
Upcoming SlideShare
Loading in...5
×

EVOLVE'13 | Enhance | Ecommerce Framework | Paolo Mottadelli

600

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
600
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

EVOLVE'13 | Enhance | Ecommerce Framework | Paolo Mottadelli

  1. 1. AEM Commerce Framework Paolo Mottadelli - Sr. Mgr. Technical Marketing @paolomoz Adobe® Marketing Cloud Adobe® Experience Manager
  2. 2. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Architecture of the framework 1
  3. 3. Commerce Integrated Platform JCR repo product DB Experience Manager PIM/ecommerce surfer content editor PIM editor 1 2 PIM synch 3 4 dynamic PIM
  4. 4. Commerce Integrated Platform surfer content editor PIM editor 1. Product display component 2. Shopping cart 3. Promotions and vouchers 4. Catalog blueprints 5. Check-out 6. Search 1. Product information integrity 2. Pricing 3. Stock-keeping inventory 4.Variations on shopping cart
  5. 5. AEM eCommerce Integration Modules 1. The integration framework (API used for eCommerce implementations) 2. AEM native (JCR) implementation 3. hybris implementation 4. A number of out-of-the-box AEM components 5. Search (AEM, eCommerce, 3rd party) 6. Catalog management 7. Promotions management 8. Client context cart store JCR repo product DB Experience Manager PIM/ecommerce
  6. 6. Architecture of the Commerce Framework AEM Commerce API Implementation AEM Commerce Components AEM native impl JCR Repository hybris impl hybris DB other impl other
  7. 7. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Commerce providers With code samples 2
  8. 8. eCommerce Engine Selection CommerceService commerceService = resource.adaptTo(CommerceService.class); CommerceSession session = commerceService.login(slingRequest, slingResponse); Product baseProduct = resource.adaptTo(Product.class); GeoImpl (geometrixx) hybrisImpl (hybris) otherImpl (xyz) Site Component OSGi container bundle bundlebundle cq:commerceProvider = geometrixx 1 2 3
  9. 9. Custom Commerce Provider: code samples
  10. 10. TrainingCommerceServiceFactory @Component(metatype = true, label = "Day CQ Commerce Factory for Training") @Service @Properties(value = { @Property(name = "service.description", value = "Factory for training commerce service"), @Property(name = "commerceProvider", value = "training") }) public class TrainingCommerceServiceFactory extends AbstractJcrCommerceServiceFactory implements CommerceServiceFactory { public CommerceService getCommerceService(Resource res) { return new TrainingCommerceServiceImpl(getServices(), res); } }
  11. 11. Commerce Factory OSGi configuration
  12. 12. TrainingCommerceServiceImpl public class TrainingCommerceServiceImpl extends AbstractJcrCommerceService implements CommerceService { [...] public CommerceSession login(SlingHttpServletRequest request, SlingHttpServletResponse response) throws CommerceException { return new TrainingCommerceSessionImpl(this, request, response, resource); } public Product getProduct(final String path) throws CommerceException { [...] return new TrainingProductImpl(resource); [...] }
  13. 13. TrainingCommerceSessionImpl public class TrainingCommerceSessionImpl extends AbstractJcrCommerceSession { [..] }
  14. 14. TrainingCommerceSessionImpl public class TrainingCommerceSessionImpl extends AbstractJcrCommerceSession { protected void loadCart() protected void saveCart() public String getProductPrice(Product product) public String getCartPrice(Predicate filter) protected void doAddCartEntry(Product product, int quantity) protected void calcCart() public List<Promotion> getActivePromotions() protected void calcOrder() }
  15. 15. TrainingCommerceServiceFactory public class TrainingProductImpl extends AbstractJcrProduct { [...] public String getSKU() { return "todo-get-sku-method"; } }
  16. 16. eCommerce Engine Selection CommerceService commerceService = resource.adaptTo(CommerceService.class); CommerceSession session = commerceService.login(slingRequest, slingResponse); Product baseProduct = resource.adaptTo(Product.class); GeoImpl (geometrixx) hybrisImpl (hybris) trainingImpl (training) Site Component OSGi container bundle bundlebundle cq:commerceProvider = training 1 2 3
  17. 17. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. (more on) CommerceSession With code samples 3
  18. 18. •updateOrderDetails(Map<String, String> orderDetails); •getOrderDetails(); •submitOrder(); CommerceSession responsibilities • addCartEntry(Product product, int quantity); • modifyCartEntry(int entryNumber, int quantity); • deleteCartEntry(int entryNumber); •updateOrderDetails(Map<String, String> orderDetails); •getOrderDetails(); •submitOrder(); cart content pricing order details 1 2 3 •getPromotions(); •addVoucher(String code); •removeVoucher(String code); promotions3
  19. 19. CommerceSession is RESTful style (1)
  20. 20. CommerceSession is RESTful style (2) ORDER%3a%3dorderId%253d9c1346bf-3813-4205-80ec-2fdfd1644143%7cCART%3a %3dquantity3%253d1%252cquantity0%253d1%252cquantity1%253d1%252cpromotionCoun t%253d2%252cquantity2%253d1%252cvoucherCount%253d0%252cpromotion1%253d %252fcontent%252fcampaigns%252fgeometrixx-outdoors%252fcosy-up-to-winter %252fwinter-female%252fcosy-companions%252cpromotion0%253d%252fcontent %252fcampaigns%252fgeometrixx-outdoors%252fbig-spender %252fordervalueover100%252ffree-shipping%252cproduct3%253d%252fcontent %252fgeometrixx-outdoors%252fen%252fequipment%252fskiing%252fhalifax-winter %252fjcr%253acontent%252fpar%252fproduct%252cproduct0%253d%252fcontent %252fgeometrixx-outdoors%252fen%252fwomen%252fcoats%252fcalgary-winter%252fjcr %253acontent%252fpar%252fproduct%252f397122-s%252cproduct2%253d%252fcontent %252fgeometrixx-outdoors%252fen%252fseasonal%252fwinter%252fequipment %252fkamloops-snow%252fjcr%253acontent%252fpar%252fproduct %252f37924450-7%252centryCount%253d4%252cproduct1%253d%252fcontent %252fgeometrixx-outdoors%252fen%252fequipment%252fskiing%252fkelowna-snow %252fjcr%253acontent%252fpar%252fproduct%7c Name: CommercePersistence, Host: geometrixx.com, Path: /
  21. 21. CommerceSession is RESTful style (3) protected void loadCart() { [...] // // Load cart from the cookie: // Map<String, String> cartStore = ContextSessionPersistence.getStore(request, "CART", CommerceConstants.COMMERCE_COOKIE_NAME); [...] }
  22. 22. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Managing products Includes solutions for scalability, performance, etc.. 4
  23. 23. Products and Variants architecture: - variant - color: purple - id: 397122.1 - variant - size: S - variant - size: L - variant - size: M - variant - size: XL - variant - color: purple -id: 397122.2 - price: 199 - variant - size: S - variant - size: L - variant - size: M - variant - size: XL - type: product - axes: color, size - id: 397122 - title: Saskatoon - price: 299 1 1 1 1 1 1 1 1 1 1 1
  24. 24. Product interface public interface Product extends Adaptable { public String getPath(); // path to specific variation public String getPagePath(); // path to presentation page for all variations public String getSKU(); // unique ID of specific variation public String getTitle(); // shortcut to getProperty(TITLE) public String getDescription(); // shortcut to getProperty(DESCRIPTION) public String getImageUrl(); // shortcut to getProperty(IMAGE_URL) public String getThumbnailUrl(); // shortcut to getProperty(THUMBNAIL_URL) public <T> T getProperty(String name, Class<T> type); public Iterator<String> getVariantAxes(); public boolean axisIsVariant(String axis); public Iterator<Product> getVariants(VariantFilter filter) throws CommerceException; }
  25. 25. AxisFilter implements VariantFilter public class AxisFilter implements VariantFilter { ... public boolean includes(Product product) { ValueMap values = product.adaptTo(ValueMap.class); if(values != null) { String v = values.get(axis, String.class); return v != null && v == value; } return false; } }
  26. 26. Product Data admin UI •Double click from Content Finder to open •Based on Scaffolding •Create/Change data in /etc/commerce/products •Can change destination path from Scaffolding page •Can navigate and change variants (overrides higher level data) 5.6.1
  27. 27. PIM Data & Product References 1 1 1 1 1 1 1 1 1 1 1 1 /etc/commerce/products 2 /content
  28. 28. Proxy Product Pages make editable 2 nodes 10 nodes 5.6.1
  29. 29. Hardening Product Importer •ROBUSTNESS: product importer more flexible with products/variants •EXTENSIBILITY: abstracted-out common parts of product importer •PERFORMANCE: importing 1000s products takes 80% less •SCALABILITY: support flat hierarchies through bucketing, proxy pages, scalable search 5.6.1
  30. 30. Catalog Generation V2 •Regional Catalog support (based on MSM) •Catalog Design Changes support •Custom Catalog Pages support •Blueprint & Catalog converter for 5.6.0 to current 5.6.1
  31. 31. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Shopping cart 5
  32. 32. Shopping Cart architecture (CommerceSession) The CommerceSession performs add, remove, etc. The CommerceSession also performs the various calculations on the cart. The CommerceSession also applies vouchers and promotions that have fired to the cart. Pricing modifiers: - Quantity discounts. - Different currencies. - VAT-liable and VAT-free.
  33. 33. session.calcCart() protected void calcCart() { ... for (int i = 0; i < cart.size(); i++) { ... for (Promotion p : promotions) { try { PromotionHandler ph = p.adaptTo(PromotionHandler.class); PriceInfo discount = ph.applyCartEntryPromotion(this, p, entry); if (discount != null && discount.getAmount().compareTo(BigDecimal.ZERO) > 0) { ... entry.calcPrices(); ... } ... cartTotalPrice = cartTotalPrice.add(entry.getPriceInfo(new PriceFilter("POST_TAX", currencyCode)).get(0).getAmount()); } setPrice(new PriceInfo(cartPreTaxPrice, currency), "CART", "PRE_TAX"); setPrice(new PriceInfo(cartTax, currency), "CART", "TAX"); setPrice(new PriceInfo(cartTotalPrice, currency), "CART", "POST_TAX"); ... }
  34. 34. Shopping Cart architecture (Storage) In AEM-native carts are stored in the ClientContext Personalization should always be driven through the ClientContext. CommerceSession.addCartEntry()
  35. 35. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Checkout 6
  36. 36. Checkout architecture (order details) Order details are not fixed by the API: updateOrderDetails(Map<String, String> orderDetails); Shipping options (and prices) depend on weight, delivery address, etc... The CommerceSession owns shipping pricing; to retrieve and update delivery details: updateOrder(Map<String, Object> delta)
  37. 37. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 7 Adobe &
  38. 38. hybris integration: product data flow hybris: Omni Commerce Connect CQ: /etc/commerce/products CQ: /content/site hybris importer catalog publishing
  39. 39. hybris integration: product data display JCR repo CQ hybris CQ hybris importer CQ component volatile data PIM data
  40. 40. hybris integration: user synchronisation •Lazy import of hybris users into CQ •Lazy creation of CQ users in hybris •CQ stores hybris authentication data for later re-use •Pluggable architecture for custom authentication schemes (SAML, OAuth)
  41. 41. hybris integration: customising the product import process •Need to add PIM attributes? Extend HybrisResponseParser. •Need to change the imported data hierarchy? Extend ImportHandler. •Need to customize what services are called when importing data? Extend HybrisImporter.
  42. 42. hybris integration: customising the user import process •ProfileSynchronizer#syncProfile is responsible for sync the user’s CQ profile to the respective hybris account
  43. 43. hybris integration: customising product and price loading •HybrisFactory#getProduct is responsible for creating Product instances •HybrisSession#getProductPriceInfo is responsible for getting the correct price for a product for the current user
  44. 44. hybris integration: how to install AEM 5.6.1 3 cq-hybris-content 5.6.22 cq-hybris-server 5.6.01 cq-geometrixx-hybris-content 5.6.100 install packages 5.6.1
  45. 45. hybris with AEM 5.6.1 •Supports hybris 5.0 •hybris 5.0 server embedded by default •Backward compatible with hybris 4.8.1 •Geometrixx-specific hybris connector •Extend the default hybris components to a specific implementation; •Remove internal references in the hybris components to allow for better extensibility •hybris connector source code included in the content package 5.6.1
  46. 46. Geometrixx-specific hybris connector 5.6.1
  47. 47. Thank you

×