package com.microsoft.azure.management.dns.implementation;
import com.microsoft.azure.PagedList;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.dns.ARecordSets;
import com.microsoft.azure.management.dns.AaaaRecordSets;
import com.microsoft.azure.management.dns.CNameRecordSets;
import com.microsoft.azure.management.dns.CaaRecordSets;
import com.microsoft.azure.management.dns.DnsRecordSet;
import com.microsoft.azure.management.dns.DnsZone;
import com.microsoft.azure.management.dns.MXRecordSets;
import com.microsoft.azure.management.dns.NSRecordSets;
import com.microsoft.azure.management.dns.PtrRecordSets;
import com.microsoft.azure.management.dns.RecordType;
import com.microsoft.azure.management.dns.SoaRecordSet;
import com.microsoft.azure.management.dns.SrvRecordSets;
import com.microsoft.azure.management.dns.SubResource;
import com.microsoft.azure.management.dns.TxtRecordSets;
import com.microsoft.azure.management.dns.ZoneType;
import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.GroupableResourceImpl;
import com.microsoft.azure.management.resources.fluentcore.utils.PagedListConverter;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import rx.Completable;
import rx.Observable;
import rx.functions.Func0;
import rx.functions.Func1;
import java.util.ArrayList;
import java.util.List;
@LangDefinition
public class DnsZoneImpl
extends GroupableResourceImpl<
DnsZone,
ZoneInner,
DnsZoneImpl,
DnsZoneManager>
implements
DnsZone,
DnsZone.Definition,
DnsZone.Update {
private ARecordSets aRecordSets;
private AaaaRecordSets aaaaRecordSets;
private CaaRecordSets caaRecordSets;
private CNameRecordSets cnameRecordSets;
private MXRecordSets mxRecordSets;
private NSRecordSets nsRecordSets;
private PtrRecordSets ptrRecordSets;
private SrvRecordSets srvRecordSets;
private TxtRecordSets txtRecordSets;
private DnsRecordSetsImpl recordSets;
private String dnsZoneETag;
DnsZoneImpl(String name, final ZoneInner innerModel, final DnsZoneManager manager) {
super(name, innerModel, manager);
this.recordSets = new DnsRecordSetsImpl(this);
initRecordSets();
if (isInCreateMode()) {
this.inner().withZoneType(ZoneType.PUBLIC);
}
}
@Override
public long maxNumberOfRecordSets() {
return Utils.toPrimitiveLong(this.inner().maxNumberOfRecordSets());
}
@Override
public long numberOfRecordSets() {
return Utils.toPrimitiveLong(this.inner().numberOfRecordSets());
}
@Override
public String eTag() {
return this.inner().etag();
}
@Override
public ZoneType accessType() {
return this.inner().zoneType();
}
@Override
public List<String> registrationVirtualNetworkIds() {
List<String> list = new ArrayList<>();
if (this.inner().registrationVirtualNetworks() != null) {
for (SubResource sb : this.inner().registrationVirtualNetworks()) {
list.add(sb.id());
}
}
return list;
}
@Override
public List<String> resolutionVirtualNetworkIds() {
List<String> list = new ArrayList<>();
if (this.inner().resolutionVirtualNetworks() != null) {
for (SubResource sb : this.inner().resolutionVirtualNetworks()) {
list.add(sb.id());
}
}
return list;
}
@Override
public PagedList<DnsRecordSet> listRecordSets() {
return this.listRecordSetsIntern(null, null);
}
@Override
public PagedList<DnsRecordSet> listRecordSets(String recordSetNameSuffix) {
return this.listRecordSetsIntern(recordSetNameSuffix, null);
}
@Override
public PagedList<DnsRecordSet> listRecordSets(int pageSize) {
return this.listRecordSetsIntern(null, pageSize);
}
@Override
public PagedList<DnsRecordSet> listRecordSets(String recordSetNameSuffix, int pageSize) {
return this.listRecordSetsIntern(recordSetNameSuffix, pageSize);
}
@Override
public List<String> nameServers() {
if (this.inner() == null) {
return new ArrayList<>();
}
return this.inner().nameServers();
}
@Override
public ARecordSets aRecordSets() {
return this.aRecordSets;
}
@Override
public AaaaRecordSets aaaaRecordSets() {
return this.aaaaRecordSets;
}
@Override
public CaaRecordSets caaRecordSets() {
return this.caaRecordSets;
}
@Override
public CNameRecordSets cNameRecordSets() {
return this.cnameRecordSets;
}
@Override
public MXRecordSets mxRecordSets() {
return this.mxRecordSets;
}
@Override
public NSRecordSets nsRecordSets() {
return this.nsRecordSets;
}
@Override
public PtrRecordSets ptrRecordSets() {
return this.ptrRecordSets;
}
@Override
public SrvRecordSets srvRecordSets() {
return this.srvRecordSets;
}
@Override
public TxtRecordSets txtRecordSets() {
return this.txtRecordSets;
}
@Override
public SoaRecordSet getSoaRecordSet() {
RecordSetInner inner = this.manager().inner().recordSets().get(this.resourceGroupName(), this.name(), "@", RecordType.SOA);
if (inner == null) {
return null;
}
return new SoaRecordSetImpl(inner.name(), this, inner);
}
@Override
public DnsRecordSetImpl defineARecordSet(String name) {
return recordSets.defineARecordSet(name);
}
@Override
public DnsRecordSetImpl defineAaaaRecordSet(String name) {
return recordSets.defineAaaaRecordSet(name);
}
@Override
public DnsRecordSetImpl defineCaaRecordSet(String name) {
return recordSets.defineCaaRecordSet(name);
}
@Override
public DnsZoneImpl withCNameRecordSet(String name, String alias) {
recordSets.withCNameRecordSet(name, alias);
return this;
}
@Override
public DnsRecordSetImpl defineCNameRecordSet(String name) {
return recordSets.defineCNameRecordSet(name);
}
@Override
public DnsRecordSetImpl defineMXRecordSet(String name) {
return recordSets.defineMXRecordSet(name);
}
@Override
public DnsRecordSetImpl defineNSRecordSet(String name) {
return recordSets.defineNSRecordSet(name);
}
@Override
public DnsRecordSetImpl definePtrRecordSet(String name) {
return recordSets.definePtrRecordSet(name);
}
@Override
public DnsRecordSetImpl defineSrvRecordSet(String name) {
return recordSets.defineSrvRecordSet(name);
}
@Override
public DnsRecordSetImpl defineTxtRecordSet(String name) {
return recordSets.defineTxtRecordSet(name);
}
@Override
public DnsRecordSetImpl updateARecordSet(String name) {
return recordSets.updateARecordSet(name);
}
@Override
public DnsRecordSetImpl updateAaaaRecordSet(String name) {
return recordSets.updateAaaaRecordSet(name);
}
@Override
public DnsRecordSetImpl updateCaaRecordSet(String name) {
return recordSets.updateCaaRecordSet(name);
}
@Override
public DnsRecordSetImpl updateMXRecordSet(String name) {
return recordSets.updateMXRecordSet(name);
}
@Override
public DnsRecordSetImpl updateCNameRecordSet(String name) {
return recordSets.updateCNameRecordSet(name);
}
@Override
public DnsRecordSetImpl updateNSRecordSet(String name) {
return recordSets.updateNSRecordSet(name);
}
@Override
public DnsRecordSetImpl updatePtrRecordSet(String name) {
return recordSets.updatePtrRecordSet(name);
}
@Override
public DnsRecordSetImpl updateSrvRecordSet(String name) {
return recordSets.updateSrvRecordSet(name);
}
@Override
public DnsRecordSetImpl updateTxtRecordSet(String name) {
return recordSets.updateTxtRecordSet(name);
}
@Override
public DnsRecordSetImpl updateSoaRecord() {
return recordSets.updateSoaRecordSet();
}
@Override
public DnsZoneImpl withoutARecordSet(String name) {
return this.withoutARecordSet(name, null);
}
@Override
public DnsZoneImpl withoutARecordSet(String name, String eTag) {
recordSets.withoutARecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutAaaaRecordSet(String name) {
return this.withoutAaaaRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutAaaaRecordSet(String name, String eTag) {
recordSets.withoutAaaaRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutCaaRecordSet(String name) {
return this.withoutCaaRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutCaaRecordSet(String name, String eTag) {
recordSets.withoutCaaRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutCNameRecordSet(String name) {
return this.withoutCNameRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutCNameRecordSet(String name, String eTag) {
recordSets.withoutCNameRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutMXRecordSet(String name) {
return this.withoutMXRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutMXRecordSet(String name, String eTag) {
recordSets.withoutMXRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutNSRecordSet(String name) {
return this.withoutNSRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutNSRecordSet(String name, String eTag) {
recordSets.withoutNSRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutPtrRecordSet(String name) {
return this.withoutPtrRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutPtrRecordSet(String name, String eTag) {
recordSets.withoutPtrRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutSrvRecordSet(String name) {
return this.withoutSrvRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutSrvRecordSet(String name, String eTag) {
recordSets.withoutSrvRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withoutTxtRecordSet(String name) {
return this.withoutTxtRecordSet(name, null);
}
@Override
public DnsZoneImpl withoutTxtRecordSet(String name, String eTag) {
recordSets.withoutTxtRecordSet(name, eTag);
return this;
}
@Override
public DnsZoneImpl withETagCheck() {
if (isInCreateMode()) {
this.dnsZoneETag = "*";
return this;
}
return this.withETagCheck(this.inner().etag());
}
@Override
public DnsZoneImpl withETagCheck(String eTagValue) {
this.dnsZoneETag = eTagValue;
return this;
}
@Override
public Observable<DnsZone> createResourceAsync() {
final DnsZoneImpl self = this;
Func0<Observable<ZoneInner>> createOrUpdateAsync = new Func0<Observable<ZoneInner>>() {
@Override
public Observable<ZoneInner> call() {
if (self.isInCreateMode()) {
return self.manager().inner().zones().createOrUpdateAsync(self.resourceGroupName(),
self.name(), self.inner(), null, self.dnsZoneETag);
} else {
return self.manager().inner().zones().createOrUpdateAsync(self.resourceGroupName(),
self.name(), self.inner(), self.dnsZoneETag, null);
}
}
};
return createOrUpdateAsync.call()
.map(innerToFluentMap(this))
.map(new Func1<DnsZone, DnsZone>() {
@Override
public DnsZone call(DnsZone dnsZone) {
self.dnsZoneETag = null;
return dnsZone;
}
});
}
@Override
public Completable afterPostRunAsync(boolean isGroupFaulted) {
recordSets.clear();
return Completable.complete();
}
@Override
public Observable<DnsZone> refreshAsync() {
return super.refreshAsync().map(new Func1<DnsZone, DnsZone>() {
@Override
public DnsZone call(DnsZone dnsZone) {
DnsZoneImpl impl = (DnsZoneImpl) dnsZone;
impl.initRecordSets();
return impl;
}
});
}
@Override
protected Observable<ZoneInner> getInnerAsync() {
return this.manager().inner().zones().getByResourceGroupAsync(this.resourceGroupName(), this.name());
}
private void initRecordSets() {
this.aRecordSets = new ARecordSetsImpl(this);
this.aaaaRecordSets = new AaaaRecordSetsImpl(this);
this.caaRecordSets = new CaaRecordSetsImpl(this);
this.cnameRecordSets = new CNameRecordSetsImpl(this);
this.mxRecordSets = new MXRecordSetsImpl(this);
this.nsRecordSets = new NSRecordSetsImpl(this);
this.ptrRecordSets = new PtrRecordSetsImpl(this);
this.srvRecordSets = new SrvRecordSetsImpl(this);
this.txtRecordSets = new TxtRecordSetsImpl(this);
this.recordSets.clear();
}
private PagedList<DnsRecordSet> listRecordSetsIntern(String recordSetSuffix, Integer pageSize) {
final DnsZoneImpl self = this;
PagedListConverter<RecordSetInner, DnsRecordSet> converter = new PagedListConverter<RecordSetInner, DnsRecordSet>() {
@Override
public Observable<DnsRecordSet> typeConvertAsync(RecordSetInner inner) {
DnsRecordSet recordSet = new DnsRecordSetImpl(inner.name(), inner.type(), self, inner);
switch (recordSet.recordType()) {
case A:
return Observable.just((DnsRecordSet) new ARecordSetImpl(inner.name(), self, inner));
case AAAA:
return Observable.just((DnsRecordSet) new AaaaRecordSetImpl(inner.name(), self, inner));
case CAA:
return Observable.just((DnsRecordSet) new CaaRecordSetImpl(inner.name(), self, inner));
case CNAME:
return Observable.just((DnsRecordSet) new CNameRecordSetImpl(inner.name(), self, inner));
case MX:
return Observable.just((DnsRecordSet) new MXRecordSetImpl(inner.name(), self, inner));
case NS:
return Observable.just((DnsRecordSet) new NSRecordSetImpl(inner.name(), self, inner));
case PTR:
return Observable.just((DnsRecordSet) new PtrRecordSetImpl(inner.name(), self, inner));
case SOA:
return Observable.just((DnsRecordSet) new SoaRecordSetImpl(inner.name(), self, inner));
case SRV:
return Observable.just((DnsRecordSet) new SrvRecordSetImpl(inner.name(), self, inner));
case TXT:
return Observable.just((DnsRecordSet) new TxtRecordSetImpl(inner.name(), self, inner));
default:
return Observable.just(recordSet);
}
}
};
return converter.convert(manager().inner().recordSets().listByDnsZone(this.resourceGroupName(), this.name(), pageSize, recordSetSuffix));
}
@Override
public DnsZoneImpl withPublicAccess() {
this.inner().withZoneType(ZoneType.PUBLIC);
this.inner().withRegistrationVirtualNetworks(null);
this.inner().withResolutionVirtualNetworks(null);
return this;
}
@Override
public DnsZoneImpl withPrivateAccess() {
this.inner().withZoneType(ZoneType.PRIVATE);
this.inner().withRegistrationVirtualNetworks(null);
this.inner().withResolutionVirtualNetworks(null);
return this;
}
@Override
public DnsZoneImpl withPrivateAccess(List<String> registrationVirtualNetworkIds, List<String> resolutionVirtualNetworkIds) {
this.withPrivateAccess();
this.inner().withRegistrationVirtualNetworks(new ArrayList<SubResource>());
this.inner().withResolutionVirtualNetworks(new ArrayList<SubResource>());
for (String rvnId : registrationVirtualNetworkIds) {
SubResource sb = new SubResource();
sb.withId(rvnId);
this.inner().registrationVirtualNetworks().add(sb);
}
for (String rvnId : resolutionVirtualNetworkIds) {
SubResource sb = new SubResource();
sb.withId(rvnId);
this.inner().resolutionVirtualNetworks().add(sb);
}
return this;
}
}