    001/*
    002 * Copyright (c) 2007-2016 Concurrent, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.stats.process;
    022
    023import java.util.Collection;
    024import java.util.Collections;
    025import java.util.HashSet;
    026import java.util.Map;
    027import java.util.Set;
    028
    029import cascading.flow.process.ProcessFlowStep;
    030import cascading.management.state.ClientState;
    031import cascading.stats.FlowStepStats;
    032
    033/**
    034 * ProcessStepStats is an implementation of FlowStepStats used in non-hadoop based flows like ProcessFlow.
    035 */
    036public class ProcessStepStats extends FlowStepStats
    037  {
    038  /**
    039   * The counters of the step as a Map.
    040   */
    041  private final Map<String, Map<String, Long>> counters;
    042  private final long lastFetch;
    043
    044  /**
    045   * Constructs a new ProcessStepStats instance.
    046   *
    047   * @param clientState
    048   * @param counters
    049   * @param step
    050   */
    051  public ProcessStepStats( ClientState clientState, Map<String, Map<String, Long>> counters, ProcessFlowStep step )
    052    {
    053    super( step, clientState );
    054    this.counters = counters;
    055
    056    lastFetch = this.counters != null ? System.currentTimeMillis() : -1;
    057    }
    058
    059  @Override
    060  public void recordChildStats()
    061    {
    062
    063    }
    064
    065  @Override
    066  public String getProcessStepID()
    067    {
    068    return null;
    069    }
    070
    071  @Override
    072  public long getLastSuccessfulCounterFetchTime()
    073    {
    074    return lastFetch;
    075    }
    076
    077  @Override
    078  public Collection<String> getCounterGroups()
    079    {
    080    return counters.keySet();
    081    }
    082
    083  @Override
    084  public Collection<String> getCountersFor( String group )
    085    {
    086    Map<String, Long> groupCollection = counters.get( group );
    087
    088    if( groupCollection == null )
    089      return Collections.emptySet();
    090
    091    return groupCollection.keySet();
    092    }
    093
    094  @Override
    095  public long getCounterValue( Enum counter )
    096    {
    097    Map<String, Long> counterMap = counters.get( counter.getDeclaringClass().getName() );
    098
    099    String counterString = counter.toString();
    100
    101    if( counterMap == null || !counterMap.containsKey( counterString ) )
    102      return 0;
    103
    104    return counterMap.get( counterString );
    105    }
    106
    107  @Override
    108  public long getCounterValue( String group, String counter )
    109    {
    110    Map<String, Long> counterMap = counters.get( group );
    111
    112    if( counterMap == null || !counterMap.containsKey( counter ) )
    113      return 0;
    114
    115    return counterMap.get( counter );
    116    }
    117
    118  @Override
    119  public void captureDetail()
    120    {
    121
    122    }
    123
    124  @Override
    125  public void captureDetail( Type depth )
    126    {
    127
    128    }
    129
    130  @Override
    131  public Collection<String> getCounterGroupsMatching( String regex )
    132    {
    133    Collection<String> counters = getCounterGroups();
    134
    135    Set<String> results = new HashSet<String>();
    136
    137    for( String counter : counters )
    138      {
    139      if( counter.matches( regex ) )
    140        results.add( counter );
    141      }
    142
    143    return Collections.unmodifiableCollection( results );
    144    }
    145
    146  @Override
    147  public Collection getChildren()
    148    {
    149    return Collections.emptyList();
    150    }
    151  }