package net.obnoxint.mcdev.omclib; import net.obnoxint.mcdev.feature.Feature; import net.obnoxint.mcdev.feature.FeatureManager; public final class OmcLibFeatureManager extends FeatureManager { private boolean active = false; private final OmcLibFeatureProperties properties; OmcLibFeatureManager(final OmcLibPlugin plugin) { super(plugin); setFeatureName("omc-lib"); properties = new OmcLibFeatureProperties(this); properties.load(); if (properties.isAutoEnable()) { setFeatureActive(true); } addAutoEnabledImplementedFeatures(); } @Override public boolean addFeature(final Feature feature) throws UnsupportedOperationException { boolean r = false; if (properties.isFeatureBlacklisted(feature)) { throw new UnsupportedOperationException("The feature \"" + feature.getFeatureName() + "\" is blacklisted."); } r = super.addFeature(feature); if (r && properties.isAutoSetFeatureActiveState()) { feature.setFeatureActive(active); } return r; } @Override public Feature getFeature(final String name) { return super.getFeature(name); } public String[] getFeatureNames() { return super.getFeatures().keySet().toArray(new String[super.getFeatures().size()]); } @Override public OmcLibPlugin getFeaturePlugin() { return (OmcLibPlugin) super.getFeaturePlugin(); } @Override public OmcLibFeatureProperties getFeatureProperties() { return properties; } public boolean hasFeature(final Feature feature) { return hasFeature(feature.getFeatureName()); } public boolean hasFeature(final String name) { return getFeatures().containsKey(name); } @Override public boolean isFeatureActive() { return active; } @Override public void setFeatureActive(final boolean active) { if (this.active != active) { super.setFeatureActive(active); if (active) { properties.load(); } else { properties.store(); } this.active = active; } } private void addAutoEnabledImplementedFeatures() { for (final ImplementedFeature v : ImplementedFeature.values()) { if (properties.isAutoEnableImplementedFeature(v)) { try { addFeature(v.getClazz().newInstance()); } catch (UnsupportedOperationException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } } } }