panlinlin
2021-01-06 627a14f37e49d5e33cc5f593277ee24f913875b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package com.genersoft.iot.vmp.gb28181.transmit;
 
import javax.sip.RequestEvent;
import javax.sip.ResponseEvent;
import javax.sip.SipProvider;
import javax.sip.header.CSeqHeader;
import javax.sip.header.CallIdHeader;
import javax.sip.header.Header;
import javax.sip.message.Request;
import javax.sip.message.Response;
 
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.alibaba.fastjson.JSON;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
 
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.AckRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.ByeRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.CancelRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.InviteRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.OtherRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.request.impl.SubscribeRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.ByeResponseProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.CancelResponseProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.InviteResponseProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.response.impl.OtherResponseProcessor;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.utils.SpringBeanFactory;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 
/**    
 * @Description:TODO(这里用一句话描述这个类的作用)   
 * @author: swwheihei
 * @date:   2020年5月3日 下午4:24:37     
 */
@Component
public class SIPProcessorFactory {
    
    private final static Logger logger = LoggerFactory.getLogger(SIPProcessorFactory.class);
    
    @Autowired
    private SipConfig sipConfig;
    
    @Autowired
    private RegisterLogicHandler handler;
    
    @Autowired
    private IVideoManagerStorager storager;
 
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
 
    @Autowired
    private EventPublisher publisher;
    
    @Autowired
    private SIPCommander cmder;
    
    @Autowired
    private RedisUtil redis;
    
    @Autowired
    private DeferredResultHolder deferredResultHolder;
    
    @Autowired
    private DeviceOffLineDetector offLineDetector;
    
    @Autowired
    private InviteResponseProcessor inviteResponseProcessor;
    
    @Autowired
    private ByeResponseProcessor byeResponseProcessor;
    
    @Autowired
    private CancelResponseProcessor cancelResponseProcessor;
 
    @Autowired
    @Lazy
    private RegisterResponseProcessor registerResponseProcessor;
 
 
    @Autowired
    private OtherResponseProcessor otherResponseProcessor;
 
 
    // 注:这里使用注解会导致循环依赖注入,暂用springBean
    private SipProvider tcpSipProvider;
        
    // 注:这里使用注解会导致循环依赖注入,暂用springBean
    private SipProvider udpSipProvider;
    
    public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) {
        Request request = evt.getRequest();
        String method = request.getMethod();
//        logger.info("接收到消息:"+request.getMethod());
        if (Request.INVITE.equals(method)) {
            InviteRequestProcessor processor = new InviteRequestProcessor();
            processor.setRequestEvent(evt);
            processor.setTcpSipProvider(getTcpSipProvider());
            processor.setUdpSipProvider(getUdpSipProvider());
            return processor;
        } else if (Request.REGISTER.equals(method)) {
            RegisterRequestProcessor processor = new RegisterRequestProcessor();
            processor.setRequestEvent(evt);
            processor.setTcpSipProvider(getTcpSipProvider());
            processor.setUdpSipProvider(getUdpSipProvider());
            processor.setHandler(handler);
            processor.setPublisher(publisher);
            processor.setSipConfig(sipConfig);
            processor.setVideoManagerStorager(storager);
            return processor;
        } else if (Request.SUBSCRIBE.equals(method)) {
            SubscribeRequestProcessor processor = new SubscribeRequestProcessor();
            processor.setRequestEvent(evt);
            return processor;
        } else if (Request.ACK.equals(method)) {
            AckRequestProcessor processor = new AckRequestProcessor();
            processor.setRequestEvent(evt);
            return processor;
        } else if (Request.BYE.equals(method)) {
            ByeRequestProcessor processor = new ByeRequestProcessor();
            processor.setRequestEvent(evt);
            return processor;
        } else if (Request.CANCEL.equals(method)) {
            CancelRequestProcessor processor = new CancelRequestProcessor();
            processor.setRequestEvent(evt);
            return processor;
        } else if (Request.MESSAGE.equals(method)) {
 
            MessageRequestProcessor processor = new MessageRequestProcessor();
            processor.setRequestEvent(evt);
            processor.setTcpSipProvider(getTcpSipProvider());
            processor.setUdpSipProvider(getUdpSipProvider());
            processor.setPublisher(publisher);
            processor.setRedis(redis);
            processor.setDeferredResultHolder(deferredResultHolder);
            processor.setOffLineDetector(offLineDetector);
            processor.setCmder(cmder);
            processor.setStorager(storager);
            processor.setRedisCatchStorage(redisCatchStorage);
            return processor;
        } else {
            return new OtherRequestProcessor();
        }
    }
    
    public ISIPResponseProcessor createResponseProcessor(ResponseEvent evt) {
 
        Response response = evt.getResponse();
        CSeqHeader cseqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
        String method = cseqHeader.getMethod();
        if(Request.INVITE.equals(method)){
            return inviteResponseProcessor;
        } else if (Request.BYE.equals(method)) {
            return byeResponseProcessor;
        } else if (Request.CANCEL.equals(method)) {
            return cancelResponseProcessor;
        }else if (Request.REGISTER.equals(method)) {
            return registerResponseProcessor;
        } else {
            return otherResponseProcessor;
        }
    }
    
    private SipProvider getTcpSipProvider() {
        if (tcpSipProvider == null) {
            tcpSipProvider = (SipProvider) SpringBeanFactory.getBean("tcpSipProvider");
        }
        return tcpSipProvider;
    }
    
    private SipProvider getUdpSipProvider() {
        if (udpSipProvider == null) {
            udpSipProvider = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
        }
        return udpSipProvider;
    }
    
}