blob: 955dce1766ccf2c3780d3ad6bd638afa5d0cbd59 [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.hadoop.examples.pi;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.examples.pi.math.ArithmeticProgression;
import org.apache.hadoop.examples.pi.math.Summation;
import org.apache.hadoop.io.WritableComparable;
/** A Writable class for Summation */
public final class SummationWritable implements WritableComparable<SummationWritable>, Container<Summation> {
private Summation sigma;
public SummationWritable() {}
SummationWritable(Summation sigma) {this.sigma = sigma;}
/** {@inheritDoc} */
@Override
public String toString() {return getClass().getSimpleName() + sigma;}
/** {@inheritDoc} */
@Override
public Summation getElement() {return sigma;}
/** Read sigma from conf */
public static Summation read(Class<?> clazz, Configuration conf) {
return Summation.valueOf(conf.get(clazz.getSimpleName() + ".sigma"));
}
/** Write sigma to conf */
public static void write(Summation sigma, Class<?> clazz, Configuration conf) {
conf.set(clazz.getSimpleName() + ".sigma", sigma.toString());
}
/** Read Summation from DataInput */
static Summation read(DataInput in) throws IOException {
final SummationWritable s = new SummationWritable();
s.readFields(in);
return s.getElement();
}
/** {@inheritDoc} */
@Override
public void readFields(DataInput in) throws IOException {
final ArithmeticProgression N = ArithmeticProgressionWritable.read(in);
final ArithmeticProgression E = ArithmeticProgressionWritable.read(in);
sigma = new Summation(N, E);
if (in.readBoolean()) {
sigma.setValue(in.readDouble());
}
}
/** Write sigma to DataOutput */
public static void write(Summation sigma, DataOutput out) throws IOException {
ArithmeticProgressionWritable.write(sigma.N, out);
ArithmeticProgressionWritable.write(sigma.E, out);
final Double v = sigma.getValue();
if (v == null)
out.writeBoolean(false);
else {
out.writeBoolean(true);
out.writeDouble(v);
}
}
/** {@inheritDoc} */
@Override
public void write(DataOutput out) throws IOException {
write(sigma, out);
}
/** {@inheritDoc} */
@Override
public int compareTo(SummationWritable that) {
return this.sigma.compareTo(that.sigma);
}
/** {@inheritDoc} */
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
else if (obj != null && obj instanceof SummationWritable) {
final SummationWritable that = (SummationWritable)obj;
return this.compareTo(that) == 0;
}
throw new IllegalArgumentException(obj == null? "obj == null":
"obj.getClass()=" + obj.getClass());
}
/** Not supported */
@Override
public int hashCode() {
throw new UnsupportedOperationException();
}
/** A writable class for ArithmeticProgression */
private static class ArithmeticProgressionWritable {
/** Read ArithmeticProgression from DataInput */
private static ArithmeticProgression read(DataInput in) throws IOException {
return new ArithmeticProgression(in.readChar(),
in.readLong(), in.readLong(), in.readLong());
}
/** Write ArithmeticProgression to DataOutput */
private static void write(ArithmeticProgression ap, DataOutput out
) throws IOException {
out.writeChar(ap.symbol);
out.writeLong(ap.value);
out.writeLong(ap.delta);
out.writeLong(ap.limit);
}
}
}