/*
*
* *
* * 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.usergrid.persistence.collection.serialization.impl;
import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
import org.apache.usergrid.persistence.core.astyanax.DynamicCompositeParserImpl;
import org.apache.usergrid.persistence.model.field.BooleanField;
import org.apache.usergrid.persistence.model.field.DoubleField;
import org.apache.usergrid.persistence.model.field.Field;
import org.apache.usergrid.persistence.model.field.FieldTypeName;
import org.apache.usergrid.persistence.model.field.FloatField;
import org.apache.usergrid.persistence.model.field.IntegerField;
import org.apache.usergrid.persistence.model.field.LongField;
import org.apache.usergrid.persistence.model.field.StringField;
import org.apache.usergrid.persistence.model.field.UUIDField;
import com.netflix.astyanax.model.CompositeParser;
import com.netflix.astyanax.model.DynamicComposite;
import com.netflix.astyanax.serializers.AbstractSerializer;
import com.netflix.astyanax.serializers.StringSerializer;
import com.netflix.astyanax.serializers.UUIDSerializer;
/**
* Serialize a unique field into a column name
*/
public class UniqueFieldEntrySerializer extends AbstractSerializer<UniqueFieldEntry> {
private static final UUIDSerializer UUID_SERIALIZER = UUIDSerializer.get();
private static final StringSerializer STRING_SERIALIZER = StringSerializer.get();
private static final UniqueFieldEntrySerializer INSTANCE = new UniqueFieldEntrySerializer();
@Override
public ByteBuffer toByteBuffer( final UniqueFieldEntry value ) {
final UUID version = value.getVersion();
final Field<?> field = value.getField();
final FieldTypeName fieldType = field.getTypeName();
final String fieldValue = field.getValue().toString().toLowerCase();
DynamicComposite composite = new DynamicComposite( );
//we want to sort ascending to descending by version
composite.addComponent( version, UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
composite.addComponent( field.getName(), STRING_SERIALIZER );
composite.addComponent( fieldValue, STRING_SERIALIZER );
composite.addComponent( fieldType.name() , STRING_SERIALIZER);
return composite.serialize();
}
@Override
public UniqueFieldEntry fromByteBuffer( final ByteBuffer byteBuffer ) {
final CompositeParser composite = new DynamicCompositeParserImpl( byteBuffer );
final UUID version = composite.readUUID();
final String name = composite.readString();
final String value = composite.readString();
final String typeString = composite.readString();
final FieldTypeName fieldType = FieldTypeName.valueOf( typeString );
final Field<?> field;
switch ( fieldType ) {
case BOOLEAN:
field = new BooleanField( name, Boolean.parseBoolean( value ) );
break;
case DOUBLE:
field = new DoubleField( name, Double.parseDouble( value ) );
break;
case FLOAT:
field = new FloatField( name, Float.parseFloat( value ));
break;
case INTEGER:
field = new IntegerField( name, Integer.parseInt( value ) );
break;
case LONG:
field = new LongField( name, Long.parseLong( value ) );
break;
case STRING:
field = new StringField( name, value );
break;
case UUID:
field = new UUIDField( name, UUID.fromString( value ) );
break;
default:
throw new RuntimeException( "Unknown unique field type" );
}
return new UniqueFieldEntry( version, field );
}
/**
* Get the singleton serializer
*/
public static UniqueFieldEntrySerializer get() {
return INSTANCE;
}
}