rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/ZipArchive.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 26 Feb 2013 16:54:16 +0100
changeset 772 d382dacfd73f
parent 694 emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/ZipArchive.java@0d277415ed02
permissions -rw-r--r--
Moving modules around so the runtime is under one master pom and can be built without building other modules that are in the repository
jaroslav@694
     1
/**
jaroslav@694
     2
 * Back 2 Browser Bytecode Translator
jaroslav@694
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@694
     4
 *
jaroslav@694
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@694
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@694
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@694
     8
 *
jaroslav@694
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@694
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@694
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@694
    12
 * GNU General Public License for more details.
jaroslav@694
    13
 *
jaroslav@694
    14
 * You should have received a copy of the GNU General Public License
jaroslav@694
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@694
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@694
    17
 */
jaroslav@694
    18
package org.apidesign.bck2brwsr.compact.tck;
jaroslav@694
    19
jaroslav@694
    20
import java.io.ByteArrayOutputStream;
jaroslav@694
    21
import java.io.IOException;
jaroslav@694
    22
import java.io.InputStream;
jaroslav@694
    23
import java.util.Arrays;
jaroslav@694
    24
import java.util.LinkedHashMap;
jaroslav@694
    25
import java.util.Map;
jaroslav@694
    26
import java.util.Objects;
jaroslav@694
    27
import java.util.zip.ZipEntry;
jaroslav@694
    28
import org.apidesign.bck2brwsr.emul.zip.ZipInputStream;
jaroslav@694
    29
jaroslav@694
    30
/**
jaroslav@694
    31
 *
jaroslav@694
    32
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@694
    33
 */
jaroslav@694
    34
