commit
0c2cfaa13b
@ -0,0 +1,3 @@
|
||||
*.iml
|
||||
.idea/
|
||||
target/
|
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>de.joshavg</groupId>
|
||||
<artifactId>simpledic</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<name>SimpleDiContainer</name>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.collections</groupId>
|
||||
<artifactId>google-collections</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
@ -0,0 +1,105 @@
|
||||
package de.joshavg.simpledic;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import de.joshavg.simpledic.exception.ContainerInitException;
|
||||
import de.joshavg.simpledic.exception.DependencyNotSatisfiedException;
|
||||
import de.joshavg.simpledic.exception.SdicClassNotFoundException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SdiContainer {
|
||||
|
||||
private final Properties props;
|
||||
|
||||
@VisibleForTesting
|
||||
SdiContainer(Properties props) {
|
||||
this.props = props;
|
||||
}
|
||||
|
||||
public static SdiContainer load() {
|
||||
return load("sdic.properties");
|
||||
}
|
||||
|
||||
public static SdiContainer load(String filename) {
|
||||
Properties props = new Properties();
|
||||
|
||||
InputStream inputStream = SdiContainer.class.getClassLoader().getResourceAsStream(filename);
|
||||
try {
|
||||
props.load(inputStream);
|
||||
} catch (IOException e) {
|
||||
throw new ContainerInitException("failed loading properties", e);
|
||||
}
|
||||
|
||||
SdiContainer container = new SdiContainer(props);
|
||||
container.integrityCheck();
|
||||
return container;
|
||||
}
|
||||
|
||||
private void integrityCheck() {
|
||||
List<Class<?>> services = fetchAllServices();
|
||||
checkConstructorDependencies(services);
|
||||
}
|
||||
|
||||
private List<Class<?>> fetchAllServices() {
|
||||
return props.entrySet().stream()
|
||||
.filter(e -> isServiceName(e.getKey().toString()))
|
||||
.map(e -> e.getValue().toString())
|
||||
.map(n -> {
|
||||
try {
|
||||
return Class.forName(n);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new SdicClassNotFoundException(e);
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private void checkConstructorDependencies(List<Class<?>> services) {
|
||||
for(Class<?> c : services) {
|
||||
Constructor<?>[] constructors = c.getDeclaredConstructors();
|
||||
for(Constructor constructor : constructors) {
|
||||
Class[] parameterTypes = constructor.getParameterTypes();
|
||||
System.out.println(Arrays.toString(parameterTypes));
|
||||
System.out.println(Arrays.asList(parameterTypes));
|
||||
}
|
||||
}
|
||||
/* services.stream()
|
||||
// get all constructors
|
||||
.map(Class::getDeclaredConstructors)
|
||||
.reduce(new ArrayList<Constructor>(),
|
||||
(l, arr) -> {
|
||||
l.addAll(Arrays.asList(arr));
|
||||
return l;
|
||||
},
|
||||
(l1, l2) -> l1)
|
||||
// get all parameter types
|
||||
.stream()
|
||||
.map(Constructor::getParameterTypes)
|
||||
.reduce(new ArrayList<Class<?>>(),
|
||||
(l, arr) -> {
|
||||
l.addAll(Arrays.asList(arr));
|
||||
return l;
|
||||
},
|
||||
(l1, l2) -> l1)
|
||||
// search for services with needed types
|
||||
.stream()
|
||||
.distinct()
|
||||
.forEach(t -> {
|
||||
if (!services.contains(t)) {
|
||||
throw new DependencyNotSatisfiedException(t);
|
||||
}
|
||||
});*/
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static boolean isServiceName(String name) {
|
||||
return name.startsWith("service.");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package de.joshavg.simpledic.exception;
|
||||
|
||||
public class ContainerInitException extends RuntimeException {
|
||||
|
||||
public ContainerInitException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package de.joshavg.simpledic.exception;
|
||||
|
||||
public class DependencyNotSatisfiedException extends RuntimeException {
|
||||
public DependencyNotSatisfiedException(Class<?> dependency) {
|
||||
super(String.format("Dependency %s not satisfied", dependency.getName()));
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package de.joshavg.simpledic.exception;
|
||||
|
||||
public class NoDefaultConstructorException extends RuntimeException {
|
||||
public NoDefaultConstructorException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package de.joshavg.simpledic.exception;
|
||||
|
||||
public class SdicClassNotFoundException extends RuntimeException {
|
||||
public SdicClassNotFoundException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package de.joshavg.simpledic;
|
||||
|
||||
public class NoDependencies {
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package de.joshavg.simpledic;
|
||||
|
||||
public class ServiceOne {
|
||||
public ServiceOne(NoDependencies b) {
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package de.joshavg.simpledic;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class TestProperties {
|
||||
|
||||
@Test
|
||||
public void testIntegrityCheck() {
|
||||
SdiContainer.load("test.properties");
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
service.one: de.joshavg.simpledic.ServiceOne
|
||||
service.nodeps: de.joshavg.simpledic.NoDependencies
|
Loading…
Reference in new issue