Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

171
LINES

< > BotCompany Repo | #1034361 // Jar Web Bot [backup before zip4j]

JavaX module (desktop) [tags: use-pretranspiled]

Download Jar. Uses 3106K of libraries. Click here for Pure Java version (14240L/87K).

!7

sS standardCredentials() { ret ""; } // public snippets only

// (transpilation md5, snippetID) => jar file
//static new SerializeComputations<PairS, File> computations;
// transpilation md5 => jar file
static new SerializeComputations<S, File> computations;

static File compileSrcLib(S srcLibID) {
  new CompilerBot2 subBot;
  subBot.dontCompile = true;
  ret assertFileExists(subBot.compileSnippet(srcLibID));
}

static Lock lock = lock();

html {
  // lock lock; // now using SerializeComputations
  
  uri = dropPrefixSlash(uri);
  S snippetID = fsI(uri);
  if (!isSnippetPublic(snippetID)) fail("Snippet not public: " + snippetID);
  S transpiledSrc = getServerTranspiled2(snippetID);
  
  // md5 check (if parameter supplied)
  
  S md5 = params.get('md5);
  S srcMD5 = md5(transpiledSrc);
  if (md5 != null && !eq(md5, srcMD5)) ret "md5 mismatch";
  bool forceCompilation = eq(params.get("forceCompilation"), "1");
  
  File jar;
  try {
    jar = computations.get(srcMD5/*, snippetID)*/, -> {
      print("Entering compilation (forceCompilation=" + forceCompilation + ")");
      new CompilerBot2 bot;
      bot.useRenaming = !sameSnippetID(snippetID, #1001638);
      bot.forceCompilation = forceCompilation;
      bot.compileSrcLib = lambda1 compileSrcLib;
      ret bot.compileSnippet(snippetID);
    });
  } catch print e {
    // dexcompile.php can't handle code 500
    ret /*subBot_serve500*/("Error. " + e);
  }
  
  bool forceRepackage = eq("1", params.get("repackage"));
  bool withLibs = eq("1", params.get("withLibs"));
  bool noCompiler = eq("1", params.get("noCompiler"));
  bool withX30 = eq("1", params.get("withX30"));
  bool x30UtilOnly = eq("1", params.get("x30UtilOnly"));
  bool noSrc = eq("1", params.get("noSrc"));
  bool dynamicObjectOnly = eq("dynamicObjectOnly", params.get("mode"));
  bool uncompressed = eq("1", params.get("uncompressed"));
  S nameForDelivery = params.get("name");
  
  L<Map> existingFilesJSON = (L) jsonDecode(params.get("existingFiles"));
  S existingFilesComp = params.get("existingFilesComp");
  if (nempty(existingFilesComp))
    existingFilesJSON = (L) jsonDecode(gunzipToText(base64decode(existingFilesComp)));
  
  File jar2 = jar;
  if (withLibs) jar2 = appendToBaseFileName(jar2, ".with-libs"); 
  if (noCompiler) jar2 = appendToBaseFileName(jar2, ".no-compiler"); 
  if (dynamicObjectOnly) jar2 = appendToBaseFileName(jar2, ".dynamicObjectOnly"); 
  if (noSrc) jar2 = appendToBaseFileName(jar2, ".noSrc"); 
  if (uncompressed) jar2 = appendToBaseFileName(jar2, ".uncomp"); 
  
  bool withSrc = !noSrc;
      
  IPred<S> generalFileFilter = f -> 
       (withSrc || !endsWith(f, ".java"))
    && !startsWithOneOf(f, "META-INF/versions/", "META-INF/LICENSE"); // see flatlaf jar
  
  if (!eq(jar, jar2)) {
    lock lock;
  
    if (fileLength(jar2) <= 22 || forceRepackage) {
      temp var jarOut = zipOutputStream(jar2);
      new Set<S> entries;
      
      text2zip(jarOut, "source.txt",
        renderColonProperties(
          jar := f2s(jar2),
          packagingDate := dateWithSecondsUTC()));
      
      Zip2Zip_b z2z = new(jar, jarOut, entries);
      z2z.predicate = generalFileFilter;
      if (uncompressed) z2z.modifyZipEntry = e -> {
        e.setMethod(ZipOutputStream.STORED);
        e.setCompressedSize(e.getSize());
      };
      z2z.run();
      
      if (withLibs) {
        Pair<S, LS> srcAndLibs = extractLibsFromTranspilation(transpiledSrc);
        fOr (S libID : srcAndLibs.b) {
          File fixer = compilerBotDestDir("fixer" + psI(libID) + ".jar");
  
          if (fileExists(fixer)) {
            println("APPLYING FIXER: " + fixer);
            z2z.inZip = fixer;
            z2z.predicate = null;
            z2z.run();
          }
            
          z2z.inZip = loadLibraryOrSrcLib(libID, lambda1 compileSrcLib);
          z2z.run();
        }
      }
      
      z2z.inZip = pathToJavaxJar();
      
      if (withX30) {
        z2z.predicate = null;
        z2z.run();
      } else if (x30UtilOnly) {
        z2z.predicate = name -> startsWithOneOf(name, "x30_pkg");
        z2z.run();
      } else if (noCompiler) {
        z2z.predicate = name -> !
          startsWithOneOf(name, "org/eclipse/", "META-INF/", "ecj.", "about.html");
        z2z.run();
      } else if (dynamicObjectOnly) {
        z2z.predicate = name -> contains(name, "DynamicObject");
        z2z.run();
      }
    }
    
    jar = jar2;
  }
  
  if (nempty(existingFilesJSON)) {
    L<Map> newFingerprints = zipFileToJSONFingerprint_md5(jar);
    new SS map;
    for (Map m : existingFilesJSON)
      map.put((S) m.get("name"), (S) m.get("md5"));
    
    jar2 = createTempFile("partial", ".jar");
    {
      temp ZipOutputStream outJar = zipOutputStream(jar2);
      temp ZipFile jarIn = new ZipFile(jar);
      new LS toKeep;
      for (Map fp : newFingerprints) {
        S name = (S) fp.get("name");
        S oldMD5 = map.get(name);
        if (!eq(oldMD5, fp.get("md5"))) {
          outJar.putNextEntry(new ZipEntry(name));
          ZipEntry entry = jarIn.getEntry(name);
          copyStreamAndCloseInput(jarIn.getInputStream(entry), outJar);
        } else
          toKeep.add(name);
      }
      text2zip(outJar, "to-keep", lines_rtrim(toKeep));
    }
    
    jar = jar2;
  }
  
  if (forceRepackage)
    sendToSnippetUpdatesBot("/transpileOK/" + psI(snippetID));

  print("Serving jar for " + snippetID + ": " + renderFileInfo(jar));
  if (eq(params.get("makeJarOnly"), "1"))
    ret "OK: " + f2s(jar);
  else
    ret subBot_serveFileWithName(jar,
      or2(nameForDelivery, psI(snippetID) + ".jar"),
      "application/java-archive");
}

Author comment

Began life as a copy of #1020140

download  show line numbers  debug dex  old transpilations   

Travelled to 2 computer(s): bhatertpkbcr, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1034361
Snippet name: Jar Web Bot [backup before zip4j]
Eternal ID of this version: #1034361/1
Text MD5: a3899d06413ccf321ff278ab4810c48f
Transpilation MD5: 83e26c6d190068cd737c0e75aa574091
Author: stefan
Category: javax / web
Type: JavaX module (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-02-03 07:07:50
Source code size: 5816 bytes / 171 lines
Pitched / IR pitched: No / No
Views / Downloads: 92 / 429
Referenced in: [show references]