This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 160390
Collapse All | Expand All

(-)a/core.startup/src/org/netbeans/core/startup/ModuleList.java (-20 / +37 lines)
Lines 52-60 Link Here
52
import java.io.FileNotFoundException;
52
import java.io.FileNotFoundException;
53
import java.io.IOException;
53
import java.io.IOException;
54
import java.io.InputStream;
54
import java.io.InputStream;
55
import java.io.ObjectInputStream;
55
import java.io.ObjectOutput;
56
import java.io.ObjectOutput;
57
import java.io.ObjectOutputStream;
56
import java.io.OutputStream;
58
import java.io.OutputStream;
57
import java.io.OutputStreamWriter;
59
import java.io.OutputStreamWriter;
60
import java.io.PushbackInputStream;
58
import java.io.Writer;
61
import java.io.Writer;
59
import java.util.ArrayList;
62
import java.util.ArrayList;
60
import java.util.Arrays;
63
import java.util.Arrays;
Lines 287-293 Link Here
287
                    // Quasi-prop which is stored separately.
290
                    // Quasi-prop which is stored separately.
288
                    props.put("installerState", buf); // NOI18N
291
                    props.put("installerState", buf); // NOI18N
289
                }
292
                }
293
                Module.deps = props.get("deps");
290
                Module m = mgr.create(jarFile, history, reloadable, autoload, eager);
294
                Module m = mgr.create(jarFile, history, reloadable, autoload, eager);
295
                Module.deps = null;
296
                
291
                read.add(m);
297
                read.add(m);
292
                DiskStatus status = new DiskStatus();
298
                DiskStatus status = new DiskStatus();
293
                status.module = m;
299
                status.module = m;
Lines 787-834 Link Here
787
     * @see "#26786"
793
     * @see "#26786"
788
     */
794
     */
