content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you 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.apache.apex.examples.machinedata.operator;
  
  import java.util.HashMap;
  import java.util.Map;
  
  import org.apache.apex.examples.machinedata.data.AverageData;
  import org.apache.apex.examples.machinedata.data.MachineInfo;
  import org.apache.apex.examples.machinedata.data.MachineKey;
  import org.apache.apex.malhar.lib.util.KeyHashValPair;
  
  import com.datatorrent.api.DefaultInputPort;
  import com.datatorrent.api.DefaultOutputPort;
  
  import com.datatorrent.common.util.BaseOperator;
  
  /**
   * This class calculates the partial sum and count for tuples generated by upstream Operator
   * <p> MachineInfoAveragingPrerequisitesOperator class. </p>
   *
   * @since 0.3.5
   */
  public class MachineInfoAveragingPrerequisitesOperator extends BaseOperator
  {
  
    // Aggregate sum of all values seen for a key.
    private Map<MachineKey, AverageData> sums = new HashMap<>();
  
    public final transient DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>> outputPort = new DefaultOutputPort<KeyHashValPair<MachineKey, AverageData>>()
    {
      @Override
      public Unifier<KeyHashValPair<MachineKey, AverageData>> getUnifier()
      {
        MachineInfoAveragingUnifier unifier = new MachineInfoAveragingUnifier();
        return unifier;
      }
    };
  
    public transient DefaultInputPort<MachineInfo> inputPort = new DefaultInputPort<MachineInfo>()
    {
  
      @Override
      public void process(MachineInfo tuple)
      {
        MachineKey key = tuple.getMachineKey();
        AverageData averageData = sums.get(key);
        if (averageData == null) {
          averageData = new AverageData(tuple.getCpu(), tuple.getHdd(), tuple.getRam(), 1);
          sums.put(key, averageData);
        } else {
          averageData.setCpu(averageData.getCpu() + tuple.getCpu());
          averageData.setRam(averageData.getRam() + tuple.getRam());
          averageData.setHdd(averageData.getHdd() + tuple.getHdd());
          averageData.setCount(averageData.getCount() + 1);
        }
      }
    };
  
    @Override
    public void endWindow()
    {
  
      for (Map.Entry<MachineKey, AverageData> entry : sums.entrySet()) {
        if (outputPort.isConnected()) {
          outputPort.emit(new KeyHashValPair<>(entry.getKey(), entry.getValue()));
        }
      }
      sums.clear();
    }
  
  }
  