...
- Define the import process in the imports.xml metadata file.
- Create the template file defined in the imports.xml metadata file for the import process, as defined in the imports.xml metadata file.
- Create a process class extending com.crm.process.CRMImportBean, responsible for parsing the file and processing its records and define this process in modules.xml metadata file.
1.
...
In the following example, we will implement a multithreaded mechanism to import traceable physical goods as installed items.
In order to do so, we create CRMImportInstalledItemBean.java and implement importInstalledItem method, which parses a file, and by using threads, it saves and posts warehouse transactions, and marks each process as completed or failed accordingly, until all installed items' records have been processed.
...
language | java |
---|---|
theme | Eclipse |
title | CRMImportInstalledItems.java - importInstalledItem |
collapse | true |
...
Imports Metadata File
The import process must be defined in the imports.xml metadata file, as shown in the example below. The metadata file can be located under the <custom_project>/src/main/resources/metadata/ directory. Note that all of the information except importdescription must be defined in the file.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<importsconfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/imports.xsd">
<imports>
...
<import>
<importname>Custom Import</importname>
<importdescription>Custom Import in CRM.COM.</importdescription>
<importprocess>CUSTOM_IMPORT</importprocess>
<importmodule>CUSTOM</importmodule>
<importtemplatefilepath>imports/customTemplateFile.csv</importtemplatefilepath>
</import>
...
</imports>
</importsconfig> |
2. Template File
The template file will be used as an example for the file used by the import process and can be downloaded from the import data entry page. The file must be placed under the directory defined in the imports.xml metadata file, with the importtemplatefilepath tag.
3. Import Process class
A process class must be created for the import process, extending com.crm.process.CRMImportBean. Below, you can see the implementation of an example import process class. It is recommended to use the LogTextFile method to log the import process results for easier debugging of the process.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class EXAMPLEImportBean extends CRMImportBean { ... public void import(String processRunLogID) throws Exception{ processRunLogBean.save(processRun); CallList.LogTextFile(getCRMSession(), "Example Import start processing (" + processRunLogID + ")", "importExample",""); BooleanCRMDOProcessRunLog processCompleteprocessRun = new Boolean(false(CRMDOProcessRunLog)processRunLogBean.load(processRunLogID); try ArrayList<CRMDO> attachments = attachmentBean.load(processRun); { for (int i=0;i<attachents.size();i++) processRun.setStatus(ProcessRunLogStatus.IN_PROGRESS); processRun.setStartDate(getCurrentDate()); { processRunLogBean.save(processRun); CRMDOAttachment attachment = (CRMDOAttachment)attachents.get(i); Boolean processComplete = new Boolean(false); String[] tokens ProcessRunLogStatus processRunLogStatus = StringUtil.split(attachment.getFileName(),".")null; try String extension = tokens[tokens.length-1];{ for (int i=0;i<attachents.size();i++) { SupportedImportFileExtensions[]CRMDOAttachment supportedImportFileExtensionsattachment = SupportedImportFileExtensions.values((CRMDOAttachment)attachments.get(i); String[] tokens = StringUtil.split(attachment.getFileName(),"."); for (int j=0; j<supportedImportFileExtensions.length; j++) String extension = tokens[tokens.length-1]; { SupportedImportFileExtensions[] supportedImportFileExtensionsupportedImportFileExtensions = supportedImportFileExtensions[j]SupportedImportFileExtensions.values(); if (supportedImportFileExtension.isSupported(extension)) for (int j=0; j<supportedImportFileExtensions.length; j++) { { if (supportedImportFileExtension.equals(SupportedImportFileExtensions.EXCEL)) SupportedImportFileExtensions supportedImportFileExtension = supportedImportFileExtensions[j]; {if (supportedImportFileExtension.isSupported(extension)) { importInstalledItemEXCEL(importInstalledItemDefinition,attachment,processRun,extension); if (supportedImportFileExtension.equals(SupportedImportFileExtensions.EXCEL)) } { else if (supportedImportFileExtension.equals(SupportedImportFileExtensions.CSV)) { importInstalledItemCSV(importInstalledItemDefinition,importEXCEL(attachment,processRun,extension); } else if (supportedImportFileExtension.equals(SupportedImportFileExtensions.XMLCSV)) { importInstalledItemXMLimportCSV(importInstalledItemDefinition,attachment,processRun); } } else if (supportedImportFileExtension.equals(SupportedImportFileExtensions.XML)) } }{ processComplete = new BooleanimportXML(trueattachment,processRun); } catch (Exception e) } { saveEntityLogRecord(processRun,"", "",ProcessRunLogEntityStatus.FAILED,e.getClass().getSimpleName(),ExceptionUtil.getStackTrace(e)); } processRun.setStatus(ProcessRunLogStatus.FAILED); } } processRunLogBean.save(processRun); processRunprocessComplete = new saveNextProcessRunBoolean(processRuntrue); } catch (Exception e) { CallList.LogTextFile(getCRMSession(), "Error on processing import (" + processRunLogID + ")" + ExceptionUtil.getStackTrace(e), "importExample",""); saveEntityLogRecord(processRun,"", "",ProcessRunLogEntityStatus.FAILED,e.getClass().getSimpleName(),ExceptionUtil.getStackTrace(e)); processRun.setStatus(ProcessRunLogStatus.FAILED); processRunLogBean.save(processRun); } if (processComplete) { processRun.setStatus(processRunLogStatus); processRun.setEndDate(getCurrentDate()); processRunLogBean.save(processRun); } CallList.LogTextFile(getCRMSession(), "Example Import end processing (" + processRunLogID + ")", "importExample",""); } ... } |
Next, you must define this process class and the method that will be called for the import in the modules.xml metadata file, which can be found under the <custom_project>/src/main/resources/metadata/ directory. Note that the <importprocess> and <importmodule> defined in the imports.xml file will be used in the modules.xml metadata file to correcty define the process class. The <importprocess> will be used as the process id and the <importmodule> as the module id, as shown below.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8"?> if (processComplete) { processRun.setStatus(ProcessRunLogStatus.COMPLETED); processRun.setEndDate(getCurrentDate()); processRun = saveNextProcessRun(processRun); processRunLogBean.save(processRun); } } ... } |
...
<moduleconfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../xsd/modules.xsd">
<modules>
...
<module>
<moduleid>CUSTOM</moduleid>
<modulename>key_custom_import</modulename>
<moduledescription>key_custom_import</moduledescription>
...
<features>
<feature>
...
<commonprocesses/>
<additionalprocesses>
<process>
<id>CUSTOM_IMPORT</id>
<name>key_custom_import</name>
<description>key_custom_import</description>
<methods>
<method>
<ejbname>EXAMPLEImportBean</ejbname>
<methodname>import</methodname>
<scheduled>false</scheduled>
</method>
</methods>
<batch>true</batch>
<csrincluded>true</csrincluded>
</process>
...
</additionalprocesses>
</feature>
</features>
<leftmenuoptions>
<id>CUSTOM_IMPORT_MERCHANT</id>
<id>CUSTOM_IMPORT_BIN</id>
</leftmenuoptions>
</module>
...
</modules>
</moduleconfig> |
Create Export Processes
To create an export process, you need to create:
...