/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2008 Sun Microsystems, Inc.
*/
package org.opends.quicksetup;
import org.opends.quicksetup.util.Utils;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.io.*;
/**
* Log of past upgrade/reversion events that is backed by the file
* [install root]/history/log.
*/
public class HistoricalLog {
private File file;
/**
* Creates a historical log backed by file. If file
* does not exist an attempt will be made to create it.
* @param file File containing the historical record
* @throws IOException if something goes wrong attempting to create
* a new historical record file
*/
public HistoricalLog(File file) throws IOException {
this.file = file;
if (!file.exists()) {
Utils.createFile(file);
}
}
/**
* Gets a list of the historical records in the file.
* @return List of HistoricalRecord
* @throws IOException if there was an error reading the records file
*/
public List getRecords() throws IOException {
List records = new ArrayList();
BufferedReader br = new BufferedReader(new FileReader(file));
String s;
while (null != (s = br.readLine())) {
records.add(HistoricalRecord.fromString(s));
}
return Collections.unmodifiableList(records);
}
/**
* Creates a new historical log record and appends a new log record to the
* log. A new operation ID is generated and returned so that future calls
* can use the same ID.
* @param from current version
* @param to version to upgrade to
* @param status of the upgrade
* @param note optional string with additional information
* @return Long operation ID that can be used in writing future logs
* @throws IOException if there is a problem appending the log to the file
*/
public Long append(BuildInformation from, BuildInformation to,
HistoricalRecord.Status status, String note)
throws IOException
{
HistoricalRecord record = new HistoricalRecord(from, to, status, note);
Long id = record.getOperationId();
append(record);
return id;
}
/**
* Creates a new historical log record and appends a new log record to the
* log.
* @param id Long ID obtained from a call to
{@link org.opends.quicksetup.HistoricalLog#
append(Integer, Integer,
org.opends.quicksetup.upgrader.HistoricalRecord.Status)}
* @param from current version
* @param to version to upgrade to
* @param status of the upgrade
* @param note optional string with additional information
* @throws IOException if there is a problem appending the log to the file
*/
public void append(Long id, BuildInformation from, BuildInformation to,
HistoricalRecord.Status status, String note)
throws IOException
{
HistoricalRecord record = new HistoricalRecord(id, from, to, status, note);
append(record);
}
/**
* Appends a historical record to the log.
* @param record to append to the log file
* @throws IOException if there is a problem appending the record to the file
*/
private void append(HistoricalRecord record) throws IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, true));
bw.write(record.toString());
bw.newLine();
bw.flush();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException ioe2) {
// do nothing;
}
}
}
}
}