/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.microsoft.azure.management.sql.implementation;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.resources.fluentcore.arm.collection.implementation.ReadableWrappersImpl;
import com.microsoft.azure.management.resources.fluentcore.arm.models.IndependentChild;
import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.IndependentChildResourceImpl;
import com.microsoft.azure.management.resources.fluentcore.model.Creatable;
import com.microsoft.azure.management.resources.fluentcore.utils.PagedListConverter;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import com.microsoft.azure.management.sql.ElasticPoolActivity;
import com.microsoft.azure.management.sql.ElasticPoolDatabaseActivity;
import com.microsoft.azure.management.sql.ElasticPoolEditions;
import com.microsoft.azure.management.sql.ElasticPoolState;
import com.microsoft.azure.management.sql.SqlDatabase;
import com.microsoft.azure.management.sql.SqlElasticPool;
import com.microsoft.azure.management.sql.SqlServer;
import org.joda.time.DateTime;
import rx.Observable;
import rx.functions.Func1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Implementation for SqlElasticPool and its parent interfaces.
*/
@LangDefinition
class SqlElasticPoolImpl
extends IndependentChildResourceImpl<
SqlElasticPool,
SqlServer,
ElasticPoolInner,
SqlElasticPoolImpl,
SqlServerManager>
implements SqlElasticPool,
SqlElasticPool.Definition,
SqlElasticPool.Update,
IndependentChild.DefinitionStages.WithParentResource<SqlElasticPool, SqlServer> {
private final DatabasesImpl databasesImpl;
private final Map<String, SqlDatabaseImpl> databaseCreatableMap;
protected SqlElasticPoolImpl(String name,
ElasticPoolInner innerObject,
DatabasesImpl databasesImpl,
SqlServerManager manager) {
super(name, innerObject, manager);
this.databasesImpl = databasesImpl;
this.databaseCreatableMap = new HashMap<>();
}
@Override
public String sqlServerName() {
return this.parentName;
}
@Override
public DateTime creationDate() {
return this.inner().creationDate();
}
@Override
public ElasticPoolState state() {
return this.inner().state();
}
@Override
public ElasticPoolEditions edition() {
return this.inner().edition();
}
@Override
public int dtu() {
return Utils.toPrimitiveInt(this.inner().dtu());
}
@Override
public int databaseDtuMax() {
return Utils.toPrimitiveInt(this.inner().databaseDtuMax());
}
@Override
public int databaseDtuMin() {
return Utils.toPrimitiveInt(this.inner().databaseDtuMin());
}
@Override
public int storageMB() {
return Utils.toPrimitiveInt(this.inner().storageMB());
}
@Override
public List<ElasticPoolActivity> listActivities() {
PagedListConverter<ElasticPoolActivityInner, ElasticPoolActivity> converter = new PagedListConverter<ElasticPoolActivityInner, ElasticPoolActivity>() {
@Override
public ElasticPoolActivity typeConvert(ElasticPoolActivityInner elasticPoolActivityInner) {
return new ElasticPoolActivityImpl(elasticPoolActivityInner);
}
};
return converter.convert(ReadableWrappersImpl.convertToPagedList(
this.manager().inner().elasticPools().listActivity(
this.resourceGroupName(),
this.sqlServerName(),
this.name())));
}
@Override
public List<ElasticPoolDatabaseActivity> listDatabaseActivities() {
PagedListConverter<ElasticPoolDatabaseActivityInner, ElasticPoolDatabaseActivity> converter
= new PagedListConverter<ElasticPoolDatabaseActivityInner, ElasticPoolDatabaseActivity>() {
@Override
public ElasticPoolDatabaseActivity typeConvert(ElasticPoolDatabaseActivityInner elasticPoolDatabaseActivityInner) {
return new ElasticPoolDatabaseActivityImpl(elasticPoolDatabaseActivityInner);
}
};
return converter.convert(ReadableWrappersImpl.convertToPagedList(
this.manager().inner().elasticPools().listDatabaseActivity(
this.resourceGroupName(),
this.sqlServerName(),
this.name())));
}
@Override
public List<SqlDatabase> listDatabases() {
final SqlElasticPoolImpl self = this;
PagedListConverter<DatabaseInner, SqlDatabase> converter
= new PagedListConverter<DatabaseInner, SqlDatabase>() {
@Override
public SqlDatabase typeConvert(DatabaseInner databaseInner) {
return new SqlDatabaseImpl(databaseInner.name(), databaseInner, self.manager());
}
};
return converter.convert(ReadableWrappersImpl.convertToPagedList(
this.manager().inner().elasticPools().listDatabases(
this.resourceGroupName(),
this.sqlServerName(),
this.name())));
}
@Override
public SqlDatabase getDatabase(String databaseName) {
DatabaseInner database = this.manager().inner().elasticPools().getDatabase(
this.resourceGroupName(),
this.sqlServerName(),
this.name(),
databaseName);
return new SqlDatabaseImpl(database.name(), database, this.manager());
}
@Override
public void delete() {
this.manager().inner().elasticPools().delete(this.resourceGroupName(), this.sqlServerName(), this.name());
}
@Override
protected Observable<ElasticPoolInner> getInnerAsync() {
return this.manager().inner().elasticPools().getAsync(this.resourceGroupName(), this.sqlServerName(), this.name());
}
@Override
protected Observable<SqlElasticPool> createChildResourceAsync() {
final SqlElasticPool self = this;
return this.manager().inner().elasticPools().createOrUpdateAsync(this.resourceGroupName(), this.sqlServerName(), this.name(), this.inner())
.map(new Func1<ElasticPoolInner, SqlElasticPool>() {
@Override
public SqlElasticPool call(ElasticPoolInner elasticPoolInner) {
setInner(elasticPoolInner);
createOrUpdateDatabase();
return self;
}
});
}
@Override
public SqlElasticPoolImpl withEdition(ElasticPoolEditions edition) {
this.inner().withEdition(edition);
return this;
}
@Override
public SqlElasticPoolImpl withDatabaseDtuMin(int databaseDtuMin) {
this.inner().withDatabaseDtuMin(databaseDtuMin);
return this;
}
@Override
public SqlElasticPoolImpl withDatabaseDtuMax(int databaseDtuMax) {
this.inner().withDatabaseDtuMax(databaseDtuMax);
return this;
}
@Override
public SqlElasticPoolImpl withDtu(int dtu) {
this.inner().withDtu(dtu);
return this;
}
@Override
public SqlElasticPoolImpl withStorageCapacity(int storageMB) {
this.inner().withStorageMB(storageMB);
return this;
}
@Override
public SqlElasticPoolImpl withNewDatabase(String databaseName) {
this.databaseCreatableMap.put(databaseName,
(SqlDatabaseImpl) this.databasesImpl.define(databaseName).withExistingElasticPool(this.name()));
return this;
}
@Override
public SqlElasticPoolImpl withExistingDatabase(String databaseName) {
this.databaseCreatableMap.put(databaseName, (SqlDatabaseImpl) this.databasesImpl.get(databaseName).update().withExistingElasticPool(this.name()));
return this;
}
@Override
public SqlElasticPoolImpl withExistingDatabase(SqlDatabase database) {
this.databaseCreatableMap.put(database.name(), (SqlDatabaseImpl) database.update().withExistingElasticPool(this.name()));
return this;
}
private void createOrUpdateDatabase() {
if (this.databaseCreatableMap.size() > 0) {
this.databasesImpl.databases().create(new ArrayList<Creatable<SqlDatabase>>(this.databaseCreatableMap.values()));
this.databaseCreatableMap.clear();
}
}
}