package com.l7tech.policy.assertion;

import com.l7tech.objectmodel.ExternalEntityHeader;
import com.l7tech.objectmodel.migration.Migration;
import com.l7tech.objectmodel.migration.MigrationMappingSelection;
import com.l7tech.objectmodel.migration.PropertyResolver;
import com.l7tech.policy.variable.VariableMetadata;

public abstract class MessageTargetableAssertion extends Assertion implements MessageTargetable, UsesVariables, SetsVariables {
   private MessageTargetableSupport targetSupport;
   static final long serialVersionUID = 1870467744830802458L;

   @Override
   public TargetMessageType getTarget() {
      return this.targetSupport.getTarget();
   }

   @Override
   public void setTarget(TargetMessageType var1) {
      this.targetSupport.setTarget(var1);
   }

   @Override
   public String getOtherTargetMessageVariable() {
      return this.targetSupport.getOtherTargetMessageVariable();
   }

   @Override
   public void setOtherTargetMessageVariable(String var1) {
      this.targetSupport.setOtherTargetMessageVariable(var1);
   }

   @Override
   public String getTargetName() {
      return this.targetSupport.getTargetName(this);
   }

   @Override
   public boolean isTargetModifiedByGateway() {
      return this.targetSupport.isTargetModifiedByGateway();
   }

   @Migration(
      mapName = MigrationMappingSelection.NONE,
      mapValue = MigrationMappingSelection.REQUIRED,
      export = false,
      valueType = ExternalEntityHeader.ValueType.TEXT_ARRAY,
      resolver = PropertyResolver.Type.SERVER_VARIABLE
   )
   @Override
   public final String[] getVariablesUsed() {
      return this.doGetVariablesUsed().asArray();
   }

   @Override
   public final VariableMetadata[] getVariablesSet() {
      return this.doGetVariablesSet().asArray();
   }

   @Override
   public Object clone() {
      MessageTargetableAssertion var1 = (MessageTargetableAssertion)super.clone();
      var1.targetSupport = new MessageTargetableSupport(this.targetSupport);
      return var1;
   }

   protected MessageTargetableAssertion() {
      this(TargetMessageType.REQUEST);
   }

   protected MessageTargetableAssertion(TargetMessageType var1) {
      this.targetSupport = new MessageTargetableSupport(var1);
   }

   protected MessageTargetableAssertion(boolean var1) {
      this(TargetMessageType.REQUEST, var1);
   }

   protected MessageTargetableAssertion(TargetMessageType var1, boolean var2) {
      this.targetSupport = new MessageTargetableSupport(var1, var2);
   }

   protected void clearTarget() {
      this.targetSupport.clearTarget();
   }

   protected void copyFrom(MessageTargetableAssertion var1) {
      this.setTarget(var1.getTarget());
      this.setOtherTargetMessageVariable(var1.getOtherTargetMessageVariable());
   }

   protected void setTargetModifiedByGateway(boolean var1) {
      this.targetSupport.setTargetModifiedByGateway(var1);
   }

   protected void setSourceUsedByGateway(boolean var1) {
      this.targetSupport.setSourceUsedByGateway(var1);
   }

   protected MessageTargetableAssertion.VariablesUsed doGetVariablesUsed() {
      return new MessageTargetableAssertion.VariablesUsed(this.targetSupport.getMessageTargetVariablesUsed().asArray());
   }

   protected MessageTargetableAssertion.VariablesSet doGetVariablesSet() {
      return new MessageTargetableAssertion.VariablesSet(this.targetSupport.getMessageTargetVariablesSet().asArray());
   }

   protected static final class VariablesSet extends VariableUseSupport.VariablesSetSupport<MessageTargetableAssertion.VariablesSet> {
      private VariablesSet(VariableMetadata[] var1) {
         super(var1);
      }

      protected MessageTargetableAssertion.VariablesSet get() {
         return this;
      }
   }

   protected static final class VariablesUsed extends VariableUseSupport.VariablesUsedSupport<MessageTargetableAssertion.VariablesUsed> {
      private VariablesUsed(String[] var1) {
         super(var1);
      }

      protected MessageTargetableAssertion.VariablesUsed get() {
         return this;
      }
   }
}
