Use functional programming for challenge class generation

pull/30/head
Richard Körber 2017-02-11 11:57:37 +01:00
parent 898c552f77
commit 1f4faf803b
1 changed files with 11 additions and 31 deletions

View File

@ -13,14 +13,13 @@
*/ */
package org.shredzone.acme4j.provider; package org.shredzone.acme4j.provider;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function;
import org.shredzone.acme4j.Session; import org.shredzone.acme4j.Session;
import org.shredzone.acme4j.challenge.Challenge; import org.shredzone.acme4j.challenge.Challenge;
@ -43,7 +42,7 @@ import org.shredzone.acme4j.util.JSON;
*/ */
public abstract class AbstractAcmeProvider implements AcmeProvider { public abstract class AbstractAcmeProvider implements AcmeProvider {
private static final Map<String, Constructor<? extends Challenge>> CHALLENGES = challengeMap(); private static final Map<String, Function<Session, Challenge>> CHALLENGES = challengeMap();
@Override @Override
public Connection connect() { public Connection connect() {
@ -64,27 +63,14 @@ public abstract class AbstractAcmeProvider implements AcmeProvider {
} }
@SuppressWarnings("deprecation") // must still provide deprecated challenges @SuppressWarnings("deprecation") // must still provide deprecated challenges
private static Map<String, Constructor<? extends Challenge>> challengeMap() { private static Map<String, Function<Session, Challenge>> challengeMap() {
Map<String, Constructor<? extends Challenge>> map = new HashMap<>(); Map<String, Function<Session, Challenge>> map = new HashMap<>();
try { map.put(Dns01Challenge.TYPE, Dns01Challenge::new);
map.put(Dns01Challenge.TYPE, map.put(org.shredzone.acme4j.challenge.TlsSni01Challenge.TYPE, org.shredzone.acme4j.challenge.TlsSni01Challenge::new);
Dns01Challenge.class.getConstructor(Session.class)); map.put(TlsSni02Challenge.TYPE, TlsSni02Challenge::new);
map.put(Http01Challenge.TYPE, Http01Challenge::new);
map.put(org.shredzone.acme4j.challenge.TlsSni01Challenge.TYPE, map.put(OutOfBand01Challenge.TYPE, OutOfBand01Challenge::new);
org.shredzone.acme4j.challenge.TlsSni01Challenge.class.getConstructor(Session.class));
map.put(TlsSni02Challenge.TYPE,
TlsSni02Challenge.class.getConstructor(Session.class));
map.put(Http01Challenge.TYPE,
Http01Challenge.class.getConstructor(Session.class));
map.put(OutOfBand01Challenge.TYPE,
OutOfBand01Challenge.class.getConstructor(Session.class));
} catch (NoSuchMethodException ex) {
throw new IllegalStateException("Could not find Challenge constructor", ex);
}
return Collections.unmodifiableMap(map); return Collections.unmodifiableMap(map);
} }
@ -94,18 +80,12 @@ public abstract class AbstractAcmeProvider implements AcmeProvider {
Objects.requireNonNull(session, "session"); Objects.requireNonNull(session, "session");
Objects.requireNonNull(type, "type"); Objects.requireNonNull(type, "type");
Constructor<? extends Challenge> constructor = CHALLENGES.get(type); Function<Session, Challenge> constructor = CHALLENGES.get(type);
if (constructor == null) { if (constructor == null) {
return null; return null;
} }
try { return constructor.apply(session);
return constructor.newInstance(session);
} catch (InvocationTargetException | IllegalAccessException
| InstantiationException ex) {
throw new IllegalStateException(
"Could not instantiate a Challenge for type " + type, ex);
}
} }
/** /**