KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > presumo > jms > persistence > LogFileEntryDelete


1 /**
2  * This file is part of Presumo.
3  *
4  * Presumo is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * Presumo is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with Presumo; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Copyright (c) 2001 Rob Cauble
19  */

20 package com.presumo.jms.persistence;
21
22 import com.presumo.jms.message.JmsMessage;
23 import com.presumo.jms.resources.Resources;
24 import com.presumo.util.log.Logger;
25 import com.presumo.util.log.LoggerFactory;
26
27 import java.io.DataInput JavaDoc;
28 import java.io.DataOutput JavaDoc;
29 import java.io.EOFException JavaDoc;
30 import java.io.IOException JavaDoc;
31
32 import java.util.HashSet JavaDoc;
33 import java.util.LinkedList JavaDoc;
34 import java.util.ListIterator JavaDoc;
35
36
37 /**
38  * Represents the logic to write an read a DELETE entry from the log file.
39  *
40  */

41 class LogFileEntryDelete extends LogFileEntry
42 {
43
44   private String JavaDoc [] keys_to_delete;
45
46
47     /////////////////////////////////////////////////////////////////////////
48
// Constructors //
49
/////////////////////////////////////////////////////////////////////////
50

51   LogFileEntryDelete()
52   {
53     this(null);
54   }
55
56   LogFileEntryDelete(String JavaDoc [] keys_to_delete)
57   {
58     this.keys_to_delete = keys_to_delete;
59   }
60
61     /////////////////////////////////////////////////////////////////////////
62
// Package Methods //
63
/////////////////////////////////////////////////////////////////////////
64

65   boolean writeAndProcess(LinkedList JavaDoc mainQueue,
66                           LinkedList JavaDoc pendingDelete,
67                           HashSet JavaDoc persistent,
68                           DataOutput JavaDoc out) throws IOException JavaDoc
69   {
70     try {
71       logger.entry("writeAndProcess");
72
73       int num_persistent = 0;
74       for (int i = 0; i < keys_to_delete.length; i++) {
75         if (persistent.contains(keys_to_delete[i]))
76           num_persistent++;
77       }
78
79       if (num_persistent == 0) {
80         restore(mainQueue, pendingDelete, persistent);
81         return false;
82       }
83
84       out.writeInt(DELETE);
85       out.writeInt(num_persistent);
86       for (int i = 0 ; i < keys_to_delete.length; i++) {
87         String JavaDoc key = keys_to_delete[i];
88         if (persistent.contains(key)) {
89           if (logger.isDebugEnabled()) {
90             logger.debug("Writing KEY:"+key);
91           }
92           out.writeUTF(key);
93         }
94       }
95
96       restore(mainQueue,pendingDelete,persistent);
97       return true;
98     }
99     finally {
100       logger.exit("writeAndProcess");
101     }
102   }
103
104
105   void read(DataInput JavaDoc in) throws IOException JavaDoc, EOFException JavaDoc
106   {
107     try {
108       logger.entry("read");
109
110       String JavaDoc [] temp = new String JavaDoc[in.readInt()];
111       if (logger.isDebugEnabled()) {
112         logger.debug("Reading "+temp.length+" entries");
113       }
114
115       for (int i = 0 ; i < temp.length; i++) {
116         temp[i] = in.readUTF();
117       }
118       this.keys_to_delete = temp;
119     }
120     finally {
121       logger.exit("read");
122     }
123   }
124
125
126
127   void restore(LinkedList JavaDoc mainQueue,
128                LinkedList JavaDoc pendingDelete,
129                HashSet JavaDoc persistent)
130   {
131     HashSet JavaDoc to_delete = new HashSet JavaDoc(keys_to_delete.length*4/3+1);
132     for (int i = 0; i < keys_to_delete.length; i++) {
133       if (!to_delete.add(keys_to_delete[i])) {
134         logger.warn("Duplicate request for deletion of "+keys_to_delete[i]);
135       }
136     }
137
138     ListIterator JavaDoc temp = pendingDelete.listIterator(0);
139     while (temp.hasNext() && to_delete.size() > 0) {
140       JmsMessage val = (JmsMessage)temp.next();
141       if (to_delete.contains(val.getJMSMessageID())) {
142         to_delete.remove(val.getJMSMessageID());
143         temp.remove();
144         persistent.remove(val.getJMSMessageID());
145       }
146     }
147
148     if (to_delete.size() > 0) {
149       Object JavaDoc val = to_delete.iterator().next();
150       logger.warn("Request for deletion of key which is not present: "+val);
151     }
152   }
153
154
155
156   ////////////////////////////// Misc stuff ////////////////////////////////
157
private static Logger logger =
158     LoggerFactory.getLogger(LogFileEntryDelete.class, Resources.getBundle());
159   ///////////////////////////////////////////////////////////////////////////
160

161 }
162
Popular Tags