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 PluginService service;
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    
029        // -------------------------------------------------------------------------------------------------- Public Methods
030    
031        @Override
032        public String toString() {
033            return serviceInterface.getName();
034        }
035    
036        // ----------------------------------------------------------------------------------------- Package Private Methods
037    
038        Class<? extends PluginService> getServiceInterface() {
039            return serviceInterface;
040        }
041    
042        PluginService getService() {
043            if (!isServiceAvailable()) {
044                throw new RuntimeException("Service " + this + " is not available (consumed by " + pluginContext + ")");
045            }
046            return service;
047        }
048    
049        boolean isServiceAvailable() {
050            return service != null;
051        }
052    
053        void injectService(PluginService service) {
054            this.service = service;
055            injectValue(service);
056        }
057    
058        // ------------------------------------------------------------------------------------------------- Private Methods
059    
060        private void injectValue(Object value) {
061            try {
062                injectableField.set(pluginContext, value);  // throws IllegalAccessException
063            } catch (Exception e) {
064                throw new RuntimeException("Injecting " + (value == null ? "null for " : "") + this + " failed", e);
065            }
066        }
067    }