Refactor providers to a generic implementation in preparation for future spawn egg APIs

This commit is contained in:
vemacs 2016-03-10 07:47:43 -07:00
parent 873f9404bf
commit f1c57371a3
5 changed files with 58 additions and 51 deletions

View file

@ -28,7 +28,6 @@ import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.KeywordReplacer;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.SpawnerProviderFactory;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
@ -36,6 +35,11 @@ import net.ess3.api.*;
import net.ess3.api.IEssentials;
import net.ess3.api.ISettings;
import net.ess3.nms.SpawnerProvider;
import net.ess3.nms.blockmeta.BlockMetaSpawnerProvider;
import net.ess3.nms.legacy.LegacySpawnerProvider;
import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider;
import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider;
import net.ess3.providers.ProviderFactory;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Server;
@ -74,7 +78,6 @@ import static com.earth2me.essentials.I18n.tl;
public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
public static final int BUKKIT_VERSION = 3050;
private static final Logger LOGGER = Logger.getLogger("Essentials");
private transient ISettings settings;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this);
@ -194,7 +197,13 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
execTimer.mark("Init(Worth/ItemDB)");
jails = new Jails(this);
confList.add(jails);
spawnerProvider = new SpawnerProviderFactory(this).getProvider();
spawnerProvider = new ProviderFactory<>(getLogger(),
Arrays.asList(
BlockMetaSpawnerProvider.class,
v1_8_R2SpawnerProvider.class,
v1_8_R1SpawnerProvider.class,
LegacySpawnerProvider.class
), "mob spawner").getProvider();
reload();
} catch (YAMLException exception) {
if (pm.getPlugin("EssentialsUpdate") != null) {

View file

@ -1,46 +0,0 @@
package com.earth2me.essentials.utils;
import com.earth2me.essentials.IEssentials;
import net.ess3.nms.SpawnerProvider;
import net.ess3.nms.blockmeta.BlockMetaSpawnerProvider;
import net.ess3.nms.legacy.LegacySpawnerProvider;
import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider;
import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider;
import java.util.Arrays;
import java.util.List;
public class SpawnerProviderFactory {
private IEssentials ess;
public SpawnerProviderFactory(IEssentials ess) {
this.ess = ess;
}
public SpawnerProvider getProvider() {
List<Class<? extends SpawnerProvider>> availableProviders = Arrays.asList(
BlockMetaSpawnerProvider.class,
v1_8_R1SpawnerProvider.class,
v1_8_R2SpawnerProvider.class,
LegacySpawnerProvider.class
);
SpawnerProvider finalProvider = null;
for (Class<? extends SpawnerProvider> providerClass : availableProviders) {
finalProvider = loadProvider(providerClass);
if (finalProvider != null && finalProvider.tryProvider()) {
break;
}
}
assert finalProvider != null;
ess.getLogger().info("Using " + finalProvider.getHumanName() + " as spawner provider.");
return finalProvider;
}
private SpawnerProvider loadProvider(Class<? extends SpawnerProvider> providerClass) {
try {
return providerClass.newInstance();
} catch (Throwable ignored) {
return null;
}
}
}

View file

@ -1,5 +1,6 @@
package net.ess3.nms;
import net.ess3.providers.Provider;
import com.google.common.collect.ImmutableMap;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -9,7 +10,7 @@ import org.bukkit.inventory.meta.ItemMeta;
import java.util.Map;
public abstract class SpawnerProvider {
public abstract class SpawnerProvider implements Provider {
protected Map<EntityType, String> entityToDisplayName = ImmutableMap.<EntityType, String>builder()
.put(EntityType.CAVE_SPIDER, "Cave Spider")
.put(EntityType.PIG_ZOMBIE, "Zombie Pigman")
@ -25,8 +26,8 @@ public abstract class SpawnerProvider {
public abstract ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException;
public abstract EntityType getEntityType(ItemStack is) throws IllegalArgumentException;
public abstract String getHumanName();
@Override
public boolean tryProvider() {
try {
EntityType type = EntityType.CREEPER;

View file

@ -0,0 +1,7 @@
package net.ess3.providers;
public interface Provider {
boolean tryProvider();
String getHumanName();
}

View file

@ -0,0 +1,36 @@
package net.ess3.providers;
import java.util.logging.Logger;
public class ProviderFactory<T extends Provider> {
private Logger logger;
private String providerType;
private Iterable<Class <? extends T>> availableProviders;
public ProviderFactory(Logger logger, Iterable<Class <? extends T>> availableProviders, String providerType) {
this.logger = logger;
this.providerType = providerType;
this.availableProviders = availableProviders;
}
public T getProvider() {
T finalProvider = null;
for (Class<? extends T> providerClass : availableProviders) {
finalProvider = loadProvider(providerClass);
if (finalProvider != null && finalProvider.tryProvider()) {
break;
}
}
assert finalProvider != null;
logger.info("Using " + finalProvider.getHumanName() + " as " + providerType + " provider.");
return finalProvider;
}
private T loadProvider(Class<? extends T> providerClass) {
try {
return providerClass.newInstance();
} catch (Throwable ignored) {
return null;
}
}
}