789
    private Map<String, Object> readStatus(InputStream is,boolean checkEOF) throws IOException {
795
    private Map<String, Object> readStatus(InputStream is,boolean checkEOF) throws IOException {
796
        PushbackInputStream pbis = new PushbackInputStream(is, 1);
790
        Map<String,Object> m = new HashMap<String,Object>(15);
797
        Map<String,Object> m = new HashMap<String,Object>(15);
791
        if (!expect(is, MODULE_XML_INTRO)) {
798
        if (!expect(pbis, MODULE_XML_INTRO)) {
792
            LOG.fine("Could not read intro");
799
            LOG.fine("Could not read intro");
793
            return null;
800
            return null;
794
        }
801
        }
795
        String name = readTo(is, '"');
802
        String name = readTo(pbis, '"');
796
        if (name == null) {
803
        if (name == null) {
797
            LOG.fine("Could not read code name base");
804
            LOG.fine("Could not read code name base");
798
            return null;
805
            return null;
799
        }
806
        }
800
        m.put("name", name.intern()); // NOI18N
807
        m.put("name", name.intern()); // NOI18N
801
        if (!expect(is, MODULE_XML_INTRO_END)) {
808
        if (!expect(pbis, MODULE_XML_INTRO_END)) {
802
            LOG.fine("Could not read stuff after cnb");
809
            LOG.fine("Could not read stuff after cnb");
803
            return null;
810
            return null;
804
        }
811
        }
805
        // Now we have <param>s some number of times, finally </module>.
812
        // Now we have <param>s some number of times, finally </module>.
806
    PARSE:
813
    PARSE:
807
        while (true) {
814
        while (true) {
808
            int c = is.read();
815
            int c = pbis.read();
809
            switch (c) {
816
            switch (c) {
810
            case ' ':
817
            case ' ':
811
                // <param>
818
                // <param>
812
                if (!expect(is, MODULE_XML_DIV2)) {
819
                if (!expect(pbis, MODULE_XML_DIV2)) {
813
                    LOG.fine("Could not read up to param");
820
                    LOG.fine("Could not read up to param");
814
                    return null;
821
                    return null;
815
                }
822
                }
816
                String k = readTo(is, '"');
823
                String k = readTo(pbis, '"');
817
                if (k == null) {
824
                if (k == null) {
818
                    LOG.fine("Could not read param");
825
                    LOG.fine("Could not read param");
819
                    return null;
826
                    return null;
820
                }
827
                }
821
                k = k.intern();
828
                k = k.intern();
822
                if (is.read() != '>') {
829
                if (pbis.read() != '>') {
823
                    LOG.fine("No > at end of <param> " + k);
830
                    LOG.fine("No > at end of <param> " + k);
824
                    return null;
831
                    return null;
825
                }
832
                }
826
                String v = readTo(is, '<');
833
                String v = readTo(pbis, '<');
827
                if (v == null) {
834
                if (v == null) {
828
                    LOG.fine("Could not read value of " + k);
835
                    LOG.fine("Could not read value of " + k);
829
                    return null;
836
                    return null;
830
                }
837
                }
831
                if (!expect(is, MODULE_XML_DIV3)) {
838
                if (!expect(pbis, MODULE_XML_DIV3)) {
832
                    LOG.fine("Could not read end of param " + k);
839
                    LOG.fine("Could not read end of param " + k);
833
                    return null;
840
                    return null;
834
                }
841
                }
Lines 841-854 Link Here
841
                break;
848
                break;
842
            case '<':
849
            case '<':
843
                // </module>
850
                // </module>
844
                if (!expect(is, MODULE_XML_END)) {
851
                if (!expect(pbis, MODULE_XML_END)) {
845
                    LOG.fine("Strange ending");
852
                    LOG.fine("Strange ending");
846
                    return null;
853
                    return null;
847
                }
854
                }
848
                if (!checkEOF) {
855
                if (!checkEOF) {
849
                    break PARSE;
856
                    break PARSE;
850
                }
857
                }
851
                if (is.read() != -1) {
858
                if (pbis.read() != -1) {
852
                    LOG.fine("Trailing garbage");
859
                    LOG.fine("Trailing garbage");
853
                    return null;
860
                    return null;
854
                }
861
                }
Lines 867-873 Link Here
867
     * Newline conventions are normalized to Unix \n.
874
     * Newline conventions are normalized to Unix \n.
868
     * @return true upon success, false if stream contained something else
875
     * @return true upon success, false if stream contained something else
869
     */
876
     */
870
    private boolean expect(InputStream is, byte[] stuff) throws IOException {
877
    private boolean expect(PushbackInputStream is, byte[] stuff) throws IOException {
871
        int len = stuff.length;
878
        int len = stuff.length;
872
        boolean inNewline = false;
879
        boolean inNewline = false;
873
        for (int i = 0; i < len; ) {
880
        for (int i = 0; i < len; ) {
Lines 890-901 Link Here
890
        if (stuff[len - 1] == 10) {
897
        if (stuff[len - 1] == 10) {
891
            // Expecting something ending in a \n - so we have to
898
            // Expecting something ending in a \n - so we have to
892
            // read any further \r or \n and discard.
899
            // read any further \r or \n and discard.
893
            if (!is.markSupported()) throw new IOException("Mark not supported"); // NOI18N
894
            is.mark(1);
895
            int c = is.read();
900
            int c = is.read();
896
            if (c != -1 && c != 10 && c != 13) {
901
            if (c != -1 && c != 10 && c != 13) {
897
                // Got some non-newline character, push it back!
902
                // Got some non-newline character, push it back!
898
                is.reset();
903
                is.unread(c);
899
            }
904
            }
900
        }
905
        }
901
        return true;
906
        return true;
Lines 947-979 Link Here
947
            return null;
952
            return null;
948
        }
953
        }
949
        LOG.log(Level.FINEST, "Reading cache all-modules.dat");
954
        LOG.log(Level.FINEST, "Reading cache all-modules.dat");
955
        ObjectInputStream ois = new ObjectInputStream(is);
950
        
956
        
951
        Map<String,Map<String,Object>> ret = new HashMap<String, Map<String, Object>>(1333);
957
        Map<String,Map<String,Object>> ret = new HashMap<String, Map<String, Object>>(1333);
952
        while (is.available() > 0) {
958
        while (is.available() > 0) {
953
            Map<String, Object> prop = readStatus(is, false);
959
            Map<String, Object> prop = readStatus(ois, false);
954
            if (prop == null) {
960
            if (prop == null) {
955
                LOG.log(Level.CONFIG, "Cache is invalid all-modules.dat");
961
                LOG.log(Level.CONFIG, "Cache is invalid all-modules.dat");
956
                return null;
962
                return null;
957
            }
963
            }
964
            Set<?> deps;
965
            try {
966
                deps = (Set<?>) ois.readObject();
967
            } catch (ClassNotFoundException ex) {
968
                throw (IOException)new IOException(ex.getMessage()).initCause(ex);
969
            }
970
            prop.put("deps", deps);
958
            String cnb = (String)prop.get("name"); // NOI18N
971
            String cnb = (String)prop.get("name"); // NOI18N
959
            ret.put(cnb, prop);
972
            ret.put(cnb, prop);
960
        }
973
        }
961
            is.close();
962
974
963
            return ret;
975
964
        }
976
        is.close();
977
978
        return ret;
979
    }
965
980
966
    final void writeCache() {
981
    final void writeCache() {
967
        Stamps.getModulesJARs().scheduleSave(this, "all-modules.dat", false);
982
        Stamps.getModulesJARs().scheduleSave(this, "all-modules.dat", false);
968
    }
983
    }
969
    
984
    
970
    public void flushCaches(DataOutputStream os) throws IOException {
985
    public void flushCaches(DataOutputStream os) throws IOException {
986
        ObjectOutputStream oss = new ObjectOutputStream(os);
971
        for (Module m : mgr.getModules()) {
987
        for (Module m : mgr.getModules()) {
972
            if (m.isFixed()) {
988
            if (m.isFixed()) {
973
                continue;
989
                continue;
974
            }
990
            }
975
            Map<String, Object> prop = computeProperties(m);
991
            Map<String, Object> prop = computeProperties(m);
976
            writeStatus(prop, os);
992
            writeStatus(prop, oss);
993
            oss.writeObject(m.getDependencies());
977
        }
994
        }
978
    }
995
    }
979
    
996
    
(-)a/o.n.bootstrap/src/org/netbeans/Module.java (-37 / +63 lines)
Lines 80-86 Link Here
80
    public static final String PROP_MANIFEST = "manifest"; // NOI18N
80
    public static final String PROP_MANIFEST = "manifest"; // NOI18N
81
    public static final String PROP_VALID = "valid"; // NOI18N
81
    public static final String PROP_VALID = "valid"; // NOI18N
82
    public static final String PROP_PROBLEMS = "problems"; // NOI18N
82
    public static final String PROP_PROBLEMS = "problems"; // NOI18N
83
    
83
    public static Object deps;
84
84
    /** manager which owns this module */
85
    /** manager which owns this module */
85
    protected final ModuleManager mgr;
86
    protected final ModuleManager mgr;
86
    /** event logging (should not be much here) */
87
    /** event logging (should not be much here) */
Lines 305-310 Link Here
305
     * some kind of description of the problem.
306
     * some kind of description of the problem.
306
     */
307
     */
307
    protected void parseManifest() throws InvalidException {
308
    protected void parseManifest() throws InvalidException {
309
        boolean verifyCNBs = Module.deps == null;
310
308
        Attributes attr = getManifest().getMainAttributes();
311
        Attributes attr = getManifest().getMainAttributes();
309
        // Code name
312
        // Code name
310
        codeName = attr.getValue("OpenIDE-Module"); // NOI18N
313
        codeName = attr.getValue("OpenIDE-Module"); // NOI18N
Lines 322-328 Link Here
322
            if (codeName.indexOf(',') != -1) {
325
            if (codeName.indexOf(',') != -1) {
323
                throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module: " + codeName); // NOI18N
326
                throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module: " + codeName); // NOI18N
324
            }
327
            }
325
            Dependency.create(Dependency.TYPE_MODULE, codeName);
328
            if (verifyCNBs) {
329
                Dependency.create(Dependency.TYPE_MODULE, codeName);
330
            }
326
            Object[] cnParse = Util.parseCodeName(codeName);
331
            Object[] cnParse = Util.parseCodeName(codeName);
327
            codeNameBase = (String)cnParse[0];
332
            codeNameBase = (String)cnParse[0];
328
            codeNameRelease = (cnParse[1] != null) ? ((Integer)cnParse[1]).intValue() : -1;
333
            codeNameRelease = (cnParse[1] != null) ? ((Integer)cnParse[1]).intValue() : -1;
Lines 350-356 Link Here
350
                    if (provide.indexOf(',') != -1) {
355
                    if (provide.indexOf(',') != -1) {
351
                        throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module-Provides: " + provide); // NOI18N
356
                        throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module-Provides: " + provide); // NOI18N
352
                    }
357
                    }
353
                    Dependency.create(Dependency.TYPE_MODULE, provide);
358
                    if (verifyCNBs) {
359
                        Dependency.create(Dependency.TYPE_MODULE, provide);
360
                    }
354
                    if (provide.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Provides: " + provide); // NOI18N
361
                    if (provide.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Provides: " + provide); // NOI18N
355
                    provides[i] = provide;
362
                    provides[i] = provide;
356
                }
363
                }
Lines 382-393 Link Here
382
                        String piece = tok.nextToken();
389
                        String piece = tok.nextToken();
383
                        if (piece.endsWith(".*")) { // NOI18N
390
                        if (piece.endsWith(".*")) { // NOI18N
384
                            String pkg = piece.substring(0, piece.length() - 2);
391
                            String pkg = piece.substring(0, piece.length() - 2);
385
                            Dependency.create(Dependency.TYPE_MODULE, pkg);
392
                            if (verifyCNBs) {
393
                                Dependency.create(Dependency.TYPE_MODULE, pkg);
394
                            }
386
                            if (pkg.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Public-Packages: " + exportsS); // NOI18N
395
                            if (pkg.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Public-Packages: " + exportsS); // NOI18N
387
                            exports.add(new PackageExport(pkg.replace('.', '/') + '/', false));
396
                            exports.add(new PackageExport(pkg.replace('.', '/') + '/', false));
388
                        } else if (piece.endsWith(".**")) { // NOI18N
397
                        } else if (piece.endsWith(".**")) { // NOI18N
389
                            String pkg = piece.substring(0, piece.length() - 3);
398
                            String pkg = piece.substring(0, piece.length() - 3);
390
                            Dependency.create(Dependency.TYPE_MODULE, pkg);
399
                            if (verifyCNBs) {
400
                                Dependency.create(Dependency.TYPE_MODULE, pkg);
401
                            }
391
                            if (pkg.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Public-Packages: " + exportsS); // NOI18N
402
                            if (pkg.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Public-Packages: " + exportsS); // NOI18N
392
                            exports.add(new PackageExport(pkg.replace('.', '/') + '/', true));
403
                            exports.add(new PackageExport(pkg.replace('.', '/') + '/', true));
393
                        } else {
404
                        } else {
Lines 414-421 Link Here
414
                        if (piece.indexOf('/') != -1) {
425
                        if (piece.indexOf('/') != -1) {
415
                            throw new IllegalArgumentException("May specify only module code name bases in OpenIDE-Module-Friends, not major release versions: " + piece); // NOI18N
426
                            throw new IllegalArgumentException("May specify only module code name bases in OpenIDE-Module-Friends, not major release versions: " + piece); // NOI18N
416
                        }
427
                        }
417
                        // Indirect way of checking syntax:
428
                        if (verifyCNBs) {
418
                        Dependency.create(Dependency.TYPE_MODULE, piece);
429
                            // Indirect way of checking syntax:
430
                            Dependency.create(Dependency.TYPE_MODULE, piece);
431
                        }
419
                        // OK, add it.
432
                        // OK, add it.
420
                        set.add(piece);
433
                        set.add(piece);
421
                    }
434
                    }
Lines 428-464 Link Here
428
                    this.friendNames = set;
441
                    this.friendNames = set;
429
                }
442
                }
430
            }
443
            }
431
            
432
            
433
            // Dependencies
434
            Set<Dependency> dependencies = new HashSet<Dependency>(20);
435
            // First convert IDE/1 -> org.openide/1, so we never have to deal with
436
            // "IDE deps" internally:
437
            @SuppressWarnings("deprecation")
438
            Set<Dependency> openideDeps = Dependency.create(Dependency.TYPE_IDE, attr.getValue("OpenIDE-Module-IDE-Dependencies")); // NOI18N
439
            if (!openideDeps.isEmpty()) {
440
                // If empty, leave it that way; NbInstaller will add it anyway.
441
                Dependency d = openideDeps.iterator().next();
442
                String name = d.getName();
443
                if (!name.startsWith("IDE/")) throw new IllegalStateException("Weird IDE dep: " + name); // NOI18N
444
                dependencies.addAll(Dependency.create(Dependency.TYPE_MODULE, "org.openide/" + name.substring(4) + " > " + d.getVersion())); // NOI18N
445
                if (dependencies.size() != 1) throw new IllegalStateException("Should be singleton: " + dependencies); // NOI18N
446
                
447
                Util.err.warning("the module " + codeNameBase + " uses OpenIDE-Module-IDE-Dependencies which is deprecated. See http://openide.netbeans.org/proposals/arch/modularize.html"); // NOI18N
448
            }
449
            dependencies.addAll(Dependency.create(Dependency.TYPE_JAVA, attr.getValue("OpenIDE-Module-Java-Dependencies"))); // NOI18N
450
            dependencies.addAll(Dependency.create(Dependency.TYPE_MODULE, attr.getValue("OpenIDE-Module-Module-Dependencies"))); // NOI18N
451
            String pkgdeps = attr.getValue("OpenIDE-Module-Package-Dependencies"); // NOI18N
452
            if (pkgdeps != null) {
453
                // XXX: Util.err.log(ErrorManager.WARNING, "Warning: module " + codeNameBase + " uses the OpenIDE-Module-Package-Dependencies manifest attribute, which is now deprecated: XXX URL TBD");
454
                dependencies.addAll(Dependency.create(Dependency.TYPE_PACKAGE, pkgdeps)); // NOI18N
455
            }
456
            dependencies.addAll(Dependency.create(Dependency.TYPE_REQUIRES, attr.getValue("OpenIDE-Module-Requires"))); // NOI18N
457
            dependencies.addAll(Dependency.create(Dependency.TYPE_NEEDS, attr.getValue("OpenIDE-Module-Needs"))); // NOI18N
458
            dependencies.addAll(Dependency.create(Dependency.TYPE_RECOMMENDS, attr.getValue("OpenIDE-Module-Recommends"))); // NOI18N
459
            // Permit the concrete installer to make some changes:
444
            // Permit the concrete installer to make some changes:
460
            mgr.refineDependencies(this, dependencies);
445
            initDeps(attr);
461
            dependenciesA = dependencies.toArray(new Dependency[dependencies.size()]);
462
        } catch (IllegalArgumentException iae) {
446
        } catch (IllegalArgumentException iae) {
463
            throw (InvalidException) new InvalidException("While parsing " + codeName + " a dependency attribute: " + iae.toString()).initCause(iae); // NOI18N
447
            throw (InvalidException) new InvalidException("While parsing " + codeName + " a dependency attribute: " + iae.toString()).initCause(iae); // NOI18N
464
        }
448
        }
Lines 632-635 Link Here
632
        }
616
        }
633
    }
617
    }
634
618
619
    private void initDeps(Attributes attr) throws IllegalStateException, IllegalArgumentException {
620
        if (deps instanceof Set) {
621
            Set<?> s = (Set<?>)deps;
622
            dependenciesA = s.toArray(new Dependency[s.size()]);
623
            deps = null;
624
            return;
625
        }
626
627
        // Dependencies
628
        Set<Dependency> dependencies = new HashSet<Dependency>(20);
629
        // First convert IDE/1 -> org.openide/1, so we never have to deal with
630
        // "IDE deps" internally:
631
        @SuppressWarnings(value = "deprecation")
632
        Set<Dependency> openideDeps = Dependency.create(Dependency.TYPE_IDE, attr.getValue("OpenIDE-Module-IDE-Dependencies")); // NOI18N
633
        if (!openideDeps.isEmpty()) {
634
            // If empty, leave it that way; NbInstaller will add it anyway.
635
            Dependency d = openideDeps.iterator().next();
636
            String name = d.getName();
637
            if (!name.startsWith("IDE/")) {
638
                throw new IllegalStateException("Weird IDE dep: " + name); // NOI18N
639
            }
640
            dependencies.addAll(Dependency.create(Dependency.TYPE_MODULE, "org.openide/" + name.substring(4) + " > " + d.getVersion())); // NOI18N
641
            if (dependencies.size() != 1) {
642
                throw new IllegalStateException("Should be singleton: " + dependencies); // NOI18N
643
            }
644
            Util.err.warning("the module " + codeNameBase + " uses OpenIDE-Module-IDE-Dependencies which is deprecated. See http://openide.netbeans.org/proposals/arch/modularize.html"); // NOI18N
645
        }
646
        dependencies.addAll(Dependency.create(Dependency.TYPE_JAVA, attr.getValue("OpenIDE-Module-Java-Dependencies"))); // NOI18N
647
        dependencies.addAll(Dependency.create(Dependency.TYPE_MODULE, attr.getValue("OpenIDE-Module-Module-Dependencies"))); // NOI18N
648
        String pkgdeps = attr.getValue("OpenIDE-Module-Package-Dependencies"); // NOI18N
649
        if (pkgdeps != null) {
650
            // XXX: Util.err.log(ErrorManager.WARNING, "Warning: module " + codeNameBase + " uses the OpenIDE-Module-Package-Dependencies manifest attribute, which is now deprecated: XXX URL TBD");
651
            dependencies.addAll(Dependency.create(Dependency.TYPE_PACKAGE, pkgdeps)); // NOI18N
652
        }
653
        dependencies.addAll(Dependency.create(Dependency.TYPE_REQUIRES, attr.getValue("OpenIDE-Module-Requires"))); // NOI18N
654
        dependencies.addAll(Dependency.create(Dependency.TYPE_NEEDS, attr.getValue("OpenIDE-Module-Needs"))); // NOI18N
655
        dependencies.addAll(Dependency.create(Dependency.TYPE_RECOMMENDS, attr.getValue("OpenIDE-Module-Recommends"))); // NOI18N
656
        // Permit the concrete installer to make some changes:
657
        mgr.refineDependencies(this, dependencies);
658
        dependenciesA = dependencies.toArray(new Dependency[dependencies.size()]);
659
    }
660
635
}
661
}
(-)a/openide.modules/src/org/openide/modules/Dependency.java (-1 / +5 lines)
Lines 41-46 Link Here
41
41
42
package org.openide.modules;
42
package org.openide.modules;
43
43
44
import java.io.Serializable;
44
import java.util.Collections;
45
import java.util.Collections;
45
import java.util.HashMap;
46
import java.util.HashMap;
46
import java.util.HashSet;
47
import java.util.HashSet;
Lines 53-59 Link Here
53
 * @author Jesse Glick
