/* * Copyright © 2014-2015 Cask Data, Inc. * * Licensed 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 co.cask.cdap.data2.dataset2; import co.cask.cdap.api.dataset.Dataset; import co.cask.cdap.api.dataset.DatasetDefinition; import co.cask.cdap.api.dataset.DatasetManagementException; import co.cask.cdap.api.dataset.DatasetProperties; import co.cask.cdap.api.dataset.DatasetSpecification; import co.cask.cdap.api.dataset.module.DatasetDefinitionRegistry; import co.cask.cdap.api.dataset.module.DatasetModule; import co.cask.cdap.common.conf.CConfiguration; import co.cask.cdap.common.conf.Constants; import co.cask.cdap.common.guice.ConfigModule; import co.cask.cdap.common.guice.LocationRuntimeModule; import co.cask.cdap.data.runtime.SystemDatasetRuntimeModule; import co.cask.cdap.data.runtime.TransactionExecutorModule; import co.cask.cdap.proto.DatasetSpecificationSummary; import co.cask.cdap.proto.Id; import co.cask.tephra.DefaultTransactionExecutor; import co.cask.tephra.TransactionAware; import co.cask.tephra.TransactionExecutor; import co.cask.tephra.TransactionManager; import co.cask.tephra.inmemory.InMemoryTxSystemClient; import co.cask.tephra.inmemory.MinimalTxSystemClient; import co.cask.tephra.runtime.TransactionModules; import com.google.common.base.Preconditions; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.PrivateModule; import com.google.inject.assistedinject.FactoryModuleBuilder; import org.junit.rules.ExternalResource; import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Map; public final class DatasetFrameworkTestUtil extends ExternalResource { public static final Id.Namespace NAMESPACE_ID = Id.Namespace.from("myspace"); private Injector injector; private CConfiguration cConf; private TemporaryFolder tmpFolder; private DatasetFramework framework; private TransactionManager txManager; public Injector getInjector() { return injector; } public CConfiguration getConfiguration() { return cConf; } @Override protected void before() throws Throwable { this.tmpFolder = new TemporaryFolder(); tmpFolder.create(); File localDataDir = tmpFolder.newFolder(); cConf = CConfiguration.create(); cConf.set(Constants.CFG_LOCAL_DATA_DIR, localDataDir.getAbsolutePath()); injector = Guice.createInjector( new ConfigModule(cConf), new LocationRuntimeModule().getInMemoryModules(), new SystemDatasetRuntimeModule().getInMemoryModules(), new TransactionModules().getInMemoryModules(), new TransactionExecutorModule(), new PrivateModule() { @Override protected void configure() { install(new FactoryModuleBuilder() .implement(DatasetDefinitionRegistry.class, DefaultDatasetDefinitionRegistry.class) .build(DatasetDefinitionRegistryFactory.class)); bind(DatasetFramework.class).to(InMemoryDatasetFramework.class); expose(DatasetFramework.class); } } ); txManager = injector.getInstance(TransactionManager.class); txManager.startAndWait(); framework = injector.getInstance(DatasetFramework.class); } @Override protected void after() { if (txManager != null) { txManager.stopAndWait(); } if (tmpFolder != null) { tmpFolder.delete(); } } public DatasetFramework getFramework() { return framework; } public void addModule(Id.DatasetModule moduleId, DatasetModule module) throws DatasetManagementException { framework.addModule(moduleId, module); } public void deleteModule(Id.DatasetModule moduleId) throws DatasetManagementException { framework.deleteModule(moduleId); } public void createInstance(String type, Id.DatasetInstance datasetInstanceId, DatasetProperties properties) throws IOException, DatasetManagementException { framework.addInstance(type, datasetInstanceId, properties); } public void deleteInstance(Id.DatasetInstance datasetInstanceId) throws IOException, DatasetManagementException { framework.deleteInstance(datasetInstanceId); } public <T extends Dataset> T getInstance(Id.DatasetInstance datasetInstanceId) throws DatasetManagementException, IOException { return getInstance(datasetInstanceId, DatasetDefinition.NO_ARGUMENTS); } public <T extends Dataset> T getInstance(Id.DatasetInstance datasetInstanceId, Map<String, String> arguments) throws DatasetManagementException, IOException { return framework.getDataset(datasetInstanceId, arguments, null); } public DatasetSpecification getSpec(Id.DatasetInstance datasetInstanceId) throws DatasetManagementException { return framework.getDatasetSpec(datasetInstanceId); } public Collection<DatasetSpecificationSummary> list(Id.Namespace namespace) throws DatasetManagementException { return framework.getInstances(namespace); } /** * @param tables the TransactionAwares over which the returned TransactionExecutor operates on. * @return a TransactionExecutor that uses a dummy implementation of a TransactionSystemClient. Note that this * TransactionExecutor returns the same transaction ID across transactions, since it is using a dummy * implementation of TransactionSystemClient. */ public TransactionExecutor newTransactionExecutor(TransactionAware...tables) { Preconditions.checkArgument(tables != null); return new DefaultTransactionExecutor(new MinimalTxSystemClient(), tables); } /** * @param tables the TransactionAwares over which the returned TransactionExecutor operates on. * @return a TransactionExecutor that uses an in-memory implementation of a TransactionSystemClient. */ public TransactionExecutor newInMemoryTransactionExecutor(TransactionAware...tables) { Preconditions.checkArgument(tables != null); return new DefaultTransactionExecutor(new InMemoryTxSystemClient(txManager), tables); } public TransactionManager getTxManager() { return txManager; } // helper to make this method accessible to DatasetsUtilTest public static DatasetDefinition getDatasetDefinition(InMemoryDatasetFramework framework, Id.Namespace namespace, String type) { return framework.getDefinitionForType(namespace, type); } }