Skip to content

v2.0.0

Compare
Choose a tag to compare
@sunye sunye released this 15 Jul 15:08
· 124 commits to master since this release

2.0.0

Released on 2019-03-21.

IMPORTANT NOTE: Due to significant changes in data mapping, databases created with a previous version are not compatible with this release.
No migration helper is provided: the simplest way to transfer the old databases to the new ones, is to export the database into an XMI file and re-import it.

NOTE: The changelog of this version is not exhaustive and regroup only major changes.

Core

  • [NEW] Use ServiceLoader and OSGI Services to retrieve implementations of Config, BackendFactory and UriFactory
  • [NEW] Id instances are created by an IdProvider instead of static methods
  • [UPD] Ids use a long representation, or a 64-bits word. They can be converted to a hexadecimal string and vice versa to maintain compatibility with Backends that don't support long
  • [UPD] The hasher used to generate new Id from a value is now xxHash that provides better performance than MurmurHash3
  • [UPD] Features are identified by their EStructuralFeature#getFeatureId() instead of their name (see FeatureBean)

Back-ends and stores abstraction

  • [NEW] Introduce the new DataMapper layer to manipulate elements as key/value pairs.
    They are presented as several interfaces and each have their responsibility:
    • ContainerMapper : manage the container of elements (represented by ContainerBean)
    • ClassMapper : manage the meta-class of elements (represented by ClassBean)
    • ValueMapper : manage single-valued attributes of elements (identified by SingleFeatureBean)
    • ReferenceMapper : manage single-valued references between elements (identified by SingleFeatureBean)
    • ManyValueMapper : manage multi-valued attributes of elements (identified by ManyFeatureBean)
    • ManyReferenceMapper : manage multi-valued references between elements (identified by ManyFeatureBean)
  • [NEW] Several default mappings have been implemented to process references as attributes after a conversion, or to manage data with indices, arrays, lists, or with a custom way.
    They are presented as interfaces to allow a combination of several mappings.
    For example, you can combine: ReferenceAs<String>, MergeManyReferenceAs<String> and ManyValueWithLists. These mappings are optional
  • [NEW] A generic DefaultTransientBackend has been created to handle transient elements in memory:
    Custom TransientBackends are no longer necessary, but this requires the neoemf-io module to transfer the transient content to a PersistentBackend
  • [NEW] URIs are now created with factories instead of static methods
  • [UPD] Complete optimization of all existing database adapters
  • [UPD] Backends are auto-closed when the JVM is shutting-down
  • [UPD] StoreAdapter become the only EStore implementation, and provides a bridge between EMF and DataMappers
  • [UPD] All Backends and Stores inherit from the DataMapper architecture
  • [UPD] Back-end configuration have been merged, updated and simplified
  • [UPD] Configuration is now managed with a simple Properties file (may change in the near future)
  • [UPD] PersistentResource are no longer linked to their Backends, prefer using Stores
  • [UPD] BackendFactory#createBackend() take a URI as parameter instead of a File to handle distributed PersistentBackend
  • [DEL] All backend-specific implementations of PersistentStore have been merged with those at core-level
  • [DEL] InvalidStore has been replaced by InvalidBackend
  • [DEL] TransientStores have been removed and replaced by BoundInMemoryBackend (a lightweigth and shared version of an DefaultInMemoryBackend)

Automation

  • [NEW] BackendFactorys are automatically registered at runtime (no need to explicitly register them in the ResourceSet registry)
  • [NEW] BackendFactorys are linked to their associated UriFactory and Config with annotations which are processed at runtime: a UriFactory or Config can be retrieved from their association
  • [NEW] Stores and mappings are created by using reflection in BackendFactory to allow customizations (defined with Config)
  • [NEW] URIs are automatically created according to a common prefix ("neo-") and the lowercase name of their associated BackendFactory

I/O

  • [NEW] The direct-import becomes generic and works with all implementations
  • [NEW] The direct-export is fully implemented, and is possible to an XMI file (compressed or not), or another DataMapper

Performance

  • [NEW] Add batch methods getAll, setAll,... in addition to get, set,... to avoid multiple call
  • [UPD] BlueprintsBackends labels has been simplified by one-letter labels
  • [UPD] The default chunk of AutoSaveStore is processed automatically from the total amount of memory
  • [UPD] Map-based Serializers have been replaced by generic serializers (the implementation is located in atlanmod:commons-core and use FST)

Utility methods

  • [DEL] Utility classes and methods have been moved to atlanmod:commons-core

