/******************************************************************************* * Copyright (c) 2013 GigaSpaces Technologies Ltd. All rights reserved * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. *******************************************************************************/ package org.cloudifysource.rest.events; import com.gigaspaces.log.LogEntry; import com.gigaspaces.log.LogEntryMatcher; import org.cloudifysource.dsl.rest.response.DeploymentEvent; import org.cloudifysource.dsl.rest.response.DeploymentEvents; import java.text.MessageFormat; import java.util.List; import static com.gigaspaces.log.LogEntryMatchers.regex; /** * Created with IntelliJ IDEA. User: elip Date: 5/16/13 Time: 10:47 AM <br/> * <br/> * * Utility class for events related operations. mainly the translation of logs to events. */ public final class EventsUtils { private EventsUtils() { } private static final String USM_EVENT_LOGGER_NAME = ".*.USMEventLogger.*"; /** * Given a log entry, translate to event. * * @param logEntry * The log entry. * @param hostName * The host name. * @param hostAddress * The host address. * @return The event. */ public static DeploymentEvent logToEvent(final LogEntry logEntry, final String hostName, final String hostAddress) { String text = logEntry.getText(); String[] split = text.split(" - "); if (split.length < 2) { throw new IllegalArgumentException("Expected a separator (' - ') in USM log entry: " + text); } String textWithoutLogger = split[1]; String actualEvent = textWithoutLogger.substring(textWithoutLogger.indexOf(".") + 1); DeploymentEvent event = new DeploymentEvent(); event.setDescription("[" + hostName + "/" + hostAddress + "] - " + actualEvent); return event; } /** * Creates a matcher for * {@link org.openspaces.admin.gsc.GridServiceContainer#logEntries(com.gigaspaces.log.LogEntryMatcher)}. This * matcher will find USM related event only using the {@code USM_EVENT_LOGGER_NAME} regex. * * @return The log entry matcher. */ public static LogEntryMatcher createUSMEventLoggerMatcher() { final String regex = MessageFormat.format(USM_EVENT_LOGGER_NAME, new Object() { }); return regex(regex); } /** * Given a set of events and indices, extract only events who's index is in range. * * @param events * The events set. * @param from * The start index. * @param to * The end index. * @return The requested events. */ public static DeploymentEvents extractDesiredEvents(final DeploymentEvents events, final int from, final int to) { DeploymentEvents desiredEvents = new DeploymentEvents(); for (int i = from; i <= to; i++) { List<DeploymentEvent> serviceDeploymentEvents = events.getEvents(); DeploymentEvent serviceDeploymentEvent = retrieveEventWithIndex(i, serviceDeploymentEvents); if (serviceDeploymentEvent != null) { desiredEvents.getEvents().add(serviceDeploymentEvent); } } return desiredEvents; } /** * Retrieves an event with a curtain index from a list of events. * * @param i * The index. * @param serviceDeploymentEvents * The events. * @return a {@link DeploymentEvent} if found, null otherwise. */ public static DeploymentEvent retrieveEventWithIndex(final int i, final List<DeploymentEvent> serviceDeploymentEvents) { for (DeploymentEvent event1 : serviceDeploymentEvents) { if (event1.getIndex() == i) { return event1; } } return null; } /** * Given a set of events and indices, check if all index range of events is present. i.e if events contains 1,2,3 * and from=1 and to=4, this will return false. you get the idea. * * @param events * The events set. * @param from * The start index. * @param to * The end index. * @return true if all events in the range are present. false otherwise. */ public static boolean eventsPresent(final DeploymentEvents events, final int from, final int to) { for (int i = from; i <= to; i++) { DeploymentEvent event = retrieveEventWithIndex(i, events.getEvents()); if (event == null) { return false; } } return true; } /** * * @return The id of the current thread. */ public static String getThreadId() { return "[" + Thread.currentThread().getName() + "][" + Thread.currentThread().getId() + "] - "; } }