final class ZipArchive {
jaroslav@694
    35
    private final Map<String, byte[]> entries = new LinkedHashMap<>();
jaroslav@694
    36
jaroslav@694
    37
    public static ZipArchive createZip(InputStream is) throws IOException {
jaroslav@694
    38
        ZipArchive a = new ZipArchive();
jaroslav@694
    39
        readZip(is, a);
jaroslav@694
    40
        return a;
jaroslav@694
    41
    }
jaroslav@694
    42
jaroslav@694
    43
    public static ZipArchive createReal(InputStream is) throws IOException {
jaroslav@694
    44
        ZipArchive a = new ZipArchive();
jaroslav@694
    45
        realZip(is, a);
jaroslav@694
    46
        return a;
jaroslav@694
    47
    }
jaroslav@694
    48
jaroslav@694
    49
    /**
jaroslav@694
    50
     * Registers entry name and data
jaroslav@694
    51
     */
jaroslav@694
    52
    final void register(String entry, InputStream is) throws IOException {
jaroslav@694
    53
        ByteArrayOutputStream os = new ByteArrayOutputStream();
jaroslav@694
    54
        for (;;) {
jaroslav@694
    55
            int ch = is.read();
jaroslav@694
    56
            if (ch == -1) {
jaroslav@694
    57
                break;
jaroslav@694
    58
            }
jaroslav@694
    59
            os.write(ch);
jaroslav@694
    60
        }
jaroslav@694
    61
        os.close();
jaroslav@694
    62
        entries.put(entry, os.toByteArray());
jaroslav@694
    63
    }
jaroslav@694
    64
jaroslav@694
    65
    @Override
jaroslav@694
    66
    public int hashCode() {
jaroslav@694
    67
        return entries.hashCode();
jaroslav@694
    68
    }
jaroslav@694
    69
jaroslav@694
    70
    @Override
jaroslav@694
    71
    public boolean equals(Object obj) {
jaroslav@694
    72
        if (obj == null) {
jaroslav@694
    73
            return false;
jaroslav@694
    74
        }
jaroslav@694
    75
        if (getClass() != obj.getClass()) {
jaroslav@694
    76
            return false;
jaroslav@694
    77
        }
jaroslav@694
    78
        final ZipArchive other = (ZipArchive) obj;
jaroslav@694
    79
        if (!Objects.deepEquals(this.entries, other.entries)) {
jaroslav@694
    80
            return false;
jaroslav@694
    81
        }
jaroslav@694
    82
        return true;
jaroslav@694
    83
    }
jaroslav@694
    84
jaroslav@694
    85
    @Override
jaroslav@694
    86
    public String toString() {
jaroslav@694
    87
        StringBuilder sb = new StringBuilder();
jaroslav@694
    88
        for (Map.Entry<String, byte[]> en : entries.entrySet()) {
jaroslav@694
    89
            String string = en.getKey();
jaroslav@694
    90
            byte[] bs = en.getValue();
jaroslav@694
    91
            sb.append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
jaroslav@694
    92
        }
jaroslav@694
    93
        return sb.toString();
jaroslav@694
    94
    }
jaroslav@694
    95
jaroslav@694
    96
    public void assertEquals(ZipArchive zip, String msg) {
jaroslav@694
    97
        boolean ok = true;
jaroslav@694
    98
        StringBuilder sb = new StringBuilder();
jaroslav@694
    99
        sb.append(msg);
jaroslav@694
   100
        for (Map.Entry<String, byte[]> en : entries.entrySet()) {
jaroslav@694
   101
            String string = en.getKey();
jaroslav@694
   102
            byte[] bs = en.getValue();
jaroslav@694
   103
            byte[] other = zip.entries.get(string);
jaroslav@694
   104
            sb.append("\n");
jaroslav@694
   105
            if (other == null) {
jaroslav@694
   106
                sb.append("EXTRA ").append(string).append(" = ").append(Arrays.toString(bs));
jaroslav@694
   107
                ok = false;
jaroslav@694
   108
                continue;
jaroslav@694
   109
            }
jaroslav@694
   110
            if (Arrays.equals(bs, other)) {
jaroslav@694
   111
                sb.append("OK    ").append(string);
jaroslav@694
   112
                continue;
jaroslav@694
   113
            } else {
jaroslav@694
   114
                sb.append("DIFF  ").append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
jaroslav@694
   115
                sb.append("    TO").append(string).append(" = ").append(Arrays.toString(other)).append("\n");
jaroslav@694
   116
                ok = false;
jaroslav@694
   117
                continue;
jaroslav@694
   118
            }
jaroslav@694
   119
        }
jaroslav@694
   120
        for (Map.Entry<String, byte[]> entry : zip.entries.entrySet()) {
jaroslav@694
   121
            String string = entry.getKey();
jaroslav@694
   122
            if (entries.get(string) == null) {
jaroslav@694
   123
                sb.append("MISS  ").append(string).append(" = ").append(Arrays.toString(entry.getValue()));
jaroslav@694
   124
                ok = false;
jaroslav@694
   125
            }
jaroslav@694
   126
        }
jaroslav@694
   127
        if (!ok) {
jaroslav@694
   128
            assert false : sb.toString();
jaroslav@694
   129
        }
jaroslav@694
   130
    }
jaroslav@694
   131
jaroslav@694
   132
    public static void readZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   133
        ZipInputStream zip = new org.apidesign.bck2brwsr.emul.zip.ZipInputStream(is);
jaroslav@694
   134
        for (;;) {
jaroslav@694
   135
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   136
            if (en == null) {
jaroslav@694
   137
                return;
jaroslav@694
   138
            }
jaroslav@694
   139
            data.register(en.getName(), zip);
jaroslav@694
   140
        }
jaroslav@694
   141
    }
jaroslav@694
   142
jaroslav@694
   143
    public static void realZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   144
        java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(is);
jaroslav@694
   145
        for (;;) {
jaroslav@694
   146
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   147
            if (en == null) {
jaroslav@694
   148
                return;
jaroslav@694
   149
            }
jaroslav@694
   150
            data.register(en.getName(), zip);
jaroslav@694
   151
        }
jaroslav@694
   152
    }
jaroslav@694
   153
    
jaroslav@694
   154
}