Index: src/main/org/apache/maven/mkslib/MksChangeLogParser.java =================================================================== --- src/main/org/apache/maven/mkslib/MksChangeLogParser.java (Revision 0) +++ src/main/org/apache/maven/mkslib/MksChangeLogParser.java (Revision 0) @@ -0,0 +1,246 @@ +package org.apache.maven.mkslib; + +/* ==================================================================== + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.maven.changelog.ChangeLog; +import org.apache.maven.changelog.ChangeLogEntry; +import org.apache.maven.changelog.ChangeLogFile; +import org.apache.maven.changelog.ChangeLogParser; + +/** + * This class parse mks log output. + * + * @author Christoph Jerolimov + * @version $Id: $ + */ +public class MksChangeLogParser implements ChangeLogParser +{ + /** + * This date/time formatter will be uses to parse a mks date. + */ + private static final SimpleDateFormat MKS_TIMESTAMP_FORMAT = new SimpleDateFormat( + "MMM d, yyyy - h:mm a"); + + /** + * Custom date/time formatter. Rounds ChangeLogEntry times to the nearest + * minute. + */ + private static final SimpleDateFormat ENTRY_KEY_TIMESTAMP_FORMAT = new SimpleDateFormat( + "yyyyMMddHHmm"); + + /** expecting file name */ + private static final int GET_FILE_NAME = 1; + + /** expecting file revision */ + private static final int GET_FILE_REVISION = 2; + + /** expecting entry revision */ + private static final int WAITFOR_ENTRY_REVISION = 3; + + /** expecting file revision */ + private static final int GET_ENTRY_INFO = 4; + + /** expecting file revision */ + private static final int GET_ENTRY_COMMENT = 5; + + /** rcs entries, in reverse (date, time, author, comment) order */ + private Map entries = new TreeMap(Collections.reverseOrder()); + + /** current status of the parser */ + private int status = GET_FILE_NAME; + + /** current changelog entry */ + private ChangeLogEntry changeLogEntry; + + /** current changelog file */ + private ChangeLogFile changeLogFile; + + public void init(ChangeLog changeLog) + { + } + + public void cleanup() + { + } + + public void setDateFormatInFile(String dateFormat) + { + } + + public Collection parse(InputStream in) throws IOException + { + try + { + BufferedReader reader = new BufferedReader( + new InputStreamReader(in)); + + String line; + while ((line = reader.readLine()) != null) + { + if (line.startsWith("========================================")) + status = GET_FILE_NAME; + + switch (status) + { + case GET_FILE_NAME: + addEntry(); + processGetFileName(line); + break; + case GET_FILE_REVISION: + processGetFileRevision(line); + break; + case WAITFOR_ENTRY_REVISION: + processWaitForEntryRevision(line); + break; + case GET_ENTRY_INFO: + processGetEntryInfo(line); + break; + case GET_ENTRY_COMMENT: + processGetEntryComment(line); + break; + default: + // wait for next entry + break; + } + } + addEntry(); + } catch (RuntimeException e) + { + e.printStackTrace(); + throw e; + } catch (IOException e) + { + e.printStackTrace(); + throw e; + } + return entries.values(); + } + + protected void processGetFileName(String line) + { + if (line.startsWith("member name: ")) + { + String filename; + if (line.indexOf(";") == -1) + filename = line.substring(13); + else + filename = line.substring(13, line.indexOf(";")); + + changeLogFile = new ChangeLogFile(filename); + status = GET_FILE_REVISION; + } + } + + protected void processGetFileRevision(String line) + { + if (line.startsWith("member:\t")) + { + changeLogFile.setRevision(line.substring(8)); + status = WAITFOR_ENTRY_REVISION; + } + } + + protected void processWaitForEntryRevision(String line) + { + if (line.equals("-----------------------")) + { + status = GET_ENTRY_INFO; + } + } + + protected void processGetEntryInfo(String line) + { + if (line.startsWith("date: ")) + { + changeLogEntry = new ChangeLogEntry(); + + int posAuthor = line.indexOf("; author: "); + if (posAuthor == -1) + return; + int posState = line.indexOf("; state: "); + if (posState == -1) + return; + + try + { + Date date = MKS_TIMESTAMP_FORMAT.parse(line.substring(6, + posAuthor)); + String author = line.substring(posAuthor + 10, posState); + + changeLogEntry.setDate(date); + changeLogEntry.setAuthor(author); + status = GET_ENTRY_COMMENT; + } catch (ParseException e) + { + throw new IllegalArgumentException( + "I don't understand this date: " + + line.substring(6, posAuthor)); + } + } + } + + protected void processGetEntryComment(String line) + { + if (line.equals("-----------------------")) + { + addEntry(); + status = GET_ENTRY_INFO; + return; + } + changeLogEntry.setComment(changeLogEntry.getComment() + line + "\n"); + } + + protected void addEntry() + { + if (changeLogEntry == null || changeLogFile == null) + { + return; + } + // do not add if entry is not populated + if (changeLogEntry.getAuthor() == null + || changeLogEntry.getDate() == null) + { + return; + } + + String key = ENTRY_KEY_TIMESTAMP_FORMAT + .format(changeLogEntry.getDate()) + + changeLogEntry.getAuthor() + changeLogEntry.getComment(); + + if (!entries.containsKey(key)) + { + changeLogEntry.addFile(changeLogFile); + entries.put(key, changeLogEntry); + } else + { + ((ChangeLogEntry) entries.get(key)).addFile(changeLogFile); + } + } +} Index: src/main/org/apache/maven/mkslib/MksChangeLogGenerator.java =================================================================== --- src/main/org/apache/maven/mkslib/MksChangeLogGenerator.java (Revision 0) +++ src/main/org/apache/maven/mkslib/MksChangeLogGenerator.java (Revision 0) @@ -0,0 +1,59 @@ +package org.apache.maven.mkslib; + +/* ==================================================================== + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +import java.util.Date; + +import org.apache.maven.changelog.AbstractChangeLogGenerator; +import org.apache.maven.util.RepositoryUtils; +import org.apache.tools.ant.types.Commandline; + +/** + * A log-generator for the mks commandline tool. + * + * It supports an input file with + * + * @author Christoph Jerolimov + * @version $Id: $ + */ +public class MksChangeLogGenerator extends AbstractChangeLogGenerator +{ + protected Commandline getScmLogCommand() + { + String tokens[] = RepositoryUtils.splitSCMConnection(getConnection()); + + Commandline commandline = new Commandline(); + commandline.setExecutable(tokens[2]); + for (int i = 3; i < tokens.length; i++) + { + commandline.createArgument().setValue(tokens[i]); + } + + return commandline; + } + + protected String getScmDateArgument(Date before, Date to) + { + return null; + } + + protected String getScmTagArgument(String tagStart, String tagEnd) + { + return null; + } +} Index: src/main/org/apache/maven/mkslib/MksChangeLogFactory.java =================================================================== --- src/main/org/apache/maven/mkslib/MksChangeLogFactory.java (Revision 0) +++ src/main/org/apache/maven/mkslib/MksChangeLogFactory.java (Revision 0) @@ -0,0 +1,41 @@ +package org.apache.maven.mkslib; + +/* ==================================================================== + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +import org.apache.maven.changelog.ChangeLogFactory; +import org.apache.maven.changelog.ChangeLogGenerator; +import org.apache.maven.changelog.ChangeLogParser; + +/** + * Provides mks ChangeLogGenerator and ChangeLogParser. + * + * @author Christoph Jerolimov + * @version $Id: $ + */ +public class MksChangeLogFactory implements ChangeLogFactory +{ + public ChangeLogGenerator createGenerator() + { + return new MksChangeLogGenerator(); + } + + public ChangeLogParser createParser() + { + return new MksChangeLogParser(); + } +} Index: src/main/org/apache/maven/changelog/ChangeLog.java =================================================================== --- src/main/org/apache/maven/changelog/ChangeLog.java (Revision 368355) +++ src/main/org/apache/maven/changelog/ChangeLog.java (Arbeitskopie) @@ -121,6 +121,7 @@ FACTORIES.put( "perforce", "org.apache.maven.perforcelib.PerforceChangeLogFactory" ); FACTORIES.put( "starteam", "org.apache.maven.starteamlib.StarteamChangeLogFactory" ); FACTORIES.put( "vss", "org.apache.maven.vsslib.VssChangeLogFactory" ); + FACTORIES.put( "mks", "org.apache.maven.mkslib.MksChangeLogFactory" ); } /**