ATG  C om mer ce P ro g ramm in g   Gui d e 
40 3  
17  -  C u s t o mi zi ng   t he  P u rch ase  P ro ces s  Ex t ern al s 
μ
OrderRepositoryUtils.saveRepositoryItem(mutRep, mutItem, 
(String) savedProperties[i], value, orderTools); 
} // for 
/* 
Here the repository item is updated to the repository. 
This is done here to catch any Concurrency exceptions. 
*/ 
try { 
mutRep.updateItem(mutItem); 
catch (ConcurrentUpdateException e) { 
throw new CommerceException("Concurrent Update Attempt", e); 
/* 
Finally, the ChangedProperties Set is cleared and the saveAllProperties property 
is set to false. This resets the object for more edits. Then the SUCCESS value is 
returned. 
*/ 
if (orderData instanceof ChangedProperties) { 
ChangedProperties cp = (ChangedProperties) orderData; 
cp.clearChangedProperties(); 
cp.setSaveAllProperties(false); 
return SUCCESS; 
Next, configure an instance of 
ProcSaveOrderDataObject
by adding a 
SaveOrderDataObject.properties
file to your 
localconfig
directory at 
/atg/commerce/order/processor/
. The configuration file might look as follows: 
$class=my_package.ProcSaveOrderDataObject 
# This property tells the processor to only save the properties which have 
# changed. This requires that when a property is changed that it be marked 
# for saving. 
saveChangedPropertiesOnly=true 
# These are the properties of the OrderData object which will be saved to 
# the repository. All properties which should be saved should be listed 
# here. By default a property name listed here will be saved to the 
# corresponding repository item property with the same name. If the name 
# in the bean and repository are not the same then it can be mapped in the 
# property propertyDescriptorToBeanPropertyMap below. Nothing needs to be 
# defined for this property 
Extract pages from pdf acrobat - SDK Library API:C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others
www.rasteredge.com
Extract pages from pdf acrobat - SDK Library API:VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
40 4  
17  -  C u s to m iz in g   th e  P u rchas e  P roce ss   Ex t ern als  
savedProperties= 
# This property maps a OrderRepository property descriptor to an OrderData 
# bean property. By default the processor will look for an OrderRepository 
# property descriptor which is the same as the bean property name. If 
# there are any properties whose names differ, they can be mapped here. 
# The format is repository_property_descriptor=bean_property_name 
propertyDescriptorToBeanPropertyMap= 
orderDataProperty=orderData 
Finally, insert the 
SaveOrderDataObject
processor into the 
updateOrder
pipeline. The 
updateOrder
pipeline is defined in the commerce pipeline definition file, 
commercepipeline.xml
. In ATG Consumer 
Commerce, this file is located at 
<ATG10dir>/B2CCommerce/config/atg/commerce/
. In ATG Business 
Commerce, it is located at 
<ATG10dir>/B2BCommerce/config/atg/commerce/
To insert the 
SaveOrderDataObject
processor into the 
updateOrder
pipeline, extend the 
commercepipeline.xml
file by creating a new 
commercepipeline.xml
file that defines the new 
processor and placing it in your 
localconfig
directory at 
/atg/commerce/
. During deployment, the 
ATG platform uses XML file combination to combine the 
commercepipeline.xml
files in the 
CONFIGPATH into a single composite XML file. Insert the new processor into the pipeline somewhere 
after the first processor, 
updateOrderObject
, and before the last processor, 
setLastModifiedTime
. By 
convention, you should insert the processor into the pipeline immediately after the processor that 
references the new object. In this example, the most appropriate place would be immediately after the 
updateOrderObject
processor. 
For more information on how to add a processor to an existing pipeline, refer to Processor Chains and the 
Pipeline Manager chapter. For more information on XML file combination, see the Nucleus: Organizing 
JavaBean Components chapter in the ATG Programming Guide
Step 6 of 7 – Add a Processor to Load the New Object 
You do not need to write new code to load the 
orderData
reference in the 
Order
object. The 
loadOrderObject
processor in the 
loadOrder
pipeline knows how to load all of the properties of the 
Order
object, regardless of whether the commerce object hierarchy has been extended. However, to load 
the data into the 
OrderData
object itself, you must create a new processor that loads the data from the 
repository into the 
OrderData
object and insert that new processor into the 
refreshOrder
pipeline, 
which performs the actual loading of most of the contained objects in the 
Order
. (For more information 
on loading and refreshing orders, see Loading Orders in the Configuring Purchase Process Services chapter.) 
First, write the Java source code for the new processor. The following Java source file, 
ProcLoadOrderDataObject.java
serves as an example. 
package my_package; 
import atg.repository.*; 
import atg.commerce.order.*; 
import atg.service.pipeline.*; 
SDK Library API:.NET PDF Document Viewing, Annotation, Conversion & Processing
Extract hyperlink inside PDF. PDF Write. Redact text content, images, whole pages from PDF file. Edit, update, delete PDF annotations from PDF file. Print.
www.rasteredge.com
SDK Library API:C# PDF Converter Library SDK to convert PDF to other file formats
manipulate & convert standard PDF documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat.
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
40 5  
17  -  C u s t o mi zi ng   t he  P u rch ase  P ro ces s  Ex t ern al s 
import atg.beans.*; 
import atg.commerce.order.processor.*; 
import java.util.*; 
/* 
This class extends a class called LoadProperties. LoadProperties provides a set of 
properties and a way to retrieve a mapped property. This functionality corresponds 
to the loadProperties property and the propertyDescriptorToBeanPropertyMap 
property in the properties file which corresponds the this object. 
This class also implements the PipelineProcessor interface. This interface 
includes the runProcess() and getRetCodes() methods. All pipeline processors must 
implement this interface. 
*/ 
public class ProcLoadOrderDataObject extends LoadProperties 
implements PipelineProcessor 
// These are the two valid return codes for this pipeline processor 
private final int SUCCESS = 1; 
private final int FAILURE = 2; 
// The constructor 
public ProcLoadOrderDataObject() { 
// Returns the set of all valid return codes for this processor. 
public int[] getRetCodes() 
int[] ret = {SUCCESS, FAILURE}; 
return ret; 
// property: orderDataProperty 
private String mOrderDataProperty = null; 
public String getOrderDataProperty() { 
return mOrderDataProperty; 
public void setOrderDataProperty(String pOrderDataProperty) { 
mOrderDataProperty = pOrderDataProperty; 
public int runProcess(Object pParam, PipelineResult pResult) 
throws Exception 
/* 
The pParam parameter contains the data required for executing this pipeline 
processor. This code extracts the required parameters for this processor. 
SDK Library API:C# powerpoint - PowerPoint Conversion & Rendering in C#.NET
documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. PowerPoint to PDF Conversion.
www.rasteredge.com
SDK Library API:C# Word - Word Conversion in C#.NET
Word documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Word to PDF Conversion.
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
40 6  
17  -  C u s to m iz in g   th e  P u rchas e  P roce ss   Ex t ern als  
*/ 
HashMap map = (HashMap) pParam; 
Order order = (Order) map.get(PipelineConstants.ORDER); 
MutableRepositoryItem orderItem = (MutableRepositoryItem) 
map.get(PipelineConstants.ORDERREPOSITORYITEM); 
OrderManager orderManager = (OrderManager) 
map.get(PipelineConstants.ORDERMANAGER); 
OrderTools orderTools = orderManager.getOrderTools(); 
// Check for null parameters 
if (order == null) 
throw new InvalidParameterException(); 
if (orderItem == null) 
throw new InvalidParameterException(); 
if (orderManager == null) 
throw new InvalidParameterException(); 
/* 
Local variables. loadProperties lists all the properties which must be loaded for 
this object. 
*/ 
String mappedPropName; 
Object value; 
String[] loadProperties = getLoadProperties(); 
/* 
This section of code first gets the orderData item descriptor from the order 
repository item. Next it gets the orderData item descriptor. The third line of 
code does a lookup in the OrderTools object and returns the class mapped to the 
orderData item descriptor. 
*/ 
MutableRepositoryItem mutItem = (MutableRepositoryItem) 
orderItem.getPropertyValue(getOrderDataProperty()); 
RepositoryItemDescriptor desc = mutItem.getItemDescriptor(); 
String className = 
orderTools.getMappedBeanName(desc.getItemDescriptorName()); 
/* 
Next, an instance of OrderData is constructed, its id property set to the 
repository item's id, and if the object has a repositoryItem property, the item 
descriptor is set to it. 
*/ 
CommerceIdentifier ci = (CommerceIdentifier) 
Class.forName(className).newInstance(); 
DynamicBeans.setPropertyValue(ci, "id", mutItem.getRepositoryId()); 
if (DynamicBeans.getBeanInfo(ci).hasProperty("repositoryItem")) 
DynamicBeans.setPropertyValue(ci, "repositoryItem", mutItem); 
/* 
This section loops through all the properties in the loadProperties array and 
SDK Library API:C# Windows Viewer - Image and Document Conversion & Rendering in
standard image and document in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Convert to PDF.
www.rasteredge.com
SDK Library API:VB.NET PDF: How to Create Watermark on PDF Document within
Watermark Creator, users need no external application plugin, like Adobe Acrobat. VB example code to create graphics watermark on multiple PDF pages within the
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
40 7  
17  -  C u s t o mi zi ng   t he  P u rch ase  P ro ces s  Ex t ern al s 
loads the property values from the repository into the object. First we look for a 
mapping to the property value and then look to see if the property exists in the 
item descriptor. If so, then we load it. The OrderRepositoryUtils class provides 
functionality which parses mapped property values and either gets the property 
values, determines if the property exists, etc. This code is preserved so it will 
allow classes created for DCS 5.0 to still work. If your classes use the 
getPropertyValue() method in the get() methods of your beans, then this for loop 
can be eliminated. 
*/ 
for (int i = 0; i < loadProperties.length; i++) { 
mappedPropName = getMappedPropertyName(loadProperties[i]); 
if (desc.hasProperty(loadProperties[i])) 
value = mutItem.getPropertyValue(loadProperties[i]); 
if (orderManager.isLoggingDebug()) 
orderManager.logDebug("load property[" + loadProperties[i] 
+ ":" + value + ":" + ci.getClass().getName() 
+ ":" + ci.getId() + "]"); 
OrderRepositoryUtils.setPropertyValue(order, ci, mappedPropName, value); 
/* 
If the loaded object implements ChangedProperties, then clear the 
changedProperties Set. Then set the orderData property in the Order object to ci. 
Finally, return SUCCESS. 
*/ 
if (ci instanceof ChangedProperties) 
((ChangedProperties) ci).clearChangedProperties(); 
DynamicBeans.setPropertyValue(order, getOrderDataProperty(), ci); 
return SUCCESS; 
Next, configure an instance of 
ProcLoadOrderDataObject
by adding a 
LoadOrderDataObject.properties
file to your 
localconfig
directory at 
/atg/commerce/order/processor/
. The configuration file might look as follows: 
$class=my_package.ProcLoadOrderDataObject 
# These are the properties of the Order which will be loaded from the 
# repository. By default a property name listed here will be loaded from 
# the corresponding repository item property with the same name. If the 
# name in the bean and repository are not the same then it can be mapped 
# in the property propertyDescriptorToBeanPropertyMap below. Nothing needs 
# to be defined for this property. 
loadProperties= 
SDK Library API:C# Excel - Excel Conversion & Rendering in C#.NET
Excel documents in .NET class applications independently, without using other external third-party dependencies like Adobe Acrobat. Excel to PDF Conversion.
www.rasteredge.com
SDK Library API:VB.NET PowerPoint: VB Code to Draw and Create Annotation on PPT
as a kind of compensation for limitations (other documents are compatible, including PDF, TIFF, MS on slide with no more plug-ins needed like Acrobat or Adobe
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
40 8  
17  -  C u s to m iz in g   th e  P u rchas e  P roce ss   Ex t ern als  
# This property maps a OrderRepository property descriptor to an Order 
# bean property. By default the processor will look for an OrderRepository 
# property descriptor which is the same as the bean property name. If 
# there are any properties whose names differ, they can be mapped here. 
# The format is repository_property_descriptor=bean_property_name 
# The repository_property_descriptor name must be listed above in 
# loadProperties. 
propertyDescriptorToBeanPropertyMap= 
orderDataProperty=orderData 
Finally, insert the 
LoadOrderDataObject
processor into the 
refreshOrder
pipeline. The 
refreshOrder
pipeline is defined in the commerce pipeline definition file, 
commercepipeline.xml
. In 
ATG Consumer Commerce, this file is located at 
<ATG10dir>/B2CCommerce/config/atg/commerce/
In ATG Business Commerce, it is located at 
<ATG10dir>/B2BCommerce/config/atg/commerce/
To insert the 
LoadOrderDataObject
processor into the 
refreshOrder
pipeline, extend the 
commercepipeline.xml
file by creating a new 
commercepipeline.xml
file that defines the new 
processor and placing it in your 
localconfig
directory at 
/atg/commerce/
. During deployment, the 
ATG platform uses XML file combination to combine the 
commercepipeline.xml
files in the 
CONFIGPATH into a single composite XML file. Insert the new processor into the pipeline somewhere 
after the first processor, 
loadOrderObjectForRefresh
. By convention, you should insert the processor 
into the pipeline immediately after the processor that references the new object. In this example, the 
most appropriate place would be immediately after the 
loadOrderObjectForRefresh
processor. 
As previously mentioned, for more information on how to add a processor to an existing pipeline, refer to 
the Processor Chains and the Pipeline Manager chapter. For more information on XML file combination, 
see the Nucleus: Organizing JavaBean Components chapter in the ATG Programming Guide
Step 7 of 7 – Extend the ID Spaces Definition File 
Note: This step is only necessary when the new item descriptor is a root item descriptor. It does not need 
to be performed when the new item descriptor is a subclass of an item descriptor. 
When an ID is requested for a new repository item, it is requested from the appropriate 
IdSpace
for that 
repository item. The item descriptor’s 
id-space-name
attribute specifies which 
IdSpace
supplies 
repository IDs for items of that item type. By default, all items use the item descriptor’s name as the ID 
space unless their item type inherits from another item type. In the latter case, the items use the ID space 
name of the root item descriptor in the super-type hierarchy. 
If a new item descriptor that you’ve defined is a root item descriptor, you need to modify the ID spaces 
definition file, 
idspaces.xml
, in order to define an ID space for that item descriptor. ATG Commerce 
IdGenerator
guarantees that IDs within a named ID space are unique, and each root item descriptor 
defines the characteristics of its ID space in the 
idspaces.xml
definition file. 
In the example used throughout this section, you’ve defined a single root item descriptor, 
orderData
Consequently, you need to define an ID space for that descriptor. To do so, create a new 
idspaces.xml
file at 
/atg/dynamo/service/
in your 
localconfig
directory. During deployment, the ATG platform 
uses XML file combination to combine the 
idspaces.xml
files in the CONFIGPATH into a single 
SDK Library API:DICOM to PDF Converter | Convert DICOM to PDF, Convert PDF to
users do not need to load Adobe Acrobat or any Start DICOM - PDF image conversion through drag &drop method; Convert all pages or certain pages chosen by users;
www.rasteredge.com
SDK Library API:BMP to PDF Converter | Convert Bitmap to PDF, Convert PDF to BMP
for Adobe Acrobat Reader & print driver during conversion; Support conversion of Bitmap - PDF files in both single & batch mode; Convert all pages or certain
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
40 9  
17  -  C u s t o mi zi ng   t he  P u rch ase  P ro ces s  Ex t ern al s 
composite XML file. (For more information on XML file combination, see the Nucleus: Organizing JavaBean 
Components chapter in the ATG Programming Guide.) The 
idspaces.xml
file might look as follows: 
<id-spaces xml-combine="append"> 
<id-space name="orderData" seed="1" batch-size="10000" 
prefix="od"/> 
</id-spaces> 
For more information on defining ID spaces and its impact on repository item IDs, see the ID Generators 
section of the Core Dynamo Services chapter in the ATG Programming Guide
Manipulating Extended Objects 
Regardless of the method you use to extend purchase process objects (using an existing or new item 
descriptor), you may need to extend some additional areas as well: 
If you extend an implementation of 
CommerceItem
or 
ShippingGroup
, you may need 
to make additional changes as described in Merging Orders in this chapter. 
If you add custom properties to a 
CommerceItem
, you may need to override portions 
of 
CartModifierFormHandler
. This form handler is capable of handling new 
primitive data type properties automatically. Other types of extensions require 
extensions to the form handler. See Handling Custom Commerce Item Properties in the 
Implementing Shopping Carts chapter of the ATG Commerce Guide to Setting Up a Store 
for more information. 
Merging Orders 
The standard process for merging orders involves 
OrderManager.mergeOrders()
calling 
CommerceItemManager.mergeOrdersCopyCommerceItem()
to copy existing commerce items from a 
source order to a destination order, and calling 
ShippingGroupManager.mergeOrdersCopyShippingGroup
to copy existing shipping groups from the 
source order to the destination order. In the 
ShippingGroupManager
mergeOrdersCopyShippingGroup
, in turn, calls either 
mergeOrdersCopyHardgoodShippingGroup
or 
mergeOrdersCopyElectronicShippingGroup
, depending on the type of the shipping group. 
If you are using the multisite features of ATG Commerce, merging orders must also take site information 
into account when deciding whether two items are identical, and therefore whether to increment the 
item count or to add a second item to the order. The methods used are 
CommerceItemManager.shouldMergeItems()
and 
shouldMergeSubItems()
Note that if you have extended certain ATG Commerce classes to store additional information, you must 
change the methods used for merging orders so the additional information is copied to the destination 
order when merging orders. 
ATG  C om merce  P ro gra mm in g  G ui d e 
41 0  
17  -  C u s to m iz in g   th e  P u rchas e  P roce ss   Ex t ern als  
If you’ve extended 
CommerceItem
, you should subclass 
CommerceItemManager
and 
override the 
mergeOrdersCopyCommerceItem
method to first call the superclass 
method to do the basic copy and then copy your extended commerce item data. 
If you’ve extended 
HardgoodShippingGroup
, you should subclass 
ShippingGroupManager
and override the 
mergeOrdersCopyHardgoodShippingGroup
method to first call the superclass 
method to do the basic copy and then copy your extended commerce item data. 
If you’ve extended 
ElectronicShippingGroup
, you should subclass 
ShippingGroupManager
and override the 
mergeOrdersCopyElectronicShippingGroup
method to first call the superclass 
method to do the basic copy and then copy your extended commerce item data. 
If you’ve created a new shipping group type that is neither a subclass of 
HardgoodShippingGroup
nor 
ElectronicShippingGroup
, you should subclass 
ShippingGroupManager
and override the 
mergeOrdersCopyShippingGroup
method to examine the class of the shipping group. If the shipping group is of the new 
type you created, then the subclass should copy it to the destination order. Otherwise, 
the method can call the superclass 
mergeOrdersCopyShippingGroup
method to 
handle the standard shipping group types. 
ATG  C om mer ce P ro g ramm in g   Gui d e 
41 1  
18  -  P ro ces s or  C h ai ns   an d  t h e  P ipel in e  Man ag er 
18
Processor Chains and the Pipeline 
Manager 
The Pipeline Manager is a system that executes a series of processors, which are linked in processor chains. 
A processor is a component that executes a piece of functionality and returns a status code. The status 
code determines which processor in the chain to execute next. The Pipeline Manager enables you to 
dynamically add and remove processors and chains of processors. The Pipeline Manager does so in a 
transactionally aware way, supporting a subset of the transactional modes that EJB supports. 
The pipeline functionality is part of the main Dynamo Application Framework, but it is used primarily by 
ATG Commerce. 
This chapter includes the following sections: 
Pipeline Manager Overview 
Using the Pipeline Editor 
Running a Processor Chain 
Creating a Processor Pipeline 
Pipelines and Transactions 
Extending the Processor Pipeline Classes 
Adding a Commerce Processor Using XML Combination 
Pipeline Manager Overview 
The Pipeline Manager controls a series of processors, which make up a processor chain. Each processor in 
the processor chain is a component that performs a specific function and returns a status code. The status 
code can determine which processor to execute next. You can imagine a tree structure of processor 
chains as below: 
ATG  C om merce  P ro gra mm in g  G ui d e 
41 2  
18  -  P ro ces so r  C h ain s   an d  t h e  Pi pel in e  Man ag er 
Processor
C2
Processor
D0
Processor
C1
Processor
D1
Processor
D2
Processor
E
Processor
B
Processor
A
The processors in the processor chain illustrated above would be executed from left to right. Notice that 
chains are allowed to split and merge together. 
For a more concrete example, suppose you have a commerce site. It might include a processor chain that 
is invoked when users add an item to their shopping cart. This Add to Cart chain might contain the 
following elements in the given order: 
InventoryCheck
InventoryReserve
FraudDetection
, and 
AddToOrder
If there was already an existing transaction, when it reaches the Pipeline Manager, it will simply use that 
transaction for executing the pipeline. If a transaction had not been created, then the Pipeline Manager 
creates a new one. Next, it calls each processor in sequence from 
InventoryCheck
to 
AddToOrder
without altering the transaction in any way. 
An element in a processor chain can specify that it should be executed in the context of its own 
transaction. For example, the 
InventoryReserve
processor uses its own transaction to access the 
inventory. When the request reaches 
InventoryReserve
, the Pipeline Manager suspends the current 
transaction, which would be the one that was passed to the pipeline manager, creates a new transaction, 
and executes the code for 
InventoryReserve
When the 
InventoryReserve
processor completes execution of its transaction, then the Pipeline 
Manager either commits or rolls back the 
InventoryReserve
transaction, and then resumes the original 
transaction before it executes the 
FraudDetection
processor. 
Using the Pipeline Editor 
The Pipeline Editor in the ATG Control Center provides a graphical user interface for creating, viewing and 
editing pipeline chains. This section covers the following topics: 
Accessing the Pipeline Editor 
Opening an Existing Pipeline Definition 
Creating a New Pipeline Definition 
Documents you may be interested
Documents you may be interested