View Javadoc

    1   /***
    2    *
    3    * Copyright 2004 Hiram Chirino
    4    *
    5    * Licensed under the Apache License, Version 2.0 (the "License");
    6    * you may not use this file except in compliance with the License.
    7    * You may obtain a copy of the License at
    8    *
    9    * http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   **/
    18  package org.codehaus.activemq.journal.howl;
    19
    20  import java.io.IOException;
    21  import java.io.InterruptedIOException;
    22
    23  import org.codehaus.activemq.journal.InvalidRecordLocationException;
    24  import org.codehaus.activemq.journal.Journal;
    25  import org.codehaus.activemq.journal.JournalEventListener;
    26  import org.codehaus.activemq.journal.RecordLocation;
    27  import org.objectweb.howl.log.Configuration;
    28  import org.objectweb.howl.log.InvalidFileSetException;
    29  import org.objectweb.howl.log.InvalidLogBufferException;
    30  import org.objectweb.howl.log.InvalidLogKeyException;
    31  import org.objectweb.howl.log.LogConfigurationException;
    32  import org.objectweb.howl.log.LogEventListener;
    33  import org.objectweb.howl.log.Logger;
    34
    35  /***
    36   * An implementation of the Journal interface using a HOWL logger.  This is is a thin
    37   * wrapper around a HOWL logger.
    38   *
    39   * This implementation can be used to write records but not to retreive them
    40   * yet. Once the HOWL logger implements the methods needed to retreive
    41   * previously stored records, this class can be completed.
    42   *
    43   * @version $Revision: 1.1 $
    44   */
    45  public class HowlJournal implements Journal {
    46
    47  	private final Logger logger;
    48
    49  	private RecordLocation lastMark;
    50
    51  	public HowlJournal(Configuration configuration)
    52  			throws InvalidFileSetException, LogConfigurationException,
    53  			InvalidLogBufferException, ClassNotFoundException, IOException,
    54  			InterruptedException {
    55  		this.logger = new Logger(configuration);
    56  		this.logger.open();
    57  	}
    58
    59  	/***
    60  	 * @see org.codehaus.activemq.journal.Journal#write(byte[], boolean)
    61  	 */
    62  	public RecordLocation write(byte[] data, boolean sync) throws IOException {
    63  		try {
    64  			return new LongRecordLocation(logger.put(data, sync));
    65  		} catch (InterruptedException e) {
    66  			throw (InterruptedIOException) new InterruptedIOException()
    67  					.initCause(e);
    68  		} catch (IOException e) {
    69  			throw e;
    70  		} catch (Exception e) {
    71  			throw (IOException) new IOException("Journal write failed: " + e)
    72  					.initCause(e);
    73  		}
    74  	}
    75
    76  	/***
    77  	 * @see org.codehaus.activemq.journal.Journal#setMark(org.codehaus.activemq.journal.RecordLocation, boolean)
    78  	 */
    79  	public void setMark(RecordLocation recordLocator, boolean force)
    80  			throws InvalidRecordLocationException, IOException {
    81  		try {
    82  			if (recordLocator == null
    83  					|| recordLocator.getClass() != LongRecordLocation.class)
    84  				throw new InvalidRecordLocationException();
    85
    86  			long location = ((LongRecordLocation) recordLocator)
    87  					.getLongLocation();
    88  			logger.mark(location, force);
    89  			lastMark = recordLocator;
    90
    91  		} catch (InterruptedException e) {
    92  			throw (InterruptedIOException) new InterruptedIOException()
    93  					.initCause(e);
    94  		} catch (IOException e) {
    95  			throw e;
    96  		} catch (InvalidLogKeyException e) {
    97  			throw new InvalidRecordLocationException(e.getMessage(), e);
    98  		} catch (Exception e) {
    99  			throw (IOException) new IOException("Journal write failed: " + e)
    100 					.initCause(e);
    101 		}
    102 	}
    103
    104 	/***
    105 	 * @see org.codehaus.activemq.journal.Journal#getMark()
    106 	 */
    107 	public RecordLocation getMark() {
    108 		// TODO: this does not work if the journal has
    109 		// just been opened. Need to get the HOWL logger
    110 		// to tell us what the last mark was.
    111 		return lastMark;
    112 	}
    113
    114 	/***
    115 	 * @see org.codehaus.activemq.journal.Journal#close()
    116 	 */
    117 	public void close() throws IOException {
    118 		try {
    119 			logger.close();
    120 		} catch (IOException e) {
    121 			throw e;
    122 		} catch (InterruptedException e) {
    123 			throw (InterruptedIOException) new InterruptedIOException()
    124 					.initCause(e);
    125 		} catch (Exception e) {
    126 			throw (IOException) new IOException("Journal close failed: " + e)
    127 					.initCause(e);
    128 		}
    129 	}
    130
    131 	/***
    132 	 * @see org.codehaus.activemq.journal.Journal#setJournalEventListener(org.codehaus.activemq.journal.JournalEventListener)
    133 	 */
    134 	public void setJournalEventListener(final JournalEventListener eventListener) {
    135 		logger.setLogEventListener(new LogEventListener() {
    136 			public void logOverflowNotification(long key) {
    137 				eventListener.overflowNotification(new LongRecordLocation(key));
    138 			}
    139 		});
    140 	}
    141
    142 	/***
    143 	 * @see org.codehaus.activemq.journal.Journal#getNextRecordLocation(org.codehaus.activemq.journal.RecordLocation)
    144 	 */
    145 	public RecordLocation getNextRecordLocation(RecordLocation lastLocation)
    146 			throws InvalidRecordLocationException {
    147 		//TODO: Need to figure out how to get HOWL to provided this.
    148 		return null;
    149 	}
    150
    151 	/***
    152 	 * @see org.codehaus.activemq.journal.Journal#read(org.codehaus.activemq.journal.RecordLocation)
    153 	 */
    154 	public byte[] read(RecordLocation location)
    155 			throws InvalidRecordLocationException, IOException {
    156 		//TODO: Need to figure out how to get HOWL to provided this.
    157 		return null;
    158 	}
    159
    160 }