buildframework/helium/sf/java/scm/src/com/nokia/maven/scm/provider/hg/VersionChangeSet.java
/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.maven.scm.provider.hg;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.scm.ChangeFile;
import org.apache.maven.scm.ChangeSet;
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmVersion;
/**
* A version changeset.
*/
public class VersionChangeSet extends ChangeSet
{
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final String TIME_PATTERN = "HH:mm:ss";
private List<ScmVersion> scmVersionList;
/**
* Constructor used when attributes aren't available until later
*/
public VersionChangeSet()
{
super();
scmVersionList = new ArrayList<ScmVersion>();
}
/**
* Setter for ScmVersion
*/
public void setScmVersion(ScmVersion scmVersion) throws ScmException
{
scmVersionList.add(scmVersion);
}
/**
* Getter for ChangeFile list.
*
* @return List of ScmVersion list.
*/
public List<ScmVersion> getScmVersion()
{
return scmVersionList;
}
/**
* Added tbranch\tag\revision and changed format to match "hg log --verbose" output.
* File version has been removed, showing only file name
* @return String to output the VersionChangeSet result
*/
@SuppressWarnings("unchecked")
@Override
public String toString()
{
String result = "";
for (ScmVersion versions : getScmVersion()) {
if (!versions.getName().equals("")) {
result += versions.getType().toLowerCase() + ":" + versions.getName() + "\n";
}
}
if (getAuthor() != null) {
result += "user:" + getAuthor() + "\n";
}
if (getDate() != null) {
result += "date:" + getDate() + "\n";
}
List<ChangeFile> files = getFiles();
if ( files.size() != 0 ) {
result += "files:";
for ( ChangeFile changeFile : files ) {
result += changeFile.getName() + " ";
}
}
if (!getComment().equals("")) {
result += "\ndescription:" + getComment() + "\n";
}
return result;
}
/**
* Provide the changelog entry as an XML snippet.
*
* @return a changelog-entry in xml format
* @task make sure comment doesn't contain CDATA tags - MAVEN114
*/
@SuppressWarnings("unchecked")
@Override
public String toXML()
{
StringBuffer buffer = new StringBuffer();
buffer.append( "\t<changelog-entry>\n" );
if ( getDate() != null )
{
buffer.append( "\t\t<date pattern=\"" + getDateFormatted() + "\">" )
.append( getDateFormatted() )
.append( "</date>\n" )
.append( "\t\t<time pattern=\"" + TIME_PATTERN + "\">" )
.append( getTimeFormatted() )
.append( "</time>\n" );
}
for (ScmVersion versions : getScmVersion()) {
if (!versions.getName().equals(""))
{
buffer.append("\t\t<" + versions.getType().toLowerCase() + ">\n")
.append("\t\t\t<name>")
.append(versions.getName())
.append("</name>\n");
buffer.append("\t\t</" + versions.getType().toLowerCase() + ">\n");
}
}
buffer.append( "\t\t<author><![CDATA[" )
.append( getAuthor() )
.append( "]]></author>\n" );
List<ChangeFile> changeFiles = getFiles();
for ( ChangeFile changeFile : changeFiles)
{
buffer.append( "\t\t<file>\n" )
.append( "\t\t\t<name>" )
.append( escapeValue( changeFile.getName() ) )
.append( "</name>\n" )
.append( "\t\t\t<revision>" )
.append( changeFile.getRevision() )
.append( "</revision>\n" );
buffer.append( "\t\t</file>\n" );
}
buffer.append( "\t\t<msg><![CDATA[" )
.append( removeCDataEnd( getComment() ) )
.append( "]]></msg>\n" );
buffer.append( "\t</changelog-entry>\n" );
return buffer.toString();
}
/**
* remove a <code>]]></code> from comments (replace it with <code>] ] ></code>).
*
* @param message The message to modify
* @return a clean string
*/
private String removeCDataEnd( String message )
{
// check for invalid sequence ]]>
int endCdata;
while ( message != null && ( message.indexOf( "]]>" ) ) > -1 )
{
endCdata = message.indexOf( "]]>" );
message = message.substring( 0, endCdata ) + "] ] >" + message.substring( endCdata + 3, message.length() );
}
return message;
}
}