Tests

  • [NEW] All mappings have a code coverage of ~100% to ensure the expected behavior of future implementations
  • [NEW] HBase is now integrated in tests by using an Hadoop mini-cluster (requires Cygwin on Windows)
  • [UPD] Test helpers have been merged and simplified: now only a link to Context is needed for multi-backend tests
  • [UPD] Models used in io test-cases are now generated with Maven during the compilation
  • [UPD] Tests have been migrated to JUnit5

Benchmarks

  • [NEW] Use NEOEMF_HOME system variable to locate the base benchmark directory
  • [UPD] The NeoEMF database are created using the io importer instead of the standard importer
  • [NEW] Stores can be configured in benchmarks, with the s parameter
  • [UPD] Adapters are configured with the a parameter (previously b)

Miscellaneous

  • [NEW] FeatureMap support (still not supported by the neoemf-io module)
  • [NEW] Some methods use Optional instead of a comparison to null
  • [UPD] Complete review of EMF collections to handle massive iterations
  • [FIX] Issue #11: The LoggingStoreDecorator now use a dedicated Logger for its associated Backend
  • [FIX] Issue #12: The stores are updated according to the EMF calls, so that the backends are always synchronized.
    There is no longer custom processing during set() and add()
  • [FIX] Issue #15: The blueprints.***.directory property is overwritten in all cases by the current path:
    If a datastore already exists, then this property is updated with the new path, otherwise, the property stay unchanged.
  • [FIX] Issue #27/#28: Stores are no longer copied when the associated Resource is unloading: A Resource should not be called if it's not loaded
  • [FIX] Issue #57: The Cache<Id, PersistentEObject> is now common for all implementations
  • [FIX] Issue #58: guava dependencies are no longer used in the project
  • [FIX] Issue #63: BasicReferences are first processed as BasicAttributes when reading, then redirected in EcoreProcessor which has access to its real type with the EPackage
  • [FIX] Issue #64: If an Id is not found in Backends, then an empty array is returned
  • [FIX] Issue #70: The LazyMatchEngine class has been removed
  • [FIX] Issue #71: BoundInMemoryBackend are registered in a local registry to ensure that the features can be retrieved even if the associated PersistentEObject is freed from memory
  • [FIX] Issue #72: Ignore the uniqueness check of identifiers when creating a new Vertex
  • [FIX] Issue #73: The neoemf-data-map-core module no longer exists
  • [FIX] Issue #75: The io module now use the DataMapper structure, and not a custom implementation
  • [FIX] Issue #77: Errors are intercepted and displayed in Eclipse UI
  • [FIX] Issue #78: Improve the NullPointerException message
  • [FIX] Issue #80: DefaultPersistentEObject.toString() throws a StackOverflowError on EClass instances
  • [FIX] Issue #84: FeatureMaps was not supported

Refactoring

  • [UPD] PersistenceBackendFactory become BackendFactory: they also create TransientBackends
  • [UPD] OptionsBuilder become Config
  • [UPD] PersistenceURI become UriFactory: static methods have been replaced by this factory
  • [UPD] PersistentStore become Store: they don't have any state, so the "Persistent" prefix does not make sense
  • [UPD] FeatureKey become SingleFeatureBean
  • [UPD] MultiFeatureKey become ManyFeatureBean
  • [UPD] MetaclassValue become ClassBean
  • [UPD] ContainerValue has been merged with SingleFeatureBean

Dependencies

  • [NEW] chronicle-map : 3.17.0
  • [UPD] com.sleepycat:je : 5.0.73 to 18.3.12 (BerkeleyDB)
  • [UPD] mapdb: 3.0.5 to 3.0.7
  • [UPD] org.eclipse.emf : 2.12.0 to 2.15.0 (including associated dependencies)
  • [UPD] cglib : 3.2.4 to 3.2.10
  • [UPD] log4j : 2.7 to 2.11.1
  • [UPD] org.neo4j : 1.9.6 to 2.1.8 (include blueprints-neo4j-graph to blueprints-neo4j2-graph)
  • [DEL] junit: No longer needed, managed by atlanmod:commons-core (5.0.3+)
  • [DEL] assertj : No longer needed, managed by atlanmod:commons-core (3.9.0+)
  • [DEL] mockito : No longer needed, managed by atlanmod:commons-core (2.13.0+)
  • [DEL] caffeine : No longer needed, managed by atlanmod:commons-core (2.6.0+)
  • [DEL] guava : No longer needed
  • [DEL] commons-collections4 : No longer needed
  • [DEL] commons-configuration : No longer needed
  • [DEL] commons-io : No longer needed
  • [DEL] commons-lang3 : No longer needed