Commit a71b83de authored by 高东东's avatar 高东东

提交代码

parent 8d3d4d6f
...@@ -9,4 +9,33 @@ ...@@ -9,4 +9,33 @@
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>amos-boot-module-avic-api</artifactId> <artifactId>amos-boot-module-avic-api</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<scope>system</scope>
<systemPath>${basedir}/lib/commons-io-2.4.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.5.2</version>
<scope>system</scope>
<systemPath>${basedir}/lib/mailapi-1.5.2.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>smtp</artifactId>
<version>1.5.2</version>
<scope>system</scope>
<systemPath>${basedir}/lib/smtp-1.5.2.jar</systemPath>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.yeejoin.amos.avic.face.model;
import lombok.Data;
/**
* <p>
*
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Data
public class AvicEMailModel {
private String template;
private String id;
private long enabled;
}
package com.yeejoin.amos.avic.face.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Data
@TableName("idx_biz_send_recode")
public class AvicSenderRecordModel {
@TableField("id")
private String id;
@TableField("attachment")
private String attachment;
}
package com.yeejoin.amos.avic.face.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
@Data
@Component
@ConfigurationProperties(prefix = "avic.email")
public class EMailModel {
String host;
int port;
String username;
String password;
boolean valipwd;
boolean enabledStarttls;
}
...@@ -13,5 +13,5 @@ public class TransferModel extends UploadFileModel{ ...@@ -13,5 +13,5 @@ public class TransferModel extends UploadFileModel{
private String result; private String result;
private String comment; private String comment;
private Boolean autoConfirm; private Boolean autoConfirm = false;
} }
package com.yeejoin.amos.avic.face.orm.dao;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.avic.face.orm.entity.AvicCustomPath;
import com.yeejoin.amos.avic.face.orm.entity.AvicEMail;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Mapper
public interface AvicEMailMapper extends BaseMapper<AvicEMail> {
}
\ No newline at end of file
package com.yeejoin.amos.avic.face.orm.dao;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.avic.face.orm.entity.AvicSenderRecord;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Mapper
public interface AvicSendRecodelMapper extends BaseMapper<AvicSenderRecord> {
}
\ No newline at end of file
package com.yeejoin.amos.avic.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Data
@TableName("idx_biz_email")
public class AvicEMail {
@TableField("TEMPLATE")
private String template;
@TableField("id")
private String id;
@TableField("ENABLED")
private long enabled;
}
package com.yeejoin.amos.avic.face.orm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author 子杨
* @since 2022-03-28
*/
@Data
@TableName("idx_biz_send_recode")
public class AvicSenderRecord {
@TableField("id")
private String id;
@TableField("attachment")
private String attachment;
}
package com.yeejoin.amos.avic.face.service;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import com.yeejoin.amos.avic.face.model.AvicSenderRecordModel;
import com.yeejoin.amos.avic.face.orm.dao.AvicSendRecodelMapper;
import com.yeejoin.amos.avic.face.orm.entity.AvicSenderRecord;
@Component
public class EMailSenderRecodeService extends BaseService<AvicSenderRecordModel,AvicSenderRecord, AvicSendRecodelMapper>{
}
package com.yeejoin.amos.avic.face.service;
import java.io.File;
import java.io.FileOutputStream;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.UUID;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import com.sun.mail.util.MailSSLSocketFactory;
import com.yeejoin.amos.avic.face.model.AvicEMailModel;
import com.yeejoin.amos.avic.face.model.EMailModel;
import com.yeejoin.amos.avic.face.orm.dao.AvicEMailMapper;
import com.yeejoin.amos.avic.face.orm.entity.AvicEMail;
@Component
public class EMailSenderService extends BaseService<AvicEMailModel,AvicEMail, AvicEMailMapper>{
private Transport transport;
@Autowired
private EMailModel eMailModel;
public EMailSenderService() throws Exception {
init(eMailModel.getHost(), eMailModel.getPort(), eMailModel.getUsername(), eMailModel.getPassword(), eMailModel.isValipwd(), eMailModel.isEnabledStarttls());
}
public void init(String host, int port, final String username, final String password, boolean valipwd , boolean enabledStarttls) throws Exception {
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
if (enabledStarttls) {
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e) {
throw e;
}
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.socketFactory", sf);
props.put("mail.smtp.starttls.enable", "true");
}
if (valipwd) {
props.put("mail.smtp.auth", true);
} else {
props.put("mail.smtp.auth", false);
}
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
URLName urlName = new URLName("smtp",host,port,null,null,null);
this.transport = session.getTransport(urlName);
}
private void doSend(MimeMessage mimeMessage, Address[] addresses) throws MessagingException {
transport.connect();
transport.sendMessage(mimeMessage, addresses);
transport.close();
}
public void send(String avicCode, String targetAddress, String text, String file) throws Exception {
MimeMessage mimeMessage = new MimeMessage(Session.getInstance(new Properties()));
mimeMessage.setFrom(new InternetAddress(targetAddress));
mimeMessage.setRecipients(Message.RecipientType.TO, new Address[]{
new InternetAddress(targetAddress, avicCode)
});
mimeMessage.setSubject(11111111 + UUID.randomUUID().toString());
mimeMessage.setSentDate(new Date());
mimeMessage.setHeader("X-Mailer", "LOTONtechEmail");
mimeMessage.setHeader("usercode_header", "xUnMI9FGtWvuFYjHZAlWdmjh58sWfyZOOJNa+HwaJfELrqMvJg3iuIjRAhpuccf5");
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(text);
Multipart mp = new MimeMultipart();
mimeMessage.setContent(mp);
mimeMessage.writeTo(new FileOutputStream(new File("D:\\temp.eml")));
for (int i = 0; i < 1; i++) {
doSend(mimeMessage, new Address[]{
new InternetAddress("ccc<user4@test.com>"),
});
}
}
public String getEmailTemplate() {
List<AvicEMailModel> list = this.queryForList(null, false);
for (AvicEMailModel model : list) {
if (model.getEnabled() == 1) {
return model.getTemplate();
}
}
return "";
}
}
package com.yeejoin.amos.avic.face.utils;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class StringUtils {
public static String format(String content, HashMap<String, Object> variables) {
StringTemplateLoader stringLoader = new StringTemplateLoader();
Configuration cfg = new Configuration();
cfg.setTemplateLoader(stringLoader);
String template = "content";
stringLoader.putTemplate(template, content);
try {
Template templateCon = cfg.getTemplate(template);
StringWriter writer = new StringWriter();
templateCon.process(variables, writer);
return writer.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return null;
}
}
...@@ -86,8 +86,7 @@ public class WebServicesFileFransferResource { ...@@ -86,8 +86,7 @@ public class WebServicesFileFransferResource {
long connectionTimeout; long connectionTimeout;
@Value(value = "${avic.time.receive.timeout}") @Value(value = "${avic.time.receive.timeout}")
long receiveTimeout; long receiveTimeout;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false) @TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
...@@ -142,7 +141,7 @@ public class WebServicesFileFransferResource { ...@@ -142,7 +141,7 @@ public class WebServicesFileFransferResource {
} }
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf(".")); String suffixName = fileName.substring(fileName.lastIndexOf("."));
String name = fileName.substring(0, fileName.lastIndexOf(".") -1); String name = fileName.substring(0, fileName.lastIndexOf("."));
String filePath = tempDir; String filePath = tempDir;
fileName = name + "-" + sdf.format(new Date()) + suffixName; fileName = name + "-" + sdf.format(new Date()) + suffixName;
File dest = new File(filePath + fileName); File dest = new File(filePath + fileName);
...@@ -186,6 +185,7 @@ public class WebServicesFileFransferResource { ...@@ -186,6 +185,7 @@ public class WebServicesFileFransferResource {
DataRecordRequest dataRecordRequest = new DataRecordRequest(); DataRecordRequest dataRecordRequest = new DataRecordRequest();
dataRecordRequest.put("avicCode", transferModel.getAvicCode()); dataRecordRequest.put("avicCode", transferModel.getAvicCode());
dataRecordRequest.put("targetPath", transferModel.getPath()); dataRecordRequest.put("targetPath", transferModel.getPath());
System.out.println(JSONArray.toJSON(transferModel.getFiles()).toString());
dataRecordRequest.put("files", JSONArray.toJSON(transferModel.getFiles()).toString()); dataRecordRequest.put("files", JSONArray.toJSON(transferModel.getFiles()).toString());
list.add(dataRecordRequest); list.add(dataRecordRequest);
Map<String, Object> bizTable = indicatorsManager.indicatorClient Map<String, Object> bizTable = indicatorsManager.indicatorClient
...@@ -205,15 +205,15 @@ public class WebServicesFileFransferResource { ...@@ -205,15 +205,15 @@ public class WebServicesFileFransferResource {
return ResponseHelper.buildResponse(null); return ResponseHelper.buildResponse(null);
} }
class MyTimerTask extends TimerTask { class MyTimerTask extends TimerTask {
TransferModel transferModel; TransferModel transferModel;
MyTimerTask(TransferModel transferModel) { MyTimerTask(TransferModel transferModel) {
this.transferModel = transferModel; this.transferModel = transferModel;
} }
@Override @Override
public void run() { public void run() {
RequestContext.setToken(amosAuth.getToken()); RequestContext.setToken(amosAuth.getToken());
...@@ -221,13 +221,18 @@ public class WebServicesFileFransferResource { ...@@ -221,13 +221,18 @@ public class WebServicesFileFransferResource {
RequestContext.setAppKey(amosAuth.getAppKey()); RequestContext.setAppKey(amosAuth.getAppKey());
postfile(transferModel); postfile(transferModel);
} }
} }
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "传输") @ApiOperation(value = "传输")
@RequestMapping(value = "/confirm", method = RequestMethod.POST) @RequestMapping(value = "/confirm", method = RequestMethod.POST)
public ResponseModel postfile(@RequestBody TransferModel transferModel) { public ResponseModel postfile(@RequestBody TransferModel transferModel) {
auth(transferModel);
return ResponseHelper.buildResponse(null);
}
private void auth(TransferModel transferModel) {
Map<String, Object> task = indicatorsManager.indicatorClient.getTaskByTaskId(transferModel.getTaskId()) Map<String, Object> task = indicatorsManager.indicatorClient.getTaskByTaskId(transferModel.getTaskId())
.getResult(); .getResult();
syncSendFile(task, transferModel); syncSendFile(task, transferModel);
...@@ -237,41 +242,49 @@ public class WebServicesFileFransferResource { ...@@ -237,41 +242,49 @@ public class WebServicesFileFransferResource {
dataReportAuditRequest.setRemark(transferModel.getComment()); dataReportAuditRequest.setRemark(transferModel.getComment());
dataReportAuditRequest.setCondition("0"); dataReportAuditRequest.setCondition("0");
indicatorsManager.indicatorClient.auditWorkFlow(dataReportAuditRequest); indicatorsManager.indicatorClient.auditWorkFlow(dataReportAuditRequest);
return ResponseHelper.buildResponse(null);
} }
@Async private void syncSendFile(Map<String, Object> task1, TransferModel transferModel1) {
private void syncSendFile(Map<String, Object> task, TransferModel transferModel) {
AvicCustomPath avicCustomPath = simpleService.getById(transferModel.getPath()); Thread thread = new Thread(new Runnable() {
try { Map<String, Object> task = task1;
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); TransferModel transferModel = transferModel1;
Client client = dcf.createClient(webserviceUrl); @Override
HTTPConduit conduit = (HTTPConduit) client.getConduit(); public void run() {
HTTPClientPolicy policy = new HTTPClientPolicy(); AvicCustomPath avicCustomPath = simpleService.getById(transferModel.getPath());
policy.setConnectionTimeout(connectionTimeout); // 连接超时时间 try {
policy.setReceiveTimeout(receiveTimeout);// 请求超时时间. JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
conduit.setClient(policy); Client client = dcf.createClient(webserviceUrl);
if (ObjectUtils.isEmpty(transferModel.getAvicCode())) { HTTPConduit conduit = (HTTPConduit) client.getConduit();
for (String file : transferModel.getFiles().stream().map(m -> m.getUrl()) HTTPClientPolicy policy = new HTTPClientPolicy();
.collect(Collectors.toList())) { policy.setConnectionTimeout(connectionTimeout); // 连接超时时间
String filePath = tempDir; policy.setReceiveTimeout(receiveTimeout);// 请求超时时间.
File dest = new File(filePath + file); conduit.setClient(policy);
DataHandler handler = new DataHandler(new FileDataSource(dest)); if (ObjectUtils.isEmpty(transferModel.getAvicCode())) {
client.invoke("transferFile", handler, dest.getName(), avicCustomPath.getPath()); for (String file : transferModel.getFiles().stream().map(m -> m.getUrl())
} .collect(Collectors.toList())) {
} else { String filePath = tempDir;
for (String file : transferModel.getFiles().stream().map(m -> m.getUrl()) File dest = new File(filePath + file);
.collect(Collectors.toList())) { DataHandler handler = new DataHandler(new FileDataSource(dest));
String filePath = tempDir; client.invoke("transferFile", handler, dest.getName(), avicCustomPath.getPath());
File dest = new File(filePath + file); }
DataHandler handler = new DataHandler(new FileDataSource(dest)); } else {
client.invoke("useCodetransferFile", handler, dest.getName(), avicCustomPath.getPath(), for (String file : transferModel.getFiles().stream().map(m -> m.getUrl())
transferModel.getAvicCode()); .collect(Collectors.toList())) {
String filePath = tempDir;
File dest = new File(filePath + file);
DataHandler handler = new DataHandler(new FileDataSource(dest));
client.invoke("useCodetransferFile", handler, dest.getName(), avicCustomPath.getPath(),
transferModel.getAvicCode());
}
}
} catch (java.lang.Exception e) {
e.printStackTrace();
} }
} }
} catch (java.lang.Exception e) { });
e.printStackTrace(); thread.start();
}
} }
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
......
...@@ -7,6 +7,8 @@ import java.io.InputStream; ...@@ -7,6 +7,8 @@ import java.io.InputStream;
import javax.activation.DataHandler; import javax.activation.DataHandler;
import javax.jws.WebService; import javax.jws.WebService;
import javax.mail.Multipart;
import javax.mail.internet.MimeMultipart;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -15,6 +17,8 @@ import org.springframework.util.ObjectUtils; ...@@ -15,6 +17,8 @@ import org.springframework.util.ObjectUtils;
import com.yeejoin.amos.avic.face.model.AvicCustomPathModel; import com.yeejoin.amos.avic.face.model.AvicCustomPathModel;
import com.yeejoin.amos.avic.face.service.AvicCustomPathService; import com.yeejoin.amos.avic.face.service.AvicCustomPathService;
import com.yeejoin.amos.avic.face.service.EMailSenderRecodeService;
import com.yeejoin.amos.avic.face.service.EMailSenderService;
import com.yeejoin.amos.avic.face.webservice.FileFransferService; import com.yeejoin.amos.avic.face.webservice.FileFransferService;
@WebService(serviceName = "FileFransferService", @WebService(serviceName = "FileFransferService",
...@@ -28,11 +32,16 @@ public class FileFransferServiceImpl implements FileFransferService { ...@@ -28,11 +32,16 @@ public class FileFransferServiceImpl implements FileFransferService {
@Value("${avic.file.store.path}") @Value("${avic.file.store.path}")
String baseDir; String baseDir;
@Autowired
EMailSenderService eMailSenderService;
@Autowired
EMailSenderRecodeService eMailSenderRecodeService;
@Override @Override
public void useCodetransferFile(DataHandler handler, String fileName, String path, String code) { public void useCodetransferFile(DataHandler handler, String fileName, String path, String code) {
saveFile(handler, fileName, path); saveFile(handler, fileName, path);
sendEmail(code, fileName); sendEmail(code, path, fileName);
} }
private void saveFile(DataHandler handler, String fileName, String path) { private void saveFile(DataHandler handler, String fileName, String path) {
...@@ -73,8 +82,11 @@ public class FileFransferServiceImpl implements FileFransferService { ...@@ -73,8 +82,11 @@ public class FileFransferServiceImpl implements FileFransferService {
} }
} }
private void sendEmail(String userCode, String fileName) { private void sendEmail(String userCode, String path, String fileName) {
String template = eMailSenderService.getEmailTemplate();
File file = new File(String.format("%s%s%s%s", baseDir,path.replace(":", ""), File.separator, fileName));
Multipart mp = new MimeMultipart();
eMailSenderService.send(userCode, userCode, template, mp);
} }
@Override @Override
......
package com.yeejoin.amos; package com.yeejoin.amos;
import com.yeejoin.amos.boot.biz.common.utils.oConvertUtils; import java.net.InetAddress;
import java.net.UnknownHostException;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -17,10 +18,7 @@ import org.springframework.scheduling.annotation.EnableAsync; ...@@ -17,10 +18,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.typroject.tyboot.core.restful.exception.GlobalExceptionHandler; import org.typroject.tyboot.core.restful.exception.GlobalExceptionHandler;
import java.net.InetAddress; import com.yeejoin.amos.boot.biz.common.utils.oConvertUtils;
import java.net.UnknownHostException;
import javax.xml.ws.WebServiceProvider;
/** /**
* <pre> * <pre>
......
...@@ -15,4 +15,17 @@ upload.temp.dir=E:\\ftp\\ ...@@ -15,4 +15,17 @@ upload.temp.dir=E:\\ftp\\
avic.file.store.path=E:\\webservice avic.file.store.path=E:\\webservice
avic.webservice.path=http://localhost:8808/avic/services/fileFransfer?wsdl avic.webservice.path=http://localhost:8808/avic/services/fileFransfer?wsdl
avic.time.connection.timeout=100000 avic.time.connection.timeout=100000
avic.time.receive.timeout=100000 avic.time.receive.timeout=100000
\ No newline at end of file
amos.auth.user-name=avic_test
amos.auth.password=a1234560
amos.auth.app-key=AMOS_STUDIO
amos.auth.product=AMOS_STUDIO_WEB
avic.email.host=
avic.email.port=
avic.email.username=
avic.email.password=
avic.email.valipwd=
avic.email.enabledStarttls=
\ No newline at end of file
spring.application.name=AMOS-BIZ-AVIC-API-TARGET spring.application.name=AMOS-BIZ-AVIC-API-TARGET
server.servlet.context-path=/avic server.servlet.context-path=/avic
server.port=8808 server.port=8808
server.uri-encoding=UTF-8
spring.profiles.active=dev spring.profiles.active=dev
spring.jackson.time-zone=GMT+8 spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
...@@ -43,4 +44,7 @@ redis.cache.failure.time=10800 ...@@ -43,4 +44,7 @@ redis.cache.failure.time=10800
spring.servlet.multipart.maxFileSize=100MB spring.servlet.multipart.maxFileSize=100MB
spring.servlet.multipart.maxRequestSize=100MB spring.servlet.multipart.maxRequestSize=100MB
spring.main.allow-bean-definition-overriding=true spring.main.allow-bean-definition-overriding=true
\ No newline at end of file spring.http.encoding.charset=utf-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment