This code snippet will use to analyzing the documents storage in each business unit for everymonth and send the report to the business unit manager. This report will helps to unit manager to documentum usage for each business unit.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.hssf.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.documentum.com.DfClientX;
import com.documentum.fc.client.DfQuery;
import com.documentum.fc.client.IDfClient;
import com.documentum.fc.client.IDfCollection;
import com.documentum.fc.client.IDfDocument;
import com.documentum.fc.client.IDfQuery;
import com.documentum.fc.client.IDfSession;
import com.documentum.fc.client.IDfSessionManager;
import com.documentum.fc.common.DfException;
import com.documentum.fc.common.DfId;
import com.documentum.fc.common.IDfLoginInfo;
public class DCTMUsageReport {
/**
* @param args
* @throws IOException
*/
public static FileInputStream fis = null;
public static FileOutputStream fos = null;
public static String mailRecepient =null;
public static String host =null;
public static String fromId =null;
public static String userName =null;
public static String password =null;
public static String docbase =null;
public static String filePath =null;
public static String attachmentName =null;
public static String supportTeamID =null;
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//Read the values from properties file
String PROP_FILE = "DCTMUsageReport.properties";
InputStream is = DCTMUsageReport.class.getResourceAsStream(PROP_FILE);
Properties prop = new Properties();
prop.load(is);
//Doc Base connection values
userName = prop.getProperty("SUPER_USER_ID");
password = prop.getProperty("SUPER_USER_PASS");
docbase = prop.getProperty("DOCBASE_NAME");
//Input data file
String dataFile =prop.getProperty("INPUT_DATA_FILE");
System.out.println("dataFile:"+dataFile);
//File Location
filePath =prop.getProperty("DATA_FILE_LOCATION");
System.out.println("filePath:"+filePath);
fromId =prop.getProperty("CUSTOM_MAIL_FROM_ID");
System.out.println("fromId:"+fromId);
supportTeamID =prop.getProperty("SUPPORT_TEAM_EMAIL_ID");
System.out.println("fromId:"+supportTeamID);
//List to store the values read from input data file
List sheetData = new ArrayList();
try {
//Read the Business Unit,report generation query,sheet name recipient list and sort order from excel file
fis = new FileInputStream(dataFile);
HSSFWorkbook workbook = new HSSFWorkbook(fis);
HSSFSheet sheet = workbook.getSheetAt(0);
Iterator rows = sheet.rowIterator();
while (rows.hasNext()) {
HSSFRow row = (HSSFRow) rows.next();
Iterator cells = row.cellIterator();
List data = new ArrayList();
while (cells.hasNext()) {
HSSFCell cell = (HSSFCell) cells.next();
data.add(cell);
}
sheetData.add(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
}
//call the getInputData() method to generate report based on BU
getInputData(sheetData);
}
/**
* Method to generate the NA Activity Report for same Business Unit in the single workbook
* @param List sheetData
*
*/
private static void getInputData(List sheetData) throws Exception {
//Call the creationDate() method to get the report generation period
String strCreationDate=creationDate();
String strTempBU ="";
String wbName="";
String strBUnit="";
String strsortOrder="";
String strRQuery="";
String strRecipient="";
String strsheetName ="";
ArrayList mailBU = new ArrayList();
ArrayList mailReceipient = new ArrayList();
DCTMUsageReport dctmUsageReport = new DCTMUsageReport();
for (int i = 1; i < sheetData.size(); i++) {
List list = (List) sheetData.get(i);
//Retrieve the values from the Array list
HSSFCell bUnit = (HSSFCell) list.get(0);
HSSFCell reportQuery = (HSSFCell) list.get(1);
HSSFCell recipient = (HSSFCell) list.get(2);
HSSFCell sheetName = (HSSFCell) list.get(3);
HSSFCell sortOrder = (HSSFCell) list.get(4);
strBUnit = bUnit.getRichStringCellValue().getString();
strsortOrder = sortOrder.getRichStringCellValue().getString();
strRQuery = reportQuery.getRichStringCellValue().getString()+ strCreationDate +strsortOrder ;
strRecipient = recipient.getRichStringCellValue().getString();
strsheetName = sheetName.getRichStringCellValue().getString();
System.out.println("BusinessUnit:"+strBUnit);
System.out.println("ReportQuery:"+strRQuery);
//Check for recipient email id is not null,
//if it is null then send the report to support team email id mention in the properties file
if(strRecipient.equalsIgnoreCase("")){
strRecipient=supportTeamID;
}
//Check for previous report business unit - If business unit is same for the previous report,
//the new report will be added as a new sheet in the previous report, else the report will be created as a new workbook
if(!strTempBU.equalsIgnoreCase(strBUnit)){
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet firstSheet = workbook.createSheet(strsheetName);
wbName = strBUnit+" Usage Report.xls"; //Naming the report based on the business unit
//call for generating the report
dctmUsageReport.generateReport(strRQuery, workbook,firstSheet,wbName);
//Assign the Business Unit(BU) to temporary variable for creating multiple sheets in the same workbook for single BU
mailBU.add(strBUnit);
mailReceipient.add(strRecipient);
strTempBU =strBUnit;
}
else{// If BU is same for multiple doc types, create a new sheet in the existing workbook
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath+wbName)); //Read the existing file, that is created for same BU
// create a workbook out of the input stream
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet nextSheet = wb.createSheet(strsheetName);
//call for generating the report
dctmUsageReport.generateReport(strRQuery, wb,nextSheet,wbName);
}
}
//Call the sendMailAttachment() method to send the generated usage report
for (int j=0;j< mailBU.size(); j++){
String bussUnit =mailBU.get(j).toString();//To get the business unit
String receipientUnit =mailReceipient.get(j).toString();//To get the recipients list
String attachmentName = filePath+bussUnit+" Usage Report.xls";//To form the attachment file name based on the BU with location
dctmUsageReport.sendMailAttachment(attachmentName,receipientUnit,bussUnit);
}
}
/**
* Method to get the report generation period based on the current Date
* Usually the period will be completed period of last month from current date
* @return String
*
*/
public static String creationDate(){
//Set the date format
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Calendar cal = Calendar.getInstance();
//Get the first date of current month
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
String endDate = (dateFormat.format(cal.getTime()));
//Get the first date for last month
cal.add(Calendar.MONTH,-1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
String startDate = (dateFormat.format(cal.getTime()));
//Get the report generation period for last month
String creationDate =" and r_creation_date between date('"+ startDate+"') and date('" + endDate +"')";
//String creationDate =" and s.r_creation_date between date('03/01/2011') and date('04/01/2011') ";
return creationDate;
}
/**
* Method to generate the NA Activity Report
* @param query
* @param workbook
* @param sheet
*/
public void generateReport( String execQuery, HSSFWorkbook workbook, HSSFSheet sheet,String reportName)throws Exception{
DfClientX clientx = new DfClientX();
IDfClient client = clientx.getLocalClient();
IDfLoginInfo login = clientx.getLoginInfo();
login.setUser(userName);
login.setPassword(password);
login.setDomain("");
IDfSessionManager sMgr = client.newSessionManager();
IDfSession session = null;
String a_name ="";
String a_value ="";
ArrayList headers = new ArrayList();
try {
//Set the date format
DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
Calendar cal = Calendar.getInstance();
//Get the first date of current month
cal.add(Calendar.MONTH,-1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
//Get the last day of previous month to mention in the report
String lastDate = (dateFormat.format(cal.getTime()));
sMgr.setIdentity(docbase,login);
session = sMgr.getSession(docbase);
IDfQuery query2 = new DfQuery();
query2.setDQL(execQuery);
//Execute the query
IDfCollection collection2 = query2.execute(session, IDfQuery.DF_EXEC_QUERY);
//Get the total attribute count in the query
int cnt = collection2.getAttrCount();
//Header for Activity report and Date & Time
HSSFRow hssfHeader1 = sheet.createRow(0);
//Create the style for cell
HSSFCellStyle cellStyle1 = workbook.createCellStyle();
//Set the alignment
cellStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//Set the border
cellStyle1.setAlignment(HSSFCellStyle.BORDER_THICK);
//Merge the Caption Cells
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, cnt-2));
//Set the font for the Caption
HSSFFont capFont = workbook.createFont();
capFont.setFontName(HSSFFont.FONT_ARIAL);
capFont.setColor(IndexedColors.BLACK.getIndex());
capFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
cellStyle1.setFont(capFont);
cellStyle1.setAlignment((short) 0);
HSSFCell hssfCell1 = hssfHeader1.createCell(0);
hssfCell1.setCellStyle(cellStyle1);
cellStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//Set the header for the report
hssfCell1.setCellValue("DCTM Usage Report excludes documents created by ECMDSM1, ia_admin and Viewstar - For the Month Ending "+lastDate);
int i =1;
int cellIdx=0;
//To write the column headers
while(i < cnt )
{
headers.add(collection2.getAttr(i).getName());
i++;
}
HSSFRow hssfHeader = sheet.createRow(2);
//Set the font and styles
HSSFFont font = workbook.createFont();
font.setFontName(HSSFFont.FONT_ARIAL);
font.setColor(IndexedColors.BLACK.getIndex());
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cellStyle.setAlignment(HSSFCellStyle.BORDER_THIN);
//Get and set the column headers
for (Iterator cells = headers.iterator(); cells.hasNext();) {
HSSFCell hssfCell = hssfHeader.createCell(cellIdx);
hssfCell.setCellStyle(cellStyle);
hssfCell.setCellValue((String) cells.next());
sheet.autoSizeColumn(cellIdx);
//sheet.setColumnWidth(cellIdx,5000);
cellIdx++;
}
int rowIdx = 3;//Caption is written on top 2 rows and write the report from 3rd row
//Get the attribute values and set the values in the workbook
while(collection2.next())
{
i = 0;
int collIndex =0;
HSSFRow hssfRow = sheet.createRow(rowIdx++);
while(i < (cnt-1)){
collIndex=i+1;
HSSFCell hssfCell = hssfRow.createCell(i);
/*IDfAttr attr_name = collection2.getAttr(collIndex);
if(attr_name.isRepeating()){
a_name = attr_name.getName();
a_value= collection2.getAllRepeatingStrings(a_name, ",");
hssfCell.setCellValue(a_value);
}else {*/
String attribute = collection2.getAttr(i).getName();
String value = collection2.getValueAt(i++).toString();
IDfDocument object = (IDfDocument)(session.getObject(new DfId(collection2.getString("r_object_id"))));
String repeatingValue = object.getAllRepeatingStrings(attribute, ",");
if(repeatingValue != null && repeatingValue.trim() != "")
{
value = repeatingValue;
hssfCell.setCellValue(value);
}else{
hssfCell.setCellValue(value);
//hssfCell.setCellValue(collection2.getValueAt(collIndex).toString());
}
sheet.setColumnWidth(i,5000);
HSSFCellStyle cellStyle2 = workbook.createCellStyle();
cellStyle2.setWrapText(true);
hssfCell.setCellStyle(cellStyle2);
i++;
}
}
collection2.close(); //close the collection
fos = new FileOutputStream(new File(filePath+reportName));
workbook.write(fos); //Write the data to workbook
System.out.println("Report Generated");
}
catch(DfException df){
System.out.println("dfc Exception :"+df.getStackTraceAsString());
}
catch (Exception e1) {
e1.printStackTrace();
}finally {
sMgr.release(session);
if (fos != null) {
fos.flush();
fos.close();
}
}
}
/**
* Method will send the generated NA usage report to the recipients mentioned each BU
* @param fileName
* @param recMailID
* @return businessUnit
*/
public void sendMailAttachment( String fileName, String recMailID,String businessUnit){
try {
//Set the date format
DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
Calendar cal = Calendar.getInstance();
//Get the first date of current month
cal.add(Calendar.MONTH,-1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
//Get the last day of previous month to mention in the report
String lastDate = (dateFormat.format(cal.getTime()));
// Create the message to send
File tempFile = new File(fileName);
//Custom Mail Server
host = "mail10.custom.com";
Properties sysProperties = System.getProperties();
sysProperties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(sysProperties);
Message message = new MimeMessage(session);
// From Email Address
message.setFrom(new InternetAddress(fromId));
//Split the multiple recipients based on the ',' delimiter and add the email id to the recipient list
StringTokenizer st = new StringTokenizer(recMailID, ",");
while(st.hasMoreTokens()){
message.addRecipient(Message.RecipientType.TO,new InternetAddress(st.nextToken()));
}
// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();
//Part 1 to add the body message
MimeBodyPart p1 = new MimeBodyPart();
//Part 2 to attach the NA usage report
MimeBodyPart p2 = new MimeBodyPart();
//Part 3 to add the signature
MimeBodyPart p3 = new MimeBodyPart();
//Form the Body message
StringBuffer bodyMessage = new StringBuffer();
bodyMessage.append("Hi,");
bodyMessage.append("\n");
bodyMessage.append("\n");
bodyMessage.append("Please find the attached Documentum Usage Report");
bodyMessage.append("\n");
bodyMessage.append("\n");
bodyMessage.append("\n");
//Form the signature
StringBuffer trailMessage = new StringBuffer();
trailMessage.append("\n");
trailMessage.append("\n");
trailMessage.append("\n");
trailMessage.append("Regards");
trailMessage.append("\n");
trailMessage.append("Documentum Support");
trailMessage.append("\n");
trailMessage.append("\n");
//Attach the report in the email
FileDataSource fds = new FileDataSource(tempFile);
p2.setDataHandler(new DataHandler(fds));
p2.setFileName(fds.getName());
p1.setText(bodyMessage.toString());
p3.setText(trailMessage.toString());
multipart.addBodyPart(p1);
multipart.addBodyPart(p2);
multipart.addBodyPart(p3);
//Set the subject message
message.setSubject(businessUnit+" Usage Report for Month ending with "+ lastDate);
message.setContent(multipart);
message.saveChanges();
// Send message
Transport.send(message);
} catch(Exception e){
e.printStackTrace();
}
}
}