All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.datarouter.gcp.spanner.field.SpannerFieldCodecRegistry Maven / Gradle / Ivy

The newest version!
/*
 * Copyright © 2009 HotPads ([email protected])
 *
 * 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 io.datarouter.gcp.spanner.field;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import io.datarouter.gcp.spanner.field.array.SpannerByteArrayEncodedFieldCodec;
import io.datarouter.gcp.spanner.field.array.SpannerByteArrayFieldCodec;
import io.datarouter.gcp.spanner.field.date.SpannerInstantFieldCodec;
import io.datarouter.gcp.spanner.field.date.SpannerLocalDateFieldCodec;
import io.datarouter.gcp.spanner.field.date.SpannerLocalDateTimeFieldCodec;
import io.datarouter.gcp.spanner.field.date.SpannerMilliTimestampFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerBooleanFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerDoubleFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerFloatFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerIntegerEncodedFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerIntegerFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerLongEncodedFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerLongFieldCodec;
import io.datarouter.gcp.spanner.field.primitive.SpannerShortFieldCodec;
import io.datarouter.gcp.spanner.field.string.SpannerStringEncodedFieldCodec;
import io.datarouter.gcp.spanner.field.string.SpannerStringFieldCodec;
import io.datarouter.model.field.Field;
import io.datarouter.model.field.imp.LocalDateField;
import io.datarouter.model.field.imp.StringEncodedField;
import io.datarouter.model.field.imp.StringField;
import io.datarouter.model.field.imp.array.ByteArrayEncodedField;
import io.datarouter.model.field.imp.array.ByteArrayField;
import io.datarouter.model.field.imp.comparable.BooleanField;
import io.datarouter.model.field.imp.comparable.DoubleField;
import io.datarouter.model.field.imp.comparable.FloatField;
import io.datarouter.model.field.imp.comparable.InstantField;
import io.datarouter.model.field.imp.comparable.IntegerEncodedField;
import io.datarouter.model.field.imp.comparable.IntegerField;
import io.datarouter.model.field.imp.comparable.LongEncodedField;
import io.datarouter.model.field.imp.comparable.LongField;
import io.datarouter.model.field.imp.comparable.MilliTimestampEncodedField;
import io.datarouter.model.field.imp.comparable.ShortField;
import io.datarouter.model.field.imp.custom.LocalDateTimeField;
import io.datarouter.util.lang.ReflectionTool;

public class SpannerFieldCodecRegistry implements SpannerFieldCodecs{

	private final Map>,Class>> codecByFieldClass;

	public SpannerFieldCodecRegistry(){
		codecByFieldClass = new HashMap<>();

		//simple
		addCodec(StringField.class, SpannerStringFieldCodec.class);
		addCodec(BooleanField.class, SpannerBooleanFieldCodec.class);
		addCodec(DoubleField.class, SpannerDoubleFieldCodec.class);
		addCodec(FloatField.class, SpannerFloatFieldCodec.class);
		addCodec(IntegerField.class, SpannerIntegerFieldCodec.class);
		addCodec(LongField.class, SpannerLongFieldCodec.class);
		addCodec(ShortField.class, SpannerShortFieldCodec.class);

		//encoded
		addCodec(IntegerEncodedField.class, SpannerIntegerEncodedFieldCodec.class);
		addCodec(LongEncodedField.class, SpannerLongEncodedFieldCodec.class);
		addCodec(ByteArrayEncodedField.class, SpannerByteArrayEncodedFieldCodec.class);
		addCodec(StringEncodedField.class, SpannerStringEncodedFieldCodec.class);

		//time
		addCodec(InstantField.class, SpannerInstantFieldCodec.class);
		addCodec(LocalDateField.class, SpannerLocalDateFieldCodec.class);
		addCodec(LocalDateTimeField.class, SpannerLocalDateTimeFieldCodec.class);
		addCodec(MilliTimestampEncodedField.class, SpannerMilliTimestampFieldCodec.class);

		//array
		addCodec(ByteArrayField.class, SpannerByteArrayFieldCodec.class);
	}

	public ,
			C extends SpannerBaseFieldCodec>
	SpannerFieldCodecRegistry addCodec(Class fieldClass, Class codecClass){
		codecByFieldClass.put(fieldClass, codecClass);
		return this;
	}

	@Override
	public SpannerBaseFieldCodec createCodec(Field field){
		Class> spannerCodecClass = codecByFieldClass.get(field.getClass());
		if(spannerCodecClass == null){
			String message = String.format("unkown field class=%s", field.getClass().getCanonicalName());
			throw new IllegalArgumentException(message);
		}
		return ReflectionTool.createWithParameters(
				spannerCodecClass,
				Collections.singletonList(field));
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy