/*
 * 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.geode.internal.cache.execute;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import org.apache.geode.cache.execute.Function;
import org.apache.geode.cache.execute.FunctionException;
import org.apache.geode.cache.execute.ResultCollector;
import org.apache.geode.distributed.DistributedMember;

/**
 * Default implementation of ResultCollector interface. DefaultResultCollector gathers result from
 * all the function execution nodes<br>
 * Using a custom ResultCollector a user can sort/aggregate the result. This implementation stores
 * the result in a List. The size of the list will be same as the no of nodes on which a function
 * got executed
 *
 * @since GemFire 6.0
 *
 */
public class DefaultResultCollector implements ResultCollector {

  private ArrayList<Object> resultList = new ArrayList<Object>();

  public DefaultResultCollector() {}

  /**
   * Adds a single function execution result from a remote node to the ResultCollector
   *
   */
  @Override
  public synchronized void addResult(DistributedMember distributedMember,
      Object resultOfSingleExecution) {
    this.resultList.add(resultOfSingleExecution);
  }

  /**
   * Waits if necessary for the computation to complete, and then retrieves its result.<br>
   * If {@link Function#hasResult()} is false, upon calling {@link ResultCollector#getResult()}
   * throws {@link FunctionException}.
   *
   * @return the Object computed result
   * @throws FunctionException if something goes wrong while retrieving the result
   */
  @Override
  public Object getResult() throws FunctionException {
    return this.resultList; // this is full result
  }

  /**
   * Call back provided to caller, which is called after function execution is complete and caller
   * can retrieve results using {@link ResultCollector#getResult()}
   *
   */
  @Override
  public void endResults() {}

  /**
   * Waits if necessary for at most the given time for the computation to complete, and then
   * retrieves its result, if available. <br>
   * If {@link Function#hasResult()} is false, upon calling {@link ResultCollector#getResult()}
   * throws {@link FunctionException}.
   *
   * @param timeout the maximum time to wait
   * @param unit the time unit of the timeout argument
   * @return Object computed result
   * @throws FunctionException if something goes wrong while retrieving the result
   */
  @Override
  public Object getResult(long timeout, TimeUnit unit) throws FunctionException {
    return this.resultList;
  }

  /**
   * GemFire will invoke this method before re-executing function (in case of Function Execution HA)
   * This is to clear the previous execution results from the result collector
   *
   */
  @Override
  public void clearResults() {
    this.resultList.clear();
  }
}
