Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
(cherry picked from commit 7db618e)
  • Loading branch information
liorhson authored and olivergondza committed Jun 16, 2015
1 parent 8e19340 commit 0612d94
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 8 deletions.
32 changes: 28 additions & 4 deletions core/src/main/java/hudson/util/MaskingClassLoader.java
Expand Up @@ -23,6 +23,7 @@
*/
package hudson.util;

import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand All @@ -41,28 +42,51 @@ public class MaskingClassLoader extends ClassLoader {
/**
* Prefix of the packages that should be hidden.
*/
private List<String> masks;
private List<String> masksClasses;

private List<String> masksResources;

public MaskingClassLoader(ClassLoader parent, String... masks) {
this(parent, Arrays.asList(masks));
}

public MaskingClassLoader(ClassLoader parent, Collection<String> masks) {
super(parent);
this.masks = new ArrayList<String>(masks);
this.masksClasses = new ArrayList<String>(masks);
this.masksResources = new ArrayList<String>();

/**
* The name of a resource is a '/'-separated path name
*/
for (String mask : masks) {
masksResources.add(mask.replace(".","/"));
}
}

@Override
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
for (String mask : masks) {
for (String mask : masksClasses) {
if(name.startsWith(mask))
throw new ClassNotFoundException();
}

return super.loadClass(name, resolve);
}

@Override
public synchronized URL getResource(String name) {
for (String mask : masksResources) {
if(name.startsWith(mask))
return null;
}

return super.getResource(name);
}

public synchronized void add(String prefix) {
masks.add(prefix);
masksClasses.add(prefix);
if(prefix !=null){
masksResources.add(prefix.replace(".","/"));
}
}
}
24 changes: 20 additions & 4 deletions test/src/test/java/hudson/ClassicPluginStrategyTest.java
@@ -1,19 +1,19 @@
/*
* The MIT License
*
*
* Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi,
* Alan Harder
*
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Expand All @@ -26,6 +26,7 @@

import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.LenientRunnable;
import org.jvnet.hudson.test.recipes.LocalData;

import java.net.URL;
Expand Down Expand Up @@ -87,4 +88,19 @@ public void testDisabledDependencyClassLoader() throws Exception {
fail("disabled dependency should not be included");
}
}

/**
* Test finding resources under masking.
* "foo1" plugin contains attribute of Mask-Classes: org.apache.http.
*/
@LocalData
@Issue("JENKINS-27289")
public void testMaskResourceClassLoader() throws Exception {
PluginWrapper pw = jenkins.getPluginManager().getPlugin("foo1");
Class<?> clazz = pw.classLoader.loadClass("org.apache.http.impl.io.SocketInputBuffer");
ClassLoader cl = clazz.getClassLoader();
URL url = cl.getResource("org/apache/http/impl/io/SocketInputBuffer.class");
assert url != null;
assertTrue("expected to find the class from foo1 plugin", url.toString().contains("plugins/foo1"));
}
}
Binary file not shown.

0 comments on commit 0612d94

Please sign in to comment.