001package com.ganteater.ae;
002
003import java.io.BufferedInputStream;
004import java.io.File;
005import java.io.FileInputStream;
006import java.util.Enumeration;
007import java.util.HashMap;
008import java.util.Map;
009import java.util.zip.ZipEntry;
010import java.util.zip.ZipFile;
011import java.util.zip.ZipInputStream;
012
013public final class JarResources {
014
015        private Map<String, Integer> htSizes = new HashMap<>();
016        private Map<String, byte[]> htJarContents = new HashMap<>();
017        private File jarFileName;
018
019        public JarResources(File jarFileName) {
020                this.jarFileName = jarFileName;
021                init();
022        }
023
024        public byte[] getResource(String name) {
025                return (byte[]) htJarContents.get(name);
026        }
027
028        private void init() {
029                try {
030                        ZipFile zf = new ZipFile(jarFileName);
031                        Enumeration<? extends ZipEntry> e = zf.entries();
032                        while (e.hasMoreElements()) {
033                                ZipEntry ze = (ZipEntry) e.nextElement();
034                                htSizes.put(ze.getName(), new Integer((int) ze.getSize()));
035                        }
036                        zf.close();
037
038                        FileInputStream fis = new FileInputStream(jarFileName);
039                        BufferedInputStream bis = new BufferedInputStream(fis);
040                        try (ZipInputStream zis = new ZipInputStream(bis)) {
041                                ZipEntry ze = null;
042                                while ((ze = zis.getNextEntry()) != null) {
043                                        if (ze.isDirectory()) {
044                                                continue;
045                                        }
046
047                                        int size = (int) ze.getSize();
048                                        if (size == -1) {
049                                                size = ((Integer) htSizes.get(ze.getName())).intValue();
050                                        }
051
052                                        byte[] b = new byte[(int) size];
053                                        int rb = 0;
054                                        int chunk = 0;
055                                        while (((int) size - rb) > 0) {
056                                                chunk = zis.read(b, rb, (int) size - rb);
057                                                if (chunk == -1) {
058                                                        break;
059                                                }
060                                                rb += chunk;
061                                        }
062
063                                        htJarContents.put(ze.getName(), b);
064                                }
065                        }
066                } catch (NullPointerException e) {
067                        //
068                } catch (Exception e) {
069                        e.printStackTrace();
070                }
071        }
072
073}