package logdruid.engine; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import org.apache.log4j.Logger; import logdruid.data.Source; import logdruid.data.mine.ReportData; import logdruid.data.mine.ReportItem; import logdruid.data.record.Recording; import logdruid.data.record.RecordingItem; import logdruid.data.record.ReportRecording; public class ReportProcessor implements Runnable { private final BlockingQueue<ReportItem> queue; private ReportData reportData; private static Logger logger = Logger.getLogger(ReportProcessor.class.getName()); private int count2 = 0; public ReportProcessor(BlockingQueue<ReportItem> queue1, ReportData repData) { queue = queue1; reportData = repData; } public void run() { while (true) { try { consume(queue.take()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void consume(ReportItem reportItem) { count2++; if (count2 >= 10000) { logger.debug("consumed 10k"); count2 = 0; } ReportRecording rec = reportItem.getRecording(); Matcher matcher2 = reportItem.getMatcher(); Source source = reportItem.getSource(); mapCheck(source); int count = 0; if (((ReportRecording) rec).getSubType().equals("histogram") && rec.getIsActive()) { List<Object> temp = new ArrayList<Object>(); Iterator<RecordingItem> recItemIte2 = rec.getRecordingItem().iterator(); while (recItemIte2.hasNext()) { RecordingItem recItem2 = recItemIte2.next(); if (recItem2.isSelected()) { try { temp.add(matcher2.group(count + 1)); } catch (StringIndexOutOfBoundsException siobe) { logger.debug("not matched: " + rec.getName() + reportItem.getLine()); temp.add(""); } catch (IllegalStateException e) { logger.debug("not matched2: " + rec.getName() + reportItem.getLine()); temp.add(""); } } count++; } Map<List<Object>, Long> occMap = reportData.occurenceReport.get(source).get(rec); if (occMap == null) { reportData.occurenceReport.get(source).put(rec, new ConcurrentHashMap<List<Object>, Long>()); occMap = reportData.occurenceReport.get(source).get(rec); } synchronized (occMap) { Object occ = occMap.get(temp); if (occ == null) { occMap.put(temp, (long) 1); } else { occMap.put(temp, (long) occ + 1); } } } else if (((ReportRecording) rec).getSubType().equals("top100") && rec.getIsActive()) { double itemIndex = 0; SortedMap<Double, List<Object>> t100 = reportData.top100Report.get(source).get(rec); if (t100 == null) { reportData.top100Report.get(source).put(rec, Collections.synchronizedSortedMap(new TreeMap<Double, List<Object>>())); t100 = reportData.top100Report.get(source).get(rec); } try { itemIndex = (double) Double.valueOf(matcher2.group(((ReportRecording) rec).getTop100RecordID() + 1)); } catch (NullPointerException npe) { // nothing } catch (NumberFormatException nfe) { // nothing logger.info(matcher2.group(0)); // logger.info(matcher2.group(((ReportRecording) // rec).getTop100RecordID() + 1)); } synchronized (t100) { if (t100.size() < 100) { List<Object> temp = new ArrayList<Object>(); Iterator<RecordingItem> recItemIte2 = rec.getRecordingItem().iterator(); while (recItemIte2.hasNext()) { RecordingItem recItem2 = recItemIte2.next(); if (recItem2.isSelected()) { if (recItem2.getProcessingType().equals("top100")) { itemIndex = (double) Double.valueOf(matcher2.group(count + 1)); } else { temp.add(matcher2.group(count + 1)); } } count++; } t100.put(itemIndex, temp); } else if (t100.size() == 100) { if (itemIndex > t100.firstKey()) { List<Object> temp = new ArrayList<Object>(); Iterator<RecordingItem> recItemIte2 = rec.getRecordingItem().iterator(); while (recItemIte2.hasNext()) { RecordingItem recItem2 = recItemIte2.next(); if (recItem2.isSelected()) { if (recItem2.getProcessingType().equals("top100")) { itemIndex = (double) Double.valueOf(matcher2.group(count + 1)); } else { temp.add(matcher2.group(count + 1)); } } count++; } t100.remove(t100.firstKey()); t100.put(itemIndex, temp); } } } } else if (((ReportRecording) rec).getSubType().equals("sum") && rec.getIsActive()) { double itemIndex = 0; List<Object> temp = new ArrayList<Object>(); Iterator<RecordingItem> recItemIte2 = rec.getRecordingItem().iterator(); while (recItemIte2.hasNext()) { RecordingItem recItem2 = recItemIte2.next(); if (recItem2.isSelected()) { if (recItem2.getProcessingType().equals("sum")) { itemIndex = (double) Double.valueOf(matcher2.group(count + 1)); } else { temp.add(matcher2.group(count + 1)); } } count++; } Map<List<Object>, Double> sumMap = reportData.sumReport.get(source).get(rec); if (sumMap == null) { reportData.sumReport.get(source).put(rec, new ConcurrentHashMap<List<Object>, Double>()); sumMap = reportData.sumReport.get(source).get(rec); } synchronized (sumMap) { Object sum = sumMap.get(temp); if (sum == null) { sumMap.put(temp, (double) itemIndex); } else { sumMap.put(temp, (double) sum + itemIndex); } } } } // Check that a key exists in the map for the source private void mapCheck(Source source) { if (!ReportData.occurenceReport.containsKey(source)) { ReportData.occurenceReport.put(source, new ConcurrentHashMap<Recording, Map<List<Object>, Long>>()); } if (!ReportData.top100Report.containsKey(source)) { ReportData.top100Report.put(source, new ConcurrentHashMap<Recording, SortedMap<Double, List<Object>>>()); } if (!ReportData.sumReport.containsKey(source)) { ReportData.sumReport.put(source, new ConcurrentHashMap<Recording, Map<List<Object>, Double>>()); } } }