*/
public ChangeLogSet getChangeLog( Date startDate, Date endDate )
throws APIException
{
// Initialize our return object
ChangeLogSet changeLog = new ChangeLogSet( startDate, endDate );
// By default we're going to group-by change package
// Non change package changes will be lumped into one big Change Set
Hashtable<String, ChangeSet> changeSetHash = new Hashtable<String, ChangeSet>();
// Lets prepare our si rlog command for execution
Command siRlog = new Command( Command.SI, "rlog" );
siRlog.addOption( new Option( "recurse" ) );
MultiValue rFilter = new MultiValue( ":" );
rFilter.add( "daterange" );
rFilter.add( "'" + RLOG_DATEFORMAT.format( startDate ) + "'-'" + RLOG_DATEFORMAT.format( endDate ) + "'" );
siRlog.addOption( new Option( "rfilter", rFilter ) );
siRlog.addOption( new Option( "cwd", sandboxDir ) );
// Execute the si rlog command
Response response = api.runCommand( siRlog );
for ( WorkItemIterator wit = response.getWorkItems(); wit.hasNext(); )
{
WorkItem wi = wit.next();
String memberName = wi.getContext();
// We're going to have to do a little dance to get the correct server file name
memberName = memberName.substring( 0, memberName.lastIndexOf( '/' ) );
memberName = memberName + '/' + wi.getId();
memberName = memberName.replace( '\\', '/' );
// Now lets get the revisions for this file
Field revisionsFld = wi.getField( "revisions" );
if ( null != revisionsFld && revisionsFld.getDataType().equals( Field.ITEM_LIST_TYPE )
&& null != revisionsFld.getList() )
{
@SuppressWarnings( "unchecked" ) List<Item> revList = revisionsFld.getList();
for ( Iterator<Item> lit = revList.iterator(); lit.hasNext(); )
{
Item revisionItem = lit.next();
String revision = revisionItem.getId();
String author = revisionItem.getField( "author" ).getItem().getId();
// Attempt to get the full name, if available
try
{
author = revisionItem.getField( "author" ).getItem().getField( "fullname" ).getValueAsString();
}
catch ( NullPointerException npe )
{ /* ignore */ }
String cpid = ":none";
// Attempt to get the cpid for this revision
try
{
cpid = revisionItem.getField( "cpid" ).getItem().getId();
}
catch ( NullPointerException npe )
{ /* ignore */ }
// Get the Change Package summary for this revision
String comment = cpid + ": " + revisionItem.getField( "cpsummary" ).getValueAsString();
// Get the date associated with this revision
Date date = revisionItem.getField( "date" ).getDateTime();
// Lets create our ChangeFile based on the information we've gathered so far
ChangeFile changeFile = new ChangeFile( memberName, revision );
// Check to see if we already have a ChangeSet grouping for this revision
ChangeSet changeSet = changeSetHash.get( cpid );
if ( null != changeSet )
{
// Set the date of the ChangeSet to the oldest entry
if ( changeSet.getDate().after( date ) )
{
changeSet.setDate( date );
}
// Add the new ChangeFile
changeSet.addFile( changeFile );
// Update the changeSetHash
changeSetHash.put( cpid, changeSet );
}
else // Create a new ChangeSet grouping and add the ChangeFile
{
List<ChangeFile> changeFileList = new ArrayList<ChangeFile>();
changeFileList.add( changeFile );
changeSet = new ChangeSet( date, comment, author, changeFileList );
// Update the changeSetHash with an initial entry for the cpid
changeSetHash.put( cpid, changeSet );
}
}
}
}
// Update the Change Log with the Change Sets
List<ChangeSet> changeSetList = new ArrayList<ChangeSet>();
changeSetList.addAll( changeSetHash.values() );
changeLog.setChangeSets( changeSetList );
return changeLog;
}