/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.usergrid.persistence.graph.guice; import org.safehaus.guicyfig.GuicyFigModule; import org.apache.usergrid.persistence.core.consistency.TimeService; import org.apache.usergrid.persistence.core.consistency.TimeServiceImpl; import org.apache.usergrid.persistence.core.migration.data.DataMigration; import org.apache.usergrid.persistence.core.migration.data.MigrationPlugin; import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship; import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet; import org.apache.usergrid.persistence.core.migration.schema.Migration; import org.apache.usergrid.persistence.graph.GraphFig; import org.apache.usergrid.persistence.graph.GraphManagerFactory; import org.apache.usergrid.persistence.graph.impl.stage.EdgeDeleteListener; import org.apache.usergrid.persistence.graph.impl.stage.EdgeDeleteListenerImpl; import org.apache.usergrid.persistence.graph.impl.stage.EdgeDeleteRepair; import org.apache.usergrid.persistence.graph.impl.stage.EdgeDeleteRepairImpl; import org.apache.usergrid.persistence.graph.impl.stage.EdgeMetaRepair; import org.apache.usergrid.persistence.graph.impl.stage.EdgeMetaRepairImpl; import org.apache.usergrid.persistence.graph.impl.stage.NodeDeleteListener; import org.apache.usergrid.persistence.graph.impl.stage.NodeDeleteListenerImpl; import org.apache.usergrid.persistence.graph.serialization.EdgeMetadataSerialization; import org.apache.usergrid.persistence.graph.serialization.EdgeSerialization; import org.apache.usergrid.persistence.graph.serialization.EdgesObservable; import org.apache.usergrid.persistence.graph.serialization.NodeSerialization; import org.apache.usergrid.persistence.graph.serialization.TargetIdObservable; import org.apache.usergrid.persistence.graph.serialization.impl.EdgeMetadataSerializationProxyImpl; import org.apache.usergrid.persistence.graph.serialization.impl.EdgeMetadataSerializationV1Impl; import org.apache.usergrid.persistence.graph.serialization.impl.EdgeMetadataSerializationV2Impl; import org.apache.usergrid.persistence.graph.serialization.impl.EdgeSerializationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.EdgesObservableImpl; import org.apache.usergrid.persistence.graph.serialization.impl.GraphManagerFactoryImpl; import org.apache.usergrid.persistence.graph.serialization.impl.NodeSerializationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.TargetIdObservableImpl; import org.apache.usergrid.persistence.graph.serialization.impl.migration.EdgeDataMigrationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.migration.GraphMigration; import org.apache.usergrid.persistence.graph.serialization.impl.migration.GraphMigrationPlugin; import org.apache.usergrid.persistence.graph.serialization.impl.shard.AsyncTaskExecutor; import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeColumnFamilies; import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeShardSerialization; import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeShardStrategy; import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardAllocation; import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardCache; import org.apache.usergrid.persistence.graph.serialization.impl.shard.ShardGroupCompaction; import org.apache.usergrid.persistence.graph.serialization.impl.shard.ShardGroupDeletion; import org.apache.usergrid.persistence.graph.serialization.impl.shard.ShardedEdgeSerialization; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.AsyncTaskExecutorImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.EdgeShardSerializationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.NodeShardAllocationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.NodeShardCacheImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.ShardGroupCompactionImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.ShardGroupDeletionImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.ShardedEdgeSerializationImpl; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.SizebasedEdgeColumnFamilies; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.SizebasedEdgeShardStrategy; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Key; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.Multibinder; public abstract class GraphModule extends AbstractModule { @Override protected void configure() { //install our configuration install( new GuicyFigModule( GraphFig.class ) ); bind( NodeSerialization.class ).to( NodeSerializationImpl.class ); bind( TimeService.class ).to( TimeServiceImpl.class ); bind( GraphManagerFactory.class ).to(GraphManagerFactoryImpl.class); bind(EdgesObservable.class).to(EdgesObservableImpl.class); bind(TargetIdObservable.class).to(TargetIdObservableImpl.class); bind(EdgesObservable.class).to(EdgesObservableImpl.class); bind(EdgeMetadataSerialization.class).to(EdgeMetadataSerializationProxyImpl.class); /** * bindings for shard allocations */ bind(NodeShardAllocation.class).to( NodeShardAllocationImpl.class ); bind( NodeShardCache.class ).to( NodeShardCacheImpl.class ); /** * Binding for task tracker */ bind( AsyncTaskExecutor.class ).to( AsyncTaskExecutorImpl.class ); bind( ShardGroupDeletion.class ).to( ShardGroupDeletionImpl.class ); /** * Bind our strategies based on their internal annotations. */ bind( EdgeShardSerialization.class ).to( EdgeShardSerializationImpl.class ); //Repair/cleanup classes. bind( EdgeMetaRepair.class ).to( EdgeMetaRepairImpl.class ); bind( EdgeDeleteRepair.class ).to( EdgeDeleteRepairImpl.class ); //wire up the edg migration Multibinder<DataMigration> dataMigrationMultibinder = Multibinder.newSetBinder( binder(), new TypeLiteral<DataMigration>() {}, GraphMigration.class ); dataMigrationMultibinder.addBinding().to( EdgeDataMigrationImpl.class ); //wire up the collection migration plugin Multibinder.newSetBinder( binder(), MigrationPlugin.class ).addBinding().to( GraphMigrationPlugin.class ); /** * Add our listeners */ bind( NodeDeleteListener.class ).to( NodeDeleteListenerImpl.class ); bind( EdgeDeleteListener.class ).to( EdgeDeleteListenerImpl.class ); bind( EdgeSerialization.class ).to( EdgeSerializationImpl.class ); bind( EdgeShardStrategy.class ).to( SizebasedEdgeShardStrategy.class ); bind(ShardedEdgeSerialization.class ).to( ShardedEdgeSerializationImpl.class ); bind( EdgeColumnFamilies.class ).to( SizebasedEdgeColumnFamilies.class ); bind(ShardGroupCompaction.class ).to( ShardGroupCompactionImpl.class ); /** * Bind our implementation */ /******** * Migration bindings ********/ //do multibindings for migrations Multibinder<Migration> migrationBinding = Multibinder.newSetBinder( binder(), Migration.class ); migrationBinding.addBinding().to( Key.get( NodeSerialization.class ) ); //bind each singleton to the multi set. Otherwise we won't migrate properly migrationBinding.addBinding().to( Key.get( EdgeColumnFamilies.class ) ); migrationBinding.addBinding().to( Key.get( EdgeShardSerialization.class ) ); //Get the old version and the new one migrationBinding.addBinding().to( Key.get( EdgeMetadataSerializationV1Impl.class) ); migrationBinding.addBinding().to( Key.get( EdgeMetadataSerializationV2Impl.class ) ); /** * Migrations of our edge meta serialization */ bind( EdgeMetadataSerializationV1Impl.class ); bind( EdgeMetadataSerializationV2Impl.class ); bind( EdgeMetadataSerialization.class ).to( EdgeMetadataSerializationProxyImpl.class ); //invoke the migration plugin config configureMigrationProvider(); } /** * Configure via explicit declaration the migration path we can follow * @param v1 * @param v2 * @return */ @Singleton @Inject @Provides public VersionedMigrationSet<EdgeMetadataSerialization> getVersions(final EdgeMetadataSerializationV1Impl v1, final EdgeMetadataSerializationV2Impl v2){ //migrate from v1 to v2 MigrationRelationship<EdgeMetadataSerialization> v1Tov2 = new MigrationRelationship<>( v1, v2); //keep our curent tuple, v2, v2 MigrationRelationship<EdgeMetadataSerialization> current = new MigrationRelationship<EdgeMetadataSerialization>( v2, v2 ); //now create our set of versions VersionedMigrationSet<EdgeMetadataSerialization> set = new VersionedMigrationSet<>( v1Tov2, current ); return set; } /** * Gives callers the ability to to configure an instance of * * MigrationDataProvider<ApplicationScope> for providing data migrations */ public abstract void configureMigrationProvider(); }