http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java index 7c770df..341de3b 100644 --- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java +++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java @@ -19,10 +19,8 @@ package org.apache.polygene.entitystore.sql; import org.apache.polygene.api.concern.Concerns; import org.apache.polygene.api.configuration.Configuration; -import org.apache.polygene.api.injection.scope.Uses; import org.apache.polygene.api.mixin.Mixins; import org.apache.polygene.api.service.ServiceActivation; -import org.apache.polygene.api.service.ServiceDescriptor; import org.apache.polygene.spi.entitystore.ConcurrentModificationCheckConcern; import org.apache.polygene.spi.entitystore.EntityStateVersions; import org.apache.polygene.spi.entitystore.EntityStore;
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/indexing-elasticsearch/src/main/java/org/apache/polygene/index/elasticsearch/ElasticSearchIndexer.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/apache/polygene/index/elasticsearch/ElasticSearchIndexer.java b/extensions/indexing-elasticsearch/src/main/java/org/apache/polygene/index/elasticsearch/ElasticSearchIndexer.java index 344f9d7..c8caa7d 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/apache/polygene/index/elasticsearch/ElasticSearchIndexer.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/apache/polygene/index/elasticsearch/ElasticSearchIndexer.java @@ -19,11 +19,10 @@ */ package org.apache.polygene.index.elasticsearch; -import java.io.StringReader; import java.util.HashMap; import java.util.Map; -import javax.json.Json; import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; import org.apache.polygene.api.entity.EntityDescriptor; @@ -38,7 +37,7 @@ import org.apache.polygene.api.structure.ModuleDescriptor; import org.apache.polygene.api.time.SystemTime; import org.apache.polygene.api.usecase.UsecaseBuilder; import org.apache.polygene.api.util.Classes; -import org.apache.polygene.serialization.javaxjson.JavaxJson; +import org.apache.polygene.serialization.javaxjson.JavaxJsonFactories; import org.apache.polygene.spi.entity.EntityState; import org.apache.polygene.spi.entity.EntityStatus; import org.apache.polygene.spi.entity.ManyAssociationState; @@ -74,6 +73,9 @@ public interface ElasticSearchIndexer extends StateChangeListener @Service private JsonSerializer jsonSerializer; + @Service + private JavaxJsonFactories jsonFactories; + @This private ElasticSearchSupport support; @@ -118,13 +120,13 @@ public interface ElasticSearchIndexer extends StateChangeListener case UPDATED: LOGGER.trace( "Updating Entity State in Index: {}", changedState ); remove( bulkBuilder, changedState.entityReference().identity().toString() ); - String updatedJson = toJSON( changedState, newStates, uow ); + String updatedJson = toJSON( changedState, newStates, uow ).toString(); LOGGER.trace( "Will index: {}", updatedJson ); index( bulkBuilder, changedState.entityReference().identity().toString(), updatedJson ); break; case NEW: LOGGER.trace( "Creating Entity State in Index: {}", changedState ); - String newJson = toJSON( changedState, newStates, uow ); + String newJson = toJSON( changedState, newStates, uow ).toString(); LOGGER.trace( "Will index: {}", newJson ); index( bulkBuilder, changedState.entityReference().identity().toString(), newJson ); break; @@ -182,13 +184,13 @@ public interface ElasticSearchIndexer extends StateChangeListener * } * </pre> */ - private String toJSON( EntityState state, Map<String, EntityState> newStates, EntityStoreUnitOfWork uow ) + private JsonObject toJSON( EntityState state, Map<String, EntityState> newStates, EntityStoreUnitOfWork uow ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); + JsonObjectBuilder builder = jsonFactories.builderFactory().createObjectBuilder(); builder.add( "_identity", state.entityReference().identity().toString() ); - JsonArrayBuilder typesBuilder = Json.createArrayBuilder(); + JsonArrayBuilder typesBuilder = jsonFactories.builderFactory().createArrayBuilder(); state.entityDescriptor().mixinTypes().map( Classes.toClassName() ).forEach( typesBuilder::add ); builder.add( "_types", typesBuilder.build() ); @@ -225,26 +227,20 @@ public interface ElasticSearchIndexer extends StateChangeListener { if( newStates.containsKey( associated.identity().toString() ) ) { - builder.add( key, - Json.createReader( new StringReader( - toJSON( newStates.get( associated.identity().toString() ), - newStates, uow ) - ) ).readObject() ); + builder.add( key, toJSON( newStates.get( associated.identity().toString() ), + newStates, uow ) ); } else { EntityReference reference = EntityReference.create( associated.identity() ); EntityState assocState = uow.entityStateOf( entityType.module(), reference ); - builder.add( key, - Json.createReader( new StringReader( - toJSON( assocState, newStates, uow ) - ) ).readObject() ); + builder.add( key, toJSON( assocState, newStates, uow ) ); } } else { - builder.add( key, Json.createObjectBuilder() - .add( "reference", associated.identity().toString() ) ); + builder.add( key, jsonFactories.builderFactory().createObjectBuilder() + .add( "reference", associated.identity().toString() ) ); } } } @@ -257,7 +253,7 @@ public interface ElasticSearchIndexer extends StateChangeListener if( manyAssocDesc.queryable() ) { String key = manyAssocDesc.qualifiedName().name(); - JsonArrayBuilder assBuilder = Json.createArrayBuilder(); + JsonArrayBuilder assBuilder = jsonFactories.builderFactory().createArrayBuilder(); ManyAssociationState assocs = state.manyAssociationValueOf( manyAssocDesc.qualifiedName() ); for( EntityReference associated : assocs ) { @@ -265,25 +261,21 @@ public interface ElasticSearchIndexer extends StateChangeListener { if( newStates.containsKey( associated.identity().toString() ) ) { - assBuilder.add( - Json.createReader( new StringReader( - toJSON( newStates.get( associated.identity().toString() ), newStates, uow ) - ) ).readObject() ); + assBuilder.add( toJSON( newStates.get( associated.identity().toString() ), + newStates, uow ) ); } else { EntityReference reference = EntityReference.create( associated.identity() ); EntityState assocState = uow.entityStateOf( entityType.module(), reference ); - assBuilder.add( - Json.createReader( new StringReader( - toJSON( assocState, newStates, uow ) - ) ).readObject() ); + assBuilder.add( toJSON( assocState, newStates, uow ) ); } } else { - assBuilder.add( Json.createObjectBuilder().add( "reference", - associated.identity().toString() ) ); + assBuilder.add( jsonFactories.builderFactory().createObjectBuilder() + .add( "reference", + associated.identity().toString() ) ); } } builder.add( key, assBuilder.build() ); @@ -297,7 +289,7 @@ public interface ElasticSearchIndexer extends StateChangeListener if( namedAssocDesc.queryable() ) { String key = namedAssocDesc.qualifiedName().name(); - JsonArrayBuilder assBuilder = Json.createArrayBuilder(); + JsonArrayBuilder assBuilder = jsonFactories.builderFactory().createArrayBuilder(); NamedAssociationState assocs = state.namedAssociationValueOf( namedAssocDesc.qualifiedName() ); for( String name : assocs ) @@ -309,36 +301,32 @@ public interface ElasticSearchIndexer extends StateChangeListener if( newStates.containsKey( identityString ) ) { assBuilder.add( - JavaxJson.toBuilder( - Json.createReader( new StringReader( - toJSON( newStates.get( identityString ), newStates, uow ) ) - ).readObject() - ).add( "_named", name ).build() ); + jsonFactories.cloneBuilder( toJSON( newStates.get( identityString ), + newStates, uow ) ) + .add( "_named", name ) + .build() ); } else { EntityReference reference = EntityReference.create( identity ); EntityState assocState = uow.entityStateOf( entityType.module(), reference ); assBuilder.add( - JavaxJson.toBuilder( - Json.createReader( new StringReader( - toJSON( assocState, newStates, uow ) - ) ).readObject() - ).add( "_named", name ).build() ); + jsonFactories.cloneBuilder( toJSON( assocState, newStates, uow ) ) + .add( "_named", name ).build() ); } } else { - assBuilder.add( Json.createObjectBuilder() - .add( "_named", name ) - .add( "reference", identity.toString() ) - .build() ); + assBuilder.add( jsonFactories.builderFactory().createObjectBuilder() + .add( "_named", name ) + .add( "reference", identity.toString() ) + .build() ); } } builder.add( key, assBuilder.build() ); } } ); - return builder.build().toString(); + return builder.build(); } } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/indexing-solr/src/main/java/org/apache/polygene/index/solr/internal/SolrEntityIndexerMixin.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-solr/src/main/java/org/apache/polygene/index/solr/internal/SolrEntityIndexerMixin.java b/extensions/indexing-solr/src/main/java/org/apache/polygene/index/solr/internal/SolrEntityIndexerMixin.java index 14335d0..1c4e372 100644 --- a/extensions/indexing-solr/src/main/java/org/apache/polygene/index/solr/internal/SolrEntityIndexerMixin.java +++ b/extensions/indexing-solr/src/main/java/org/apache/polygene/index/solr/internal/SolrEntityIndexerMixin.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; -import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonNumber; import javax.json.JsonObject; @@ -39,6 +38,7 @@ import org.apache.polygene.api.injection.scope.Uses; import org.apache.polygene.index.solr.EmbeddedSolrService; import org.apache.polygene.index.solr.SolrQueryService; import org.apache.polygene.library.rdf.entity.EntityStateSerializer; +import org.apache.polygene.serialization.javaxjson.JavaxJsonFactories; import org.apache.polygene.spi.entity.EntityState; import org.apache.polygene.spi.entity.EntityStatus; import org.apache.solr.client.solrj.SolrServer; @@ -66,6 +66,9 @@ public abstract class SolrEntityIndexerMixin @Service private EmbeddedSolrService solr; + @Service + private JavaxJsonFactories jsonFactories; + @Uses private EntityStateSerializer stateSerializer; @@ -177,19 +180,22 @@ public abstract class SolrEntityIndexerMixin String value = statement.getObject().stringValue(); if( field.getType().getTypeName().equals( "json" ) ) { - try( JsonParser parser = Json.createParser( new StringReader( value ) ) ) + try( JsonParser parser = jsonFactories.parserFactory() + .createParser( new StringReader( value ) ) ) { JsonParser.Event event = parser.next(); switch( event ) { case START_ARRAY: - try( JsonReader reader = Json.createReader( new StringReader( value ) ) ) + try( JsonReader reader = jsonFactories.readerFactory() + .createReader( new StringReader( value ) ) ) { indexJson( input, reader.readArray() ); } break; case START_OBJECT: - try( JsonReader reader = Json.createReader( new StringReader( value ) ) ) + try( JsonReader reader = jsonFactories.readerFactory() + .createReader( new StringReader( value ) ) ) { indexJson( input, reader.readObject() ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java b/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java index 2584600..bf665c6 100644 --- a/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java +++ b/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java @@ -33,6 +33,7 @@ import org.apache.polygene.api.identity.Identity; import org.apache.polygene.api.property.PropertyDescriptor; import org.apache.polygene.api.structure.ModuleDescriptor; import org.apache.polygene.api.type.CollectionType; +import org.apache.polygene.api.type.EntityCompositeType; import org.apache.polygene.api.type.ValueCompositeType; import org.apache.polygene.api.type.ValueType; import org.apache.polygene.api.value.ValueComposite; @@ -191,6 +192,12 @@ class SQLCompatEntityStateWrapper return wrappedEntityState.hashCode(); } + @Override + public String toString() + { + return wrappedEntityState.toString(); + } + private static class CompatEntityDescriptorWrapper implements EntityDescriptor { @@ -202,6 +209,12 @@ class SQLCompatEntityStateWrapper } @Override + public EntityCompositeType valueType() + { + return wrappedEntityDescriptor.valueType(); + } + + @Override public ModuleDescriptor module() { return wrappedEntityDescriptor.module(); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java ---------------------------------------------------------------------- diff --git a/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java b/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java index 79e1583..f361801 100644 --- a/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java +++ b/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java @@ -22,11 +22,10 @@ package org.apache.polygene.migration; import java.util.ArrayList; import java.util.List; import java.util.Map; -import javax.json.Json; +import javax.json.JsonArrayBuilder; import javax.json.JsonException; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; -import javax.json.JsonString; import javax.json.JsonValue; import org.apache.polygene.api.activation.ActivatorAdapter; import org.apache.polygene.api.activation.Activators; @@ -44,6 +43,7 @@ import org.apache.polygene.migration.assembly.EntityMigrationRule; import org.apache.polygene.migration.assembly.MigrationBuilder; import org.apache.polygene.migration.assembly.MigrationContext; import org.apache.polygene.migration.assembly.MigrationRule; +import org.apache.polygene.serialization.javaxjson.JavaxJsonFactories; import org.apache.polygene.spi.entitystore.EntityStore; import org.apache.polygene.spi.entitystore.helpers.JSONKeys; import org.apache.polygene.spi.entitystore.helpers.Migration; @@ -87,35 +87,84 @@ public interface MigrationService class MigrationMixin implements MigrationService, Migrator { + private static final Logger LOGGER = LoggerFactory.getLogger( MigrationService.class ); + @Structure - Application app; + private Application app; @This - Configuration<MigrationConfiguration> config; + private Configuration<MigrationConfiguration> config; @Uses - ServiceDescriptor descriptor; + private ServiceDescriptor descriptor; + + @Service + private StateStore store; @Service - StateStore store; + private EntityStore entityStore; @Service - EntityStore entityStore; + private JsonSerialization serialization; @Service - JsonSerialization serialization; + private JavaxJsonFactories jsonFactories; @Structure - UnitOfWorkFactory uowf; + private UnitOfWorkFactory uowf; @This - Migrator migrator; - - public MigrationBuilder builder; - public Logger log; + private Migrator migrator; @Service - Iterable<MigrationEvents> migrationEvents; + private Iterable<MigrationEvents> migrationEvents; + + private MigrationBuilder builder; + + + @Override + public void initialize() + throws Exception + { + builder = descriptor.metaInfo( MigrationBuilder.class ); + + String version = app.version(); + String lastVersion = config.get().lastStartupVersion().get(); + + // Run general rules if version has changed + if( !app.version().equals( lastVersion ) ) + { + Iterable<MigrationRule> rules = builder.migrationRules().rulesBetweenVersions( lastVersion, version ); + List<MigrationRule> executedRules = new ArrayList<>(); + try + { + if( rules != null ) + { + for( MigrationRule rule : rules ) + { + rule.upgrade( store, this ); + executedRules.add( rule ); + LOGGER.debug( rule.toString() ); + } + + LOGGER.info( "Migrated to " + version ); + } + + config.get().lastStartupVersion().set( version ); + config.save(); + } + catch( Exception e ) + { + LOGGER.error( "Upgrade failed", e ); + + // Downgrade the migrated rules + for( MigrationRule executedRule : executedRules ) + { + executedRule.downgrade( store, this ); + } + } + } + } @Override public JsonObject migrate( final JsonObject state, String toVersion, StateStore stateStore ) @@ -138,9 +187,9 @@ public interface MigrationService migratedState = matchedRule.upgrade( context, migratedState, stateStore, migrator ); - if( context.isSuccess() && context.hasChanged() && log.isDebugEnabled() ) + if( context.isSuccess() && context.hasChanged() && LOGGER.isDebugEnabled() ) { - log.debug( matchedRule.toString() ); + LOGGER.debug( matchedRule.toString() ); } failures.addAll( context.failures() ); @@ -148,7 +197,7 @@ public interface MigrationService } } - JsonObjectBuilder appVersionBuilder = Json.createObjectBuilder(); + JsonObjectBuilder appVersionBuilder = jsonFactories.builderFactory().createObjectBuilder(); for( Map.Entry<String, JsonValue> entry : migratedState.entrySet() ) { appVersionBuilder.add( entry.getKey(), entry.getValue() ); @@ -158,16 +207,16 @@ public interface MigrationService if( failures.size() > 0 ) { - log.warn( "Migration of {} from {} to {} aborted, failed operation(s):\n{}", - state.getString( JSONKeys.IDENTITY ), fromVersion, toVersion, - String.join( "\n\t", failures ) ); + LOGGER.warn( "Migration of {} from {} to {} aborted, failed operation(s):\n{}", + state.getString( JSONKeys.IDENTITY ), fromVersion, toVersion, + String.join( "\n\t", failures ) ); return state; } if( changed ) { - log.info( "Migrated {} from {} to {}", - migratedState.getString( JSONKeys.IDENTITY ), fromVersion, toVersion ); + LOGGER.info( "Migrated {} from {} to {}", + migratedState.getString( JSONKeys.IDENTITY ), fromVersion, toVersion ); return migratedState; } @@ -175,77 +224,20 @@ public interface MigrationService return state; } - @Override - public void initialize() - throws Exception - { - builder = descriptor.metaInfo( MigrationBuilder.class ); - - log = LoggerFactory.getLogger( MigrationService.class ); - - String version = app.version(); - String lastVersion = config.get().lastStartupVersion().get(); - - // Run general rules if version has changed - if( !app.version().equals( lastVersion ) ) - { - Iterable<MigrationRule> rules = builder.migrationRules().rulesBetweenVersions( lastVersion, version ); - List<MigrationRule> executedRules = new ArrayList<>(); - try - { - if( rules != null ) - { - for( MigrationRule rule : rules ) - { - rule.upgrade( store, this ); - executedRules.add( rule ); - log.debug( rule.toString() ); - } - - log.info( "Migrated to " + version ); - } - - config.get().lastStartupVersion().set( version ); - config.save(); - } - catch( Exception e ) - { - log.error( "Upgrade failed", e ); - - // Downgrade the migrated rules - for( MigrationRule executedRule : executedRules ) - { - executedRule.downgrade( store, this ); - } - } - } - } - // Migrator implementation @Override public JsonObject addProperty( MigrationContext context, JsonObject state, String name, Object defaultValue ) throws JsonException { - JsonObject properties = state.getJsonObject( JSONKeys.PROPERTIES ); - if( !properties.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( !valueState.containsKey( name ) ) { - JsonValue value = serialization.toJson( defaultValue ); - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.PROPERTIES.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder propBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : properties.entrySet() ) - { - propBuilder.add( entry.getKey(), entry.getValue() ); - } - propBuilder.add( name, value ); - builder.add( JSONKeys.PROPERTIES, propBuilder.build() ); + valueState = jsonFactories.cloneBuilder( valueState ) + .add( name, serialization.toJson( defaultValue ) ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) @@ -253,7 +245,7 @@ public interface MigrationService migrationEvent.propertyAdded( state.getString( JSONKeys.IDENTITY ), name, defaultValue ); } - return builder.build(); + return migratedState; } else { @@ -266,42 +258,20 @@ public interface MigrationService public JsonObject removeProperty( MigrationContext context, JsonObject state, String name ) throws JsonException { - JsonObject properties = state.getJsonObject( JSONKeys.PROPERTIES ); - if( properties.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.PROPERTIES.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder propBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : properties.entrySet() ) - { - String key = entry.getKey(); - if( !name.equals( key ) ) - { - propBuilder.add( key, entry.getValue() ); - } - else - { - context.markAsChanged(); - } - } - builder.add( JSONKeys.PROPERTIES, propBuilder.build() ); - - if( context.hasChanged() ) + valueState = jsonFactories.cloneBuilderExclude( valueState, name ).build(); + JsonObject migratedState = jsonFactories + .cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); + for( MigrationEvents migrationEvent : migrationEvents ) { - for( MigrationEvents migrationEvent : migrationEvents ) - { - migrationEvent.propertyRemoved( state.getString( JSONKeys.IDENTITY ), name ); - } + migrationEvent.propertyRemoved( state.getString( JSONKeys.IDENTITY ), name ); } - - return builder.build(); + return migratedState; } else { @@ -314,40 +284,22 @@ public interface MigrationService public JsonObject renameProperty( MigrationContext context, JsonObject state, String from, String to ) throws JsonException { - JsonObject properties = state.getJsonObject( JSONKeys.PROPERTIES ); - if( properties.containsKey( from ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( from ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.PROPERTIES.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder propBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : properties.entrySet() ) - { - String key = entry.getKey(); - if( from.equals( key ) ) - { - propBuilder.add( to, entry.getValue() ); - context.markAsChanged(); - } - else - { - propBuilder.add( key, entry.getValue() ); - } - } - builder.add( JSONKeys.PROPERTIES, propBuilder.build() ); - + JsonValue jsonValue = valueState.get( from ); + valueState = jsonFactories.cloneBuilderExclude( valueState, from ) + .add( to, jsonValue ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.propertyRenamed( state.getString( JSONKeys.IDENTITY ), from, to ); } - - return builder.build(); + return migratedState; } else { @@ -361,34 +313,21 @@ public interface MigrationService String defaultReference ) throws JsonException { - JsonObject associations = state.getJsonObject( JSONKeys.ASSOCIATIONS ); - if( !associations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( !valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : associations.entrySet() ) - { - assocBuilder.add( entry.getKey(), entry.getValue() ); - } - JsonValue value = serialization.toJson( defaultReference ); - assocBuilder.add( name, value ); - builder.add( JSONKeys.ASSOCIATIONS, assocBuilder.build() ); + valueState = jsonFactories.cloneBuilder( valueState ) + .add( name, defaultReference ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); context.markAsChanged(); - for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.associationAdded( state.getString( JSONKeys.IDENTITY ), name, defaultReference ); } - - return builder.build(); + return migratedState; } else { @@ -401,39 +340,19 @@ public interface MigrationService public JsonObject removeAssociation( MigrationContext context, JsonObject state, String name ) throws JsonException { - JsonObject associations = state.getJsonObject( JSONKeys.ASSOCIATIONS ); - if( associations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : associations.entrySet() ) - { - String key = entry.getKey(); - if( !name.equals( key ) ) - { - assocBuilder.add( key, entry.getValue() ); - } - else - { - context.markAsChanged(); - } - } - builder.add( JSONKeys.ASSOCIATIONS, assocBuilder.build() ); - + valueState = jsonFactories.cloneBuilderExclude( valueState, name ).build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.associationRemoved( state.getString( JSONKeys.IDENTITY ), name ); } - - return builder.build(); + return migratedState; } else { @@ -446,40 +365,22 @@ public interface MigrationService public JsonObject renameAssociation( MigrationContext context, JsonObject state, String from, String to ) throws JsonException { - JsonObject associations = state.getJsonObject( JSONKeys.ASSOCIATIONS ); - if( associations.containsKey( from ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( from ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : associations.entrySet() ) - { - String key = entry.getKey(); - if( from.equals( key ) ) - { - assocBuilder.add( to, entry.getValue() ); - context.markAsChanged(); - } - else - { - assocBuilder.add( to, entry.getValue() ); - } - } - builder.add( JSONKeys.ASSOCIATIONS, assocBuilder.build() ); - + JsonValue jsonValue = valueState.get( from ); + valueState = jsonFactories.cloneBuilderExclude( valueState, from ) + .add( to, jsonValue ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.associationRenamed( state.getString( JSONKeys.IDENTITY ), from, to ); } - - return builder.build(); + return migratedState; } else { @@ -493,35 +394,27 @@ public interface MigrationService String... defaultReferences ) throws JsonException { - JsonObject manyAssociations = state.getJsonObject( JSONKeys.MANY_ASSOCIATIONS ); - if( !manyAssociations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( !valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.MANY_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : manyAssociations.entrySet() ) + JsonArrayBuilder refArrayBuilder = jsonFactories.builderFactory().createArrayBuilder(); + for( String ref : defaultReferences ) { - assocBuilder.add( entry.getKey(), entry.getValue() ); + refArrayBuilder.add( ref ); } - JsonValue value = serialization.toJson( defaultReferences ); - assocBuilder.add( name, value ); - builder.add( JSONKeys.MANY_ASSOCIATIONS, assocBuilder.build() ); + valueState = jsonFactories.cloneBuilder( valueState ) + .add( name, refArrayBuilder.build() ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); context.markAsChanged(); - for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.manyAssociationAdded( state.getString( JSONKeys.IDENTITY ), name, defaultReferences ); } - - return builder.build(); + return migratedState; } else { @@ -534,39 +427,19 @@ public interface MigrationService public JsonObject removeManyAssociation( MigrationContext context, JsonObject state, String name ) throws JsonException { - JsonObject manyAssociations = state.getJsonObject( JSONKeys.MANY_ASSOCIATIONS ); - if( manyAssociations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.MANY_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : manyAssociations.entrySet() ) - { - String key = entry.getKey(); - if( !name.equals( key ) ) - { - assocBuilder.add( key, entry.getValue() ); - } - else - { - context.markAsChanged(); - } - } - builder.add( JSONKeys.MANY_ASSOCIATIONS, assocBuilder.build() ); - + valueState = jsonFactories.cloneBuilderExclude( valueState, name ).build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.manyAssociationRemoved( state.getString( JSONKeys.IDENTITY ), name ); } - - return builder.build(); + return migratedState; } else { @@ -579,40 +452,22 @@ public interface MigrationService public JsonObject renameManyAssociation( MigrationContext context, JsonObject state, String from, String to ) throws JsonException { - JsonObject manyAssociations = state.getJsonObject( JSONKeys.MANY_ASSOCIATIONS ); - if( manyAssociations.containsKey( from ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( from ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.MANY_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : manyAssociations.entrySet() ) - { - String key = entry.getKey(); - if( from.equals( key ) ) - { - context.markAsChanged(); - assocBuilder.add( to, entry.getValue() ); - } - else - { - assocBuilder.add( key, entry.getValue() ); - } - } - builder.add( JSONKeys.MANY_ASSOCIATIONS, assocBuilder.build() ); - + JsonValue jsonValue = valueState.get( from ); + valueState = jsonFactories.cloneBuilderExclude( valueState, from ) + .add( to, jsonValue ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.manyAssociationRenamed( state.getString( JSONKeys.IDENTITY ), from, to ); } - - return builder.build(); + return migratedState; } else { @@ -626,35 +481,27 @@ public interface MigrationService Map<String, String> defaultReferences ) throws JsonException { - JsonObject namedAssociations = state.getJsonObject( JSONKeys.NAMED_ASSOCIATIONS ); - if( !namedAssociations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( !valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) + JsonObjectBuilder refBuilder = jsonFactories.builderFactory().createObjectBuilder(); + for( Map.Entry<String, String> entry : defaultReferences.entrySet() ) { - String key = entry.getKey(); - if( !JSONKeys.NAMED_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : namedAssociations.entrySet() ) - { - assocBuilder.add( entry.getKey(), entry.getValue() ); + refBuilder.add( entry.getKey(), entry.getValue() ); } - JsonValue value = serialization.toJson( defaultReferences ); - assocBuilder.add( name, value ); - builder.add( JSONKeys.NAMED_ASSOCIATIONS, assocBuilder.build() ); + valueState = jsonFactories.cloneBuilder( valueState ) + .add( name, refBuilder.build() ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); context.markAsChanged(); - for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.namedAssociationAdded( state.getString( JSONKeys.IDENTITY ), name, defaultReferences ); } - - return builder.build(); + return migratedState; } else { @@ -667,39 +514,19 @@ public interface MigrationService public JsonObject removeNamedAssociation( MigrationContext context, JsonObject state, String name ) throws JsonException { - JsonObject namedAssociations = state.getJsonObject( JSONKeys.NAMED_ASSOCIATIONS ); - if( namedAssociations.containsKey( name ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( !valueState.containsKey( name ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.NAMED_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : namedAssociations.entrySet() ) - { - String key = entry.getKey(); - if( !name.equals( key ) ) - { - assocBuilder.add( key, entry.getValue() ); - } - else - { - context.markAsChanged(); - } - } - builder.add( JSONKeys.NAMED_ASSOCIATIONS, assocBuilder.build() ); - + valueState = jsonFactories.cloneBuilderExclude( valueState, name ).build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.namedAssociationRemoved( state.getString( JSONKeys.IDENTITY ), name ); } - - return builder.build(); + return migratedState; } else { @@ -712,40 +539,22 @@ public interface MigrationService public JsonObject renameNamedAssociation( MigrationContext context, JsonObject state, String from, String to ) throws JsonException { - JsonObject namedAssociations = state.getJsonObject( JSONKeys.NAMED_ASSOCIATIONS ); - if( namedAssociations.containsKey( from ) ) + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + if( valueState.containsKey( from ) ) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) - { - String key = entry.getKey(); - if( !JSONKeys.NAMED_ASSOCIATIONS.equals( key ) ) - { - builder.add( key, entry.getValue() ); - } - } - JsonObjectBuilder assocBuilder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : namedAssociations.entrySet() ) - { - String key = entry.getKey(); - if( from.equals( key ) ) - { - assocBuilder.add( to, entry.getValue() ); - context.markAsChanged(); - } - else - { - assocBuilder.add( key, entry.getValue() ); - } - } - builder.add( JSONKeys.NAMED_ASSOCIATIONS, assocBuilder.build() ); - + JsonValue jsonValue = valueState.get( from ); + valueState = jsonFactories.cloneBuilderExclude( valueState, from ) + .add( to, jsonValue ) + .build(); + JsonObject migratedState = jsonFactories.cloneBuilderExclude( state, JSONKeys.VALUE ) + .add( JSONKeys.VALUE, valueState ) + .build(); + context.markAsChanged(); for( MigrationEvents migrationEvent : migrationEvents ) { migrationEvent.namedAssociationRenamed( state.getString( JSONKeys.IDENTITY ), from, to ); } - - return builder.build(); + return migratedState; } else { @@ -759,35 +568,23 @@ public interface MigrationService String fromType, String toType ) throws JsonException { - JsonObjectBuilder builder = Json.createObjectBuilder(); - for( Map.Entry<String, JsonValue> entry : state.entrySet() ) + String currentType = state.getString( JSONKeys.TYPE ); + if( fromType.equals( currentType ) ) { - String key = entry.getKey(); - if( JSONKeys.TYPE.equals( key ) ) - { - String oldValue = entry.getValue().getValueType() == JsonValue.ValueType.STRING - ? ( (JsonString) entry.getValue() ).getString() - : entry.getValue().toString(); - if( !fromType.equals( oldValue ) ) - { - context.addFailure( "Change entity type from " + fromType + " to " + toType ); - return state; - } - builder.add( JSONKeys.TYPE, toType ); - context.markAsChanged(); - } - else + JsonObject migratedState = jsonFactories.cloneBuilder( state ) + .add( JSONKeys.TYPE, toType ) + .build(); + for( MigrationEvents migrationEvent : migrationEvents ) { - builder.add( key, entry.getValue() ); + migrationEvent.entityTypeChanged( state.getString( JSONKeys.IDENTITY ), toType ); } + return migratedState; } - - for( MigrationEvents migrationEvent : migrationEvents ) + else { - migrationEvent.entityTypeChanged( state.getString( JSONKeys.IDENTITY ), toType ); + context.addFailure( "Change entity type from " + fromType + " to " + toType ); + return state; } - - return builder.build(); } } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/migration/src/test/java/org/apache/polygene/migration/MigrationTest.java ---------------------------------------------------------------------- diff --git a/extensions/migration/src/test/java/org/apache/polygene/migration/MigrationTest.java b/extensions/migration/src/test/java/org/apache/polygene/migration/MigrationTest.java index 1068abb..27fe187 100644 --- a/extensions/migration/src/test/java/org/apache/polygene/migration/MigrationTest.java +++ b/extensions/migration/src/test/java/org/apache/polygene/migration/MigrationTest.java @@ -221,8 +221,8 @@ public class MigrationTest @Override public JsonObject upgrade( MigrationContext context, JsonObject state, StateStore store, Migrator migrator ) { - JsonObject properties = state.getJsonObject( JSONKeys.PROPERTIES ); - return migrator.addProperty( context, state, "customBar", "Hello " + properties.getString( "bar" ) ); + JsonObject valueState = state.getJsonObject( JSONKeys.VALUE ); + return migrator.addProperty( context, state, "customBar", "Hello " + valueState.getString( "bar" ) ); } @Override http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxjson/src/main/java/org/apache/polygene/serialization/javaxjson/assembly/JavaxJsonSerializationAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxjson/src/main/java/org/apache/polygene/serialization/javaxjson/assembly/JavaxJsonSerializationAssembler.java b/extensions/serialization-javaxjson/src/main/java/org/apache/polygene/serialization/javaxjson/assembly/JavaxJsonSerializationAssembler.java index 5152f1b..10a8622 100644 --- a/extensions/serialization-javaxjson/src/main/java/org/apache/polygene/serialization/javaxjson/assembly/JavaxJsonSerializationAssembler.java +++ b/extensions/serialization-javaxjson/src/main/java/org/apache/polygene/serialization/javaxjson/assembly/JavaxJsonSerializationAssembler.java @@ -17,12 +17,14 @@ */ package org.apache.polygene.serialization.javaxjson.assembly; +import org.apache.polygene.api.serialization.Converters; import org.apache.polygene.api.serialization.Deserializer; import org.apache.polygene.api.serialization.Serialization; import org.apache.polygene.api.serialization.Serializer; import org.apache.polygene.bootstrap.Assemblers; import org.apache.polygene.bootstrap.ModuleAssembly; import org.apache.polygene.bootstrap.ServiceDeclaration; +import org.apache.polygene.serialization.javaxjson.JavaxJsonAdapters; import org.apache.polygene.serialization.javaxjson.JavaxJsonFactories; import org.apache.polygene.serialization.javaxjson.JavaxJsonSerialization; import org.apache.polygene.serialization.javaxjson.JavaxJsonSettings; @@ -46,9 +48,10 @@ public class JavaxJsonSerializationAssembler extends Assemblers.VisibilityIdenti ServiceDeclaration declaration = module.services( JavaxJsonSerialization.class ) .withTypes( Serialization.class, Serializer.class, Deserializer.class, + Converters.class, JsonSerialization.class, JsonSerializer.class, JsonDeserializer.class, - JavaxJsonFactories.class ) + JavaxJsonFactories.class, JavaxJsonAdapters.class ) .taggedWith( Serialization.Format.JSON ) .visibleIn( visibility() ); if( hasIdentity() ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/CustomJsonAdapterTest.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/CustomJsonAdapterTest.java b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/CustomJsonAdapterTest.java index 57ad62b..85db21e 100644 --- a/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/CustomJsonAdapterTest.java +++ b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/CustomJsonAdapterTest.java @@ -20,7 +20,6 @@ package org.apache.polygene.serialization.javaxjson; import java.time.LocalDate; import java.util.function.BiFunction; import java.util.function.Function; -import javax.json.JsonBuilderFactory; import javax.json.JsonObject; import javax.json.JsonString; import javax.json.JsonValue; @@ -86,11 +85,10 @@ public class CustomJsonAdapterTest extends AbstractPolygeneTest public Class<CustomValue> type() { return CustomValue.class; } @Override - public JsonValue serialize( JsonBuilderFactory builderFactory, + public JsonValue serialize( JavaxJsonFactories jsonFactories, Object object, Function<Object, JsonValue> serialize ) { - // TODO FUCK JSON - return JavaxJson.toJsonString( type().cast( object ).state ); + return jsonFactories.toJsonString( type().cast( object ).state ); } @Override @@ -112,14 +110,14 @@ public class CustomJsonAdapterTest extends AbstractPolygeneTest public Class<CustomStructure> type() { return CustomStructure.class; } @Override - public JsonValue serialize( JsonBuilderFactory builderFactory, + public JsonValue serialize( JavaxJsonFactories jsonFactories, Object object, Function<Object, JsonValue> serialize ) { CustomStructure customStructure = type().cast( object ); - return builderFactory.createObjectBuilder() - .add( "foo", customStructure.foo ) - .add( "bar", serialize.apply( customStructure.bar ) ) - .build(); + return jsonFactories.builderFactory().createObjectBuilder() + .add( "foo", customStructure.foo ) + .add( "bar", serialize.apply( customStructure.bar ) ) + .build(); } @Override http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/JavaxJsonValueCompositeSerializationTest.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/JavaxJsonValueCompositeSerializationTest.java b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/JavaxJsonValueCompositeSerializationTest.java index 34b81c5..d628cb2 100644 --- a/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/JavaxJsonValueCompositeSerializationTest.java +++ b/extensions/serialization-javaxjson/src/test/java/org/apache/polygene/serialization/javaxjson/JavaxJsonValueCompositeSerializationTest.java @@ -18,10 +18,10 @@ package org.apache.polygene.serialization.javaxjson; import java.io.StringReader; -import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonValue; import org.apache.polygene.api.injection.scope.Service; +import org.apache.polygene.api.serialization.Serializer; import org.apache.polygene.api.unitofwork.UnitOfWork; import org.apache.polygene.bootstrap.ModuleAssembly; import org.apache.polygene.serialization.javaxjson.assembly.JavaxJsonSerializationAssembler; @@ -50,27 +50,33 @@ public class JavaxJsonValueCompositeSerializationTest extends AbstractValueCompo JsonSerialization jsonSerialization; // END SNIPPET: json-serialization + @Service + JavaxJsonFactories jsonFactories; + @Test public void valueCompositeJsonEquality() { // START SNIPPET: json-serialization try( UnitOfWork uow = unitOfWorkFactory.newUnitOfWork() ) { - Some some = buildSomeValue( moduleInstance, uow, "42" ); + Some valueInstance = buildSomeValue( moduleInstance, uow, "42" ); // Serialize using injected service - JsonValue jsonState = jsonSerialization.toJson( some ); - String stateString = jsonState.toString(); - System.out.println( jsonState.toString() ); + JsonValue serializedJson = jsonSerialization.toJson( valueInstance ); + System.out.println( serializedJson.toString() ); // Deserialize using Module API - Some some2 = moduleInstance.newValueFromSerializedState( Some.class, stateString ); - - assertThat( "Deserialized Value equality", some, equalTo( some2 ) ); - - JsonObject jsonState2 = Json.createReader( new StringReader( some2.toString() ) ).readObject(); + Some valueFromSerializedState = moduleInstance.newValueFromSerializedState( Some.class, serializedJson.toString() ); + assertThat( "Deserialized Value equality", valueInstance, equalTo( valueFromSerializedState ) ); + // END SNIPPET: json-serialization - assertThat( "value.toString() JSON equality", jsonState, equalTo( jsonState2 ) ); + // value.toString() + JsonValue valueJsonWithoutTypeInfo = jsonSerialization.toJson( Serializer.Options.NO_TYPE_INFO, valueFromSerializedState ); + JsonObject valueToStringJson = jsonFactories.readerFactory() + .createReader( new StringReader( valueFromSerializedState.toString() ) ) + .readObject(); + assertThat( "value.toString() JSON equality", valueJsonWithoutTypeInfo, equalTo( valueToStringJson ) ); + // START SNIPPET: json-serialization } // END SNIPPET: json-serialization } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java index 3561d1e..a4863c0 100644 --- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java +++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java @@ -38,6 +38,8 @@ import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.stream.StreamSource; import org.apache.polygene.api.association.AssociationDescriptor; +import org.apache.polygene.api.composite.CompositeDescriptor; +import org.apache.polygene.api.composite.StatefulAssociationCompositeDescriptor; import org.apache.polygene.api.entity.EntityReference; import org.apache.polygene.api.injection.scope.This; import org.apache.polygene.api.injection.scope.Uses; @@ -53,11 +55,10 @@ import org.apache.polygene.api.type.ArrayType; import org.apache.polygene.api.type.CollectionType; import org.apache.polygene.api.type.EnumType; import org.apache.polygene.api.type.MapType; -import org.apache.polygene.api.type.ValueCompositeType; +import org.apache.polygene.api.type.StatefulAssociationValueType; import org.apache.polygene.api.type.ValueType; import org.apache.polygene.api.util.Annotations; import org.apache.polygene.api.value.ValueBuilder; -import org.apache.polygene.api.value.ValueDescriptor; import org.apache.polygene.spi.serialization.AbstractTextDeserializer; import org.apache.polygene.spi.serialization.XmlDeserializer; import org.w3c.dom.Element; @@ -149,35 +150,38 @@ public class JavaxXmlDeserializer extends AbstractTextDeserializer { return (T) adapter.deserialize( xml, ( element, type ) -> doDeserialize( module, type, element ) ); } - if( EnumType.class.isAssignableFrom( valueType.getClass() ) ) + Class<? extends ValueType> valueTypeClass = valueType.getClass(); + if( EnumType.class.isAssignableFrom( valueTypeClass ) ) { return (T) Enum.valueOf( (Class) valueType.primaryType(), xml.getNodeValue() ); } - if( ArrayType.class.isAssignableFrom( valueType.getClass() ) ) + if( ArrayType.class.isAssignableFrom( valueTypeClass ) ) { return (T) deserializeArray( module, (ArrayType) valueType, xml ); } - if( CollectionType.class.isAssignableFrom( valueType.getClass() ) ) + if( CollectionType.class.isAssignableFrom( valueTypeClass ) ) { return (T) deserializeCollection( module, (CollectionType) valueType, xml ); } - if( MapType.class.isAssignableFrom( valueType.getClass() ) ) + if( MapType.class.isAssignableFrom( valueTypeClass ) ) { return (T) deserializeMap( module, (MapType) valueType, xml ); } - if( ValueCompositeType.class.isAssignableFrom( valueType.getClass() ) ) + if( StatefulAssociationValueType.class.isAssignableFrom( valueTypeClass ) ) { - return (T) deserializeValueComposite( module, (ValueCompositeType) valueType, xml ); + return (T) deserializeStatefulAssociationValue( module, (StatefulAssociationValueType<?>) valueType, xml ); } return (T) doGuessDeserialize( module, valueType, xml ); } - private Object deserializeValueComposite( ModuleDescriptor module, ValueCompositeType valueType, Node xml ) + private Object deserializeStatefulAssociationValue( ModuleDescriptor module, + StatefulAssociationValueType<?> valueType, Node xml ) { Optional<String> typeInfo = getTypeInfo( xml ); if( typeInfo.isPresent() ) { - ValueDescriptor descriptor = module.valueDescriptor( typeInfo.get() ); + StatefulAssociationCompositeDescriptor descriptor = statefulCompositeDescriptorFor( module, + typeInfo.get() ); if( descriptor == null ) { String typeInfoName = settings.getTypeInfoTagName(); @@ -354,22 +358,12 @@ public class JavaxXmlDeserializer extends AbstractTextDeserializer Optional<String> typeInfo = getTypeInfo( xml ); if( typeInfo.isPresent() ) { - ValueDescriptor valueDescriptor = module.valueDescriptor( typeInfo.get() ); - if( valueDescriptor != null ) + StatefulAssociationCompositeDescriptor descriptor = statefulCompositeDescriptorFor( module, + typeInfo.get() ); + if( descriptor != null ) { - return deserializeValueComposite( valueDescriptor.module(), valueDescriptor.valueType(), xml ); - } - } - if( xml.getNodeType() == Node.CDATA_SECTION_NODE || xml.getNodeType() == Node.TEXT_NODE ) - { - byte[] bytes = Base64.getDecoder().decode( xml.getNodeValue().getBytes( UTF_8 ) ); - try - { - return deserializeJava( bytes ); - } - catch( SerializationException ex ) - { - throw new SerializationException( "Don't know how to deserialize " + valueType + " from " + xml, ex ); + return deserializeStatefulAssociationValue( ( (CompositeDescriptor) descriptor ).module(), + descriptor.valueType(), xml ); } } throw new SerializationException( "Don't know how to deserialize " + valueType + " from " + xml ); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java index fa50019..927359a 100644 --- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java +++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java @@ -31,7 +31,9 @@ import javax.xml.transform.stream.StreamResult; import org.apache.polygene.api.PolygeneAPI; import org.apache.polygene.api.association.AssociationStateHolder; import org.apache.polygene.api.common.Optional; +import org.apache.polygene.api.composite.Composite; import org.apache.polygene.api.composite.CompositeInstance; +import org.apache.polygene.api.composite.StatefulAssociationCompositeDescriptor; import org.apache.polygene.api.entity.EntityReference; import org.apache.polygene.api.injection.scope.Structure; import org.apache.polygene.api.injection.scope.This; @@ -46,10 +48,7 @@ import org.apache.polygene.api.structure.Module; import org.apache.polygene.api.type.ArrayType; import org.apache.polygene.api.type.EnumType; import org.apache.polygene.api.type.MapType; -import org.apache.polygene.api.type.ValueCompositeType; -import org.apache.polygene.api.util.Annotations; -import org.apache.polygene.api.value.ValueComposite; -import org.apache.polygene.api.value.ValueDescriptor; +import org.apache.polygene.api.type.StatefulAssociationValueType; import org.apache.polygene.spi.serialization.AbstractTextSerializer; import org.apache.polygene.spi.serialization.XmlSerializer; import org.apache.polygene.spi.util.ArrayIterable; @@ -146,11 +145,6 @@ public class JavaxXmlSerializer extends AbstractTextSerializer return document.createElement( NULL_ELEMENT_NAME ); } Class<?> objectClass = object.getClass(); - ConvertedBy convertedBy = Annotations.annotationOn( objectClass, ConvertedBy.class ); - if( convertedBy != null ) - { - return doSerialize( document, options, module.newObject( convertedBy.value() ).toString( object ), false ); - } Converter<Object> converter = converters.converterFor( objectClass ); if( converter != null ) { @@ -165,9 +159,9 @@ public class JavaxXmlSerializer extends AbstractTextSerializer { return document.createTextNode( object.toString() ); } - if( ValueCompositeType.isValueComposite( objectClass ) ) + if( StatefulAssociationValueType.isStatefulAssociationValue( objectClass ) ) { - return serializeValueComposite( document, options, object, root ); + return serializeStatefulAssociationValue( document, options, object, root ); } if( MapType.isMap( objectClass ) ) { @@ -185,17 +179,16 @@ public class JavaxXmlSerializer extends AbstractTextSerializer { return serializeStream( document, options, (Stream<?>) object ); } - // Fallback to Java Serialization in Base 64 - byte[] bytes = Base64.getEncoder().encode( serializeJava( object ) ); - return document.createCDATASection( new String( bytes, UTF_8 ) ); + throw new SerializationException( "Don't know how to serialize " + object ); } - private <T> Node serializeValueComposite( Document document, Options options, T composite, boolean root ) + private <T> Node serializeStatefulAssociationValue( Document document, Options options, T composite, boolean root ) { - CompositeInstance instance = PolygeneAPI.FUNCTION_COMPOSITE_INSTANCE_OF.apply( (ValueComposite) composite ); - ValueDescriptor descriptor = (ValueDescriptor) instance.descriptor(); + CompositeInstance instance = PolygeneAPI.FUNCTION_COMPOSITE_INSTANCE_OF.apply( (Composite) composite ); + StatefulAssociationCompositeDescriptor descriptor = + (StatefulAssociationCompositeDescriptor) instance.descriptor(); AssociationStateHolder state = (AssociationStateHolder) instance.state(); - ValueCompositeType valueType = descriptor.valueType(); + StatefulAssociationValueType<?> valueType = descriptor.valueType(); Element valueElement = document.createElement( settings.getValueTagName() ); valueType.properties().forEach( @@ -239,7 +232,7 @@ public class JavaxXmlSerializer extends AbstractTextSerializer valueElement.appendChild( element ); } ); - if( !root && options.includeTypeInfo() ) + if( ( root && options.rootTypeInfo() ) || ( !root && options.nestedTypeInfo() ) ) { valueElement.setAttribute( settings.getTypeInfoTagName(), valueType.primaryType().getName() ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/assembly/JavaxXmlSerializationAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/assembly/JavaxXmlSerializationAssembler.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/assembly/JavaxXmlSerializationAssembler.java index 1f57450..e6a69f5 100644 --- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/assembly/JavaxXmlSerializationAssembler.java +++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/assembly/JavaxXmlSerializationAssembler.java @@ -17,12 +17,14 @@ */ package org.apache.polygene.serialization.javaxxml.assembly; +import org.apache.polygene.api.serialization.Converters; import org.apache.polygene.api.serialization.Deserializer; import org.apache.polygene.api.serialization.Serialization; import org.apache.polygene.api.serialization.Serializer; import org.apache.polygene.bootstrap.Assemblers; import org.apache.polygene.bootstrap.ModuleAssembly; import org.apache.polygene.bootstrap.ServiceDeclaration; +import org.apache.polygene.serialization.javaxxml.JavaxXmlAdapters; import org.apache.polygene.serialization.javaxxml.JavaxXmlFactories; import org.apache.polygene.serialization.javaxxml.JavaxXmlSerialization; import org.apache.polygene.serialization.javaxxml.JavaxXmlSettings; @@ -46,9 +48,10 @@ public class JavaxXmlSerializationAssembler extends Assemblers.VisibilityIdentit ServiceDeclaration declaration = module.services( JavaxXmlSerialization.class ) .withTypes( Serialization.class, Serializer.class, Deserializer.class, + Converters.class, XmlSerialization.class, XmlSerializer.class, XmlDeserializer.class, - JavaxXmlFactories.class ) + JavaxXmlFactories.class, JavaxXmlAdapters.class ) .taggedWith( Serialization.Format.XML ) .visibleIn( visibility() ); if( hasIdentity() ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/b2ff271b/extensions/serialization-javaxxml/src/test/java/org/apache/polygene/serialization/javaxxml/JavaxXmlValueCompositeSerializationTest.java ---------------------------------------------------------------------- diff --git a/extensions/serialization-javaxxml/src/test/java/org/apache/polygene/serialization/javaxxml/JavaxXmlValueCompositeSerializationTest.java b/extensions/serialization-javaxxml/src/test/java/org/apache/polygene/serialization/javaxxml/JavaxXmlValueCompositeSerializationTest.java index 5c5679f..7ded112 100644 --- a/extensions/serialization-javaxxml/src/test/java/org/apache/polygene/serialization/javaxxml/JavaxXmlValueCompositeSerializationTest.java +++ b/extensions/serialization-javaxxml/src/test/java/org/apache/polygene/serialization/javaxxml/JavaxXmlValueCompositeSerializationTest.java @@ -18,6 +18,7 @@ package org.apache.polygene.serialization.javaxxml; import org.apache.polygene.api.injection.scope.Service; +import org.apache.polygene.api.serialization.Serializer; import org.apache.polygene.api.unitofwork.UnitOfWork; import org.apache.polygene.bootstrap.ModuleAssembly; import org.apache.polygene.serialization.javaxxml.assembly.JavaxXmlSerializationAssembler; @@ -55,22 +56,25 @@ public class JavaxXmlValueCompositeSerializationTest extends AbstractValueCompos // START SNIPPET: xml-serialization try( UnitOfWork uow = unitOfWorkFactory.newUnitOfWork() ) { - Some some = buildSomeValue( moduleInstance, uow, "23" ); + Some valueInstance = buildSomeValue( moduleInstance, uow, "42" ); // Serialize using injected service - String stateString = serialization.serialize( some ); - System.out.println( stateString ); + String serializedXml = xmlSerialization.serialize( valueInstance ); + System.out.println( serializedXml ); // Deserialize using Module API - Some some2 = moduleInstance.newValueFromSerializedState( Some.class, stateString ); - - assertThat( "Deserialized Value equality", some, equalTo( some2 ) ); + Some valueFromSerializedState = moduleInstance.newValueFromSerializedState( Some.class, serializedXml ); + assertThat( "Deserialized Value equality", valueInstance, equalTo( valueFromSerializedState ) ); + // END SNIPPET: xml-serialization + // value.toString() // Need to loosely compare because of HashMaps not retaining order + String valueXmlWithoutTypeInfo = xmlSerialization.serialize( Serializer.Options.NO_TYPE_INFO, valueFromSerializedState ); assertThat( "value.toString() XML equality", - stateString, - isSimilarTo( some2.toString() ) + valueFromSerializedState.toString(), + isSimilarTo( valueXmlWithoutTypeInfo ) .withNodeMatcher( new DefaultNodeMatcher( ElementSelectors.byNameAndAllAttributes ) ) ); + // START SNIPPET: xml-serialization } // END SNIPPET: xml-serialization }
