anyk: init at 3.26.0

+180
+145
pkgs/by-name/an/anyk/package.nix
··· 1 + { stdenv 2 + , lib 3 + , fetchurl 4 + , fetchzip 5 + , openjdk 6 + , writeScript 7 + , runCommandLocal 8 + , bash 9 + , unzip 10 + , makeWrapper 11 + , libredirect 12 + , xsettingsd 13 + , makeDesktopItem 14 + , copyDesktopItems 15 + , python3 16 + }: 17 + let 18 + # Downloads can be found here: https://nav.gov.hu/nyomtatvanyok/letoltesek/nyomtatvanykitolto_programok/nyomtatvany_apeh/keretprogramok/AbevJava 19 + # There are no versioned download URLs but archive.org can be used to preserve them. 20 + # The original download URL is: https://nav.gov.hu/pfile/programFile?path=/nyomtatvanyok/letoltesek/nyomtatvanykitolto_programok/nyomtatvany_apeh/keretprogramok/AbevJava 21 + # You can put the URL here to create a fresh archive URL: https://web.archive.org/save 22 + abevjavaSrc = fetchzip { 23 + url = "https://web.archive.org/web/20231106112510if_/https://nav.gov.hu/pfile/programFile?path=/nyomtatvanyok/letoltesek/nyomtatvanykitolto_programok/nyomtatvany_apeh/keretprogramok/AbevJava"; 24 + sha256 = "sha256-qt0mHv3HI6C8OltFjSR47+RLSnmB2Si5U8rXEvdN4/c="; 25 + extension = "zip"; 26 + stripRoot = false; 27 + }; 28 + 29 + # ÁNYK uses some SOAP stuff that's not shipped with OpenJDK any more. 30 + # We don't really want to use openjdk8 because it's unusable on HiDPI 31 + # and people are more likely to have a modern OpenJDK installed. 32 + extraClasspath = [ 33 + (fetchurl { 34 + url = "mirror://maven/org/glassfish/metro/webservices-rt/2.4.10/webservices-rt-2.4.10.jar"; 35 + sha256 = "sha256-lHclIZn3HR2B2lMttmmQGIV67qJi5KhL5jT2WNUQpPI="; 36 + }) 37 + 38 + (fetchurl { 39 + url = "mirror://maven/org/glassfish/metro/webservices-api/2.4.10/webservices-api-2.4.10.jar"; 40 + sha256 = "sha256-1jiabjPkRnh+l/fmTt8aKE5hpeLreYOiLH9sVIcLUQE="; 41 + }) 42 + 43 + (fetchurl { 44 + url = "mirror://maven/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.jar"; 45 + sha256 = "sha256-ueJLfdbgdJVWLqllMb4xMMltuk144d/Yitu96/QzKHE="; 46 + }) 47 + 48 + # Patch one of the classes so it works with the packages above by removing .internal. from the package names. 49 + (runCommandLocal "anyk-patch" {} '' 50 + mkdir $out 51 + cd $out 52 + ${unzip}/bin/unzip ${abevjavaSrc}/application/abevjava.jar hu/piller/enykp/niszws/ClientStubBuilder.class 53 + ${python3}/bin/python ${./patch_paths.py} hu/piller/enykp/niszws/ClientStubBuilder.class 54 + '') 55 + ]; 56 + 57 + # This script can be used to run template installation jars (or use the Szervíz -> Telepítés menu) 58 + anyk-java = writeScript "anyk-java" '' 59 + if [ -f ~/.abevjava/abevjavapath.cfg ] 60 + then 61 + if ABEVJAVA_PATH_CFG=$(grep abevjava.path ~/.abevjava/abevjavapath.cfg) 62 + then 63 + ABEVJAVA_PATH=''${ABEVJAVA_PATH_CFG#abevjava.path = } 64 + echo "Determined abevjava path as $ABEVJAVA_PATH" 65 + else 66 + echo "Could not determine abevjava path from ~/.abevjava/abevjavapath.cfg" 67 + exit 1 68 + fi 69 + else 70 + ABEVJAVA_PATH=~/abevjava 71 + mkdir -p ~/.abevjava 72 + echo "abevjava.path = $ABEVJAVA_PATH" > ~/.abevjava/abevjavapath.cfg 73 + echo "Initialized abevjava path as $ABEVJAVA_PATH" 74 + fi 75 + 76 + # Sync help files. 77 + mkdir -p "$ABEVJAVA_PATH/segitseg/" 78 + cp -sRf --no-preserve=all @out@/opt/segitseg/. "$ABEVJAVA_PATH/segitseg" 79 + 80 + export LD_PRELOAD=${libredirect}/lib/libredirect.so:$LD_PRELOAD 81 + # Look for form templates in ABEVJAVA_PATH instead of the install dir. 82 + export NIX_REDIRECTS=@out@/opt/nyomtatvanyok=$ABEVJAVA_PATH/nyomtatvanyok:@out@/opt/segitseg=$ABEVJAVA_PATH/segitseg:@out@/opt/setenv=$ABEVJAVA_PATH/setenv:/bin/bash=${bash}/bin/bash:$NIX_REDIRECTS 83 + if WINDOW_SCALING_FACTOR=$(${xsettingsd}/bin/dump_xsettings | awk '/Gdk\/WindowScalingFactor/{print $NF}' | grep .); then 84 + # Fix scaling on HiDPI. 85 + SCALING_PROP="-Dsun.java2d.uiScale=''${WINDOW_SCALING_FACTOR}" 86 + fi 87 + # ÁNYK crashes with NullPointerException with the GTK look and feel so use the cross-platform one. 88 + exec ${openjdk}/bin/java -Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel $SCALING_PROP "$@" 89 + ''; 90 + in stdenv.mkDerivation { 91 + pname = "anyk"; 92 + version = "3.26.0"; 93 + 94 + src = abevjavaSrc; 95 + 96 + dontConfigure = true; 97 + dontBuild = true; 98 + 99 + nativeBuildInputs = [ makeWrapper copyDesktopItems ]; 100 + 101 + desktopItems = [ 102 + (makeDesktopItem rec { 103 + desktopName = "ÁNYK"; 104 + name = "anyk"; 105 + exec = "anyk"; 106 + icon = "anyk"; 107 + categories = [ "Office" ]; 108 + }) 109 + ]; 110 + 111 + installPhase = '' 112 + mkdir $out 113 + cp -r application $out/opt 114 + 115 + mkdir $out/bin 116 + substituteAll ${anyk-java} $out/bin/anyk-java 117 + chmod +x $out/bin/anyk-java 118 + 119 + # ÁNYK has some old school dependencies that are no longer bundled with Java, put them on the classpath. 120 + makeWrapper $out/bin/anyk-java $out/bin/anyk --add-flags "-cp ${lib.concatStringsSep ":" extraClasspath}:$out/opt/abevjava.jar hu.piller.enykp.gui.framework.MainFrame" 121 + 122 + mkdir -p $out/share/applications $out/share/pixmaps $out/share/icons 123 + 124 + copyDesktopItems 125 + 126 + ln -s $out/opt/abevjava.png $out/share/pixmaps/anyk.png 127 + ln -s $out/opt/abevjava.png $out/share/icons/anyk.png 128 + ''; 129 + 130 + meta = with lib; { 131 + description = "Tool for filling forms for the Hungarian government,"; 132 + longDescription = '' 133 + Official tool for filling Hungarian government forms. 134 + 135 + Use `anyk-java` to install form templates/help files like this: `anyk-java -jar NAV_IGAZOL.jar` 136 + ''; 137 + homepage = "https://nav.gov.hu/nyomtatvanyok/letoltesek/nyomtatvanykitolto_programok/nyomtatvany_apeh/keretprogramok/javakitolto"; 138 + license = licenses.unfree; 139 + maintainers = with maintainers; [ chpatrick ]; 140 + platforms = openjdk.meta.platforms; 141 + sourceProvenance = [ sourceTypes.binaryBytecode ]; 142 + mainProgram = "anyk"; 143 + }; 144 + } 145 +
+35
pkgs/by-name/an/anyk/patch_paths.py
··· 1 + from pathlib import Path 2 + from struct import pack 3 + import sys 4 + 5 + def to_java_string(string) -> bytes: 6 + string_bytes = string.encode("utf-8") 7 + # Java constant pool string entries are prefixed by 0x01 and 16-bit big-endian string length. 8 + return pack(">BH", 1, len(string_bytes)) + string_bytes 9 + 10 + class_file = Path(sys.argv[1]) 11 + 12 + clazz = class_file.read_bytes() 13 + 14 + # We want to fix these package names so they work with the open-source Java EE releases instead of OpenJDK 8. 15 + patches = [ 16 + ( "com/sun/xml/internal/ws/developer/WSBindingProvider", "com/sun/xml/ws/developer/WSBindingProvider" ), 17 + ( "com/sun/xml/internal/ws/api/message/Header", "com/sun/xml/ws/api/message/Header" ), 18 + ( "com.sun.xml.internal.ws.transport.http.client.streaming.chunk.size", "com.sun.xml.ws.transport.http.client.streaming.chunk.size" ), 19 + ( "com/sun/xml/internal/ws/api/message/Headers", "com/sun/xml/ws/api/message/Headers" ), 20 + ( "(Lorg/w3c/dom/Element;)Lcom/sun/xml/internal/ws/api/message/Header;", "(Lorg/w3c/dom/Element;)Lcom/sun/xml/ws/api/message/Header;" ), 21 + ( "([Lcom/sun/xml/internal/ws/api/message/Header;)V", "([Lcom/sun/xml/ws/api/message/Header;)V" ), 22 + ] 23 + 24 + for old, new in patches: 25 + old_java = to_java_string(old) 26 + new_java = to_java_string(new) 27 + assert old_java in clazz 28 + clazz = clazz.replace(old_java, new_java) 29 + assert old_java not in clazz 30 + assert new_java in clazz 31 + 32 + assert b".internal." not in clazz 33 + 34 + class_file.write_bytes(clazz) 35 +