Skip to content

Commit

Permalink
https://github.com/javers/javers/issues/416
Browse files Browse the repository at this point in the history
  • Loading branch information
bartoszwalacik committed Aug 28, 2016
1 parent 090a5ca commit f18dfa5
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 10 deletions.
@@ -0,0 +1,47 @@
package org.javers.repository.mongo;

import org.bson.Document;

/**
* @author bartosz.walacik
*/
class MapKeyDotReplacer {
private static final String REPLACEMENT = "#dot#";

Document replaceInSnapshotState(Document snapshot) {
return replaceInPropertyMaps(snapshot, "\\.", ".", REPLACEMENT);
}

Document back(Document snapshot) {
return replaceInPropertyMaps(snapshot, REPLACEMENT, REPLACEMENT, ".");
}

private Document replaceInPropertyMaps(Document snapshot, String regexFrom, String from, String to) {
Document state = getState(snapshot);

for (String pName : state.keySet()){
if (state.get(pName) instanceof Document) {
Document mapProperty = (Document)state.get(pName);
state.put(pName, replaceInMapKeys(mapProperty, regexFrom, from, to));
}
}

return snapshot;
}

private Document getState(Document snapshot) {
return (Document) snapshot.get("state");
}

private Document replaceInMapKeys(Document map, String regexFrom, String from, String to) {
for (String key : map.keySet()){
if (key.contains(from)){
String escaped = key.replaceAll(regexFrom, to);
Object val = map.get(key);
map.remove(key);
map.put(escaped, val);
}
}
return map;
}
}
Expand Up @@ -41,6 +41,7 @@ public class MongoRepository implements JaversRepository {
private static final int DESC = -1;
private final MongoSchemaManager mongoSchemaManager;
private JsonConverter jsonConverter;
private final MapKeyDotReplacer mapKeyDotReplacer = new MapKeyDotReplacer();

public MongoRepository(MongoDatabase mongo) {
this(mongo, null);
Expand Down Expand Up @@ -164,12 +165,13 @@ private Bson createManagedTypeQuery(ManagedType managedType, boolean aggregate)
}

private CdoSnapshot readFromDBObject(Document dbObject) {
return jsonConverter.fromJson(dbObject.toJson(), CdoSnapshot.class);
return jsonConverter.fromJson(mapKeyDotReplacer.back(dbObject).toJson(), CdoSnapshot.class);
}

private Document writeToDBObject(CdoSnapshot snapshot){
conditionFulfilled(jsonConverter != null, "MongoRepository: jsonConverter is null");
Document dbObject = Document.parse(jsonConverter.toJson(snapshot));
dbObject = mapKeyDotReplacer.replaceInSnapshotState(dbObject);
dbObject.append(GLOBAL_ID_KEY,snapshot.getGlobalId().value());
return dbObject;
}
Expand Down
Expand Up @@ -3,10 +3,8 @@ package org.javers.repository.mongo
import com.mongodb.client.MongoDatabase
import org.javers.core.JaversRepositoryE2ETest
import org.javers.core.model.SnapshotEntity
import org.javers.core.snapshot.SnapshotsAssert
import org.javers.repository.api.JaversRepository

import static org.javers.repository.jql.InstanceIdDTO.instanceId
import static org.javers.repository.jql.QueryBuilder.byInstanceId

/**
Expand All @@ -31,17 +29,13 @@ abstract class JaversMongoRepositoryE2ETest extends JaversRepositoryE2ETest {

def "should commit and read snapshot of Entity containing map field with dot keys"() {
given:
def cdo = new SnapshotEntity(id: 1,
mapOfPrimitives: ["primitive.value":1])
def cdo = new SnapshotEntity(id: 1, mapOfPrimitives: ['primitive.value':1])

when:
javers.commit("author", cdo)
javers.commit('author', cdo)
def snapshots = javers.findSnapshots(byInstanceId(1, SnapshotEntity).build())

then:
def cdoId = instanceId(1,SnapshotEntity)
SnapshotsAssert.assertThat(snapshots)
.hasSnapshot(cdoId, "1.0", [id:1,
mapOfPrimitives: ["primitive.value":1]])
snapshots[0].getPropertyValue('mapOfPrimitives') == ['primitive.value':1]
}
}

0 comments on commit f18dfa5

Please sign in to comment.