| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. 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. For additional information regarding |
| * copyright in this work, please see the NOTICE file in the top level |
| * directory of this distribution. |
| * |
| */ |
| package org.apache.usergrid.persistence.collection.impl; |
| |
| |
| |
| import com.datastax.driver.core.Session; |
| import com.google.common.base.Preconditions; |
| import com.google.common.cache.CacheBuilder; |
| import com.google.common.cache.CacheLoader; |
| import com.google.common.cache.LoadingCache; |
| import com.google.inject.Inject; |
| import com.google.inject.Singleton; |
| import com.netflix.astyanax.Keyspace; |
| import org.apache.usergrid.persistence.actorsystem.ActorSystemManager; |
| import org.apache.usergrid.persistence.collection.EntityCollectionManager; |
| import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory; |
| import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkCommit; |
| import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkStart; |
| import org.apache.usergrid.persistence.collection.mvcc.stage.delete.UniqueCleanup; |
| import org.apache.usergrid.persistence.collection.mvcc.stage.delete.VersionCompact; |
| import org.apache.usergrid.persistence.collection.mvcc.stage.write.*; |
| import org.apache.usergrid.persistence.collection.scheduler.CollectionExecutorScheduler; |
| import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy; |
| import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy; |
| import org.apache.usergrid.persistence.collection.serialization.SerializationFig; |
| import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy; |
| import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService; |
| import org.apache.usergrid.persistence.core.CassandraConfig; |
| import org.apache.usergrid.persistence.core.metrics.MetricsFactory; |
| import org.apache.usergrid.persistence.core.rx.RxTaskScheduler; |
| import org.apache.usergrid.persistence.core.scope.ApplicationScope; |
| |
| import java.util.concurrent.ExecutionException; |
| |
| |
| |
| /** |
| * returns Entity Collection Managers built to manage caching |
| */ |
| @Singleton |
| public class EntityCollectionManagerFactoryImpl implements EntityCollectionManagerFactory { |
| |
| private final WriteStart writeStart; |
| private final WriteUniqueVerify writeVerifyUnique; |
| private final WriteOptimisticVerify writeOptimisticVerify; |
| private final WriteCommit writeCommit; |
| private final RollbackAction rollback; |
| private final MarkStart markStart; |
| private final MarkCommit markCommit; |
| private final UniqueCleanup uniqueCleanup; |
| private final VersionCompact versionCompact; |
| private final SerializationFig serializationFig; |
| private final MvccEntitySerializationStrategy entitySerializationStrategy; |
| private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy; |
| private final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy; |
| private final Keyspace keyspace; |
| private final Session session; |
| private final MetricsFactory metricsFactory; |
| private final RxTaskScheduler rxTaskScheduler; |
| private final ActorSystemManager actorSystemManager; |
| private final UniqueValuesService uniqueValuesService; |
| |
| private final CassandraConfig cassandraConfig; |
| |
| private LoadingCache<ApplicationScope, EntityCollectionManager> ecmCache = |
| CacheBuilder.newBuilder().maximumSize( 1000 ) |
| .build( new CacheLoader<ApplicationScope, EntityCollectionManager>() { |
| public EntityCollectionManager load( ApplicationScope scope ) { |
| //create the target EM that will perform logic |
| final EntityCollectionManager target = new EntityCollectionManagerImpl( |
| |
| writeStart, |
| writeVerifyUnique, |
| writeOptimisticVerify, |
| writeCommit, |
| rollback, |
| markStart, |
| markCommit, |
| uniqueCleanup, |
| versionCompact, |
| |
| entitySerializationStrategy, |
| uniqueValueSerializationStrategy, |
| mvccLogEntrySerializationStrategy, |
| |
| keyspace, |
| metricsFactory, |
| serializationFig, |
| rxTaskScheduler, |
| actorSystemManager, |
| uniqueValuesService, |
| cassandraConfig, |
| scope, |
| session); |
| |
| return target; |
| } |
| } ); |
| |
| |
| @Inject |
| public EntityCollectionManagerFactoryImpl( |
| final WriteStart writeStart, |
| final WriteUniqueVerify writeVerifyUnique, |
| final WriteOptimisticVerify writeOptimisticVerify, |
| final WriteCommit writeCommit, |
| final RollbackAction rollback, |
| final MarkStart markStart, |
| final MarkCommit markCommit, |
| final UniqueCleanup uniqueCleanup, |
| final VersionCompact versionCompact, |
| final SerializationFig serializationFig, |
| final MvccEntitySerializationStrategy entitySerializationStrategy, |
| final UniqueValueSerializationStrategy uniqueValueSerializationStrategy, |
| final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy, |
| final Keyspace keyspace, |
| final MetricsFactory metricsFactory, |
| @CollectionExecutorScheduler |
| final RxTaskScheduler rxTaskScheduler, |
| final ActorSystemManager actorSystemManager, |
| final UniqueValuesService uniqueValuesService, |
| final CassandraConfig cassandraConfig, |
| final Session session ) { |
| |
| this.writeStart = writeStart; |
| this.writeVerifyUnique = writeVerifyUnique; |
| this.writeOptimisticVerify = writeOptimisticVerify; |
| this.writeCommit = writeCommit; |
| this.rollback = rollback; |
| this.markStart = markStart; |
| this.markCommit = markCommit; |
| this.uniqueCleanup = uniqueCleanup; |
| this.versionCompact = versionCompact; |
| this.serializationFig = serializationFig; |
| this.entitySerializationStrategy = entitySerializationStrategy; |
| this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy; |
| this.mvccLogEntrySerializationStrategy = mvccLogEntrySerializationStrategy; |
| this.keyspace = keyspace; |
| this.metricsFactory = metricsFactory; |
| this.rxTaskScheduler = rxTaskScheduler; |
| this.actorSystemManager = actorSystemManager; |
| this.uniqueValuesService = uniqueValuesService; |
| this.cassandraConfig = cassandraConfig; |
| this.session = session; |
| |
| } |
| |
| @Override |
| public EntityCollectionManager createCollectionManager(ApplicationScope applicationScope) { |
| Preconditions.checkNotNull(applicationScope); |
| try { |
| return ecmCache.get(applicationScope); |
| } catch (ExecutionException ee) { |
| throw new RuntimeException(ee); |
| } |
| } |
| |
| |
| @Override |
| public void invalidate() { |
| ecmCache.invalidateAll(); |
| } |
| } |