/***************************************************************************** * * Copyright (C) Zenoss, Inc. 2010-2011, all rights reserved. * * This content is made available according to terms specified in * License.zenoss under the directory where your Zenoss product is installed. * ****************************************************************************/ package org.zenoss.zep.dao.impl; import org.zenoss.protobufs.zep.Zep.Event; import org.zenoss.protobufs.zep.Zep.EventActor; import org.zenoss.zep.ClearFingerprintGenerator; import org.zenoss.zep.plugins.EventPreCreateContext; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; public class EventDaoUtils { /** * Default implementation of ClearFingerprintGenerator. */ public static final ClearFingerprintGenerator DEFAULT_GENERATOR = new ClearFingerprintGenerator() { @Override public String generateClearFingerprint(Event event) { final EventActor actor = event.getActor(); if (actor == null) { return null; } final String elementId = actor.getElementIdentifier(); final String subElementId = actor.getElementSubIdentifier(); final String subElementUuid = actor.getElementSubUuid(); final String eventKey = event.getEventKey(); final String eventClass = event.getEventClass(); // To clear an event, need a minimum of event class and element id specified. if (elementId.isEmpty() || eventClass.isEmpty()) { return null; } final char separator = '|'; final String hash; if (!subElementUuid.isEmpty()) { hash = join(separator, subElementUuid, eventClass, eventKey); } else { hash = join(separator, elementId, subElementId, eventClass, eventKey); } return hash; } @Override public List<String> generateClearFingerprints(Event event, Set<String> clearClasses) { final EventActor actor = event.getActor(); if (actor == null) { return Collections.emptyList(); } final String elementId = actor.getElementIdentifier(); final String subElementId = actor.getElementSubIdentifier(); final String subElementUuid = actor.getElementSubUuid(); final boolean hasSubElementUuid = !subElementUuid.isEmpty(); final String eventKey = event.getEventKey(); // To clear an event, need element id specified. if (elementId.isEmpty()) { return Collections.emptyList(); } final int listSize = (hasSubElementUuid) ? clearClasses.size() * 2 : clearClasses.size(); final List<String> clearFingerprints = new ArrayList<String>(listSize); final char separator = '|'; for (String clearClass : clearClasses) { // Create old-style clear hash to match events without UUID information clearFingerprints.add(join(separator, elementId, subElementId, clearClass, eventKey)); // Create new-style clear hash to match events with UUID information if (hasSubElementUuid) { clearFingerprints.add(join(separator, subElementUuid, clearClass, eventKey)); } } return clearFingerprints; } @Override public String toString() { return "DEFAULT_FINGERPRINT_GENERATOR"; } }; /** * Create a clear hash using the default ClearFingerprintGenerator. * * @param event Event to generate a clear hash for. * @return The clear hash. */ public static byte[] createClearHash(Event event) { return createClearHash(event, null); } /** * Create a clear hash using the specified ClearFingerprintGenerator. * @param event Event to generate a clear hash for. * @param generator Generator used to generate a clear fingerprint. * @return The clear hash. */ public static byte[] createClearHash(Event event, ClearFingerprintGenerator generator) { ClearFingerprintGenerator fingerprintGenerator = generator; if (fingerprintGenerator == null) { fingerprintGenerator = DEFAULT_GENERATOR; } final String fingerprint = fingerprintGenerator.generateClearFingerprint(event); return (fingerprint != null) ? DaoUtils.sha1(fingerprint) : null; } /** * Creates clear hashes for the specified event. Uses the clear classes and the fingerprint * generator specified in the {@link org.zenoss.zep.plugins.EventPreCreateContext} (or the default if the generator is null) * to create the clear hashes. * * @param event Clear event to generate clear hashes for. * @param context Event context containing the clear classes and the clear fingerprint * generator. * @return A list of clear hashes for the event. */ public static List<byte[]> createClearHashes(Event event, EventPreCreateContext context) { ClearFingerprintGenerator fingerprintGenerator = context.getClearFingerprintGenerator(); if (fingerprintGenerator == null) { fingerprintGenerator = DEFAULT_GENERATOR; } final List<String> clearFingerprints = fingerprintGenerator.generateClearFingerprints(event, context.getClearClasses()); if (clearFingerprints == null || clearFingerprints.isEmpty()) { return Collections.emptyList(); } final List<byte[]> clearHashes = new ArrayList<byte[]>(clearFingerprints.size()); for (String clearFingerprint : clearFingerprints) { clearHashes.add(DaoUtils.sha1(clearFingerprint)); } return clearHashes; } /** * Joins the specified strings using the character separator. * * @param separator Separator used to join strings. * @param args Strings to join. * @return A String delimited by the specified separator. */ public static String join(char separator, String... args) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.length; i++) { if (i > 0) { sb.append(separator); } sb.append(args[i]); } return sb.toString(); } }