/** * 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.ListToMapConverter; import com.microsoft.azure.management.resources.fluentcore.utils.PagedListConverter; import com.microsoft.azure.management.sql.CreateMode; import com.microsoft.azure.management.sql.DatabaseEditions; import com.microsoft.azure.management.sql.DatabaseMetric; import com.microsoft.azure.management.sql.ReplicationLink; import com.microsoft.azure.management.sql.RestorePoint; import com.microsoft.azure.management.sql.ServiceObjectiveName; import com.microsoft.azure.management.sql.ServiceTierAdvisor; import com.microsoft.azure.management.sql.SqlDatabase; import com.microsoft.azure.management.sql.SqlElasticPool; import com.microsoft.azure.management.sql.SqlServer; import com.microsoft.azure.management.sql.SqlWarehouse; import com.microsoft.azure.management.sql.TransparentDataEncryption; import com.microsoft.azure.management.sql.UpgradeHintInterface; import org.joda.time.DateTime; import rx.Observable; import rx.functions.Func1; import java.util.List; import java.util.Map; import java.util.UUID; /** * Implementation for SqlDatabase and its parent interfaces. */ @LangDefinition class SqlDatabaseImpl extends IndependentChildResourceImpl< SqlDatabase, SqlServer, DatabaseInner, SqlDatabaseImpl, SqlServerManager> implements SqlDatabase, SqlDatabase.Definition, SqlDatabase.DefinitionStages.WithCreateWithElasticPoolOptions, SqlDatabase.DefinitionStages.WithExistingDatabase, SqlDatabase.Update, IndependentChild.DefinitionStages.WithParentResource<SqlDatabase, SqlServer> { private String elasticPoolCreatableKey; protected SqlDatabaseImpl(String name, DatabaseInner innerObject, SqlServerManager manager) { super(name, innerObject, manager); } @Override public String sqlServerName() { return this.parentName; } @Override public String collation() { return this.inner().collation(); } @Override public DateTime creationDate() { return this.inner().creationDate(); } @Override public UUID currentServiceObjectiveId() { return this.inner().currentServiceObjectiveId(); } @Override public String databaseId() { return this.inner().databaseId(); } @Override public DateTime earliestRestoreDate() { return this.inner().earliestRestoreDate(); } @Override public DatabaseEditions edition() { return this.inner().edition(); } @Override public UUID requestedServiceObjectiveId() { return this.inner().requestedServiceObjectiveId(); } @Override public long maxSizeBytes() { return Long.parseLong(this.inner().maxSizeBytes()); } @Override public ServiceObjectiveName requestedServiceObjectiveName() { return this.inner().requestedServiceObjectiveName(); } @Override public ServiceObjectiveName serviceLevelObjective() { return this.inner().serviceLevelObjective(); } @Override public String status() { return this.inner().status(); } @Override public String elasticPoolName() { return this.inner().elasticPoolName(); } @Override public String defaultSecondaryLocation() { return this.inner().defaultSecondaryLocation(); } @Override public UpgradeHintInterface getUpgradeHint() { if (this.inner().upgradeHint() == null) { this.setInner(this.manager().inner().databases().get( this.resourceGroupName(), this.sqlServerName(), this.name(), "upgradeHint")); } if (this.inner().upgradeHint() != null) { return new UpgradeHintImpl(this.inner().upgradeHint()); } return null; } @Override public boolean isDataWarehouse() { return this.edition().toString().equalsIgnoreCase(DatabaseEditions.DATA_WAREHOUSE.toString()); } @Override public SqlWarehouse asWarehouse() { if (this.isDataWarehouse()) { return (SqlWarehouse) this; } return null; } @Override public List<RestorePoint> listRestorePoints() { PagedListConverter<RestorePointInner, RestorePoint> converter = new PagedListConverter<RestorePointInner, RestorePoint>() { @Override public RestorePoint typeConvert(RestorePointInner restorePointInner) { return new RestorePointImpl(restorePointInner); } }; return converter.convert(ReadableWrappersImpl.convertToPagedList( this.manager().inner().databases().listRestorePoints( this.resourceGroupName(), this.sqlServerName(), this.name()))); } @Override public List<DatabaseMetric> listUsages() { PagedListConverter<DatabaseMetricInner, DatabaseMetric> converter = new PagedListConverter<DatabaseMetricInner, DatabaseMetric>() { @Override public DatabaseMetric typeConvert(DatabaseMetricInner databaseMetricInner) { return new DatabaseMetricImpl(databaseMetricInner); } }; return converter.convert(ReadableWrappersImpl.convertToPagedList( this.manager().inner().databases().listUsages( this.resourceGroupName(), this.sqlServerName(), this.name()))); } @Override public TransparentDataEncryption getTransparentDataEncryption() { return new TransparentDataEncryptionImpl( this.manager().inner().databases().getTransparentDataEncryptionConfiguration( this.resourceGroupName(), this.sqlServerName(), this.name()), this.manager().inner().databases()); } @Override public Map<String, ServiceTierAdvisor> listServiceTierAdvisors() { final SqlDatabaseImpl self = this; ListToMapConverter<ServiceTierAdvisor, ServiceTierAdvisorInner> converter = new ListToMapConverter<ServiceTierAdvisor, ServiceTierAdvisorInner>() { @Override protected String name(ServiceTierAdvisorInner serviceTierAdvisorInner) { return serviceTierAdvisorInner.name(); } @Override protected ServiceTierAdvisor impl(ServiceTierAdvisorInner serviceTierAdvisorInner) { return new ServiceTierAdvisorImpl(serviceTierAdvisorInner, self.manager().inner().databases()); } }; return converter.convertToUnmodifiableMap(this.manager().inner().databases().listServiceTierAdvisors( this.resourceGroupName(), this.sqlServerName(), this.name())); } @Override public Map<String, ReplicationLink> listReplicationLinks() { final SqlDatabaseImpl self = this; ListToMapConverter<ReplicationLink, ReplicationLinkInner> converter = new ListToMapConverter<ReplicationLink, ReplicationLinkInner>() { @Override protected String name(ReplicationLinkInner replicationLinkInner) { return replicationLinkInner.name(); } @Override protected ReplicationLink impl(ReplicationLinkInner replicationLinkInner) { return new ReplicationLinkImpl(replicationLinkInner, self.manager().inner().databases()); } }; return converter.convertToUnmodifiableMap(this.manager().inner().databases().listReplicationLinks( this.resourceGroupName(), this.sqlServerName(), this.name())); } @Override public void delete() { this.manager().inner().databases().delete(this.resourceGroupName(), this.sqlServerName(), this.name()); } @Override protected Observable<DatabaseInner> getInnerAsync() { if (this.inner().upgradeHint() != null) { return this.manager().inner().databases().getAsync( this.resourceGroupName(), this.sqlServerName(), this.name()); } else { return this.manager().inner().databases().getAsync( this.resourceGroupName(), this.sqlServerName(), this.name(), "upgradeHint"); } } @Override protected Observable<SqlDatabase> createChildResourceAsync() { final SqlDatabaseImpl self = this; if (this.elasticPoolCreatableKey != null) { SqlElasticPool sqlElasticPool = (SqlElasticPool) this.createdResource(this.elasticPoolCreatableKey); withExistingElasticPool(sqlElasticPool); } if (this.inner().elasticPoolName() != null && !this.inner().elasticPoolName().isEmpty()) { this.inner().withEdition(new DatabaseEditions("")); this.inner().withRequestedServiceObjectiveName(new ServiceObjectiveName("")); this.inner().withRequestedServiceObjectiveId(null); } return this.manager().inner().databases().createOrUpdateAsync( this.resourceGroupName(), this.sqlServerName(), this.name(), this.inner()) .map(new Func1<DatabaseInner, SqlDatabase>() { @Override public SqlDatabase call(DatabaseInner databaseInner) { setInner(databaseInner); self.elasticPoolCreatableKey = null; return self; } }); } @Override public SqlDatabaseImpl withCollation(String collation) { this.inner().withCollation(collation); return this; } @Override public SqlDatabaseImpl withEdition(DatabaseEditions edition) { this.inner().withEdition(edition); return this; } @Override public SqlDatabaseImpl withoutElasticPool() { this.inner().withElasticPoolName(""); return this; } @Override public SqlDatabaseImpl withExistingElasticPool(String elasticPoolName) { this.inner().withElasticPoolName(elasticPoolName); return this; } @Override public SqlDatabaseImpl withExistingElasticPool(SqlElasticPool sqlElasticPool) { return this.withExistingElasticPool(sqlElasticPool.name()); } @Override public SqlDatabaseImpl withNewElasticPool(Creatable<SqlElasticPool> sqlElasticPool) { if (this.elasticPoolCreatableKey == null) { this.elasticPoolCreatableKey = sqlElasticPool.key(); this.addCreatableDependency(sqlElasticPool); } return this; } @Override public SqlDatabaseImpl withMaxSizeBytes(long maxSizeBytes) { this.inner().withMaxSizeBytes(Long.toString(maxSizeBytes)); return this; } @Override public SqlDatabaseImpl withServiceObjective(ServiceObjectiveName serviceLevelObjective) { this.inner().withRequestedServiceObjectiveName(serviceLevelObjective); this.inner().withRequestedServiceObjectiveId(null); return this; } @Override public SqlDatabaseImpl withMode(CreateMode createMode) { this.inner().withCreateMode(createMode); return this; } @Override public SqlDatabase.DefinitionStages.WithCreateMode withSourceDatabase(String sourceDatabaseId) { this.inner().withSourceDatabaseId(sourceDatabaseId); return this; } @Override public SqlDatabase.DefinitionStages.WithCreateMode withSourceDatabase(SqlDatabase sourceDatabase) { return withSourceDatabase(sourceDatabase.id()); } }