Skip to content

Commit

Permalink
https://github.com/javers/javers/issues/723
Browse files Browse the repository at this point in the history
issue fix
  • Loading branch information
bartoszwalacik committed Oct 11, 2018
1 parent 73e5df2 commit bcba48c
Show file tree
Hide file tree
Showing 14 changed files with 144 additions and 73 deletions.
Expand Up @@ -11,6 +11,18 @@
* @author bartosz walacik
*/
public class ToStringBuilder {
public static String smartToString(Object value) {
if (value == null){
return "";
}

if (value instanceof String) {
return (String)value;
}

return value.toString();
}

public static String typeName(Type type){
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType)type;
Expand Down
Expand Up @@ -42,7 +42,7 @@ private boolean isIdProperty(NodePair nodePair, JaversProperty property){
ManagedType managedType = nodePair.getManagedType();

if (managedType instanceof EntityType) {
return ((EntityType)managedType).getIdProperty().equals(property);
return ((EntityType)managedType).isIdProperty(property);
}
return false;
}
Expand Down
Expand Up @@ -10,8 +10,8 @@
import org.javers.core.metamodel.type.DuckType;
import org.javers.core.metamodel.type.ManagedType;
import org.javers.core.metamodel.type.TypeMapper;
import org.javers.core.metamodel.type.UnknownType;

import java.sql.SQLOutput;
import java.util.*;

import static org.javers.core.metamodel.object.CdoSnapshotBuilder.cdoSnapshot;
Expand Down Expand Up @@ -48,7 +48,9 @@ public CdoSnapshot fromJson(JsonElement json, JsonDeserializationContext context
Long version = context.deserialize(jsonObject.get(VERSION), Long.class);
DuckType duckType = new DuckType(cdoId.getTypeName(), extractPropertyNames(stateObject));

ManagedType managedType = typeMapper.getJaversManagedType(duckType, ManagedType.class);
ManagedType managedType = typeMapper
.getJaversManagedTypeMaybe(duckType, ManagedType.class)
.orElseGet(() -> new UnknownType(duckType.getTypeName()));

CdoSnapshotBuilder builder = cdoSnapshot()
.withGlobalId(cdoId)
Expand Down
Expand Up @@ -2,12 +2,17 @@

import com.google.gson.*;
import org.javers.common.collections.Lists;
import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;
import org.javers.common.string.ToStringBuilder;
import org.javers.core.json.JsonTypeAdapter;
import org.javers.core.metamodel.object.*;
import org.javers.core.metamodel.type.EntityType;
import org.javers.core.metamodel.type.TypeMapper;
import sun.jvm.hotspot.code.Location;

import java.util.List;
import java.util.Optional;

/**
* @author bartosz walacik
Expand Down Expand Up @@ -56,12 +61,17 @@ private ValueObjectId parseValueObjectId(JsonObject jsonObject, JsonDeserializat

private InstanceId parseInstanceId(JsonObject jsonObject, JsonDeserializationContext context) {

EntityType entity = parseEntity(jsonObject);

JsonElement cdoIdElement = jsonObject.get(CDO_ID_FIELD);
Object cdoId = context.deserialize(cdoIdElement, entity.getIdProperty().getGenericType());

return entity.createIdFromLocalId(cdoId);
String typeName = jsonObject.get(ENTITY_FIELD).getAsString();
Optional<EntityType> entityMaybe = typeMapper.getJaversManagedTypeMaybe(typeName, EntityType.class);

return entityMaybe.map(entity -> {
Object cdoId = context.deserialize(cdoIdElement, entity.getIdPropertyGenericType());
return entity.createIdFromInstanceId(cdoId);
}).orElseGet(() ->
new InstanceId(typeName, context.deserialize(cdoIdElement, Object.class), cdoIdElement.getAsString())
);
}

@Override
Expand Down Expand Up @@ -111,9 +121,4 @@ private static boolean hasStringField(JsonObject json, String childName) {
return json.has(childName) && json.get(childName) instanceof JsonPrimitive && ((JsonPrimitive)json.get(childName)).isString();

}

private EntityType parseEntity(JsonObject object){
String entityName = object.get(ENTITY_FIELD).getAsString();
return typeMapper.getJaversManagedType(entityName, EntityType.class);
}
}
Expand Up @@ -2,6 +2,7 @@

import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;
import org.javers.common.string.ToStringBuilder;
import org.javers.common.validation.Validate;
import org.javers.core.graph.ObjectAccessProxy;
import org.javers.core.graph.ObjectAccessHook;
Expand Down Expand Up @@ -101,14 +102,20 @@ public ValueObjectId createValueObjectIdFromPath(GlobalId owner, String fragment
return new ValueObjectId(valueObjectType.getName(), owner, fragment);
}

public InstanceId createInstanceId(Object localId, Class entityClass){
public InstanceId createIdFromInstance(Object instance) {
EntityType entityType = typeMapper.getJaversManagedType(instance.getClass(), EntityType.class);
return entityType.createIdFromInstance(instance);
}

public InstanceId createInstanceId(Object localId, Class entityClass) {
EntityType entity = typeMapper.getJaversManagedType(entityClass, EntityType.class);
return entity.createIdFromLocalId(localId);
return entity.createIdFromInstanceId(localId);
}

public InstanceId createInstanceId(Object localId, String typeName){
EntityType entity = typeMapper.getJaversManagedType(typeName, EntityType.class);
return entity.createIdFromLocalId(localId);
public InstanceId createInstanceId(Object localId, String typeName) {
Optional<EntityType> entity = typeMapper.getJaversManagedTypeMaybe(typeName, EntityType.class);
return entity.map(e -> e.createIdFromInstanceId(localId))
.orElse(new InstanceId(typeName, localId, ToStringBuilder.smartToString(localId)));
}

public GlobalId createFromDto(GlobalIdDTO globalIdDTO){
Expand Down
Expand Up @@ -42,10 +42,6 @@ public class EntityType extends ManagedType {
this.idProperty = idProperty;
}

EntityType(ManagedClass entity, JaversProperty idProperty) {
this(entity, idProperty, Optional.empty());
}

@Override
EntityType spawn(ManagedClass managedClass, Optional<String> typeName) {
//when spawning from prototype, prototype.idProperty and child.idProperty are different objects
Expand All @@ -57,41 +53,23 @@ public Type getIdPropertyGenericType() {
return getIdProperty().getGenericType();
}

@Override
public String toString() {
return ToStringBuilder.toString(this,
"baseType", getBaseJavaType(),
"id", getIdProperty().getName());
}

@Override
protected PrettyPrintBuilder prettyPrintBuilder() {
return super.prettyPrintBuilder().addField("idProperty", getIdProperty().getName());
}

public JaversProperty getIdProperty() {
return idProperty;
}

/**
* @throws JaversException ENTITY_INSTANCE_WITH_NULL_ID
* @throws JaversException NOT_INSTANCE_OF
*/
public InstanceId createIdFromInstance(Object instance) {
return createIdFromLocalId(getIdOf(instance));
private String getIdPropertyName() {
return getIdProperty().getName();
}

public InstanceId createIdFromLocalId(Object localId) {
return new InstanceId(getName(), localId, localIdAsString(localId));
public boolean isIdProperty(JaversProperty property) {
return idProperty.equals(property);
}

/**
* @param instance instance of {@link #getBaseJavaClass()}
* @return returns ID of given instance (value of idProperty)
* @throws JaversException ENTITY_INSTANCE_WITH_NULL_ID
* @throws JaversException NOT_INSTANCE_OF
*/
private Object getIdOf(Object instance) {
public Object getIdOf(Object instance) {
Validate.argumentIsNotNull(instance);

if (!isInstance(instance)) {
Expand All @@ -105,16 +83,29 @@ private Object getIdOf(Object instance) {
return cdoId;
}

public InstanceId createIdFromInstance(Object instance) {
Object localId = getIdOf(instance);
return new InstanceId(getName(), localId, localIdAsString(localId));
}

public InstanceId createIdFromInstanceId(Object localId) {
return new InstanceId(getName(), localId, localIdAsString(localId));
}

private String localIdAsString(Object localId) {
if (getIdProperty().getType() instanceof EntityType) {
EntityType idPropertyType = getIdProperty().getType();
if (getIdPropertyType() instanceof EntityType) {
EntityType idPropertyType = getIdPropertyType();
return idPropertyType.localIdAsString(idPropertyType.getIdOf(localId));
}

PrimitiveOrValueType idPropertyType = getIdProperty().getType();
PrimitiveOrValueType idPropertyType = getIdPropertyType();
return idPropertyType.smartToString(localId);
}

private <T extends JaversType> T getIdPropertyType() {
return getIdProperty().getType();
}

@Override
public boolean equals(Object o) {
if (this == o) { return true; }
Expand All @@ -128,4 +119,16 @@ public boolean equals(Object o) {
public int hashCode() {
return super.hashCode() + idProperty.hashCode();
}

@Override
public String toString() {
return ToStringBuilder.toString(this,
"baseType", getBaseJavaType(),
"id", getIdPropertyName());
}

@Override
protected PrettyPrintBuilder prettyPrintBuilder() {
return super.prettyPrintBuilder().addField("idProperty", getIdPropertyName());
}
}
Expand Up @@ -38,6 +38,10 @@ class ManagedClass {
}
}

static ManagedClass unknown() {
return new ManagedClass(Object.class, Collections.emptyList(), Collections.emptyList(), ManagedPropertiesFilter.empty());
}

ManagedClass createShallowReference(){
return new ManagedClass(baseJavaClass, Collections.emptyList(), getLooksLikeId(), ManagedPropertiesFilter.empty());
}
Expand Down
@@ -1,6 +1,7 @@
package org.javers.core.metamodel.type;

import org.javers.common.collections.Primitives;
import org.javers.common.string.ToStringBuilder;
import org.javers.core.diff.custom.CustomValueComparator;

import java.lang.reflect.Type;
Expand All @@ -25,16 +26,8 @@ public boolean equals(Object left, Object right) {
return valueComparator.equals(left, right);
}

public String smartToString(Object cdo) {
if (cdo == null){
return "";
}

if (cdo instanceof String) {
return (String)cdo;
}

return cdo.toString();
public String smartToString(Object value) {
return ToStringBuilder.smartToString(value);
}

public boolean isNumber() {
Expand Down
Expand Up @@ -4,21 +4,20 @@
import org.javers.common.collections.WellKnownValueTypes;
import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;
import org.javers.common.string.ToStringBuilder;
import org.javers.common.validation.Validate;
import org.javers.core.JaversCoreConfiguration;
import org.javers.core.diff.ListCompareAlgorithm;
import org.javers.core.metamodel.clazz.ClientsClassDefinition;
import org.javers.core.metamodel.object.GlobalId;
import org.javers.core.metamodel.object.InstanceId;
import org.javers.core.metamodel.property.Property;
import org.javers.core.metamodel.scanner.ClassScanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;

import static org.javers.common.validation.Validate.argumentIsNotNull;

Expand Down Expand Up @@ -203,6 +202,21 @@ public <T extends ManagedType> T getJaversManagedType(Class javaClass, Class<T>
}
}

public <T extends ManagedType> Optional<T> getJaversManagedTypeMaybe(String typeName, Class<T> expectedType) {
return getJaversManagedTypeMaybe(new DuckType(typeName), expectedType);
}

public <T extends ManagedType> Optional<T> getJaversManagedTypeMaybe(DuckType duckType, Class<T> expectedType) {
try {
return Optional.of(getJaversManagedType(duckType, expectedType));
} catch (JaversException e) {
if (JaversExceptionCode.TYPE_NAME_NOT_FOUND == e.getCode()) {
return Optional.empty();
}
throw e;
}
}

public <T extends JaversType> T getPropertyType(Property property){
argumentIsNotNull(property);
try {
Expand Down
Expand Up @@ -24,11 +24,11 @@
*/
class TypeMapperState {
private static final Logger logger = LoggerFactory.getLogger(TypeMapperState.class);
public static final ValueType OBJECT_TYPE = new ValueType(Object.class);

private final Map<String, JaversType> mappedTypes = new ConcurrentHashMap<>();
private final Map<DuckType, Class> mappedTypeNames = new ConcurrentHashMap<>();
private final TypeFactory typeFactory;
private final ValueType OBJECT_TYPE = new ValueType(Object.class);

TypeMapperState(TypeFactory typeFactory) {
this.typeFactory = typeFactory;
Expand Down
@@ -0,0 +1,19 @@
package org.javers.core.metamodel.type;

import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;

import java.util.Optional;

public class UnknownType extends ManagedType {

public UnknownType(String typeName) {
super(ManagedClass.unknown(), Optional.of(typeName));
}

@Override
ManagedType spawn(ManagedClass managedClass, Optional<String> typeName) {
throw new JaversException(JaversExceptionCode.NOT_IMPLEMENTED);
}

}
Expand Up @@ -26,10 +26,6 @@ static class IdFilterDefinition extends FilterDefinition {
Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) {
return new IdFilter(globalIdFactory.createFromDto(globalIdDTO));
}

boolean isInstanceIdFilter() {
return globalIdDTO instanceof InstanceIdDTO;
}
}

static class IdAndTypeNameFilterDefinition extends FilterDefinition {
Expand Down

0 comments on commit bcba48c

Please sign in to comment.