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
109
110
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
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
157 return null;
158 }
159
160 }