content: // Licensed to the Apache Software Foundation (ASF) under one
  // or more contributor license agreements.  See the NOTICE file
  // distributed with this work for additional information
  // regarding copyright ownership.  The ASF licenses this file
  // to you 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 com.cloud.network;
  
  import com.cloud.exception.CloudException;
  import com.cloud.utils.Pair;
  import org.apache.cloudstack.api.Identity;
  import org.apache.cloudstack.api.InternalIdentity;
  import org.apache.commons.lang3.StringUtils;
  
  import java.util.HashSet;
  import java.util.List;
  import java.util.Objects;
  import java.util.Set;
  
  /**
   *
   */
  public interface PhysicalNetwork extends Identity, InternalIdentity {
  
      public enum State {
          Disabled, Enabled;
      }
  
      public class IsolationMethod {
          protected static final String UNKNOWN_PROVIDER = "Unknown";
          static Set<IsolationMethod> registeredIsolationMethods = new HashSet<>();
  
          String methodPrefix;
          String provider;
  
          public IsolationMethod(String prfx) {
              this(prfx, UNKNOWN_PROVIDER);
          }
  
          public IsolationMethod(String prfx, String prvdr) {
              methodPrefix = prfx;
              provider = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER;
              registeredIsolationMethods.add(this);
          }
  
          /**
           * gets a IsolationMethod object that defines this prefix and if any it returns the first one found that has a known provider. If none has a known provider
           * it will return the one with the unknown provider. if none is found it return null.
           *
           * @param prfx
           * @return
           */
          public static IsolationMethod getIsolationMethod(String prfx) throws IsolationMethodNotRegistered {
              IsolationMethod rc = null;
              for (IsolationMethod method: registeredIsolationMethods) {
                  if (method.methodPrefix.equals(prfx)) {
                      rc = method;
                      if(! rc.getProvider().equals(UNKNOWN_PROVIDER)) {
                          break;
                      }
                  }
              }
              if (rc == null) {
                  throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' found.");
              }
              return rc;
          }
  
          public static IsolationMethod getIsolationMethod(String prfx, String provider) throws IsolationMethodNotRegistered {
              for (IsolationMethod method: registeredIsolationMethods) {
                  if (method.methodPrefix.equals(prfx) && method.provider.equals(provider)) {
                      return method;
                  }
              }
              throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' for provider '" + provider + "' found.");
          }
  
          static class IsolationMethodNotRegistered extends CloudException {
              IsolationMethodNotRegistered (String message) {
                  super(message);
              }
          }
  
          public String getMethodPrefix() {
              return methodPrefix;
          }
  
          public String getProvider() {
              return provider;
          }
  
          @Override
          public boolean equals(Object o) {
              if (this == o)
                  return true;
              if (o == null || getClass() != o.getClass())
                  return false;
              IsolationMethod that = (IsolationMethod)o;
              return Objects.equals(methodPrefix, that.methodPrefix) && Objects.equals(provider, that.provider);
          }
  
          @Override
          public int hashCode() {
              return Objects.hash(methodPrefix, provider);
          }
  
          @Override
          public String toString() {
              return methodPrefix;
          }
  
          public static boolean remove(String prfx, String prvdr) {
              prvdr = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER;
  
              try {
                  return remove(getIsolationMethod(prfx, prvdr));
              } catch (IsolationMethodNotRegistered isolationMethodNotRegistered) {
                  return false;
              }
          }
          public static boolean remove(IsolationMethod method) {
              return registeredIsolationMethods.remove(method);
          }
      }
  
      public enum BroadcastDomainRange {
          POD, ZONE;
      }
  
      BroadcastDomainRange getBroadcastDomainRange();
  
      // TrafficType getTrafficType();
  
      long getDataCenterId();
  
      State getState();
  
      List<String> getTags();
  
      List<String> getIsolationMethods();
  
      Long getDomainId();
  
      List<Pair<Integer, Integer>> getVnet();
  
      String getVnetString();
  
      String getSpeed();
  
      String getName();
  
  }
  