/*
* Copyright © 2016 Cask Data, 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 co.cask.cdap.etl.batch.conversion;
import co.cask.cdap.api.data.format.StructuredRecord;
import co.cask.cdap.etl.batch.StructuredRecordWritable;
import com.google.common.collect.ImmutableMap;
import org.apache.hadoop.io.BooleanWritable;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import java.util.Map;
import javax.annotation.Nullable;
/**
* Functions to convert common classes to their WritableComparable equivalent and vice versa.
*/
public class WritableConversions {
// classname -> function for functions that transform common classes that should be transformed into classes usable
// as mapper keys or values.
private static final Map<String, WritableConversion<?, ?>> CONVERSIONS;
static {
ImmutableMap.Builder<String, WritableConversion<?, ?>> builder = ImmutableMap.builder();
builder.put(StructuredRecord.class.getName(),
new WritableConversion<StructuredRecord, StructuredRecordWritable>() {
@Override
public StructuredRecordWritable toWritable(StructuredRecord val) {
return new StructuredRecordWritable(val);
}
@Override
public StructuredRecord fromWritable(StructuredRecordWritable val) {
return val.get();
}
});
builder.put(String.class.getName(),
new WritableConversion<String, Text>() {
@Override
public Text toWritable(String val) {
return new Text(val);
}
@Override
public String fromWritable(Text val) {
return val.toString();
}
});
builder.put(Integer.class.getName(),
new WritableConversion<Integer, IntWritable>() {
@Override
public IntWritable toWritable(Integer val) {
return new IntWritable(val);
}
@Override
public Integer fromWritable(IntWritable val) {
return val.get();
}
});
builder.put(Long.class.getName(),
new WritableConversion<Long, LongWritable>() {
@Override
public LongWritable toWritable(Long val) {
return new LongWritable(val);
}
@Override
public Long fromWritable(LongWritable val) {
return val.get();
}
});
builder.put(Float.class.getName(),
new WritableConversion<Float, FloatWritable>() {
@Override
public FloatWritable toWritable(Float val) {
return new FloatWritable(val);
}
@Override
public Float fromWritable(FloatWritable val) {
return val.get();
}
});
builder.put(Double.class.getName(),
new WritableConversion<Double, DoubleWritable>() {
@Override
public DoubleWritable toWritable(Double val) {
return new DoubleWritable(val);
}
@Override
public Double fromWritable(DoubleWritable val) {
return val.get();
}
});
builder.put(Boolean.class.getName(),
new WritableConversion<Boolean, BooleanWritable>() {
@Override
public BooleanWritable toWritable(Boolean val) {
return new BooleanWritable(val);
}
@Override
public Boolean fromWritable(BooleanWritable val) {
return val.get();
}
});
builder.put(byte[].class.getName(),
new WritableConversion<byte[], BytesWritable>() {
@Override
public BytesWritable toWritable(byte[] val) {
return new BytesWritable(val);
}
@Override
public byte[] fromWritable(BytesWritable val) {
return val.getBytes();
}
});
CONVERSIONS = builder.build();
}
/**
* Get the conversion functions to and from the WritableComparable for the specified class.
* Returns null if none exists.
*
* @param className the name of the class to convert to/from a WritableComparable
* @return conversion functions to and from the WritableComparable for the specified class
*/
@Nullable
public static <KEY, VAL extends Writable> WritableConversion<KEY, VAL> getConversion(String className) {
//noinspection unchecked
return (WritableConversion<KEY, VAL>) CONVERSIONS.get(className);
}
private WritableConversions() {
// no-op to prevent instantiation of a helper class
}
}