package com.l7tech.policy.assertion.credential.wss;

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.assertion.MessageTargetable;
import com.l7tech.policy.assertion.MessageTargetableSupport;
import com.l7tech.policy.assertion.TargetMessageType;
import com.l7tech.policy.assertion.VariableUseSupport;
import com.l7tech.policy.assertion.annotation.RequiresSOAP;
import com.l7tech.policy.assertion.xmlsec.SecurityHeaderAddressableSupport;
import com.l7tech.policy.variable.VariableMetadata;

@RequiresSOAP(wss = true)
public abstract class WssCredentialSourceAssertion extends SecurityHeaderAddressableSupport implements MessageTargetable {
   private MessageTargetableSupport messageTargetableSupport = new MessageTargetableSupport();
   static final long serialVersionUID = -2454960740722196355L;

   protected WssCredentialSourceAssertion() {
      this.messageTargetableSupport.setTargetModifiedByGateway(false);
   }

   @Override
   public boolean isCredentialSource() {
      return true;
   }

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

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

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

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

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

   @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 boolean isTargetModifiedByGateway() {
      return this.messageTargetableSupport.isTargetModifiedByGateway();
   }

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

   public WssCredentialSourceAssertion clone() {
      WssCredentialSourceAssertion var1 = (WssCredentialSourceAssertion)super.clone();
      var1.messageTargetableSupport = new MessageTargetableSupport(this.messageTargetableSupport);
      return var1;
   }

   protected WssCredentialSourceAssertion.VariablesUsed doGetVariablesUsed(boolean var1) {
      WssCredentialSourceAssertion.VariablesUsed var2;
      if (var1) {
         var2 = new WssCredentialSourceAssertion.VariablesUsed(this.messageTargetableSupport.getMessageTargetVariablesUsed().asArray());
      } else {
         var2 = new WssCredentialSourceAssertion.VariablesUsed();
      }

      return var2;
   }

   protected WssCredentialSourceAssertion.VariablesUsed doGetVariablesUsed() {
      return this.doGetVariablesUsed(true);
   }

   protected static final class VariablesUsed extends VariableUseSupport.VariablesUsedSupport<WssCredentialSourceAssertion.VariablesUsed> {
      private VariablesUsed() {
      }

      private VariablesUsed(String[] var1) {
         super(var1);
      }

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