/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.infinispanremote.impl.schema;
import java.io.IOException;
import org.hibernate.ogm.datastore.infinispanremote.impl.protobuf.LongProtofieldAccessor;
import org.hibernate.ogm.datastore.infinispanremote.impl.protobuf.ProtofieldAccessor;
import org.hibernate.ogm.datastore.infinispanremote.impl.protobuf.StringProtofieldAccessor;
import org.hibernate.ogm.datastore.infinispanremote.impl.sequences.SequenceId;
import org.hibernate.ogm.model.key.spi.IdSourceKeyMetadata;
public final class SequenceTableDefinition implements ProtobufEntryExporter {
private final String messageName;
private final String idMessageName;
private final String keyColumnName;
private final String valueColumnName;
private final LongProtofieldAccessor valueEncoder;
private final StringProtofieldAccessor sequenceNameEncoder;
private final String protobufPackageName;
public SequenceTableDefinition(IdSourceKeyMetadata idSourceKeyMetadata, String protobufPackageName) {
this.protobufPackageName = protobufPackageName;
this.messageName = inferMessageName( idSourceKeyMetadata );
this.idMessageName = SanitationUtils.toProtobufIdName( messageName );
this.keyColumnName = SanitationUtils.convertNameSafely( idSourceKeyMetadata.getKeyColumnName() );
this.valueColumnName = SanitationUtils.convertNameSafely( idSourceKeyMetadata.getValueColumnName() );
this.sequenceNameEncoder = new StringProtofieldAccessor( 1,
keyColumnName, false, idSourceKeyMetadata.getKeyColumnName() );
this.valueEncoder = new LongProtofieldAccessor( 2,
valueColumnName, false, idSourceKeyMetadata.getValueColumnName() );
}
private static String inferMessageName(IdSourceKeyMetadata idSourceKeyMetadata) {
return SanitationUtils.convertNameSafely( idSourceKeyMetadata.getName() );
}
@Override
public void exportProtobufEntry(StringBuilder sb) {
exportMessage( idMessageName, sequenceNameEncoder, sb );
exportMessage( messageName, valueEncoder, sb );
}
private static void exportMessage(String messageName, ProtofieldAccessor<?> encoder, StringBuilder sb) {
sb.append( "\nmessage " ).append( messageName ).append( " {" );
encoder.exportProtobufFieldDefinition( sb );
sb.append( "\n}\n" );
}
public String getName() {
return messageName;
}
public SequenceId readSequenceId(org.infinispan.protostream.MessageMarshaller.ProtoStreamReader reader) throws IOException {
String read = sequenceNameEncoder.read( reader );
return new SequenceId( read );
}
public void writeSequenceId(org.infinispan.protostream.MessageMarshaller.ProtoStreamWriter writer, SequenceId t) throws IOException {
sequenceNameEncoder.writeTo( writer, t.getSegmentName() );
}
public String getQualifiedIdMessageName() {
return SanitationUtils.qualify( idMessageName, protobufPackageName );
}
}