001 package de.deepamehta.core.impl;
002
003 import de.deepamehta.core.osgi.PluginContext;
004 import de.deepamehta.core.service.PluginService;
005
006 import java.lang.reflect.Field;
007
008
009
010 class InjectableService {
011
012 // ---------------------------------------------------------------------------------------------- Instance Variables
013
014 private PluginContext pluginContext;
015 private Class<? extends PluginService> serviceInterface;
016 private Field injectableField;
017
018 private boolean isServiceAvailable;
019
020 // ---------------------------------------------------------------------------------------------------- Constructors
021
022 InjectableService(PluginContext pluginContext, Class<? extends PluginService> serviceInterface,
023 Field injectableField) {
024 this.pluginContext = pluginContext;
025 this.serviceInterface = serviceInterface;
026 this.injectableField = injectableField;
027 //
028 injectableField.setAccessible(true); // allow injection into private fields
029 }
030
031 // -------------------------------------------------------------------------------------------------- Public Methods
032
033 @Override
034 public String toString() {
035 return serviceInterface.getName();
036 }
037
038 // ----------------------------------------------------------------------------------------- Package Private Methods
039
040 Class<? extends PluginService> getServiceInterface() {
041 return serviceInterface;
042 }
043
044 boolean isServiceAvailable() {
045 return isServiceAvailable;
046 }
047
048 // ---
049
050 void injectService(Object service) {
051 injectValue(service);
052 isServiceAvailable = true;
053 }
054
055 void injectNull() {
056 injectValue(null);
057 isServiceAvailable = false;
058 }
059
060 // ------------------------------------------------------------------------------------------------- Private Methods
061
062 private void injectValue(Object value) {
063 try {
064 injectableField.set(pluginContext, value); // throws IllegalAccessException
065 } catch (Exception e) {
066 throw new RuntimeException("Injecting " + (value == null ? "null for " : "") + this + " failed", e);
067 }
068 }
069 }