blob: 259be9e0e0b1a75ce04b1aaa3c81e6394bd0deab [file] [log] [blame]
/*
* 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.giraph.block_app.framework.api;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Class that contains references to Block Api objects.
*
* One general use-case for this is for applications to indirectly get a handle
* on the Block Api objects and implement operations that (i) depend on the
* Block Api interfaces, (ii) are not in the context of a Piece when defined,
* and (iii) are in the context of a Piece when executed.
*
* To do this, as opposed to defining an application as a
* {@link org.apache.giraph.block_app.framework.block.Block}, define
* your application as a
* {@link org.apache.giraph.block_app.framework.block.BlockWithApiHandle}.
*
* NOTE: Depending on the context in which this class is used, some of the
* handles may not be set. For instance, the {@link masterApi} is not set when
* this is in the context of a worker. Trying to get access to a handle when
* it is not set will result in a runtime exception. Instead, you should first
* use methods like the {@link #isMasterApiSet()} to check.
*
* The *Api fields are transient as we do not need/want to serialize them. They
* will be set at the appropriate time by the framework.
*/
public class BlockApiHandle {
private transient BlockMasterApi masterApi;
private transient BlockWorkerReceiveApi workerReceiveApi;
private transient BlockWorkerSendApi workerSendApi;
private transient BlockWorkerContextReceiveApi workerContextReceiveApi;
private transient BlockWorkerContextSendApi workerContextSendApi;
public void setMasterApi(BlockMasterApi api) {
this.masterApi = api;
}
public void setWorkerReceiveApi(BlockWorkerReceiveApi api) {
this.workerReceiveApi = api;
}
public void setWorkerSendApi(BlockWorkerSendApi api) {
this.workerSendApi = api;
}
public void setWorkerContextReceiveApi(BlockWorkerContextReceiveApi api) {
this.workerContextReceiveApi = api;
}
public void setWorkerContextSendApi(BlockWorkerContextSendApi api) {
this.workerContextSendApi = api;
}
public boolean isMasterApiSet() {
return masterApi != null;
}
public boolean isWorkerReceiveApiSet() {
return workerReceiveApi != null;
}
public boolean isWorkerSendApiSet() {
return workerSendApi != null;
}
public boolean isWorkerContextReceiveApiSet() {
return workerContextReceiveApi != null;
}
public boolean isWorkerContextSendApiSet() {
return workerContextSendApi != null;
}
public BlockMasterApi getMasterApi() {
checkNotNull(masterApi,
"BlockMasterApi not valid in this context.");
return masterApi;
}
public BlockWorkerReceiveApi getWorkerReceiveApi() {
checkNotNull(workerReceiveApi,
"BlockWorkerReceiveApi not valid in this context.");
return workerReceiveApi;
}
public BlockWorkerSendApi getWorkerSendApi() {
checkNotNull(workerSendApi,
"BlockWorkerSendApi not valid in this context.");
return workerSendApi;
}
public BlockWorkerContextReceiveApi getWorkerContextReceiveApi() {
checkNotNull(workerContextReceiveApi,
"BlockWorkerContextReceiveApi not valid in this context");
return workerContextReceiveApi;
}
public BlockWorkerContextSendApi getWorkerContextSendApi() {
checkNotNull(workerContextSendApi,
"BlockWorkerContextSendApi not valid in this context");
return workerContextSendApi;
}
}