org.smallmind.mongodb.throng.mapping.ThrongEntityCodec Maven / Gradle / Ivy
/*
* Copyright (c) 2007 through 2024 David Berkman
*
* This file is part of the SmallMind Code Project.
*
* The SmallMind Code Project is free software, you can redistribute
* it and/or modify it under either, at your discretion...
*
* 1) The terms of GNU Affero General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* ...or...
*
* 2) The terms of the Apache License, Version 2.0.
*
* The SmallMind Code Project is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License or Apache License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* and the Apache License along with the SmallMind Code Project. If not, see
* or .
*
* Additional permission under the GNU Affero GPL version 3 section 7
* ------------------------------------------------------------------
* If you modify this Program, or any covered work, by linking or
* combining it with other code, such other code is not for that reason
* alone subject to any of the requirements of the GNU Affero GPL
* version 3.
*/
package org.smallmind.mongodb.throng.mapping;
import java.lang.reflect.InvocationTargetException;
import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.smallmind.mongodb.throng.ThrongRuntimeException;
import org.smallmind.mongodb.throng.lifecycle.ThrongLifecycle;
public class ThrongEntityCodec extends ThrongPropertiesCodec {
private final ThrongLifecycle lifecycle;
private final Class entityClass;
private final ThrongProperty idProperty;
private final String collection;
public ThrongEntityCodec (ThrongEntity throngEntity) {
super(throngEntity);
entityClass = throngEntity.getEntityClass();
idProperty = throngEntity.getIdProperty();
collection = throngEntity.getCollection();
lifecycle = throngEntity.getLifecycle();
}
public Class getEntityClass () {
return entityClass;
}
public String getCollection () {
return collection;
}
public ThrongLifecycle getLifecycle () {
return lifecycle;
}
@Override
public T decode (BsonReader reader, DecoderContext decoderContext) {
T instance;
String idName;
reader.readStartDocument();
if (!idProperty.getName().equals(idName = reader.readName())) {
throw new ThrongRuntimeException("The expected 'id' field(%s) does not match the actual(%s)", idProperty.getName(), idName);
} else {
Object idValue = idProperty.getCodec().decode(reader, decoderContext);
ThrongLifecycle events;
instance = super.decode(reader, decoderContext);
reader.readEndDocument();
try {
idProperty.getFieldAccessor().set(instance, idValue);
} catch (IllegalAccessException | InvocationTargetException exception) {
throw new ThrongRuntimeException(exception);
}
return instance;
}
}
@Override
public void encode (BsonWriter writer, T value, EncoderContext encoderContext) {
if (value != null) {
writer.writeStartDocument();
try {
Object idValue;
if ((idValue = idProperty.getFieldAccessor().get(value)) != null) {
writer.writeName(idProperty.getName());
reEncode(writer, idProperty.getCodec(), idValue, encoderContext);
}
} catch (IllegalAccessException | InvocationTargetException exception) {
throw new ThrongRuntimeException(exception);
}
super.encode(writer, value, encoderContext);
writer.writeEndDocument();
}
}
}