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