/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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 com.asakusafw.testdriver.mapreduce.mock;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.hadoop.io.Writable;
import com.asakusafw.runtime.io.ModelInput;
import com.asakusafw.runtime.io.ModelOutput;
import com.asakusafw.runtime.model.DataModel;
import com.asakusafw.runtime.value.DateOption;
import com.asakusafw.runtime.value.DateTimeOption;
import com.asakusafw.runtime.value.IntOption;
import com.asakusafw.runtime.value.StringOption;
import com.google.common.base.Objects;
/**
* Mock data model class.
* @since 0.1.0
* @version 0.3.0
*/
public class MockData implements DataModel<MockData>, Writable {
private final IntOption intValue = new IntOption();
private final StringOption stringValue = new StringOption();
private final DateOption dateValue = new DateOption();
private final DateTimeOption datetimeValue = new DateTimeOption();
/**
* Puts values as {@link #getStringValueOption() string_value}.
* @param output the target output
* @param values the values to set
* @throws IOException if failed
*/
public static void put(ModelOutput<MockData> output, String... values) throws IOException {
put(output, 0, values);
}
/**
* Puts values as {@link #getStringValueOption() string_value}.
* @param output the target output
* @param offset starting ID number
* @param values the values to set
* @throws IOException if failed
* @since 0.1.1
*/
public static void put(ModelOutput<MockData> output, int offset, String... values) throws IOException {
Map<Integer, String> map = new LinkedHashMap<>();
for (String s : values) {
map.put(offset + map.size(), s);
}
put(output, map);
}
/**
* Puts values.
* @param output the target output
* @param entries {@code (int_value, string_value)} pairs
* @throws IOException if failed
*/
public static void put(ModelOutput<MockData> output, Map<Integer, String> entries) throws IOException {
MockData buf = new MockData();
for (Map.Entry<Integer, String> entry : entries.entrySet()) {
output.write(buf.set(entry.getKey(), entry.getValue()));
}
}
/**
* Collect values.
* @param input the target input
* @return {@code (int_value, string_value)} pairs
* @throws IOException if failed
*/
public static Map<Integer, String> collect(ModelInput<MockData> input) throws IOException {
MockData buf = new MockData();
Map<Integer, String> results = new LinkedHashMap<>();
while (input.readTo(buf)) {
results.put(buf.getKey(), buf.getValue());
}
return results;
}
/**
* Sets {@code (int_value, string_value)} pair.
* @param key the {@code int_value}
* @param value the {@code string_value}
* @return this
*/
@SuppressWarnings("deprecation")
public MockData set(int key, String value) {
intValue.modify(key);
stringValue.modify(value);
return this;
}
/**
* Returns the {@code int_value}.
* @return {@code int_value}
*/
public int getKey() {
return intValue.get();
}
/**
* Returns the {@code string_value}.
* @return {@code string_value}
*/
public String getValue() {
return stringValue.getAsString();
}
/**
* Returns the {@code int_value} as option.
* @return the option value
*/
public IntOption getIntValueOption() {
return intValue;
}
/**
* Returns the {@code string_value} as option.
* @return the option value
*/
public StringOption getStringValueOption() {
return stringValue;
}
/**
* Returns the {@code date_value} as option.
* @return the option value
*/
public DateOption getDateValueOption() {
return dateValue;
}
/**
* Returns the {@code datetime_value} as option.
* @return the option vaule
*/
public DateTimeOption getDatetimeValueOption() {
return datetimeValue;
}
@SuppressWarnings("deprecation")
@Override
public void reset() {
intValue.setNull();
stringValue.setNull();
dateValue.setNull();
datetimeValue.setNull();
}
@SuppressWarnings("deprecation")
@Override
public void copyFrom(MockData other) {
intValue.copyFrom(other.intValue);
stringValue.copyFrom(other.stringValue);
dateValue.copyFrom(other.dateValue);
datetimeValue.copyFrom(other.datetimeValue);
}
@Override
public void write(DataOutput out) throws IOException {
intValue.write(out);
stringValue.write(out);
dateValue.write(out);
datetimeValue.write(out);
}
@Override
public void readFields(DataInput input) throws IOException {
intValue.readFields(input);
stringValue.readFields(input);
dateValue.readFields(input);
datetimeValue.readFields(input);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Objects.hashCode(intValue);
result = prime * result + Objects.hashCode(stringValue);
result = prime * result + Objects.hashCode(dateValue);
result = prime * result + Objects.hashCode(datetimeValue);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MockData other = (MockData) obj;
if (!Objects.equal(intValue, other.intValue)) {
return false;
}
if (!Objects.equal(stringValue, other.stringValue)) {
return false;
}
if (!Objects.equal(dateValue, other.dateValue)) {
return false;
}
if (!Objects.equal(datetimeValue, other.datetimeValue)) {
return false;
}
return true;
}
@Override
public String toString() {
return String.format("{int=%s, string=%s, date=%s, datetime=%s}", //$NON-NLS-1$
intValue, stringValue, dateValue, datetimeValue);
}
}