All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dianping.cat.configuration.client.transform.DefaultValidator Maven / Gradle / Ivy

package com.dianping.cat.configuration.client.transform;

import static com.dianping.cat.configuration.client.Constants.ATTR_ID;
import static com.dianping.cat.configuration.client.Constants.ATTR_IP;
import static com.dianping.cat.configuration.client.Constants.ATTR_MODE;
import static com.dianping.cat.configuration.client.Constants.ATTR_NAME;
import static com.dianping.cat.configuration.client.Constants.ENTITY_CONFIG;
import static com.dianping.cat.configuration.client.Constants.ENTITY_DOMAIN;
import static com.dianping.cat.configuration.client.Constants.ENTITY_PROPERTIES;
import static com.dianping.cat.configuration.client.Constants.ENTITY_PROPERTY;
import static com.dianping.cat.configuration.client.Constants.ENTITY_SERVER;
import static com.dianping.cat.configuration.client.Constants.ENTITY_SERVERS;

import java.util.Stack;

import com.dianping.cat.configuration.client.IVisitor;
import com.dianping.cat.configuration.client.entity.Bind;
import com.dianping.cat.configuration.client.entity.ClientConfig;
import com.dianping.cat.configuration.client.entity.Domain;
import com.dianping.cat.configuration.client.entity.Property;
import com.dianping.cat.configuration.client.entity.Server;

public class DefaultValidator implements IVisitor {

   private Path m_path = new Path();
   
   protected void assertRequired(String name, Object value) {
      if (value == null) {
         throw new RuntimeException(String.format("%s at path(%s) is required!", name, m_path));
      }
   }

   @Override
   public void visitBind(Bind bind) {
   }

   @Override
   public void visitConfig(ClientConfig config) {
      m_path.down(ENTITY_CONFIG);

      assertRequired(ATTR_MODE, config.getMode());

      visitConfigChildren(config);

      m_path.up(ENTITY_CONFIG);
   }

   protected void visitConfigChildren(ClientConfig config) {
      m_path.down(ENTITY_SERVERS);

      for (Server server : config.getServers()) {
         visitServer(server);
      }

      m_path.up(ENTITY_SERVERS);

      for (Domain domain : config.getDomains().values()) {
         visitDomain(domain);
      }

      if (config.getBind() != null) {
         visitBind(config.getBind());
      }

      m_path.down(ENTITY_PROPERTIES);

      for (Property property : config.getProperties().values()) {
         visitProperty(property);
      }

      m_path.up(ENTITY_PROPERTIES);
   }

   @Override
   public void visitDomain(Domain domain) {
      m_path.down(ENTITY_DOMAIN);

      assertRequired(ATTR_ID, domain.getId());

      m_path.up(ENTITY_DOMAIN);
   }

   @Override
   public void visitProperty(Property property) {
      m_path.down(ENTITY_PROPERTY);

      assertRequired(ATTR_NAME, property.getName());

      m_path.up(ENTITY_PROPERTY);
   }

   @Override
   public void visitServer(Server server) {
      m_path.down(ENTITY_SERVER);

      assertRequired(ATTR_IP, server.getIp());

      m_path.up(ENTITY_SERVER);
   }

   static class Path {
      private Stack m_sections = new Stack();

      public Path down(String nextSection) {
         m_sections.push(nextSection);

         return this;
      }

      @Override
      public String toString() {
         StringBuilder sb = new StringBuilder();

         for (String section : m_sections) {
            sb.append('/').append(section);
         }

         return sb.toString();
      }

      public Path up(String currentSection) {
         if (m_sections.isEmpty() || !m_sections.peek().equals(currentSection)) {
            throw new RuntimeException("INTERNAL ERROR: stack mismatched!");
         }

         m_sections.pop();
         return this;
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy