package com.microsoft.azure.management.network.implementation;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import com.microsoft.azure.SubResource;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.network.ApplicationGateway;
import com.microsoft.azure.management.network.ApplicationGatewayBackend;
import com.microsoft.azure.management.network.ApplicationGatewayBackendAddress;
import com.microsoft.azure.management.network.ApplicationGatewayBackendHttpConfiguration;
import com.microsoft.azure.management.network.ApplicationGatewayListener;
import com.microsoft.azure.management.network.ApplicationGatewayProtocol;
import com.microsoft.azure.management.network.ApplicationGatewayRedirectConfiguration;
import com.microsoft.azure.management.network.ApplicationGatewayRequestRoutingRule;
import com.microsoft.azure.management.network.ApplicationGatewayRequestRoutingRuleType;
import com.microsoft.azure.management.network.ApplicationGatewaySslCertificate;
import com.microsoft.azure.management.network.ApplicationGatewayUrlPathMap;
import com.microsoft.azure.management.network.PublicIPAddress;
import com.microsoft.azure.management.resources.fluentcore.arm.ResourceUtils;
import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.ChildResourceImpl;
import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext;
@LangDefinition
class ApplicationGatewayRequestRoutingRuleImpl
extends ChildResourceImpl<ApplicationGatewayRequestRoutingRuleInner, ApplicationGatewayImpl, ApplicationGateway>
implements
ApplicationGatewayRequestRoutingRule,
ApplicationGatewayRequestRoutingRule.Definition<ApplicationGateway.DefinitionStages.WithRequestRoutingRuleOrCreate>,
ApplicationGatewayRequestRoutingRule.UpdateDefinition<ApplicationGateway.Update>,
ApplicationGatewayRequestRoutingRule.Update {
ApplicationGatewayRequestRoutingRuleImpl(ApplicationGatewayRequestRoutingRuleInner inner, ApplicationGatewayImpl parent) {
super(inner, parent);
}
private Boolean associateWithPublicFrontend = null;
@Override
public Collection<ApplicationGatewayBackendAddress> backendAddresses() {
Collection<ApplicationGatewayBackendAddress> addresses = new ArrayList<>();
ApplicationGatewayBackend backend = this.backend();
if (backend != null && backend.addresses() != null) {
addresses = backend.addresses();
}
return Collections.unmodifiableCollection(addresses);
}
@Override
public ApplicationGatewayUrlPathMap urlPathMap() {
SubResource urlMapRef = this.inner().urlPathMap();
if (urlMapRef != null) {
String urlMapName = ResourceUtils.nameFromResourceId(urlMapRef.id());
return this.parent().urlPathMaps().get(urlMapName);
} else {
return null;
}
}
@Override
public boolean cookieBasedAffinity() {
final ApplicationGatewayBackendHttpConfiguration backendConfig = this.backendHttpConfiguration();
return (backendConfig != null) ? backendConfig.cookieBasedAffinity() : false;
}
@Override
public int backendPort() {
final ApplicationGatewayBackendHttpConfiguration backendConfig = this.backendHttpConfiguration();
return (backendConfig != null) ? backendConfig.port() : 0;
}
@Override
public boolean requiresServerNameIndication() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.requiresServerNameIndication() : false;
}
@Override
public String hostName() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.hostName() : null;
}
@Override
public int frontendPort() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.frontendPortNumber() : 0;
}
@Override
public ApplicationGatewaySslCertificate sslCertificate() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.sslCertificate() : null;
}
@Override
public ApplicationGatewayProtocol frontendProtocol() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.protocol() : null;
}
@Override
public String publicIPAddressId() {
final ApplicationGatewayListener listener = this.listener();
return (listener != null) ? listener.publicIPAddressId() : null;
}
@Override
public PublicIPAddress getPublicIPAddress() {
final String pipId = this.publicIPAddressId();
return (pipId != null) ? this.parent().manager().publicIPAddresses().getById(pipId) : null;
}
@Override
public String name() {
return this.inner().name();
}
@Override
public ApplicationGatewayRequestRoutingRuleType ruleType() {
return this.inner().ruleType();
}
@Override
public ApplicationGatewayBackend backend() {
SubResource backendRef = this.inner().backendAddressPool();
if (backendRef != null) {
String backendName = ResourceUtils.nameFromResourceId(backendRef.id());
return this.parent().backends().get(backendName);
} else {
return null;
}
}
@Override
public ApplicationGatewayBackendHttpConfigurationImpl backendHttpConfiguration() {
SubResource configRef = this.inner().backendHttpSettings();
if (configRef != null) {
String configName = ResourceUtils.nameFromResourceId(configRef.id());
return (ApplicationGatewayBackendHttpConfigurationImpl) this.parent().backendHttpConfigurations().get(configName);
} else {
return null;
}
}
@Override
public ApplicationGatewayListenerImpl listener() {
SubResource listenerRef = this.inner().httpListener();
if (listenerRef != null) {
String listenerName = ResourceUtils.nameFromResourceId(listenerRef.id());
return (ApplicationGatewayListenerImpl) this.parent().listeners().get(listenerName);
} else {
return null;
}
}
@Override
public ApplicationGatewayRedirectConfiguration redirectConfiguration() {
SubResource ref = this.inner().redirectConfiguration();
if (ref == null) {
return null;
} else {
return this.parent().redirectConfigurations().get(ResourceUtils.nameFromResourceId(ref.id()));
}
}
@Override
public ApplicationGatewayImpl attach() {
return this.parent().withRequestRoutingRule(this);
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl fromPublicFrontend() {
this.associateWithPublicFrontend = true;
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl fromPrivateFrontend() {
this.associateWithPublicFrontend = false;
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl fromFrontendHttpPort(int portNumber) {
return this.fromFrontendPort(portNumber, ApplicationGatewayProtocol.HTTP, null);
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl fromFrontendHttpsPort(int portNumber) {
return this.fromFrontendPort(portNumber, ApplicationGatewayProtocol.HTTPS, null);
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackendHttpConfiguration(String name) {
SubResource httpConfigRef = new SubResource()
.withId(this.parent().futureResourceId() + "/backendHttpSettingsCollection/" + name);
this.inner().withBackendHttpSettings(httpConfigRef);
return this;
}
private ApplicationGatewayBackendHttpConfigurationImpl ensureBackendHttpConfig() {
ApplicationGatewayBackendHttpConfigurationImpl config = this.backendHttpConfiguration();
if (config == null) {
final String name = SdkContext.randomResourceName("bckcfg", 11);
config = this.parent().defineBackendHttpConfiguration(name);
config.attach();
this.toBackendHttpConfiguration(name);
}
return config;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackendHttpPort(int portNumber) {
String name = SdkContext.randomResourceName("backcfg", 12);
this.parent().defineBackendHttpConfiguration(name)
.withPort(portNumber)
.attach();
return this.toBackendHttpConfiguration(name);
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withCookieBasedAffinity() {
this.parent().updateBackendHttpConfiguration(ensureBackendHttpConfig().name())
.withCookieBasedAffinity();
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withoutCookieBasedAffinity() {
this.parent().updateBackendHttpConfiguration(ensureBackendHttpConfig().name())
.withoutCookieBasedAffinity();
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl fromListener(String name) {
SubResource listenerRef = new SubResource()
.withId(this.parent().futureResourceId() + "/HTTPListeners/" + name);
this.inner().withHttpListener(listenerRef);
return this;
}
private ApplicationGatewayRequestRoutingRuleImpl fromFrontendPort(int portNumber, ApplicationGatewayProtocol protocol, String name) {
ApplicationGatewayListenerImpl listenerByPort =
(ApplicationGatewayListenerImpl) this.parent().listenerByPortNumber(portNumber);
ApplicationGatewayListenerImpl listenerByName = null;
if (name != null) {
listenerByName = (ApplicationGatewayListenerImpl) this.parent().listeners().get(name);
}
Boolean needToCreate = this.parent().needToCreate(listenerByName, listenerByPort, name);
if (Boolean.TRUE.equals(needToCreate)) {
if (name == null) {
name = SdkContext.randomResourceName("listener", 13);
}
listenerByPort = this.parent().defineListener(name)
.withFrontendPort(portNumber);
if (ApplicationGatewayProtocol.HTTP.equals(protocol)) {
listenerByPort.withHttp();
} else if (ApplicationGatewayProtocol.HTTPS.equals(protocol)) {
listenerByPort.withHttps();
}
if (Boolean.TRUE.equals(this.associateWithPublicFrontend)) {
listenerByPort.withPublicFrontend();
this.parent().withNewPublicIPAddress();
} else if (Boolean.FALSE.equals(this.associateWithPublicFrontend)) {
listenerByPort.withPrivateFrontend();
}
this.associateWithPublicFrontend = null;
listenerByPort.attach();
return this.fromListener(listenerByPort.name());
} else {
return null;
}
}
private ApplicationGatewayListenerImpl ensureListener() {
ApplicationGatewayListenerImpl listener = this.listener();
if (listener == null) {
final String name = SdkContext.randomResourceName("listener", 13);
listener = this.parent().defineListener(name);
listener.attach();
this.fromListener(name);
}
return listener;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withSslCertificate(String name) {
this.parent().updateListener(ensureListener().name()).withSslCertificate(name);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withSslCertificateFromKeyVaultSecretId(String keyVaultSecretId) {
this.parent().updateListener(ensureListener().name()).withSslCertificateFromKeyVaultSecretId(keyVaultSecretId);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withSslCertificateFromPfxFile(File pfxFile) throws IOException {
this.parent().updateListener(ensureListener().name()).withSslCertificateFromPfxFile(pfxFile);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withSslCertificatePassword(String password) {
this.parent().updateListener(ensureListener().name()).withSslCertificatePassword(password);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withHostName(String hostName) {
this.parent().updateListener(ensureListener().name()).withHostName(hostName);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withServerNameIndication() {
this.parent().updateListener(ensureListener().name()).withServerNameIndication();
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withoutServerNameIndication() {
this.parent().updateListener(ensureListener().name()).withoutServerNameIndication();
return this;
}
private ApplicationGatewayBackendImpl ensureBackend() {
ApplicationGatewayBackendImpl backend = (ApplicationGatewayBackendImpl) this.backend();
if (backend == null) {
backend = this.parent().ensureUniqueBackend();
this.toBackend(backend.name());
}
return backend;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackend(String name) {
this.inner().withBackendAddressPool(this.parent().ensureBackendRef(name));
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackendIPAddress(String ipAddress) {
this.parent().updateBackend(ensureBackend().name()).withIPAddress(ipAddress);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackendIPAddresses(String... ipAddresses) {
if (ipAddresses != null) {
for (String ipAddress : ipAddresses) {
this.toBackendIPAddress(ipAddress);
}
}
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl toBackendFqdn(String fqdn) {
this.parent().updateBackend(ensureBackend().name()).withFqdn(fqdn);
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withRedirectConfiguration(String name) {
if (name == null) {
this.inner().withRedirectConfiguration(null);
} else {
SubResource ref = new SubResource().withId(this.parent().futureResourceId() + "/redirectConfigurations/" + name);
this.inner()
.withRedirectConfiguration(ref)
.withBackendAddressPool(null)
.withBackendHttpSettings(null);
}
return this;
}
@Override
public ApplicationGatewayRequestRoutingRuleImpl withoutRedirectConfiguration() {
this.inner().withRedirectConfiguration(null);
return this;
}
@Override
public DefinitionStages.WithAttach<ApplicationGateway.DefinitionStages.WithRequestRoutingRuleOrCreate> withUrlPathMap(String urlPathMapName) {
if (urlPathMapName == null) {
this.inner().withUrlPathMap(null);
} else {
SubResource ref = new SubResource().withId(this.parent().futureResourceId() + "/urlPathMaps/" + urlPathMapName);
this.inner().withUrlPathMap(ref);
}
return this;
}
}