Showing posts with label ANT. Show all posts
Showing posts with label ANT. Show all posts

Tuesday, March 17, 2015

Deployment Strategy - Create Package.xml from Excel with component list using ANT

When it comes to deployment the easiest way is change sets, however not the best method. As per my experience ANT tool is the best possible tool for developer to deploy.
Source for ANT : Package.xml file.
How to create a Package.xml file? Manually?
The Answer is No. Why?
The reason being is Human are always prone to error. Below post will try to explain how ANT + Java program can be used to convert the excel file to package.xml file.

Use Case: We have a list of components in excel. We need a deployment?
Traditional way : Go ahead and create change set and deploy
Drawback : Too much time consuming.
Automated and easy way - Create package.xml from excel and ANT to deploy
Approach - Find excel to Xml source at web. Modified as per my need.

Steps to create a automated package.xml file

1. Always add components in the excel sheet with following format-






















save file as .xls file only as java program given below will convert 2003 files.(can be modified)

2. Column 1 - Metadata Name of component
    Column 2- API name of Object or folder associated with components
    Column 3 - API name of component.

3. Download POI apache .jar library, create a java project and add below class and download jar file to build path.

4. Provide Filename.XLs as argument and execute in Eclipse.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class POIExcelReader {
 HashMap<String, ArrayList<String>> hashMapMetaData = new HashMap<String, ArrayList<String>>();
 // ArrayList<String> memberSet = new ArrayList<String>();
 String preMetaType = null;
 ArrayList<String> apexComponents = new ArrayList<String>(
   Arrays.asList(new String[]{"ApexClass", "ApexComponent",
     "ApexPage", "ApexTrigger", "ApprovalProcess",
     "CustomApplication", "CustomField", "CustomLabel",
     "CustomLabels", "CustomObject", "Dashboard", "Document",
     "EmailTemplate", "FieldSet", "HomePageLayout", "Layout",
     "Letterhead", "ListView", "Profile", "Queue", "RecordType",
     "Report", "StaticResource", "ValidationRule", "WebLink",
     "WorkflowAlert", "WorkflowFieldUpdate", "WorkflowRule"}));

 ArrayList<String> prefixObjectMetaType = new ArrayList<String>(
   Arrays.asList(new String[]{"ApprovalProcess", "ApprovalProcess",
     "CustomField", "FieldSet", "ListView",
     "RecordType", "ValidationRule", "WebLink", "WorkflowAlert",
     "WorkflowFieldUpdate", "WorkflowRule"}));

 ArrayList<String> folderComponents = new ArrayList<String>(
   Arrays.asList(new String[]{"EmailTemplate", "Report", "Dashboard",
     "Document"}));
 public POIExcelReader() {
 }

 public void displayFromExcel(String xlsPath) {
  InputStream inputStream = null;
  try {
   inputStream = new FileInputStream(xlsPath);
  } catch (FileNotFoundException e) {
   System.out.println("File not found in the specified path.");
   e.printStackTrace();
  }

  POIFSFileSystem fileSystem = null;

  try {
   // Initializing the XML document
   DocumentBuilderFactory factory = DocumentBuilderFactory
     .newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document document = builder.newDocument();
   Element rootElement = document.createElement("package");
   document.appendChild(rootElement);
   System.out
     .println("Generating Package.Xml from source XML file....");

   fileSystem = new POIFSFileSystem(inputStream);
   HSSFWorkbook workBook = new HSSFWorkbook(fileSystem);
   HSSFSheet sheet = workBook.getSheetAt(0);
   Iterator<?> rows = sheet.rowIterator();

   while (rows.hasNext()) {
    String metaDataType = null;
    String member = null;
    String objectName = null;
    HSSFRow row = (HSSFRow) rows.next();

    // get a row, iterate through cells.
    Iterator<?> cells = row.cellIterator();

    while (cells.hasNext()) {
     HSSFCell cell = (HSSFCell) cells.next();
     // STRING CELL TYPE
     HSSFRichTextString richTextString = cell
       .getRichStringCellValue();
     String cellValue = richTextString.getString();
     // System.out.println("String: " + cellValue);
     if (apexComponents.contains(cellValue)
       && metaDataType == null) {
      metaDataType = cellValue;
     } else if (cellValue == "Layout" || objectName == null) {
      objectName = cellValue;
     } else {
      member = cellValue;
     }
    } // end while
     // System.out.println("ObjectName: " + objectName+
     // " Metadatatype==>" + metaDataType + " member==>" +
     // member);
    // Add metaDataType and Members in Map
    createMetadataMap(metaDataType, objectName, member);
   } // end while
   // Create XML file String
   for (String metaDataType : hashMapMetaData.keySet()) {
    String headerStringName = new String("name");
    String headerStringMembers = new String("members");
    Element packageElement = document.createElement("types");
    rootElement.appendChild(packageElement);
    // Add each members in its Own Metadatatype
    for (String members : hashMapMetaData.get(metaDataType)) {
     Element headerElement = document
       .createElement(headerStringMembers);
     packageElement.appendChild(headerElement);
     headerElement.appendChild(document.createTextNode(members));
    }
    Element headerElement = document
      .createElement(headerStringName);
    packageElement.appendChild(headerElement);
    headerElement
      .appendChild(document.createTextNode(metaDataType));
   }
   // Add Version at end of XML doc
   Element packageElement = document.createElement("version");
   rootElement.appendChild(packageElement);
   packageElement.appendChild(document.createTextNode("32.0"));

   // Format XML File
   TransformerFactory tFactory = TransformerFactory.newInstance();
   Transformer transformer = tFactory.newTransformer();
   // Add indentation to output
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   transformer.setOutputProperty(
     "{http://xml.apache.org/xslt}indent-amount", "2");

   DOMSource source = new DOMSource(document);
   StreamResult result = new StreamResult(new File("package.xml"));
   transformer.transform(source, result);
   System.out.println("Package.xml generated Successfully");

  } catch (IOException e) {
   System.out.println("IOException " + e.getMessage());
  } catch (ParserConfigurationException e) {
   System.out
     .println("ParserConfigurationException " + e.getMessage());
  } catch (TransformerConfigurationException e) {
   System.out.println("TransformerConfigurationException "
     + e.getMessage());
  } catch (TransformerException e) {
   System.out.println("TransformerException " + e.getMessage()
     + e.getMessageAndLocation());
  }
 }
 public void createMetadataMap(String metaType, String object, String member) {
  ArrayList<String> memberSet = new ArrayList<>();
  if (metaType != null && member != null && object != null) {
   // System.out.println("Before IF Inside" + object + metaType);
   if (prefixObjectMetaType.contains(metaType)) {
    member = object + "." + member;
   } else if (metaType.equalsIgnoreCase("Layout")) {
    // System.out.println("object Inside" + object + metaType);
    member = object + "-" + member;
   } else if (folderComponents.contains(metaType)) {
    member = object + "/" + member;
   }
   if (hashMapMetaData.keySet().contains(metaType)) {
    memberSet = hashMapMetaData.get(metaType);
    memberSet.add(member);
    hashMapMetaData.put(metaType, memberSet);
   } else {
    memberSet.add(member);
    hashMapMetaData.put(metaType, memberSet);
   }
  }
 }

 public static void main(String[] args) {
  POIExcelReader poiExample = new POIExcelReader();
  if (!(args.length == 0)) {
   String xlsPath = System.getProperty("user.dir").toString() + "\\"
     + args[0];
   System.out.println("The Excel File Path is ==" + xlsPath);
   poiExample.displayFromExcel(xlsPath);
  } else {
   System.out
     .println("Please put the Excel file in current folder and provide the fileName as an argument");
   System.exit(0);
  }


 }
}
5. execute Java program
6. check for workspace folder, file package.xml should have been created.
7. Configure ant to use this xml file and deploy the components.

This is my first blog post and its 4.00AM IST so please neglect any mistakes or not a blog language. Will learn! :) I am waiting for your feedback and suggestions on this post. Happy Coding !!! :)