54
 * @author Jesse Glick
54
 * @since 1.24
55
 * @since 1.24
55
 */
56
 */
56
public final class Dependency {
57
public final class Dependency implements Serializable {
57
    /** Dependency on another module. */
58
    /** Dependency on another module. */
58
    public final static int TYPE_MODULE = 1;
59
    public final static int TYPE_MODULE = 1;
59
60
Lines 413-418 Link Here
413
    }
414
    }
414
415
415
    /** Overridden to compare contents. */
416
    /** Overridden to compare contents. */
417
    @Override
416
    public boolean equals(Object o) {
418
    public boolean equals(Object o) {
417
        if (o.getClass() != Dependency.class) {
419
        if (o.getClass() != Dependency.class) {
418
            return false;
420
            return false;
Lines 425-435 Link Here
425
    }
427
    }
426
428
427
    /** Overridden to hash by contents. */
429
    /** Overridden to hash by contents. */
430
    @Override
428
    public int hashCode() {
431
    public int hashCode() {
429
        return 772067 ^ type ^ name.hashCode();
432
        return 772067 ^ type ^ name.hashCode();
430
    }
433
    }
431
434
432
    /** Unspecified string representation for debugging. */
435
    /** Unspecified string representation for debugging. */
436
    @Override
433
    public String toString() {
437
    public String toString() {
434
        StringBuffer buf = new StringBuffer(100);
438
        StringBuffer buf = new StringBuffer(100);
435
439

Return to bug 160390