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 205678
Collapse All | Expand All

(-)a/core.netigso/apichanges.xml (+13 lines)
Lines 52-57 Link Here
52
    <apidef name="general">OSGi Related Behavior</apidef>
52
    <apidef name="general">OSGi Related Behavior</apidef>
53
</apidefs>
53
</apidefs>
54
<changes>
54
<changes>
55
    <change id="is.archive.active">
56
      <api name="spi"/>
57
      <summary>Is archive active?</summary>
58
      <version major="1" minor="14"/>
59
      <date day="10" month="1" year="2012"/>
60
      <author login="jtulach"/>
61
      <compatibility addition="yes" binary="compatible" source="compatible" semantic="compatible"/>
62
      <description>
63
          One can check whether the access to resource archive is safe or not
64
          by calling <code>isActive()</code> method.
65
     </description>
66
      <class package="org.netbeans.core.netigso.spi" name="NetigsoArchive"/>
67
    </change>
55
    <change id="no.friends">
68
    <change id="no.friends">
56
      <api name="general"/>
69
      <api name="general"/>
57
      <summary>Friend API is no longer accessible</summary>
70
      <summary>Friend API is no longer accessible</summary>
(-)a/core.netigso/manifest.mf (-1 / +1 lines)
Lines 2-8 Link Here
2
OpenIDE-Module: org.netbeans.core.netigso
2
OpenIDE-Module: org.netbeans.core.netigso
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/core/netigso/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/core/netigso/Bundle.properties
4
OpenIDE-Module-Provides: org.netbeans.NetigsoFramework
4
OpenIDE-Module-Provides: org.netbeans.NetigsoFramework
5
OpenIDE-Module-Specification-Version: 1.13
5
OpenIDE-Module-Specification-Version: 1.14
6
OpenIDE-Module-Needs: org.osgi.framework.launch.FrameworkFactory
6
OpenIDE-Module-Needs: org.osgi.framework.launch.FrameworkFactory
7
AutoUpdate-Essential-Module: true
7
AutoUpdate-Essential-Module: true
8
8
(-)a/core.netigso/src/org/netbeans/core/netigso/Netigso.java (-2 / +8 lines)
Lines 56-61 Link Here
56
import java.util.Map;
56
import java.util.Map;
57
import java.util.Properties;
57
import java.util.Properties;
58
import java.util.Set;
58
import java.util.Set;
59
import java.util.concurrent.atomic.AtomicBoolean;
59
import java.util.jar.JarOutputStream;
60
import java.util.jar.JarOutputStream;
60
import java.util.jar.Manifest;
61
import java.util.jar.Manifest;
61
import java.util.logging.Level;
62
import java.util.logging.Level;
Lines 95-101 Link Here
95
})
96
})
96
public final class Netigso extends NetigsoFramework implements Stamps.Updater {
97
public final class Netigso extends NetigsoFramework implements Stamps.Updater {
97
    static final Logger LOG = Logger.getLogger(Netigso.class.getName());
98
    static final Logger LOG = Logger.getLogger(Netigso.class.getName());
98
    private static final ThreadLocal<Boolean> SELF_QUERY = new ThreadLocal<Boolean>();
99
    private static final AtomicBoolean SELF_QUERY = new AtomicBoolean();
99
    private static final String[] EMPTY = {};
100
    private static final String[] EMPTY = {};
100
101
101
    private Framework framework;
102
    private Framework framework;
Lines 592-603 Link Here
592
    }
593
    }
593
594
594
    public byte[] fromArchive(long bundleId, String resource, ArchiveResources ar) throws IOException {
595
    public byte[] fromArchive(long bundleId, String resource, ArchiveResources ar) throws IOException {
595
        if (Boolean.TRUE.equals(SELF_QUERY.get())) {
596
        if (SELF_QUERY.get()) {
596
            return ar.resource(resource);
597
            return ar.resource(resource);
597
        }
598
        }
598
        return fromArchive(ar, resource);
599
        return fromArchive(ar, resource);
599
    }
600
    }
600
601
602
    public boolean isArchiveActive() {
603
        return !SELF_QUERY.get();
604
    }
