1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.platform.camel.ihe.mllp.core;
17
18 import lombok.experimental.Delegate;
19 import org.apache.camel.component.mina2.Mina2Producer;
20 import org.apache.camel.impl.DefaultProducer;
21 import org.apache.mina.core.service.IoConnector;
22 import org.apache.mina.core.session.IoSession;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import java.lang.reflect.Field;
27 import java.lang.reflect.InvocationTargetException;
28 import java.lang.reflect.Method;
29
30
31
32
33
34 public class MllpProducer extends DefaultProducer {
35
36 private static final Logger LOG = LoggerFactory.getLogger(MllpProducer.class);
37
38
39
40 private interface DoStop {
41 @SuppressWarnings("unused")
42 void stop() throws Exception;
43 }
44
45 @Delegate(excludes = DoStop.class)
46 private final Mina2Producer producer;
47
48 MllpProducer(Mina2Producer producer) {
49
50 super(producer.getEndpoint());
51 this.producer = producer;
52 }
53
54 @Override
55 public void stop() throws Exception {
56 super.stop();
57 }
58
59
60
61
62
63
64 @Override
65 protected void doStop() throws Exception {
66 IoSession session = getField(producer, IoSession.class, "session");
67 if (session != null) {
68 invoke(producer, "closeSessionIfNeededAndAwaitCloseInHandler", IoSession.class, session);
69 }
70 IoConnector connector = getField(producer, IoConnector.class, "connector");
71
72 connector.dispose(false);
73 super.doStop();
74 }
75
76 private static <T> T getField(Object target, Class<T> clazz, String name) throws NoSuchFieldException, IllegalAccessException {
77 Field field = target.getClass().getDeclaredField(name);
78 field.setAccessible(true);
79 return (T) field.get(target);
80 }
81
82 private static <T> void invoke(Object target, String name, Class<T> clazz, T arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
83 Method method = target.getClass().getDeclaredMethod(name, clazz);
84 method.setAccessible(true);
85 method.invoke(target, arg);
86 }
87 }