1 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 ; 28 import java.io.DataOutput ; 29 import java.io.EOFException ; 30 import java.io.IOException ; 31 32 import java.util.HashSet ; 33 import java.util.LinkedList ; 34 import java.util.ListIterator ; 35 36 37 41 class LogFileEntryDelete extends LogFileEntry 42 { 43 44 private String [] keys_to_delete; 45 46 47 51 LogFileEntryDelete() 52 { 53 this(null); 54 } 55 56 LogFileEntryDelete(String [] keys_to_delete) 57 { 58 this.keys_to_delete = keys_to_delete; 59 } 60 61 65 boolean writeAndProcess(LinkedList mainQueue, 66 LinkedList pendingDelete, 67 HashSet persistent, 68 DataOutput out) throws IOException 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 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 in) throws IOException , EOFException 106 { 107 try { 108 logger.entry("read"); 109 110 String [] temp = new String [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 mainQueue, 128 LinkedList pendingDelete, 129 HashSet persistent) 130 { 131 HashSet to_delete = new HashSet (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 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 val = to_delete.iterator().next(); 150 logger.warn("Request for deletion of key which is not present: "+val); 151 } 152 } 153 154 155 156 private static Logger logger = 158 LoggerFactory.getLogger(LogFileEntryDelete.class, Resources.getBundle()); 159 161 } 162 | Popular Tags |