Blame view

src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java 6.93 KB
6228a7a5   岑健浩   SNManage commit
1
  package com.ectrip.demo.service.impl;
9f87bede   岑健浩   SNManage init
2
3
  
  import cn.hutool.core.codec.Base64;
6228a7a5   岑健浩   SNManage commit
4
5
6
7
  import com.ectrip.demo.dto.DeleteSNsDTO;
  import com.ectrip.demo.service.SNService;
  import com.ectrip.demo.dto.AddSNsDTO;
  import com.ectrip.demo.exception.SNRepetitiveException;
03d2bc11   岑健浩   SNManage commit
8
9
  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.Logger;
9f87bede   岑健浩   SNManage init
10
11
12
13
14
15
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.stereotype.Service;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.*;
6228a7a5   岑健浩   SNManage commit
16
17
18
  import java.nio.charset.StandardCharsets;
  import java.nio.file.Files;
  import java.nio.file.Paths;
03d2bc11   岑健浩   SNManage commit
19
20
  import java.text.SimpleDateFormat;
  import java.util.Date;
9f87bede   岑健浩   SNManage init
21
22
23
24
25
26
27
28
29
30
31
32
  import java.util.HashSet;
  import java.util.Set;
  import java.util.concurrent.locks.Lock;
  import java.util.concurrent.locks.ReentrantLock;
  
  @Service
  public class SNServiceImpl implements SNService {
      /**
       *  多线程改写文件存在并发问题,需加锁操作
       */
      private static final Lock lock = new ReentrantLock();
  
03d2bc11   岑健浩   SNManage commit
33
34
      static Logger logger = LogManager.getLogger(SNServiceImpl.class);
  
9f87bede   岑健浩   SNManage init
35
36
37
38
39
40
41
      @Value("${SN.file.path}")
      String SNFilePath;
  
      @Value("${SN.file.temp.path}")
      String SNTempFilePath;
  
      @Override
03d2bc11   岑健浩   SNManage commit
42
43
      public void addSN(AddSNsDTO addSNsDTO) throws SNRepetitiveException, IOException {
  
9f87bede   岑健浩   SNManage init
44
45
46
47
          //加try,catch只为释放锁
          try {
              //加锁
              lock.lock();
03d2bc11   岑健浩   SNManage commit
48
49
50
51
              logger.info("-----------------------------开始添加SNs-----------------------------");
              StringBuilder SNs = new StringBuilder();
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              String currTime = sdf.format(new Date());
9f87bede   岑健浩   SNManage init
52
53
              //读取文件,判断SN是否重复
              Set<String> set = new HashSet<>();
6228a7a5   岑健浩   SNManage commit
54
55
              Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(SNFilePath)),StandardCharsets.UTF_8);
              BufferedReader bufferedReader = new BufferedReader(reader);
9f87bede   岑健浩   SNManage init
56
57
58
              String br;
              while ((br=bufferedReader.readLine()) != null) {
                  //截取SN
6228a7a5   岑健浩   SNManage commit
59
                  int index = br.indexOf("##");
9f87bede   岑健浩   SNManage init
60
61
62
                  String SN = br.substring(0,index == -1? 0 : index);
                  set.add(SN);
              }
03d2bc11   岑健浩   SNManage commit
63
64
65
66
67
68
              for (String SN : addSNsDTO.getSns()) {
                  if (set.contains(SN)) {
                      throw new SNRepetitiveException("SN:" + SN + " 已存在,请勿重复添加");
                  }
                  SNs.append(SN).append("##").append(addSNsDTO.getProjectName()).append("##").append(currTime);
                  SNs.append(System.lineSeparator());
9f87bede   岑健浩   SNManage init
69
70
              }
  
03d2bc11   岑健浩   SNManage commit
71
  
9f87bede   岑健浩   SNManage init
72
              //写入
6228a7a5   岑健浩   SNManage commit
73
74
75
76
77
              FileOutputStream fileOutputStream = new FileOutputStream(SNFilePath,true);
              fileOutputStream.write(SNs.toString().getBytes(StandardCharsets.UTF_8));
              fileOutputStream.flush();
              fileOutputStream.close();
              logger.info("成功写入SNs:{}",SNs);
9f87bede   岑健浩   SNManage init
78
79
80
81
82
83
84
          } finally { //释放锁
              lock.unlock();
          }
      }
  
      @Override
      public String getEncryptSNs() throws IOException {
9f87bede   岑健浩   SNManage init
85
          //读取文件
6228a7a5   岑健浩   SNManage commit
86
87
88
89
90
91
92
93
          Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(SNFilePath)),StandardCharsets.UTF_8);
          char[] chars = new char[1000];
          StringBuilder builder = new StringBuilder();
          int len = reader.read(chars);
          while (len != -1) {
              builder.append(chars,0,len);
              len = reader.read(chars);
          }
