| /* |
| * 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(); |
| } |
| } |