| /* |
| * Copyright 1996-2011 Niclas Hedhman. |
| * |
| * 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.qi4j.library.alarm; |
| |
| import java.util.List; |
| import java.util.Map; |
| import org.qi4j.api.common.UseDefaults; |
| import org.qi4j.api.mixin.Mixins; |
| import org.qi4j.api.property.Property; |
| |
| /** |
| * History of an AlarmPoint. |
| * AlarmPoint system <i>should</i> implement <code>AlarmHistory</code> classes to |
| * record the events of an <code>AlarmPoint</code>. |
| * |
| */ |
| @Mixins( AlarmHistory.AlarmHistoryMixin.class ) |
| public interface AlarmHistory |
| { |
| |
| /** |
| * Returns the newest recorded <code>AlarmEvent</code>. |
| * |
| * @return the last AlarmEvent in the buffer. This is the newest event. |
| */ |
| AlarmEvent lastEvent(); |
| |
| /** |
| * Returns the oldest recorded <code>AlarmEvent</code>. |
| * |
| * @return the first AlarmEvent in the buffer. This is the oldest event. |
| */ |
| AlarmEvent firstEvent(); |
| |
| /** |
| * Returns the recorded <code>AlarmEvent</code> at the given position |
| * in the buffer. |
| * |
| * @param position the position in the buffer, counted from the beginning to obtain the AlarmEvent from. |
| * 0 means the first element. |
| * |
| * @return the recorded <code>AlarmEvent</code> at the given position in the buffer. |
| */ |
| AlarmEvent eventAt( int position ); |
| |
| /** |
| * Returns the recorded <code>AlarmEvent</code> at the given position |
| * in the buffer counted from the end. |
| * |
| * @param position the position in the buffer, counted from the end to obtain the AlarmEvent from. |
| * 0 means the last element. |
| * |
| * @return the recorded <code>AlarmEvent</code> at the given position in the buffer counted from the end. |
| */ |
| AlarmEvent eventAtEnd( int position ); |
| |
| /** |
| * Returns a <code>java.util.List</code> of all recorded <code>AlarmEvents</code>. |
| * |
| * @return a <code>java.util.List</code> of all recorded <code>AlarmEvents</code>. |
| */ |
| @UseDefaults |
| Property<List<AlarmEvent>> allAlarmEvents(); |
| |
| /** |
| * The maximum size of the history buffer. |
| * If the sizes shrinks, the oldest <code>AlarmEvents</code> should be removed |
| * so that the number of stored events are equal to the new <i>MaxSize</i>. |
| * |
| * @return The maxSize Property instance. |
| */ |
| @UseDefaults |
| Property<Integer> maxSize(); |
| |
| /** |
| * Returns all the Counters of triggers. |
| * Each time the <code>trigger()</code> method is called, |
| * a Counter is incremented. That means that after the first |
| * time the following the sequence is called |
| * <pre> |
| * <code>activate(); |
| * acknowledge(); |
| * deactivate(); |
| * </code></pre>, the Map contains |
| * <table summary="Triggers"> |
| * <tr><td>(String) activate</td><td>(Integer) 1</td></tr> |
| * <tr><td>(String) deactivate</td><td>(Integer) 1</td></tr> |
| * <tr><td>(String) acknowledge</td><td>(Integer) 1</td></tr> |
| * </table> |
| * |
| * @return all the Counters of triggers. |
| */ |
| @UseDefaults |
| Property<Map<String, Integer>> counters(); |
| |
| /** |
| * Resets all counters. |
| */ |
| void resetAllCounters(); |
| |
| /** |
| * Returns the Counter of activate triggers. |
| * This method will return the number of times the |
| * <code>activate()</code> method and the <code>trigger()</code> |
| * method with an activate trigger is called. |
| * |
| * @return the Counter of activate triggers. |
| */ |
| int activateCounter(); |
| |
| /** |
| * Resets the Activate counter. |
| */ |
| void resetActivateCounter(); |
| |
| void addEvent( AlarmEvent event, String trigger ); |
| |
| abstract class AlarmHistoryMixin |
| implements AlarmHistory |
| { |
| @Override |
| public AlarmEvent firstEvent() |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| if( eventList.isEmpty() ) |
| { |
| return null; |
| } |
| return eventList.get( 0 ); |
| } |
| |
| @Override |
| public AlarmEvent lastEvent() |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| if( eventList.isEmpty() ) |
| { |
| return null; |
| } |
| return eventList.get( eventList.size() - 1 ); |
| } |
| |
| @Override |
| public AlarmEvent eventAt( final int position ) |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| if( eventList.size() <= position || position < 0 ) |
| { |
| return null; |
| } |
| return eventList.get( position ); |
| } |
| |
| @Override |
| public AlarmEvent eventAtEnd( final int position ) |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| int size = eventList.size(); |
| if( size <= position || position < 0 ) |
| { |
| return null; |
| } |
| return eventList.get( size - position - 1 ); |
| } |
| |
| @Override |
| public void addEvent( AlarmEvent event, String trigger ) |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| eventList.add( event ); |
| purge(); |
| allAlarmEvents().set( eventList ); |
| Map<String, Integer> counters = counters().get(); |
| Integer counter = counters.get( trigger ); |
| if( counter == null ) |
| { |
| counter = 1; |
| } |
| else |
| { |
| counter = counter + 1; |
| } |
| counters.put( trigger, counter ); |
| counters().set( counters ); |
| } |
| |
| @Override |
| public String toString() |
| { |
| StringBuilder buf = new StringBuilder(); |
| buf.append( "history[maxsize=" ); |
| buf.append( maxSize().get() ); |
| buf.append( ", size=" ); |
| buf.append( allAlarmEvents().get().size() ); |
| |
| for( Map.Entry<String, Integer> entry : counters().get().entrySet() ) |
| { |
| String type = entry.getKey(); |
| Integer counts = entry.getValue(); |
| buf.append( ", " ); |
| buf.append( type ); |
| buf.append( "=" ); |
| buf.append( counts ); |
| } |
| buf.append( "]" ); |
| return buf.toString(); |
| } |
| |
| private void purge() |
| { |
| List<AlarmEvent> eventList = allAlarmEvents().get(); |
| Integer maxSize = maxSize().get(); |
| if( maxSize <= 0 ) |
| { |
| eventList.clear(); |
| } |
| |
| while( eventList.size() > maxSize ) |
| { |
| eventList.remove( 0 ); |
| } |
| } |
| |
| @Override |
| public void resetAllCounters() |
| { |
| Map<String, Integer> counters = counters().get(); |
| counters.clear(); |
| counters().set(counters); |
| } |
| |
| @Override |
| public int activateCounter() |
| { |
| Integer counter = counters().get().get( AlarmPoint.TRIGGER_ACTIVATE ); |
| if( counter == null ) |
| { |
| return 0; |
| } |
| return counter; |
| } |
| |
| @Override |
| public void resetActivateCounter() |
| { |
| Map<String, Integer> counters = counters().get(); |
| counters.remove( AlarmPoint.TRIGGER_ACTIVATE ); |
| counters().set( counters ); |
| } |
| } |
| } |