9f87bede   岑健浩   SNManage init
94
  
6228a7a5   岑健浩   SNManage commit
95
96
          //加密
          return Base64.encode(builder.toString());
9f87bede   岑健浩   SNManage init
97
98
99
      }
  
      @Override
03d2bc11   岑健浩   SNManage commit
100
      public void deleteSN(DeleteSNsDTO deleteSNsDTO) throws Exception{
9f87bede   岑健浩   SNManage init
101
102
          try {
              lock.lock();
03d2bc11   岑健浩   SNManage commit
103
104
105
              logger.info("-----------------------------开始删除SNs-----------------------------");
  
              HashSet<String> deleteSNsSet = new HashSet<>(deleteSNsDTO.getSns());
9f87bede   岑健浩   SNManage init
106
107
  
              //读取文件,记录不用删除的数据
6228a7a5   岑健浩   SNManage commit
108
109
              Reader reader = new InputStreamReader(Files.newInputStream(new File(SNFilePath).toPath()), StandardCharsets.UTF_8);
              BufferedReader bufferedReader = new BufferedReader(reader);
9f87bede   岑健浩   SNManage init
110
111
              String br;
              StringBuilder stringBuilder = new StringBuilder();
03d2bc11   岑健浩   SNManage commit
112
113
              StringBuilder existSNs = new StringBuilder();
              //所要删除的SN是否存在
9f87bede   岑健浩   SNManage init
114
115
116
              boolean SNExist = false;
              while ((br=bufferedReader.readLine()) != null) {
                  //截取SN
6228a7a5   岑健浩   SNManage commit
117
                  int index = br.indexOf("##");
9f87bede   岑健浩   SNManage init
118
                  String str = br.substring(0,index == -1? 0 : index);
03d2bc11   岑健浩   SNManage commit
119
                  if (!deleteSNsSet.contains(str)) {
9f87bede   岑健浩   SNManage init
120
121
122
                      stringBuilder.append(br);
                      stringBuilder.append(System.lineSeparator());
                  } else {
6228a7a5   岑健浩   SNManage commit
123
                      existSNs.append(br).append(System.lineSeparator());
9f87bede   岑健浩   SNManage init
124
125
126
127
128
                      SNExist = true;
                  }
              }
              bufferedReader.close();
  
6228a7a5   岑健浩   SNManage commit
129
              //如果存在要删除的SN,先将数据备份,再将留存数据覆盖掉原SN文件。
9f87bede   岑健浩   SNManage init
130
131
              if (SNExist) {
                  //备份数据
6228a7a5   岑健浩   SNManage commit
132
133
134
135
                  FileOutputStream tempFileOutputStream = new FileOutputStream(SNTempFilePath);
                  tempFileOutputStream.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
                  tempFileOutputStream.flush();
                  tempFileOutputStream.close();
9f87bede   岑健浩   SNManage init
136
                  //覆盖掉原来的数据到SN文件中
6228a7a5   岑健浩   SNManage commit
137
138
139
140
141
                  FileOutputStream fileOutputStream = new FileOutputStream(SNFilePath);
                  fileOutputStream.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
                  fileOutputStream.flush();
                  fileOutputStream.close();
                  logger.warn("成功删除SNs:{}",existSNs);
9f87bede   岑健浩   SNManage init
142
              }
6228a7a5   岑健浩   SNManage commit
143
  
03d2bc11   岑健浩   SNManage commit
144
              logger.info("-----------------------------结束删除SNs-----------------------------");
9f87bede   岑健浩   SNManage init
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
  
  
          } finally {
              lock.unlock();
          }
      }
  
      @Override
      public void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
          File file = new File(SNFilePath);
  
          response.setCharacterEncoding("UTF-8");
          response.setHeader("Content-type","application/octet-stream;charset=UTF-8");
          response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(file.getName().trim(), "UTF-8"));
          response.addHeader("Pargam", "no-cache");
          response.addHeader("Cache-Control", "no-cache");
  
          //读取文件
          byte[] SNsByteArr = new byte[(int) file.length()];
          FileInputStream fileInputStream = new FileInputStream(file);
          fileInputStream.read(SNsByteArr);
          //加密
          String encodeSNs = Base64.encode(SNsByteArr);
  
          //写入到输出流
          response.addHeader("Content-Length",String.valueOf(encodeSNs.getBytes().length));
          OutputStream outputStream = response.getOutputStream();
          outputStream.write(encodeSNs.getBytes());
          outputStream.flush();
          outputStream.close();
  
      }
  
  }