Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Allow to use additional properties with security manager/4323 #4327

Merged
merged 18 commits into from
Dec 17, 2019
Merged
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -25,6 +25,7 @@ nb-configuration.xml
.settings/*
.project
.classpath
bin/

# Maven plugins noise
dependency-reduced-pom.xml
Original file line number Diff line number Diff line change
@@ -16,29 +16,44 @@

package org.glassfish.jersey.internal.config;

import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.internal.LocalizationMessages;
import org.glassfish.jersey.internal.util.PropertiesHelper;
import org.glassfish.jersey.internal.util.ReflectionHelper;
import org.glassfish.jersey.spi.ExternalConfigurationModel;

import javax.ws.rs.RuntimeType;
import javax.ws.rs.core.Feature;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.logging.Logger;

import javax.ws.rs.RuntimeType;
import javax.ws.rs.core.Feature;

import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.internal.LocalizationMessages;
import org.glassfish.jersey.internal.util.PropertiesHelper;
import org.glassfish.jersey.internal.util.ReflectionHelper;
import org.glassfish.jersey.spi.ExternalConfigurationModel;


class SystemPropertiesConfigurationModel implements ExternalConfigurationModel<Void> {

private static final Logger log = Logger.getLogger(SystemPropertiesConfigurationModel.class.getName());
static final List<String> PROPERTY_CLASSES = Arrays.asList(
"org.glassfish.jersey.server.ServerProperties",
"org.glassfish.jersey.client.ClientProperties",
"org.glassfish.jersey.servlet.ServletProperties",
"org.glassfish.jersey.internal.InternalProperties",
"org.glassfish.jersey.message.MessageProperties",
"org.glassfish.jersey.server.internal.InternalServerProperties",
"org.glassfish.jersey.apache.connector.ApacheClientProperties",
"org.glassfish.jersey.jdk.connector.JdkConnectorProperties",
"org.glassfish.jersey.jetty.connector.JettyClientProperties",
"org.glassfish.jersey.media.multipart.MultiPartProperties",
"org.glassfish.jersey.server.oauth1.OAuth1ServerProperties");


private static final Map<Class, Function> converters = new HashMap<>();
@@ -118,26 +133,15 @@ public Map<String, Object> getProperties() {
}

private Map<String, Object> getExpectedSystemProperties() {


final Map<String, Object> result = new HashMap<>();

mapFieldsToProperties(result, CommonProperties.class);



mapFieldsToProperties(result,
AccessController.doPrivileged(
ReflectionHelper.classForNamePA("org.glassfish.jersey.server.ServerProperties")
)
);

mapFieldsToProperties(result,
AccessController.doPrivileged(
ReflectionHelper.classForNamePA("org.glassfish.jersey.client.ClientProperties")
)
);

for (String propertyClass : PROPERTY_CLASSES) {
mapFieldsToProperties(result,
AccessController.doPrivileged(
ReflectionHelper.classForNamePA(propertyClass)
)
);
}

return result;
}
10 changes: 10 additions & 0 deletions tests/integration/property-check/pom.xml
Original file line number Diff line number Diff line change
@@ -89,6 +89,16 @@
<artifactId>jersey-media-sse</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.glassfish.jersey.internal.config;

import static org.junit.Assert.assertEquals;

import com.google.common.reflect.ClassPath;

import java.io.IOException;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.internal.util.PropertiesClass;
import org.glassfish.jersey.internal.util.Property;
import org.glassfish.jersey.test.TestProperties;
import org.junit.Test;

public class SystemPropertiesConfigurationModelTest {

private static final String ROOT_PACKAGE = "org.glassfish.jersey";

@Test
public void allPropertyClassLoaded() throws IOException {
Predicate<Class<?>> containsAnnotation = clazz -> clazz.getAnnotation(PropertiesClass.class) != null
|| clazz.getAnnotation(Property.class) != null;
Predicate<Class<?>> notCommon = clazz -> clazz != CommonProperties.class;
Predicate<Class<?>> notTestProperties = clazz -> clazz != TestProperties.class;
List<String> propertyClasses = getClassesWithPredicate(ROOT_PACKAGE, notCommon, notTestProperties,
containsAnnotation).stream().map(Class::getName).collect(Collectors.toList());
propertyClasses.removeAll(SystemPropertiesConfigurationModel.PROPERTY_CLASSES);
assertEquals("New properties have been found. "
+ "Make sure you add next classes in SystemPropertiesConfigurationModel.PROPERTY_CLASSES: "
+ propertyClasses, 0, propertyClasses.size());
}

private List<Class<?>> getClassesWithPredicate(String packageRoot, Predicate<Class<?>>... predicates)
throws IOException {
ClassPath classpath = ClassPath.from(Thread.currentThread().getContextClassLoader());
Stream<Class<?>> steam = classpath.getTopLevelClassesRecursive(packageRoot).stream()
.map(classInfo -> {
try {
return Class.forName(classInfo.getName());
} catch (ClassNotFoundException e) {
return Void.class;
}
});
for (Predicate<Class<?>> predicate : predicates) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since you are already using streams I suppose it would be appropriate to rewrite this FOR cycle with :

.filter(Arrays.stream(predicates).reduce(x->true, Predicate::and))

and then you can just return

.collect(Collectors.toList())

steam = steam.filter(predicate);
}
return steam.collect(Collectors.toList());
}

}