package com.aspose.email.examples.outlook.pst;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;
import com.aspose.email.FolderInfo;
import com.aspose.email.ItemMovedEventArgs;
import com.aspose.email.ItemMovedEventHandler;
import com.aspose.email.MailQuery;
import com.aspose.email.PersonalStorage;
import com.aspose.email.PersonalStorageQueryBuilder;
import com.aspose.email.StandardIpmFolder;
import com.aspose.email.StorageProcessedEventArgs;
import com.aspose.email.StorageProcessedEventHandler;
import com.aspose.email.examples.Utils;
import com.aspose.email.system.collections.generic.List;
public class SplitAndMergePSTFile {
public static String dataDir = Utils.getSharedDataDir(SplitAndMergePSTFile.class) + "outlook/";
public static int messageCount = 0;
public static int totalAdded = 0;
public static String currentFolder = null;
public static void main(String[] args) {
//Following examples will not run with trail version. You have to purchase Aspose License.
try {
Utils.applyALicense();
} catch(Exception e) {
System.out.println("License file is missing: " + e.getLocalizedMessage());
}
//Splitting PST into Multiple PST files
splitPSTIntoMultiplePSTFiles();
//Merging of Multiple PSTs into a Single PST
mergeMultiplePSTsIntoASinglePST();
//Merging Folders from another PST
mergeFoldersFromAnotherPST();
//Splitting PST based on Specified Criterion
splitPSTBasedOnDefinedCriterion();
}
public static void splitPSTIntoMultiplePSTFiles() {
String sourceFileName = dataDir + "source.pst";
final PersonalStorage pst = PersonalStorage.fromFile(sourceFileName);
try {
pst.StorageProcessed.add(new StorageProcessedEventHandler() {
public void invoke(Object sender, StorageProcessedEventArgs e) {
pstSplit_OnStorageProcessed(sender, e);
}
});
pst.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
pstSplit_OnItemMoved(sender, e);
}
});
deleteAllFilesInDirectory(new File(dataDir + "chunks/"));
pst.splitInto(542720 , dataDir + "chunks/");
} finally {
if (pst != null)
(pst).dispose();
}
}
public static void mergeMultiplePSTsIntoASinglePST() {
// Path to files that will be merged into "source.pst".
String mergeWithFolderPath = dataDir + "MergeWith";
String mergeIntoFolderPath = dataDir + "MergeInto" + File.separator;
// This will ensure that we can run this example as many times as we want.
// It will discard changes made to to the Source file in last run of this example.
deleteAndRecopySampleFiles(mergeIntoFolderPath, dataDir + "MergeMultiplePSTsIntoASinglePST/");
final PersonalStorage pst = PersonalStorage.fromFile(mergeIntoFolderPath + "source.pst");
try {
pst.StorageProcessed.add(new StorageProcessedEventHandler() {
public void invoke(Object sender, StorageProcessedEventArgs e) {
pstMerge_OnStorageProcessed(sender, e);
}
});
pst.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
pstMerge_OnItemMoved(sender, e);
}
});
//Get a collection of all files in the directory
ArrayList<String> results = new ArrayList<String>();
File[] files = new File(mergeWithFolderPath).listFiles();
//If this path name does not denote a directory, then listFiles() returns null.
if (files == null)
return;
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".pst")) {
results.add(file.getAbsolutePath());
}
}
String[] fileNames = results.toArray(new String[0]);
pst.mergeWith(fileNames);
} finally {
if (pst != null)
(pst).dispose();
}
}
public static void mergeFoldersFromAnotherPST() {
String sourceFileName = dataDir + "Sources/source.pst";
String destinationFolder = dataDir + "Destination" + File.separator;
String destinationFileName = "destination.pst";
// This will ensure that we can run this example as many times as we want.
// It will discard changes made to to the destination file "destination.pst" in last run of this example.
deleteAndRecopySampleFiles(destinationFolder, dataDir + "MergeFoldersFromAnotherPST" + File.separator);
final PersonalStorage destinationPst = PersonalStorage.fromFile(destinationFolder + destinationFileName);
try {
final PersonalStorage sourcePst = PersonalStorage.fromFile(sourceFileName);
try {
FolderInfo destFolder = destinationPst.getRootFolder().addSubFolder("FolderFromOtherPst" + (int) (Math.random() * 100));
FolderInfo sourceFolder = sourcePst.getPredefinedFolder(StandardIpmFolder.Inbox);
destFolder.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
destinationFolder_ItemMoved(sender, e);
}
});
destFolder.mergeWith(sourceFolder);
System.out.println("Total messages added: " + totalAdded);
} finally {
if (sourcePst != null)
(sourcePst).dispose();
}
} finally {
if (destinationPst != null)
(destinationPst).dispose();
}
}
public static void splitPSTBasedOnDefinedCriterion() {
String fileName = dataDir + "source.pst";
java.util.Calendar c = java.util.Calendar.getInstance();
List<MailQuery> criteria = new List<MailQuery>();
//Define a criterion based on Time
PersonalStorageQueryBuilder pstQueryBuilder = new PersonalStorageQueryBuilder();
c.set(2015, 1, 1, 0, 0, 0);
pstQueryBuilder.getSentDate().since(c.getTime());
c.set(2015, 12, 12, 0, 0, 0);
pstQueryBuilder.getSentDate().before(c.getTime());
criteria.addItem(pstQueryBuilder.getQuery());
//specify some other criterion as well
pstQueryBuilder = new PersonalStorageQueryBuilder();
c.set(2012, 1, 1, 0, 0, 0);
pstQueryBuilder.getSentDate().since(c.getTime());
c.set(2012, 12, 12, 0, 0, 0);
pstQueryBuilder.getSentDate().before(c.getTime());
criteria.addItem(pstQueryBuilder.getQuery());
final PersonalStorage pst = PersonalStorage.fromFile(fileName);
try {
deleteAllOutputFiles();
pst.splitInto(criteria, dataDir);
} finally {
if (pst != null)
pst.dispose();
}
}
//Helping Methods
private static void destinationFolder_ItemMoved(Object sender, ItemMovedEventArgs e) {
totalAdded++;
}
private static void pstMerge_OnStorageProcessed(Object sender, StorageProcessedEventArgs e) {
System.out.println("*** The storage is merging: {0}" + e.getFileName());
}
private static void pstMerge_OnItemMoved(Object sender, ItemMovedEventArgs e) {
if (currentFolder == null) {
currentFolder = e.getDestinationFolder().retrieveFullPath();
}
String folderPath = e.getDestinationFolder().retrieveFullPath();
if (!folderPath.equals(currentFolder)) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
messageCount = 0;
currentFolder = folderPath;
}
messageCount++;
totalAdded++;
}
private static void pstSplit_OnStorageProcessed(Object sender, StorageProcessedEventArgs e) {
if (currentFolder != null) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
}
messageCount = 0;
currentFolder = null;
System.out.println("*** The chunk is processed: " + e.getFileName());
}
private static void pstSplit_OnItemMoved(Object sender, ItemMovedEventArgs e) {
if (currentFolder == null) {
currentFolder = e.getDestinationFolder().retrieveFullPath();
}
String folderPath = e.getDestinationFolder().retrieveFullPath();
if (!folderPath.equals(currentFolder)) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
messageCount = 0;
currentFolder = folderPath;
}
messageCount++;
}
public static void deleteAndRecopySampleFiles(String destFolder, String srcFolder) {
try {
deleteAllFilesInDirectory(new File(destFolder));
File source = new File(srcFolder);
File dest = new File(destFolder);
FileUtils.copyDirectory(source, dest);
} catch(IOException e) {
System.out.println(e.getLocalizedMessage());
}
}
public static void deleteAllFilesInDirectory(File dir) {
for(String s: dir.list()){
File currentFile = new File(dir.getPath(), s);
currentFile.delete();
}
}
public static void deleteAllOutputFiles() {
File dir = new File(dataDir);
for(String s: dir.list()){
if(s.startsWith("Test_part") || s.startsWith("Personal folders_part")) {
File file = new File(dir.getPath(), s);
file.delete();
}
}
}
}