605
601
    private static String toURI(final File file) {
606
    private static String toURI(final File file) {
602
        class VFile extends File {
607
        class VFile extends File {
603
608
Lines 617-620 Link Here
617
        }
622
        }
618
        return new VFile().toURI().toString();
623
        return new VFile().toURI().toString();
619
    }
624
    }
625
620
}
626
}
(-)a/core.netigso/src/org/netbeans/core/netigso/spi/NetigsoArchive.java (+12 lines)
Lines 100-105 Link Here
100
    public byte[] fromArchive(String resource) throws IOException {
100
    public byte[] fromArchive(String resource) throws IOException {
101
        return netigso.fromArchive(bundleId, resource, content);
101
        return netigso.fromArchive(bundleId, resource, content);
102
    }
102
    }
103
    
104
    /** Checks whether the archive should be used or not. During first
105
     * start the Netigso system iterates through all bundle entries to 
106
     * record so-called <em>covered packages</em>. During this iteration
107
     * one should not try to use the archive - this method returns <code>false</code>.
108
     * 
109
     * @return true, if it is safe to use the {@link #fromArchive(java.lang.String)} method
110
     * @since 1.14
111
     */
112
    public boolean isActive() {
113
        return netigso.isArchiveActive();
114
    }
103
115
104
    static {
116
    static {
105
        NetigsoArchiveFactory f = new NetigsoArchiveFactory() {
117
        NetigsoArchiveFactory f = new NetigsoArchiveFactory() {
(-)a/netbinox/nbproject/project.xml (-1 / +1 lines)
Lines 10-16 Link Here
10
                    <build-prerequisite/>
10
                    <build-prerequisite/>
11
                    <compile-dependency/>
11
                    <compile-dependency/>
12
                    <run-dependency>
12
                    <run-dependency>
13
                        <specification-version>1.4.2</specification-version>
13
                        <specification-version>1.14</specification-version>
14
                    </run-dependency>
14
                    </run-dependency>
15
                </dependency>
15
                </dependency>
16
                <dependency>
16
                <dependency>
(-)a/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java (-1 / +6 lines)
Lines 45-51 Link Here
45
import java.io.File;
45
import java.io.File;
46
import java.io.IOException;
46
import java.io.IOException;
47
import java.io.InputStream;
47
import java.io.InputStream;
48
import java.net.MalformedURLException;
49
import java.net.URL;
48
import java.net.URL;
50
import java.util.Collections;
49
import java.util.Collections;
51
import java.util.Enumeration;
50
import java.util.Enumeration;
Lines 182-187 Link Here
182
        return d == null ? null : d.getFile(file, bln);
181
        return d == null ? null : d.getFile(file, bln);
183
    }
182
    }
184
183
184
    @Override
185
    public byte[] resource(String name) throws IOException {
185
    public byte[] resource(String name) throws IOException {
186
        BundleEntry u = findEntry("resource", name);
186
        BundleEntry u = findEntry("resource", name);
187
        if (u == null) {
187
        if (u == null) {
Lines 212-217 Link Here
212
        } finally {
212
        } finally {
213
            is.close();
213
            is.close();
214
        }
214
        }
215
        NetbinoxFactory.LOG.log(Level.FINE, "Loaded {1} bytes for {0}", new Object[] { name, arr.length }); // NOI18N
215
        return arr;
216
        return arr;
216
    }
217
    }
217
218
Lines 238-243 Link Here
238
239
239
    @Override
240
    @Override
240
    public BundleEntry getEntry(final String name) {
241
    public BundleEntry getEntry(final String name) {
242
        if (!archive.isActive()) {
243
            return delegate("inactive", name).getEntry(name); // NOI18N
244
        }
245
        
241
        final byte[] arr = getCachedEntry(name);
246
        final byte[] arr = getCachedEntry(name);
242
        if (arr == null && !name.equals("/")) {
247
        if (arr == null && !name.equals("/")) {
243
            return null;
248
            return null;
(-)ba49237cb632 (+141 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2011 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * If you wish your version of this file to be governed by only the CDDL
28
 * or only the GPL Version 2, indicate your decision by adding
29
 * "[Contributor] elects to include this software in this distribution
30
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
31
 * single choice of license, a recipient has the option to distribute
32
 * your version of this file under either the CDDL, the GPL Version 2 or
33
 * to extend the choice of license to its licensees as provided above.
34
 * However, if you add GPL Version 2 code and therefore, elected the GPL
35
 * Version 2 license, then the option applies only if the new code is
36
 * made subject to such option by the copyright holder.
37
 *
38
 * Contributor(s):
39
 *
40
 * Portions Copyrighted 2011 Oracle
41
 */
42
package org.netbeans.modules.netbinox;
43
44
import org.netbeans.core.startup.*;
45
import java.io.File;
46
import java.io.IOException;
47
import java.util.Locale;
48
import java.util.logging.Handler;
49
import java.util.logging.Level;
50
import java.util.logging.LogRecord;
51
import org.netbeans.Module;
52
import org.netbeans.ModuleManager;
53
import org.netbeans.SetupHid;
54
55
/**
56
 * Verify content is not loaded when enumerating covered packages.
57
 *
58
 * @author Jaroslav Tulach
59
 */
60
public class LoadedBytesTest extends SetupHid {
61
    private static Module m1;
62
    private static ModuleManager mgr;
63
    int counter;
64
    boolean used;
65
    private File file;
66
        
67
68
    public LoadedBytesTest(String name) {
69
        super(name);
70
    }
71
72
    protected @Override void setUp() throws Exception {
73
        Locale.setDefault(Locale.US);
74
        clearWorkDir();
75
        File ud = new File(getWorkDir(), "ud");
76
        ud.mkdirs();
77
        System.setProperty("netbeans.user", ud.getPath());
78
        
79
        data = new File(getDataDir(), "jars");
80
        jars = new File(getWorkDir(), "space in path");
81
        jars.mkdirs();
82
        File simpleModule = createTestJAR("simple-module", null);
83
        
84
        String mf = "Manifest-Version: 1.0\n" + 
85
            "Bundle-SymbolicName: org.foo\n" +
86
            "Bundle-Version: 1.2\n\n";
87
        
88
        file = NetigsoHid.changeManifest(getWorkDir(), simpleModule, mf);
89
        NetbinoxFactory.LOG.addHandler(new CountingHandler());
90
    }
91
92
    public void testEnumeratingEntriesDoesNotLoadContent() throws Exception {
93
        ModuleSystem ms = Main.getModuleSystem();
94
        mgr = ms.getManager();
95
        mgr.mutexPrivileged().enterWriteAccess();
96
        try {
97
            m1 = mgr.create(file, null, false, false, false);
98
            mgr.enable(m1);
99
            assertTrue("Is enabled: ", m1.isEnabled());
100
101
            assertEquals("No bytes loaded", 0, counter);
102
            
103
            Class<?> main = m1.getClassLoader().loadClass("org.foo.Something");
104
            assertNotNull("Class can be loaded", main);
105
            mgr.disable(m1);
106
        } finally {
107
            mgr.mutexPrivileged().exitWriteAccess();
108
        }
109
        assertTrue("The CountingHandler was active", used);
110
    }
111
    private File createTestJAR(String name, String srcdir, File... classpath) throws IOException {
112
        return createTestJAR(data, jars, name, srcdir, classpath);
113
    }
114
    private class CountingHandler extends Handler {
115
        public CountingHandler() {
116
            setLevel(Level.ALL);
117
        }
118
119
        @Override
120
        public void publish(LogRecord record) {
121
            if (record.getMessage().startsWith("opening") && record.getMessage().contains("because")) {
122
                used = true;
123
            }
124
            if (record.getMessage().startsWith("Loaded") && record.getMessage().contains("bytes")) {
125
                String name = (String) record.getParameters()[0];
126
                if (name.endsWith(".class")) {
127
                    counter += (Integer)record.getParameters()[1];
128
                }
129
            }
130
        }
131
132
        @Override
133
        public void flush() {
134
        }
135
136
        @Override
137
        public void close() throws SecurityException {
138
        }
139
    }
140
    
141
}

Return to bug 205678