Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package org.apache.geronimo.microprofile.opentracing.osgi;
  18.  
  19. import static java.util.Collections.singletonMap;
  20.  
  21. import java.util.ArrayList;
  22. import java.util.Collection;
  23. import java.util.Dictionary;
  24. import java.util.HashMap;
  25. import java.util.Hashtable;
  26. import java.util.Map;
  27. import java.util.function.BiConsumer;
  28.  
  29. import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
  30. import org.apache.geronimo.microprofile.opentracing.common.impl.GeronimoTracer;
  31. import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
  32. import org.apache.geronimo.microprofile.opentracing.common.impl.ScopeManagerImpl;
  33. import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter;
  34. import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientResponseFilter;
  35. import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
  36. import org.osgi.framework.BundleActivator;
  37. import org.osgi.framework.BundleContext;
  38. import org.osgi.framework.ServiceReference;
  39. import org.osgi.framework.ServiceRegistration;
  40. import org.osgi.service.cm.ConfigurationAdmin;
  41. import org.osgi.service.event.Event;
  42. import org.osgi.service.event.EventAdmin;
  43. import org.osgi.util.tracker.ServiceTracker;
  44. import org.osgi.util.tracker.ServiceTrackerCustomizer;
  45.  
  46. import io.opentracing.ScopeManager;
  47. import io.opentracing.Tracer;
  48.  
  49. public class OpenTracingActivator implements BundleActivator {
  50. static final Map<Class<?>, Tracked<?>> INSTANCES = new HashMap<>();
  51.  
  52. private final Collection<ServiceRegistration<?>> registrations = new ArrayList<>();
  53.  
  54. @Override
  55. public void start(final BundleContext context) {
  56. INSTANCES.put(Container.class, new Tracked<>(context, Container.class, this::register));
  57. INSTANCES.put(Tracer.class, new Tracked<>(context, Tracer.class, this::register));
  58. INSTANCES.put(GeronimoOpenTracingConfig.class, new Tracked<>(context, GeronimoOpenTracingConfig.class, this::register));
  59. INSTANCES.put(ScopeManager.class, new Tracked<>(context, ScopeManager.class, this::register));
  60. INSTANCES.put(OpenTracingClientRequestFilter.class, new Tracked<>(context, OpenTracingClientRequestFilter.class, this::register));
  61. INSTANCES.put(OpenTracingClientResponseFilter.class, new Tracked<>(context, OpenTracingClientResponseFilter.class, this::register));
  62. INSTANCES.put(EventAdmin.class, new Tracked<>(context, EventAdmin.class, this::register));
  63. INSTANCES.put(ConfigurationAdmin.class, new Tracked<>(context, ConfigurationAdmin.class, this::register));
  64.  
  65. final OSGiContainer container = new OSGiContainer();
  66.  
  67. final GeronimoOpenTracingConfig config = new ConfigAdminOpenTracingConfig();
  68. final ScopeManager scopeManager = new ScopeManagerImpl();
  69.  
  70. final IdGenerator idGenerator = new IdGenerator();
  71. idGenerator.setConfig(config);
  72. idGenerator.init();
  73.  
  74. final GeronimoTracer tracer = new GeronimoTracer();
  75. tracer.setConfig(config);
  76. tracer.setIdGenerator(idGenerator);
  77. tracer.setScopeManager(scopeManager);
  78. tracer.setFinishedSpanEvent(span -> container
  79. .lookup(EventAdmin.class)
  80. .postEvent(new Event("geronimo.opentracing.finishedSpan", singletonMap("span", span))));
  81. tracer.init();
  82.  
  83. final OpenTracingClientRequestFilter requestFilter = new OpenTracingClientRequestFilter();
  84. requestFilter.setTracer(tracer);
  85. requestFilter.setConfig(config);
  86. requestFilter.init();
  87.  
  88. final OpenTracingClientResponseFilter responseFilter = new OpenTracingClientResponseFilter();
  89.  
  90. registrations.add(context.registerService(GeronimoOpenTracingConfig.class, config, new Hashtable<>()));
  91. registrations.add(context.registerService(Container.class, container, new Hashtable<>()));
  92. registrations.add(context.registerService(IdGenerator.class, idGenerator, new Hashtable<>()));
  93. registrations.add(context.registerService(ScopeManager.class, scopeManager, new Hashtable<>()));
  94. registrations.add(context.registerService(Tracer.class, tracer, new Hashtable<>()));
  95. registrations.add(context.registerService(OpenTracingClientRequestFilter.class, requestFilter, newJaxRsExtensionProps()));
  96. registrations.add(context.registerService(OpenTracingClientResponseFilter.class, responseFilter, newJaxRsExtensionProps()));
  97. }
  98.  
  99. @Override
  100. public void stop(final BundleContext context) {
  101. INSTANCES.values().forEach(ServiceTracker::close);
  102. INSTANCES.clear();
  103. registrations.forEach(ServiceRegistration::unregister);
  104. }
  105.  
  106. private Dictionary<String, Object> newJaxRsExtensionProps() {
  107. final Dictionary<String, Object> hashtable = new Hashtable<>();
  108. hashtable.put("osgi.jaxrs.extension", "true");
  109. return hashtable;
  110. }
  111.  
  112. private void register(final Class<?> tClass, final Object t) {
  113. final Tracked tracked = INSTANCES.get(tClass);
  114. tracked.instance = t;
  115. }
  116.  
  117. public static class Tracked<T> extends ServiceTracker<T, T> implements ServiceTrackerCustomizer<T, T> {
  118. private volatile T instance;
  119.  
  120. private Tracked(final BundleContext context, final Class<T> clazz, final BiConsumer<Class<T>, T> onInstance) {
  121. super(context, clazz, new ServiceTrackerCustomizer<T, T>() {
  122. @Override
  123. public T addingService(final ServiceReference<T> reference) {
  124. final T service = context.getService(reference);
  125. onInstance.accept(clazz, service);
  126. return service;
  127. }
  128.  
  129. @Override
  130. public void modifiedService(final ServiceReference<T> reference, final T service) {
  131. addingService(reference);
  132. }
  133.  
  134. @Override
  135. public void removedService(final ServiceReference<T> reference, final T service) {
  136. addingService(reference);
  137. }
  138. });
  139. }
  140.  
  141. public T getInstance() {
  142. return instance;
  143. }
  144. }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement