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

org.yangcentral.yangkit.model.impl.stmt.ChoiceImpl Maven / Gradle / Ivy

package org.yangcentral.yangkit.model.impl.stmt;

import org.yangcentral.yangkit.base.*;
import org.yangcentral.yangkit.common.api.QName;
import org.yangcentral.yangkit.common.api.exception.ErrorTag;
import org.yangcentral.yangkit.common.api.exception.Severity;
import org.yangcentral.yangkit.common.api.validate.ValidatorResult;
import org.yangcentral.yangkit.common.api.validate.ValidatorResultBuilder;
import org.yangcentral.yangkit.model.api.stmt.*;
import org.yangcentral.yangkit.util.ModelUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class ChoiceImpl extends SchemaDataNodeImpl implements Choice {
   private Default aDefault;
   private Case defaultCase;
   private List cases = new ArrayList<>();
   private Mandatory mandatory;
   private SchemaNodeContainerImpl schemaNodeContainer = new SchemaNodeContainerImpl(this);
   private List dataDefinitions = new ArrayList<>();
   private QName identifier;

   public ChoiceImpl(String argStr) {
      super(argStr);
   }

   public Default getDefault() {
      return this.aDefault;
   }

   public boolean setDefault(Default aDefault) {
      if (null == aDefault) {
         this.aDefault = null;
         return true;
      }

      Case defaultCase = this.getCase(aDefault.getArgStr());
      if (defaultCase == null) {
         return false;
      } else {
         this.setDefaultCase(defaultCase);
         this.aDefault = aDefault;
         return true;
      }
   }

   public Case getDefaultCase() {
      return this.defaultCase;
   }

   public boolean setDefaultCase(Case defaultCase) {
      if (this.getCase(defaultCase.getArgStr()) == null) {
         return false;
      } else {
         this.defaultCase = defaultCase;
         return true;
      }
   }

   public List getCases() {
      return Collections.unmodifiableList(this.cases);
   }

   public boolean addCase(Case aCase) {
      if (aCase == null) {
         return false;
      } else {
         Iterator caseIterator = this.cases.iterator();

         Case ca;
         do {
            if (!caseIterator.hasNext()) {
               aCase.setParent(this);
               return this.cases.add(aCase);
            }

            ca = (Case)caseIterator.next();
         } while(!ca.getIdentifier().equals(aCase.getIdentifier()));

         return false;
      }
   }

   public boolean removeCase(Case ca){
      return cases.remove(ca);
   }

   public Case removeCase(QName identifier){
      for(Case c:cases){
         if(c.getIdentifier().equals(identifier)){
            cases.remove(c);
            return c;
         }
      }
      return null;
   }
   private Case getCase(String name) {
      Iterator caseIterator = this.cases.iterator();

      Case c;
      do {
         if (!caseIterator.hasNext()) {
            return null;
         }

         c = (Case)caseIterator.next();
      } while(!c.getArgStr().equals(name));

      return c;
   }

   public Mandatory getMandatory() {
      return this.mandatory;
   }

   public void setMandatory(Mandatory mandatory) {
      this.mandatory = mandatory;
   }

   public boolean isMandatory() {
      return null == this.mandatory ? false : Boolean.getBoolean(this.mandatory.getArgStr());
   }

   public boolean hasDefault() {
      return this.aDefault != null;
   }

   public List getSchemaNodeChildren() {
      return this.schemaNodeContainer.getSchemaNodeChildren();
   }

   public ValidatorResult addSchemaNodeChild(SchemaNode schemaNode) {
      return this.schemaNodeContainer.addSchemaNodeChild(schemaNode);
   }

   public ValidatorResult addSchemaNodeChildren(List schemaNodes) {
      return this.schemaNodeContainer.addSchemaNodeChildren(schemaNodes);
   }

   public SchemaNode getSchemaNodeChild(QName identifier) {
      return this.schemaNodeContainer.getSchemaNodeChild(identifier);
   }

   public DataNode getDataNodeChild(QName identifier) {
      return this.schemaNodeContainer.getDataNodeChild(identifier);
   }

   public List getDataNodeChildren() {
      return this.schemaNodeContainer.getDataNodeChildren();
   }

   @Override
   public List getTreeNodeChildren() {
      return schemaNodeContainer.getTreeNodeChildren();
   }

   @Override
   public SchemaNode getTreeNodeChild(QName identifier) {
      return schemaNodeContainer.getTreeNodeChild(identifier);
   }

   public void removeSchemaNodeChild(QName identifier) {
      this.schemaNodeContainer.removeSchemaNodeChild(identifier);
   }

   public void removeSchemaNodeChild(SchemaNode schemaNode) {
      this.schemaNodeContainer.removeSchemaNodeChild(schemaNode);
   }

   public SchemaNode getMandatoryDescendant() {
      return null;
   }

   @Override
   public boolean checkChild(YangStatement subStatement) {
      boolean result =  super.checkChild(subStatement);
      if(!result){
         return false;
      }
      YangBuiltinKeyword builtinKeyword = YangBuiltinKeyword.from(subStatement.getYangKeyword());
      switch (builtinKeyword){
         case CASE:
         case ANYDATA:
         case ANYXML:
         case CHOICE:
         case CONTAINER:
         case LEAF:
         case LEAFLIST:
         case LIST:{
            if(getDataDefChild(subStatement.getArgStr()) != null){
               return false;
            }
            return true;
         }
         default:{
            return true;
         }
      }
   }

   @Override
   protected void clearSelf() {
      this.dataDefinitions.clear();
      this.cases.clear();
      this.mandatory = null;
      this.aDefault = null;
      this.schemaNodeContainer.removeSchemaNodeChildren();
      super.clearSelf();
   }

   protected ValidatorResult initSelf() {
      ValidatorResultBuilder validatorResultBuilder = new ValidatorResultBuilder();
      validatorResultBuilder.merge(super.initSelf());
      List subElements = this.getSubElements();

      for (YangElement subElement : subElements) {
         if (subElement instanceof YangBuiltinStatement) {
            YangBuiltinStatement builtinStatement = (YangBuiltinStatement) subElement;
            YangBuiltinKeyword builtinKeyword = YangBuiltinKeyword.from(builtinStatement.getYangKeyword());
            switch (builtinKeyword) {
               case CASE:
               case ANYDATA:
               case ANYXML:
               case CHOICE:
               case CONTAINER:
               case LEAF:
               case LEAFLIST:
               case LIST:
                  validatorResultBuilder.merge(this.addDataDefChild((DataDefinition) builtinStatement));
            }
         }
      }

      List matched = this.getSubStatement(YangBuiltinKeyword.MANDATORY.getQName());
      if (matched.size() > 0) {
         this.mandatory = (Mandatory)matched.get(0);
      }

      matched = this.getSubStatement(YangBuiltinKeyword.DEFAULT.getQName());
      if (matched.size() > 0) {
         if (this.mandatory != null && this.mandatory.getValue()) {
            validatorResultBuilder.addRecord(ModelUtil.reportError(matched.get(0),Severity.WARNING,ErrorTag.BAD_ELEMENT,
                    ErrorCode.MANDATORY_HASDEFAULT.getFieldName()));
            return validatorResultBuilder.build();
         }

         this.aDefault = (Default)matched.get(0);
         Case defaultCase = this.getCase(this.aDefault.getArgStr());
         if (null == defaultCase) {
            validatorResultBuilder.addRecord(ModelUtil.reportError(this.aDefault,
                    ErrorCode.MISSING_CASE.toString(new String[]{"name=" + this.aDefault.getArgStr()})));
            return validatorResultBuilder.build();
         }

         this.setDefaultCase(defaultCase);
      }

      return validatorResultBuilder.build();
   }

   public void setContext(YangContext context) {
      super.setContext(context);
      this.schemaNodeContainer.setYangContext(context);
   }

   protected ValidatorResult validateSelf() {
      ValidatorResultBuilder validatorResultBuilder = new ValidatorResultBuilder(super.validateSelf());
      Case defCase = this.getDefaultCase();
      if (null == defCase) {
         return validatorResultBuilder.build();
      } else {
         if (!defCase.hasDefault()) {
            validatorResultBuilder.addRecord(ModelUtil.reportError(defCase,Severity.WARNING,ErrorTag.BAD_ELEMENT,
                    ErrorCode.DEFAULT_CASE_NO_DEFAULT.getFieldName()));
         }

         if (defCase.isMandatory()) {
            validatorResultBuilder.addRecord(ModelUtil.reportError(defCase,Severity.WARNING,ErrorTag.BAD_ELEMENT,
                    ErrorCode.DEFAULT_CASE_IS_MANDATORY.getFieldName() ));
         }

         return validatorResultBuilder.build();
      }
   }

   protected ValidatorResult buildSelf(BuildPhase phase) {
      ValidatorResultBuilder validatorResultBuilder;
      validatorResultBuilder = new ValidatorResultBuilder();
      validatorResultBuilder.merge(super.buildSelf(phase));
      label44:
      switch (phase) {
         case GRAMMAR:
            Case defaultCase = this.getDefaultCase();
            if (defaultCase != null) {
               if (!defaultCase.evaluateFeatures()) {
                  validatorResultBuilder.addRecord(ModelUtil.reportError(defaultCase,
                          ErrorCode.MISSING_CASE.toString(new String[]{"name=" + defaultCase.getArgStr()})));
               } else if (this.getIfFeatures().size() > 0) {
                  validatorResultBuilder.addRecord(ModelUtil.reportError(defaultCase,
                          ErrorCode.DEFAULT_CASE_IS_OPTIONAL.getFieldName()));
               }
            }
            for (Case c: this.cases) {
               if (c.evaluateFeatures() && c.isShortCase()) {
                  validatorResultBuilder.merge(c.build(phase));
               }
            }
            break;
         case SCHEMA_BUILD:
            Iterator iterator = this.cases.iterator();

            while(true) {
               if (!iterator.hasNext()) {
                  break label44;
               }

               Case c = iterator.next();
               if (c.evaluateFeatures()) {
                  this.addSchemaNodeChild(c);
                  if (c.isShortCase()) {
                     validatorResultBuilder.merge(c.build(phase));
                  }
               }
            }
         case SCHEMA_TREE:
            for (Case c: this.cases) {
               if (c.evaluateFeatures() && c.isShortCase()) {
                  validatorResultBuilder.merge(c.build(phase));
               }
            }
      }

      ValidatorResult validatorResult = validatorResultBuilder.build();
      return validatorResult;
   }

   public QName getYangKeyword() {
      return YangBuiltinKeyword.CHOICE.getQName();
   }

   public QName getIdentifier() {
      if (this.identifier != null) {
         return this.identifier;
      } else {
         this.identifier = new QName(this.getContext().getNamespace(), this.getArgStr());
         return this.identifier;
      }
   }

   public List getDataDefChildren() {
      return Collections.unmodifiableList(this.dataDefinitions);
   }

   public DataDefinition getDataDefChild(String name) {
      Iterator iterator = this.dataDefinitions.iterator();

      DataDefinition dataDefinition;
      do {
         if (!iterator.hasNext()) {
            return null;
         }

         dataDefinition = iterator.next();
      } while(!dataDefinition.getArgStr().equals(name));

      return dataDefinition;
   }

   public ValidatorResult addDataDefChild(DataDefinition dataDefinition) {
      ValidatorResultBuilder validatorResultBuilder = new ValidatorResultBuilder();
      Case old;
      old = this.getCase(dataDefinition.getArgStr());
      if (null != old) {
         validatorResultBuilder.addRecord(ModelUtil.reportDuplicateError(old, dataDefinition));
         dataDefinition.setErrorStatement(true);
         return validatorResultBuilder.build();
      }
      if (dataDefinition instanceof Case) {
         Case newCase = (Case)dataDefinition;
         this.dataDefinitions.add(newCase);
         this.cases.add(newCase);
         newCase.setParent(this);
      } else {
         Case newCase = new CaseImpl(dataDefinition.getArgStr());
         YangContext childContext = new YangContext(this.getContext());
         newCase.setContext(childContext);
         newCase.setElementPosition(this.getElementPosition());
         newCase.setShortCase(true);
         newCase.setParent(this);
         newCase.addChild(dataDefinition);
         this.dataDefinitions.add(newCase);
         this.cases.add(newCase);
         validatorResultBuilder.merge(newCase.init());
      }

      return validatorResultBuilder.build();
   }
   @Override
   public List getEffectiveSchemaNodeChildren(boolean ignoreNamespace) {
      return schemaNodeContainer.getEffectiveSchemaNodeChildren(ignoreNamespace);
   }
   public List getEffectiveSubStatements() {
      List statements = new ArrayList<>();
      if (this.mandatory != null) {
         statements.add(this.mandatory);
      } else {
         Mandatory newMandatory = new MandatoryImpl("false");
         newMandatory.setContext(new YangContext(this.getContext()));
         newMandatory.setElementPosition(this.getElementPosition());
         newMandatory.setParentStatement(this);
         newMandatory.init();
         statements.add(newMandatory);
      }

      if (this.aDefault != null) {
         statements.add(this.aDefault);
      }

      statements.addAll(getEffectiveSchemaNodeChildren());
      statements.addAll(super.getEffectiveSubStatements());
      return statements;
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy