package com.l7tech.server.globalresources;

import com.l7tech.gateway.common.AsyncAdminMethods.JobId;
import com.l7tech.gateway.common.resources.HttpConfiguration;
import com.l7tech.gateway.common.resources.HttpProxyConfiguration;
import com.l7tech.gateway.common.resources.ResourceAdmin;
import com.l7tech.gateway.common.resources.ResourceEntry;
import com.l7tech.gateway.common.resources.ResourceEntryBag;
import com.l7tech.gateway.common.resources.ResourceEntryHeader;
import com.l7tech.gateway.common.resources.ResourceType;
import com.l7tech.gateway.common.service.ServiceAdmin.DownloadDocumentType;
import com.l7tech.objectmodel.DeleteException;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.SaveException;
import com.l7tech.objectmodel.UpdateException;
import com.l7tech.server.admin.AsyncAdminMethodsImpl;
import com.l7tech.server.event.AdminInfo;
import com.l7tech.server.service.ServiceDocumentResolver;
import com.l7tech.util.Background;
import com.l7tech.util.Charsets;
import com.l7tech.util.Config;
import com.l7tech.util.IOUtils;
import com.l7tech.util.ResourceUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.FutureTask;
import java.util.logging.Logger;

public class ResourceAdminImpl extends AsyncAdminMethodsImpl implements ResourceAdmin {
   private static final Logger e;
   private final Config f;
   private final ResourceEntryManager g;
   private final DefaultHttpProxyManager h;
   private final HttpConfigurationManager i;
   private final ServiceDocumentResolver j;
   private final SchemaResourceManager k;
   private final Map<String, ResourceEntryHeader> l;
   private static final String[] m;

   public ResourceAdminImpl(
      Config var1,
      ResourceEntryManager var2,
      DefaultHttpProxyManager var3,
      HttpConfigurationManager var4,
      ServiceDocumentResolver var5,
      SchemaResourceManager var6,
      Map<String, String> var7
   ) {
      this.f = var1;
      this.g = var2;
      this.h = var3;
      this.i = var4;
      this.j = var5;
      this.k = var6;
      this.l = a(var7);
   }

   public Collection<ResourceEntryHeader> findAllResources() throws FindException {
      return this.g.findAllHeaders();
   }

   public ResourceEntry findResourceEntryByPrimaryKey(Goid var1) throws FindException {
      return (ResourceEntry)this.g.findByPrimaryKey(var1);
   }

   public ResourceEntry findResourceEntryByUriAndType(String var1, ResourceType var2) throws FindException {
      return this.g.findResourceByUriAndType(var1, var2);
   }

   public Goid saveResourceEntry(ResourceEntry var1) throws SaveException, UpdateException {
      Goid var2;
      if (Goid.isDefault(var1.getGoid())) {
         var2 = this.g.save(var1);
      } else {
         var2 = var1.getGoid();
         this.g.update(var1);
      }

      return var2;
   }

   public void saveResourceEntryBag(ResourceEntryBag var1) throws SaveException, UpdateException {
      for (ResourceEntry var3 : var1) {
         this.saveResourceEntry(var3);
      }
   }

   public void deleteResourceEntry(ResourceEntry var1) throws DeleteException {
      try {
         if (Goid.isDefault(var1.getGoid())) {
            throw new DeleteException(m[0]);
         }
      } catch (DeleteException var2) {
         throw a(var2);
      }

      this.g.delete(var1);
   }

   public void deleteResourceEntry(Goid var1) throws FindException, DeleteException {
      try {
         if (Goid.isDefault(var1)) {
            throw new DeleteException(m[0]);
         }
      } catch (FindException var2) {
         throw a(var2);
      }

      this.g.delete(var1);
   }

   public Collection<ResourceEntryHeader> findResourceHeadersByType(ResourceType var1) throws FindException {
      return this.g.findHeadersByType(var1);
   }

   public ResourceEntryHeader findResourceHeaderByUriAndType(String var1, ResourceType var2) throws FindException {
      return this.g.findHeaderByUriAndType(var1, var2);
   }

   public Collection<ResourceEntryHeader> findResourceHeadersByKeyAndType(String var1, ResourceType var2) throws FindException {
      return this.g.findHeadersByKeyAndType(var1, var2);
   }

   public Collection<ResourceEntryHeader> findResourceHeadersByTargetNamespace(String var1) throws FindException {
      return this.g.findHeadersByTNS(var1);
   }

   public Collection<ResourceEntryHeader> findResourceHeadersByPublicIdentifier(String var1) throws FindException {
      return this.g.findHeadersByPublicIdentifier(var1);
   }

   public ResourceEntry findDefaultResourceByUri(String var1) throws FindException {
      ResourceEntry var2 = null;

      for (Entry var4 : this.l.entrySet()) {
         ResourceEntryHeader var5 = (ResourceEntryHeader)var4.getValue();
         if (var5.getUri().equals(var1)) {
            InputStream var6 = null;

            try {
               var6 = ResourceAdminImpl.class.getResourceAsStream((String)var4.getKey());
               if (var6 != null) {
                  byte[] var7 = IOUtils.slurpStream(var6, 1048576);
                  var2 = new ResourceEntry();
                  var2.setType(var5.getResourceType());
                  var2.setContentType(var5.getResourceType().getMimeType());
                  var2.setUri(var5.getUri());
                  var2.setContent(new String(var7, Charsets.UTF8));
                  var2.setResourceKey1(var5.getResourceKey1());
                  var2.setResourceKey2(var5.getResourceKey2());
                  var2.setResourceKey3(var5.getResourceKey3());
                  break;
               }

               Logger var10000 = e;
               String var10001 = (String)var4.getKey();
               String[] var9 = m;
               var10000.warning(var9[7] + var10001 + var9[5]);
            } catch (IOException var12) {
               throw new FindException(m[4], var12);
            } finally {
               ResourceUtils.closeQuietly(var6);
            }
         }
      }

      return var2;
   }

   public Collection<ResourceEntryHeader> findDefaultResources() throws FindException {
      return new ArrayList<>(this.l.values());
   }

   public int countRegisteredSchemas(Collection<Goid> var1) throws FindException {
      ArrayList var2 = new ArrayList();

      for (Goid var4 : var1) {
         try {
            if (var4 == null) {
               continue;
            }
         } catch (FindException var8) {
            throw a(var8);
         }

         ResourceEntry var5 = (ResourceEntry)this.g.findByPrimaryKey(var4);

         try {
            if (var5 != null) {
               var2.add(var5.getUri());
            }
         } catch (FindException var7) {
            throw a(var7);
         }
      }

      int var9 = 0;

      for (String var11 : var2) {
         try {
            if (this.k.isSchemaRequired(var11)) {
               var9++;
            }
         } catch (FindException var6) {
            throw a(var6);
         }
      }

      return var9;
   }

   public boolean allowSchemaDoctype() {
      return this.f.getBooleanProperty(m[2], false);
   }

   public HttpProxyConfiguration getDefaultHttpProxyConfiguration() throws FindException {
      return this.h.getDefaultHttpProxyConfiguration();
   }

   public void setDefaultHttpProxyConfiguration(HttpProxyConfiguration var1) throws SaveException, UpdateException {
      this.h.setDefaultHttpProxyConfiguration(var1);
   }

   public Collection<HttpConfiguration> findAllHttpConfigurations() throws FindException {
      return this.i.findAll();
   }

   public HttpConfiguration findHttpConfigurationByPrimaryKey(Goid var1) throws FindException {
      return (HttpConfiguration)this.i.findByPrimaryKey(var1);
   }

   public void deleteHttpConfiguration(HttpConfiguration var1) throws DeleteException {
      try {
         if (HttpConfiguration.DEFAULT_GOID.equals(var1.getGoid())) {
            throw new DeleteException(m[12]);
         }
      } catch (DeleteException var2) {
         throw a(var2);
      }

      this.i.delete(var1);
   }

   public Goid saveHttpConfiguration(HttpConfiguration var1) throws SaveException, UpdateException {
      Goid var2;
      if (HttpConfiguration.DEFAULT_GOID.equals(var1.getGoid())) {
         var2 = this.i.save(var1);
      } else {
         var2 = var1.getGoid();
         this.i.update(var1);
      }

      return var2;
   }

   public String resolveResource(String var1) throws IOException {
      try {
         if (var1 == null) {
            throw new IOException(m[6]);
         }
      } catch (IOException var5) {
         throw a(var5);
      }

      String var2 = var1.toLowerCase();
      String[] var4 = m;
      DownloadDocumentType var3;
      if (var2.endsWith(var4[14])) {
         var3 = DownloadDocumentType.SCHEMA;
      } else {
         var4 = m;
         if (var2.endsWith(var4[13])) {
            var3 = DownloadDocumentType.XSL;
         } else {
            label38: {
               try {
                  if (var2.endsWith(m[11]) || var1.endsWith(m[3])) {
                     break label38;
                  }
               } catch (IOException var6) {
                  throw a(var6);
               }

               var3 = DownloadDocumentType.UNKNOWN;
               return this.j.resolveDocumentTarget(var1, var3);
            }

            var3 = DownloadDocumentType.WSDL;
         }
      }

      return this.j.resolveDocumentTarget(var1, var3);
   }

   public JobId<String> resolveResourceAsync(String var1) {
      FutureTask var2 = new FutureTask<>(AdminInfo.find(false).wrapCallable(new n(this, var1)));
      Background.scheduleOneShot(new u(this, var2), 0L);
      return this.registerJob(var2, String.class);
   }

   private static Map<String, ResourceEntryHeader> a(Map<String, String> var0) {
      HashMap var1 = new HashMap();

      for (Entry var3 : var0.entrySet()) {
         ResourceType var4 = null;

         for (ResourceType var8 : ResourceType.values()) {
            if (((String)var3.getKey()).endsWith(var8.getFilenameSuffix())) {
               var4 = var8;
               break;
            }
         }

         if (var4 == null) {
            Logger var10000 = e;
            String var10001 = (String)var3.getKey();
            String[] var9 = m;
            var10000.warning(var9[8] + var10001 + var9[1]);
         } else {
            String var13 = (String)var3.getValue();
            String[] var12 = m;
            String[] var10 = var13.split(var12[10]);
            if (var10.length > 2) {
               e.warning(var12[9] + (String)var3.getKey() + var12[1]);
            }

            ResourceEntryHeader var11 = new ResourceEntryHeader(
               Goid.toString(ResourceEntry.DEFAULT_GOID), var10[0], null, var4, var10.length > 1 ? var10[1] : null, null, null, 0, null
            );
            var1.put((String)var3.getKey(), var11);
         }
      }

      return Collections.unmodifiableMap(var1);
   }

   static {
      String[] var5 = new String[15];
      int var3 = 0;
      String var2 = "q\u0013\u0003]fgOV\u0017\u0001V}vC\u0012\u0017\u0003G`g\u0016\u0012\u001c\u0002G)c\n@\u0001\u0004@}v\u0001F\u0002\u0015\\\u0013A\u0011\u0005VdrAS\u001e\u0001\\~W\u0000Q\u0006\u0014Cl\u0005\r\u0005\u001eWe\u0016w\u0000\u001f\\{3\u0003]\u0013\tZgtO@\u0017\u001e\\|a\fW\u0002\u0015\\\b\\\u0007\u0001_)f\u001d^\u001cv\u0017\u000bR|\u007f\u001b\u0012\u0000\b@ff\u001dQ\u0017M]fgOT\u001d\u0018]m3H,q\u0013\u0003]fgOV\u0017\u0019V{~\u0006\\\u0017MGpc\n\u0012\u0014\u0002A)w\nT\u0013\u0018_}3\u001dW\u0001\u0002F{p\n\u0012U*g\u001c\bKyv\fF\u0017\t\u0013gf\u0002P\u0017\u001f\u0013fuOD\u0013\u0001Fl`OT\u001d\u001f\u0013{v\u001c]\u0007\u001fPl3H\u0002n\u000e\u0005\u001c\u0005\u001eWe$q\u0013\u0003]fgOV\u0017\u0001V}vC\u0012\u0017\u0003G`g\u0016\u0012\u001c\u0002G)c\n@\u0001\u0004@}v\u0001F";
      int var4 = "q\u0013\u0003]fgOV\u0017\u0001V}vC\u0012\u0017\u0003G`g\u0016\u0012\u001c\u0002G)c\n@\u0001\u0004@}v\u0001F\u0002\u0015\\\u0013A\u0011\u0005VdrAS\u001e\u0001\\~W\u0000Q\u0006\u0014Cl\u0005\r\u0005\u001eWe\u0016w\u0000\u001f\\{3\u0003]\u0013\tZgtO@\u0017\u001e\\|a\fW\u0002\u0015\\\b\\\u0007\u0001_)f\u001d^\u001cv\u0017\u000bR|\u007f\u001b\u0012\u0000\b@ff\u001dQ\u0017M]fgOT\u001d\u0018]m3H,q\u0013\u0003]fgOV\u0017\u0019V{~\u0006\\\u0017MGpc\n\u0012\u0014\u0002A)w\nT\u0013\u0018_}3\u001dW\u0001\u0002F{p\n\u0012U*g\u001c\bKyv\fF\u0017\t\u0013gf\u0002P\u0017\u001f\u0013fuOD\u0013\u0001Fl`OT\u001d\u001f\u0013{v\u001c]\u0007\u001fPl3H\u0002n\u000e\u0005\u001c\u0005\u001eWe$q\u0013\u0003]fgOV\u0017\u0001V}vC\u0012\u0017\u0003G`g\u0016\u0012\u001c\u0002G)c\n@\u0001\u0004@}v\u0001F"
         .length();
      char var1 = '$';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 112;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = b(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     m = var5;
                     e = Logger.getLogger(ResourceAdminImpl.class.getName());
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "zlx9\u0004zlx1";
                  var4 = "zlx9\u0004zlx1".length();
                  var1 = 4;
                  var7 = -1;
            }

            var10000 = 22;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static Exception a(Exception var0) {
      return var0;
   }

   private static char[] a(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 31);
      }

      return var10000;
   }

   private static String b(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 66;
            case 1 -> 2;
            case 2 -> 29;
            case 3 -> 67;
            case 4 -> 121;
            case 5 -> 99;
            default -> 31;
         });
      }

      return new String(var10001).intern();
   }
}
