/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed 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 hydrograph.engine.cascading.assembly.context;
import cascading.tuple.Fields;
import cascading.tuple.TupleEntry;
import hydrograph.engine.cascading.assembly.handlers.FieldManupulatingHandler;
import hydrograph.engine.cascading.utilities.ReusableRowHelper;
import hydrograph.engine.cascading.utilities.TupleHelper;
import hydrograph.engine.expression.api.ValidationAPI;
import hydrograph.engine.transformation.userfunctions.base.ReusableRow;
import hydrograph.engine.utilities.UserClassLoader;
import java.util.ArrayList;
public class CustomHandlerContext<T> {
private ArrayList<T> transformInstances;
private ArrayList<ValidationAPI> exprValidationAPIList;
private String[] initialValues;
private Object[] accumulatorList;
private String exprCount;
private ArrayList<ReusableRow> inputRows;
private ArrayList<ReusableRow> outputRows;
private ReusableRow passthroughRow;
private ReusableRow mapRow;
private ReusableRow operationRow;
private Object userObject;
private TupleEntry outputTupleEntry;
/**
* Creates the {@code CustomHandlerContext} object. Initialized input fields
* row, output fields row, pass through fields row and map fields row. Sets
* the transform class names
*
* @param fieldManupulatingHandler
* @param transformClassNames
*/
public CustomHandlerContext(FieldManupulatingHandler fieldManupulatingHandler,
ArrayList<String> transformClassNames) {
this.outputTupleEntry = (TupleHelper.initializeTupleEntry(fieldManupulatingHandler.getOutputFields()));
initialize(fieldManupulatingHandler.getOperationInputFields(),
fieldManupulatingHandler.getOperationOutputFields(), fieldManupulatingHandler.getPassThroughFields(),
fieldManupulatingHandler.getMapSourceFields(), fieldManupulatingHandler.getOutputFields(),
transformClassNames, null);
}
public CustomHandlerContext(FieldManupulatingHandler fieldManupulatingHandler,
ArrayList<String> transformClassNames, ArrayList<ValidationAPI> exprValidationObject, String[] initialValues2, Object[] objects) {
this.outputTupleEntry = (TupleHelper.initializeTupleEntry(fieldManupulatingHandler.getOutputFields()));
this.accumulatorList = objects;
this.initialValues = initialValues2;
initialize(fieldManupulatingHandler.getOperationInputFields(),
fieldManupulatingHandler.getOperationOutputFields(), fieldManupulatingHandler.getPassThroughFields(),
fieldManupulatingHandler.getMapSourceFields(), fieldManupulatingHandler.getOutputFields(),
transformClassNames, exprValidationObject);
}
public CustomHandlerContext(FieldManupulatingHandler fieldManupulatingHandler,
ArrayList<String> transformClassNames, ArrayList<ValidationAPI> exprValidationObject, String exprCount) {
this.outputTupleEntry = (TupleHelper.initializeTupleEntry(fieldManupulatingHandler.getOutputFields()));
this.exprCount = exprCount;
initialize(fieldManupulatingHandler.getOperationInputFields(),
fieldManupulatingHandler.getOperationOutputFields(), fieldManupulatingHandler.getPassThroughFields(),
fieldManupulatingHandler.getMapSourceFields(), fieldManupulatingHandler.getOutputFields(),
transformClassNames, exprValidationObject);
}
public CustomHandlerContext(FieldManupulatingHandler fieldManupulatingHandler,
ArrayList<String> transformClassNames, ArrayList<ValidationAPI> exprValidationObject) {
this.outputTupleEntry = (TupleHelper.initializeTupleEntry(fieldManupulatingHandler.getOutputFields()));
initialize(fieldManupulatingHandler.getOperationInputFields(),
fieldManupulatingHandler.getOperationOutputFields(), fieldManupulatingHandler.getPassThroughFields(),
fieldManupulatingHandler.getMapSourceFields(), fieldManupulatingHandler.getOutputFields(),
transformClassNames, exprValidationObject);
}
public CustomHandlerContext(Fields inputFields, String transformClassName, ValidationAPI exprValidationAPI) {
ArrayList<Fields> inputs = null;
ArrayList<String> classNames = null;
ArrayList<ValidationAPI> exprValidationObjectList = null;
if (inputFields != null) {
inputs = new ArrayList<Fields>();
inputs.add(inputFields);
}
if (transformClassName != null) {
classNames = new ArrayList<String>();
classNames.add(transformClassName);
}
if (exprValidationAPI != null) {
exprValidationObjectList = new ArrayList<ValidationAPI>();
exprValidationObjectList.add(exprValidationAPI);
}
initialize(inputs, null, null, null, classNames, exprValidationObjectList);
}
public CustomHandlerContext(FieldManupulatingHandler fieldManupulatingHandler, String transformClassName) {
this.outputTupleEntry = (TupleHelper.initializeTupleEntry(fieldManupulatingHandler.getOutputFields()));
ArrayList<String> classNames = null;
if (transformClassName != null) {
classNames = new ArrayList<String>();
classNames.add(transformClassName);
}
initialize(fieldManupulatingHandler.getOperationInputFields(),
fieldManupulatingHandler.getOperationOutputFields(), fieldManupulatingHandler.getPassThroughFields(),
fieldManupulatingHandler.getMapSourceFields(), fieldManupulatingHandler.getOutputFields(), classNames,
null);
}
@SuppressWarnings("unchecked")
private void initialize(ArrayList<Fields> operationInputFields, ArrayList<Fields> operationOutputFields,
Fields passThrough, Fields mapSourceFields, ArrayList<String> transformClassNames,
ArrayList<ValidationAPI> exprValidationObjectList) {
transformInstances = new ArrayList<T>();
inputRows = new ArrayList<ReusableRow>();
outputRows = new ArrayList<ReusableRow>();
exprValidationAPIList = new ArrayList<ValidationAPI>();
if (exprValidationObjectList != null) {
for (ValidationAPI validationAPI : exprValidationObjectList)
exprValidationAPIList.add(validationAPI);
}
if (transformClassNames != null) {
for (String transformClassName : transformClassNames) {
transformInstances.add((T) UserClassLoader
.loadAndInitClass(transformClassName));
}
}
if (operationInputFields != null) {
for (Fields fields : operationInputFields) {
inputRows.add(new CascadingReusableRow(ReusableRowHelper.getLinkedSetFromFields(fields)));
}
}
if (operationOutputFields != null) {
for (Fields fields : operationOutputFields) {
outputRows.add(new CascadingReusableRow(ReusableRowHelper.getLinkedSetFromFields(fields)));
}
}
if (passThrough == null) {
passthroughRow = null;
} else {
passthroughRow = new CascadingReusableRow(ReusableRowHelper.getLinkedSetFromFields(passThrough));
}
if (mapSourceFields == null) {
mapRow = null;
} else {
mapRow = new CascadingReusableRow(ReusableRowHelper.getLinkedSetFromFields(mapSourceFields));
}
}
private void initialize(ArrayList<Fields> operationInputFields, ArrayList<Fields> operationOutputFields,
Fields passThrough, Fields mapSourceFields, Fields operationFields, ArrayList<String> transformClassNames,
ArrayList<ValidationAPI> exprValidationObjectList) {
initialize(operationInputFields, operationOutputFields, passThrough, mapSourceFields, transformClassNames,
exprValidationObjectList);
if (operationFields == null) {
operationRow = null;
} else {
operationRow = new CascadingReusableRow(ReusableRowHelper.getLinkedSetFromFields(operationFields));
}
}
public ArrayList<ValidationAPI> getExpressionInstancesList() {
return exprValidationAPIList;
}
public ValidationAPI getSingleExpressionInstances() {
if (exprValidationAPIList.size() > 0)
return exprValidationAPIList.get(0);
return null;
}
public T getTransformInstance(int index) {
return transformInstances.get(index);
}
public ArrayList<T> getTransformInstances() {
return transformInstances;
}
public ReusableRow getInputRow(int index) {
return this.inputRows.get(index);
}
public ReusableRow getOutputRow(int index) {
return this.outputRows.get(index);
}
public void setOutputRow(ReusableRow row) {
this.outputRows.add(0, row);
}
public ArrayList<ReusableRow> getAllOutputRow() {
return this.outputRows;
}
public ArrayList<ReusableRow> getAllinputRow() {
return this.inputRows;
}
public ReusableRow getPassThroughRow() {
return this.passthroughRow;
}
public ReusableRow getOperationRow() {
return this.operationRow;
}
public ReusableRow getSingleOutputRow() {
return this.getOutputRow(0);
}
public ReusableRow getSingleInputRow() {
return this.getInputRow(0);
}
public T getSingleTransformInstance() {
return this.getTransformInstance(0);
}
public void setUserObject(Object obj) {
this.userObject = obj;
}
public Object getUserObject() {
return userObject;
}
public TupleEntry getOutputTupleEntry() {
return outputTupleEntry;
}
public Object[] getAccumulatorList() {
return accumulatorList;
}
public void setAccumulatorList(Object[] accumulatorList) {
this.accumulatorList = accumulatorList;
}
public Object getAccumulatorValue(int index) {
Object obj = accumulatorList[index];
return obj;
}
public void setAccumulatorValue(Object accumulatorValue, int index) {
this.accumulatorList[index] = accumulatorValue;
}
public String[] getInitialValues() {
return initialValues;
}
public String getInitialValue(int index) {
String str = initialValues[index];
return str;
}
public String getExprCount() {
return exprCount;
}
/**
* @param transformInstances
* the transformInstances to set
*/
public void setTransformInstances(ArrayList<T> transformInstances) {
this.transformInstances = transformInstances;
}
/**
* @return the object of type {@link ReusableRow} containing only the source
* field names of the map fields
*/
public ReusableRow getMapRow() {
return mapRow;
}
}