소스 검색

dev multi aip

shjung 1 년 전
부모
커밋
e87d6cae7d

+ 1 - 0
conf/AipGatewayApi.pid

@@ -0,0 +1 @@
+8928

+ 52 - 10
src/main/java/com/aip/gateway/api/aip/AuthDelegateImpl.java

@@ -11,7 +11,9 @@ import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Collections;
@@ -63,6 +65,42 @@ public class AuthDelegateImpl implements IAuthDelegate {
         }
         else throw new Exception("지원하지 않는 AIP 인증 방법 입니다.");
     }
+    private ConfidentialClientApplication createClientApplication() {
+        String cacheKey = aipConfig.getClientId() + "_" + aipConfig.getTenantId() + "_AppTokenCache";
+        MemoryTokenCacheWithEviction memoryTokenCacheWithEviction = new MemoryTokenCacheWithEviction(cacheKey);
+
+        if (aipConfig.getLoginType() == AipConfig.authLoginPassword) {
+            IClientCredential credential = ClientCredentialFactory.createFromSecret(aipConfig.getSecretValue());
+            try {
+                confidentialApp = ConfidentialClientApplication
+                        .builder(aipConfig.getClientId(), credential)
+                        .authority(AUTHORITY + aipConfig.getTenantId())
+                        .setTokenCacheAccessAspect(memoryTokenCacheWithEviction)
+                        .build();
+            } catch (MalformedURLException e) {
+                return null;
+            }
+        }
+        else //if (aipConfig.getLoginType() == AipConfig.authLoginCert) {
+        {
+            try {
+                InputStream certStream = new ByteArrayInputStream(Files.readAllBytes(Paths.get(aipConfig.getCertThumbPrint())));
+                String password = "hanteinfo1234!";
+                confidentialApp = ConfidentialClientApplication
+                        .builder(aipConfig.getClientId(),
+                                ClientCredentialFactory.createFromCertificate(certStream, password))
+                        .authority(AUTHORITY +aipConfig.getTenantId())
+                        .setTokenCacheAccessAspect(memoryTokenCacheWithEviction)
+                        .build();
+            } catch (IOException e) {
+                return null;
+            } catch (Exception e) {
+                return null;
+            }
+        }
+        return confidentialApp;
+    }
+
     @Override
     public String acquireToken(Identity identity, String authority, String resource, String claim) {
         Set<String> scope;
@@ -72,6 +110,10 @@ public class AuthDelegateImpl implements IAuthDelegate {
         else {
             scope = Collections.singleton(resource + "/.default");
         }
+
+        ConfidentialClientApplication app;
+        app = createClientApplication();
+
         // authority                            scope
         // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
         // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
@@ -86,6 +128,7 @@ public class AuthDelegateImpl implements IAuthDelegate {
         try {
             SilentParameters silentParameters = SilentParameters.builder(scope).build();
             authenticationResult = confidentialApp.acquireTokenSilently(silentParameters).join();
+            //log.error("YYYYYYYYYYYYYYYYY: {}", confidentialApp.tokenCache().serialize());
         }
         catch (Exception ex) {
             if (ex.getCause() instanceof MsalException) {
@@ -135,15 +178,14 @@ public class AuthDelegateImpl implements IAuthDelegate {
         else {
             scope = Collections.singleton(resource + "/.default");
         }
-        // authority                            scope
-        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
-        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
-        // https://login.windows.net/common     https://syncservice.o365syncservice.com/.default
-        // https://login.windows.net/common     https://aadrm.com/.default
-        // https://login.windows.net/common     https://aadrm.com/.default
-        // https://login.windows.net/common     https://aadrm.com/.default
-        // Wed Jun 05 10:41:59 KST 2024
-        // https://login.windows.net/2e58414a-c6ae-43ff-aaf5-45ab8b78a404     https://aadrm.com/.default
+        // authority                                                            scope
+        // https://login.windows.net/common                                     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common                                     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common                                     https://syncservice.o365syncservice.com/.default
+        // https://login.windows.net/common                                     https://aadrm.com/.default
+        // https://login.windows.net/common                                     https://aadrm.com/.default
+        // https://login.windows.net/common                                     https://aadrm.com/.default
+        // https://login.windows.net/2e58414a-c6ae-43ff-aaf5-45ab8b78a404       https://aadrm.com/.default
 
         log.info("acquireToken: identity = {}, authority = {}, scope = {}", identity.getEmail(), authority, scope);
         try {
@@ -155,7 +197,7 @@ public class AuthDelegateImpl implements IAuthDelegate {
                 log.error("AcquireTokenByCertificate: expiresOnDate: {}", TimeUtils.dateToString2(authenticationResult.expiresOnDate()));
                 expiredDate = authenticationResult.expiresOnDate();
             }
-            if (!accessToken.equals(authenticationResult.accessToken())) {
+            if (!accessToken.equals("X") && !accessToken.equals(authenticationResult.accessToken())) {
                 log.error("AcquireTokenByCertificate:accessTokenOLD: = {}", accessToken);
                 log.error("AcquireTokenByCertificate:accessTokenNEW: = {}", authenticationResult.accessToken());
                 accessToken = authenticationResult.accessToken();

+ 5 - 2
src/main/java/com/aip/gateway/api/aip/ConsentDelegateImpl.java

@@ -2,11 +2,14 @@ package com.aip.gateway.api.aip;
 
 import com.microsoft.informationprotection.Consent;
 import com.microsoft.informationprotection.IConsentDelegate;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 public class ConsentDelegateImpl implements IConsentDelegate {
     @Override
     public Consent getUserConsent(String s) {
-        return Consent.ACCEPT_ALWAYS;
-        //return Consent.ACCEPT;
+        log.error("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX: {}", s);
+//        return Consent.ACCEPT_ALWAYS;
+        return Consent.ACCEPT;
     }
 }

+ 6 - 2
src/main/java/com/aip/gateway/api/aip/manager/AipFileManager.java

@@ -2,6 +2,7 @@ package com.aip.gateway.api.aip.manager;
 
 import com.aip.gateway.api.aip.AuthDelegateImpl;
 import com.aip.gateway.api.aip.model.*;
+import com.aip.gateway.api.aip.utils.AipFileUtils;
 import com.aip.gateway.api.aip.utils.Utilities;
 import com.microsoft.informationprotection.*;
 import com.microsoft.informationprotection.file.FileHandler;
@@ -25,7 +26,7 @@ public class AipFileManager extends  AipFileManagerBase {
         dispose(true);
     }
 
-    public boolean initialize() {
+    public boolean initialize(int idx) {
         try {
             _authDelegate = new AuthDelegateImpl(aipConfig);
         }
@@ -43,7 +44,10 @@ public class AipFileManager extends  AipFileManagerBase {
             return false;
         }
 
-        MipConfiguration mipConfiguration = new MipConfiguration(appInfo, aipConfig.getMipData(), LogLevel.INFO, false);
+        String path = aipConfig.getMipData() + "_" + idx;
+        AipFileUtils.deletePath(path);
+
+        MipConfiguration mipConfiguration = new MipConfiguration(appInfo, path, LogLevel.TRACE, false);
         _mipContext = MIP.createMipContext(mipConfiguration);
         return true;
     }

+ 25 - 8
src/main/java/com/aip/gateway/api/aip/manager/FileManager.java

@@ -5,6 +5,7 @@ import com.aip.gateway.api.aip.ConsentDelegateImpl;
 import com.aip.gateway.api.aip.model.*;
 import com.aip.gateway.api.aip.utils.Utilities;
 import com.aip.gateway.api.aip.utils.AipFileUtils;
+import com.aip.gateway.api.utils.Elapsed;
 import com.microsoft.informationprotection.*;
 import com.microsoft.informationprotection.file.*;
 import com.microsoft.informationprotection.internal.callback.FileHandlerObserver;
@@ -21,6 +22,7 @@ import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
+@SuppressWarnings("DeclareNewLocal")
 @Slf4j
 public class FileManager extends AbstractManager {
     private IFileProfile _profile = null;
@@ -148,6 +150,7 @@ public class FileManager extends AbstractManager {
         return getFileInfo(fileName, fileName);
     }
     public AipFileInfo getFileInfo(String fileName, String actualFileName) {
+        Elapsed elapsed = new Elapsed();
         IFileHandler handler = createFileHandler(fileName, actualFileName);
         if (handler == null) {
             return null;
@@ -156,6 +159,7 @@ public class FileManager extends AbstractManager {
         if (result != null) {
             result.setFileSize(getFileSize(fileName));
         }
+        log.info("getFileInfo(File): {}, {} ms.", fileName, elapsed.milliSeconds());
         return result;
     }
 
@@ -164,7 +168,7 @@ public class FileManager extends AbstractManager {
             log.error("FileManager.getFileInfo: FileHandler is null");
             return null;
         }
-
+        Elapsed elapsed = new Elapsed();
         AipFileInfo fileInfo = new AipFileInfo(0, "");
 
         fileInfo.setOutputFileName(handler.getOutputFileName());
@@ -218,6 +222,7 @@ public class FileManager extends AbstractManager {
                 fileInfo.getProtection().setProtectionDescriptor(descriptor);
             }
         }
+        log.info("getFileInfo(Handler): {}, {} ms.", fileInfo.getOutputFileName(), elapsed.milliSeconds());
         return fileInfo;
     }
 
@@ -271,6 +276,10 @@ public class FileManager extends AbstractManager {
         }
         return null;
     }
+
+    private String getNewActualFileName(IFileHandler handler, String actualFileName) {
+        return AipFileUtils.getDirectoryName(actualFileName) + File.separator + AipFileUtils.getFileNameWithoutExtension(actualFileName) + AipFileUtils.getExtension(handler.getOutputFileName());
+    }
     public SetFileInfo setLabel(String fileName, String actualFileName, String email, String labelId, String templateId, String comments) {
         IFileHandler handler = createFileHandler(fileName, actualFileName);
         return setLabel(handler, actualFileName, email, labelId, templateId, comments, getFileSize(fileName));
@@ -280,6 +289,7 @@ public class FileManager extends AbstractManager {
         return setLabel(handler, actualFileName, email, labelId, templateId, comments, fileStream.size());
     }
     private SetFileInfo setLabel(IFileHandler handler, String actualFileName, String email, String labelId, String templateId, String comments, long fileSize) {
+        Elapsed elapsed = new Elapsed();
         SetFileInfo result = new SetFileInfo();
         if (handler == null) {
             result.errorNo = 201;
@@ -300,7 +310,7 @@ public class FileManager extends AbstractManager {
         String ownerEmail = getOrgFileInfo(handler, email, result);
 
         ProtectionSettings protectionSettings = new ProtectionSettings();
-        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.Default);
+        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.PPrefix);
         if (!Objects.equals(ownerEmail, "")) {
             protectionSettings.setDelegatedUserEmail(ownerEmail);
         }
@@ -319,7 +329,9 @@ public class FileManager extends AbstractManager {
             setError(53, "FileManager::SetLabel Failed.", ex.getMessage());
             return result;
         }
+        log.info("setLabel1: {}, {} ms.", actualFileName, elapsed.milliSeconds());
 
+        actualFileName = getNewActualFileName(handler, actualFileName);
         boolean isCommitted = commitAsync(handler, actualFileName, result);
         if (isCommitted) {
             //handler.NotifyCommitSuccessful(fileName);
@@ -334,8 +346,8 @@ public class FileManager extends AbstractManager {
             result.errorMsg = "AIP File CommitAsync(setLabel) Failed.";
             setError(53, "FileManager::SetLabel Failed.", "Label Id: " + labelId + ", SetLabel Failed.");
         }
-
         getActionFileInfo(actualFileName, result);
+        log.info("setLabel2: {}, {} ms.", actualFileName, elapsed.milliSeconds());
         return result;
     }
 
@@ -362,7 +374,7 @@ public class FileManager extends AbstractManager {
         String ownerEmail = getOrgFileInfo(handler, email, result);
 
         ProtectionSettings protectionSettings = new ProtectionSettings();
-        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.Default);
+        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.PPrefix);
         if (!Objects.equals(ownerEmail, "")) {
             protectionSettings.setDelegatedUserEmail(ownerEmail);
         }
@@ -382,6 +394,7 @@ public class FileManager extends AbstractManager {
             return result;
         }
 
+        actualFileName = getNewActualFileName(handler, actualFileName);
         boolean isCommited = commitAsync(handler, actualFileName, result);
         if (isCommited) {
             //handler.NotifyCommitSuccessful(fileName);
@@ -422,7 +435,7 @@ public class FileManager extends AbstractManager {
         try {
             ProtectionDescriptor protectionDescriptor = new ProtectionDescriptor(templateId);
             ProtectionSettings protectionSettings = new ProtectionSettings();
-            protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.Default);
+            protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.PPrefix);
             if (!Objects.equals(ownerEmail, "")) {
                 protectionSettings.setDelegatedUserEmail(ownerEmail);
             }
@@ -435,6 +448,7 @@ public class FileManager extends AbstractManager {
             return result;
         }
 
+        actualFileName = getNewActualFileName(handler, actualFileName);
         boolean isCommited = commitAsync(handler, actualFileName, result);
         if (isCommited) {
             //handler.NotifyCommitSuccessful(fileName);
@@ -472,7 +486,7 @@ public class FileManager extends AbstractManager {
         String ownerEmail = getOrgFileInfo(handler, email, result);
 
         ProtectionSettings protectionSettings = new ProtectionSettings();
-        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.Default);
+        protectionSettings.setPFileExtensionBehavior(PFileExtensionBehavior.PPrefix);
         if (!Objects.equals(ownerEmail, "")) {
             protectionSettings.setDelegatedUserEmail(ownerEmail);
         }
@@ -499,6 +513,7 @@ public class FileManager extends AbstractManager {
             return result;
         }
 
+        actualFileName = getNewActualFileName(handler, actualFileName);
         boolean isCommited = commitAsync(handler, actualFileName, result);
         if (isCommited) {
             //handler.NotifyCommitSuccessful(fileName);
@@ -556,6 +571,7 @@ public class FileManager extends AbstractManager {
     }
 
     private boolean commitAsync(IFileHandler handler, String actualFileName, SetFileInfo result) {
+        Elapsed elapsed = new Elapsed();
         boolean isCommitted = false;
         if (handler.isModified()) {
             Future<Boolean> future = handler.commitAsync(actualFileName);
@@ -564,14 +580,15 @@ public class FileManager extends AbstractManager {
             } catch (InterruptedException e) {
                 result.errorNo = 301;
                 result.errorMsg = "AIP File CommitAsync InterruptedException Exception.";
-                setError(61, "FileManager::commitAsync Failed.", e.getMessage());
+                setError(61, "FileManager::commitAsync Failed: " + actualFileName, e.getMessage());
                 Thread.currentThread().interrupt();
             } catch (ExecutionException e) {
                 result.errorNo = 302;
                 result.errorMsg = "AIP File CommitAsync ExecutionException Exception.";
-                setError(62, "FileManager::commitAsync Failed.", e.getMessage());
+                setError(62, "FileManager::commitAsync Failed: " + actualFileName, e.getMessage());
             }
         }
+        log.info("commitAsync: {}, {} ms.", actualFileName, elapsed.milliSeconds());
         return isCommitted;
     }
 

+ 37 - 0
src/main/java/com/aip/gateway/api/aip/utils/AipFileUtils.java

@@ -24,6 +24,10 @@ public class AipFileUtils {
         return file.exists();
     }
 
+    public static String getDirectoryName(String fileName) {
+        return FilenameUtils.getPath(fileName);
+        //return name;
+    }
     public static String getFileName(String fileName) {
         return FilenameUtils.getName(fileName);
         //return name;
@@ -39,6 +43,39 @@ public class AipFileUtils {
         return "." + fileExt.toLowerCase();
     }
 
+    public static void deletePath(String directoryPath) {
+        File directory = new File(directoryPath);
+        if (directory.exists()) {
+            deleteFiles(directory); // 디렉토리 내 파일 삭제
+            deleteDirectory(directory); // 디렉토리 삭제
+        }
+    }
+    // 디렉토리 내 파일 삭제
+    private static void deleteFiles(File directory) {
+        File[] files = directory.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.isDirectory()) {
+                    deleteFiles(file); // 하위 디렉토리 내 파일 삭제
+                }
+                file.delete(); // 파일 삭제
+            }
+        }
+    }
+
+    // 디렉토리 삭제
+    private static void deleteDirectory(File directory) {
+        if (directory.isDirectory()) {
+            File[] files = directory.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    deleteDirectory(file); // 하위 디렉토리 삭제
+                }
+            }
+            directory.delete(); // 디렉토리 삭제
+        }
+    }
+
     public static boolean delete(String fileName) {
         File file = new File(fileName);
         if (file.exists()) {

+ 6 - 6
src/main/java/com/aip/gateway/api/controller/ApiFileController.java

@@ -198,18 +198,18 @@ public class ApiFileController extends  BaseController {
             @RequestParam("email") String email, HttpServletRequest request)
     {
         try {
-            RequestBase baseReq = RequestBase.builder()
+            RequestBase req = RequestBase.builder()
                     .apiKey(apiKey)
                     .decryptKey("")
                     .email(email)
                     .apiGuid("")
                     .build();
-            GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_ENCRYPT, apiKey, baseReq);
+            GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_ENCRYPT, apiKey, req);
             int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_FILE_ENCRYPT);
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(request, this.service.encryptFile(file, baseReq));
+            return responseSuccess(request, this.service.encryptFile(file, req));
         }
         catch (Exception e) {
             log.error("exception: {}/encrypt, {}", GlobalConstants.API_FILE, e.getMessage());
@@ -228,18 +228,18 @@ public class ApiFileController extends  BaseController {
             @RequestParam("email") String email, HttpServletRequest request)
     {
         try {
-            RequestBase baseReq = RequestBase.builder()
+            RequestBase req = RequestBase.builder()
                     .apiKey(apiKey)
                     .decryptKey("")
                     .email(email)
                     .apiGuid("")
                     .build();
-            GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DECRYPT, apiKey, baseReq);
+            GlobalConstants.setAuthorization(request, GlobalConstants.API_FILE_DECRYPT, apiKey, req);
             int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_FILE_DECRYPT);
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(request, this.service.decryptFile(file, baseReq));
+            return responseSuccess(request, this.service.decryptFile(file, req));
         }
         catch (Exception e) {
             log.error("exception: {}/decrypt, {}", GlobalConstants.API_FILE, e.getMessage());

+ 6 - 6
src/main/java/com/aip/gateway/api/controller/ApiStreamController.java

@@ -196,18 +196,18 @@ public class ApiStreamController extends  BaseController {
             @RequestParam("email") String email, HttpServletRequest request)
     {
         try {
-            RequestBase baseReq = RequestBase.builder()
+            RequestBase req = RequestBase.builder()
                     .apiKey(apiKey)
                     .decryptKey("")
                     .email(email)
                     .apiGuid("")
                     .build();
-            GlobalConstants.setAuthorization(request, GlobalConstants.API_STREAM_ENCRYPT, apiKey, baseReq);
+            GlobalConstants.setAuthorization(request, GlobalConstants.API_STREAM_ENCRYPT, apiKey, req);
             int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_STREAM_ENCRYPT);
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(request, this.service.encryptFile(file, baseReq));
+            return responseSuccess(request, this.service.encryptFile(file, req));
         }
         catch (Exception e) {
             log.error("exception: {}/encrypt, {}", GlobalConstants.API_STREAM, e.getMessage());
@@ -226,18 +226,18 @@ public class ApiStreamController extends  BaseController {
             @RequestParam("email") String email, HttpServletRequest request)
     {
         try {
-            RequestBase baseReq = RequestBase.builder()
+            RequestBase req = RequestBase.builder()
                     .apiKey(apiKey)
                     .decryptKey("")
                     .email(email)
                     .apiGuid("")
                     .build();
-            GlobalConstants.setAuthorization(request, GlobalConstants.API_STREAM_DECRYPT, apiKey, baseReq);
+            GlobalConstants.setAuthorization(request, GlobalConstants.API_STREAM_DECRYPT, apiKey, req);
             int authError = this.appRepo.checkApiKeyValidation(apiKey, getRemoteIP(request), GlobalConstants.API_STREAM_DECRYPT);
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(request, this.service.decryptFile(file, baseReq));
+            return responseSuccess(request, this.service.decryptFile(file, req));
         }
         catch (Exception e) {
             log.error("exception: {}/decrypt, {}", GlobalConstants.API_STREAM, e.getMessage());

+ 3 - 1
src/main/java/com/aip/gateway/api/interceptor/AipApiControllerInterceptor.java

@@ -69,6 +69,7 @@ public class AipApiControllerInterceptor implements HandlerInterceptor {
             errorMessage = GlobalConstants.getAttributeStr(request, GlobalConstants.API_RESULT_MESSAGE);
         }
 
+        int jobTimeMilliseconds = (int)(endTime - startTime);
         String apiGuid = GlobalConstants.getApiGuid(request);
         String apiKey = GlobalConstants.getApiKey(request);
         TbAipCallLog callLog = TbAipCallLog.builder()
@@ -80,7 +81,7 @@ public class AipApiControllerInterceptor implements HandlerInterceptor {
                 .responseStatusCode(responseStatusCode)
                 .errorCode(errorCode)
                 .errorMessage(errorMessage)
-                .responseTime((int)(endTime - startTime))
+                .responseTime(jobTimeMilliseconds)
                 .build();
         dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_API_CALL_LOG, false, callLog));
 
@@ -95,6 +96,7 @@ public class AipApiControllerInterceptor implements HandlerInterceptor {
                     fileJobLog.setDecryptKey(GlobalConstants.getAttributeStr(request, GlobalConstants.API_DECRYPT_KEY));
                     fileJobLog.setJobOwner(GlobalConstants.getAttributeStr(request, GlobalConstants.API_JOB_OWNER));
 
+                    fileJobLog.setJobTime(jobTimeMilliseconds);
                     fileJobLog.setJobResult(res.getErrorCode());
                     fileJobLog.setJobMessage(res.getErrorMessage());
 

+ 36 - 1
src/main/java/com/aip/gateway/api/repository/AipFileRepository.java

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Component;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.LinkedBlockingQueue;
 
 @Slf4j
 @Getter
@@ -26,11 +27,28 @@ public class AipFileRepository {
     private final AppRepository repo;
     private final BaseDbMapper mapper;
     private AipFileManager manager;
+    private final LinkedBlockingQueue<AipFileManager> fileManagerQueue = new LinkedBlockingQueue<>(1000);
 
     public boolean initialize() {
+        for (int ii = 0; ii < 2; ii++) {
+            AipFileManager fileManger = new AipFileManager(this.repo.getSettings().getConfig());
+            if (!fileManger.initialize(ii+1)) {
+                log.error("AipFileManager.initialize Failed, {}, {}", fileManger.getLastErrNo(), fileManger.getLastErrMsg());
+                continue;
+            }
+            if (!fileManger.createProfile()) {
+                log.error("AipFileManager.createProfile Failed, {}, {}", fileManger.getLastErrNo(), fileManger.getLastErrMsg());
+                continue;
+            }
+            if (!fileManger.createEngine()) {
+                log.error("AipFileManager.createEngine Failed, {}, {}", fileManger.getLastErrNo(), fileManger.getLastErrMsg());
+                continue;
+            }
+            this.fileManagerQueue.offer(fileManger);
+        }
         log.info("AipFileManager Initialize And Create: Start.");
         this.manager = new AipFileManager(this.repo.getSettings().getConfig());
-        if (!this.manager.initialize()) {
+        if (!this.manager.initialize(0)) {
             log.error("AipFileManager.initialize Failed, {}, {}", this.manager.getLastErrNo(), this.manager.getLastErrMsg());
             return false;
         }
@@ -48,6 +66,23 @@ public class AipFileRepository {
         return true;
     }
 
+    public AipFileManager attachManager() {
+        AipFileManager mngr = null;
+        try {
+            mngr = this.fileManagerQueue.take();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.error("AipFileRepository.getManager: Exception {}", e.getMessage());
+            return this.manager;
+        }
+        return mngr;
+    }
+    public void releaseManager(AipFileManager fileManager) {
+        if (fileManager != null) {
+            this.fileManagerQueue.offer(fileManager);
+        }
+    }
+
     private int downloadAipLabel() {
         List<AipLabel> labels = this.manager.getSensitivityLabels();
         if (labels == null) {

+ 13 - 13
src/main/java/com/aip/gateway/api/service/impl/AbstractAipService.java

@@ -65,19 +65,19 @@ abstract class AbstractAipService {
             }
         }
         String newFileExt = null;
-        if (aipJobType == 1){
-            newFileExt = getSetLabelFileExt(reqFileName);
-        }
-        else if (aipJobType == 2) {
-            newFileExt = getDeleteLabelFileExt(reqFileName);
-        }
-        else if (aipJobType == 3) {
-            newFileExt = getSetProtectFileExt(reqFileName);
-        }
-        else if (aipJobType == 4) {
-            newFileExt = getDeleteProtectFileExt(reqFileName);
-        }
-
+//        if (aipJobType == 1){
+//            newFileExt = getSetLabelFileExt(reqFileName);
+//        }
+//        else if (aipJobType == 2) {
+//            newFileExt = getDeleteLabelFileExt(reqFileName);
+//        }
+//        else if (aipJobType == 3) {
+//            newFileExt = getSetProtectFileExt(reqFileName);
+//        }
+//        else if (aipJobType == 4) {
+//            newFileExt = getDeleteProtectFileExt(reqFileName);
+//        }
+        newFileExt = getSupportedFileExt(reqFileName);
         if (newFileExt == null) {
             return new CheckAip(102, "지원하지 않는 파일형식 입니다.", dispFileName);
         }

+ 54 - 12
src/main/java/com/aip/gateway/api/service/impl/ApiFileService.java

@@ -1,5 +1,6 @@
 package com.aip.gateway.api.service.impl;
 
+import com.aip.gateway.api.aip.manager.AipFileManager;
 import com.aip.gateway.api.aip.model.SetFileInfo;
 import com.aip.gateway.api.aip.utils.AipFileUtils;
 import com.aip.gateway.api.model.app.CheckAip;
@@ -47,8 +48,14 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());
@@ -62,8 +69,15 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());
@@ -77,8 +91,15 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());
@@ -92,8 +113,15 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());
@@ -107,8 +135,15 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());
@@ -122,8 +157,15 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             if (check.getErrorCode() != 0) {
                 return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
             }
-            SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
-            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+
+            AipFileManager aipFileManager = this.aipFile.attachManager();
+            try {
+                SetFileInfo fileInfo = aipFileManager.deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
+                return responseSetFile(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
+            }
+            finally {
+                this.aipFile.releaseManager(aipFileManager);
+            }
         }
         catch (Exception e) {
             return responseFileException(e, req.getDispFileName());

+ 30 - 16
src/main/java/com/aip/gateway/api/service/impl/ApiStreamService.java

@@ -1,5 +1,6 @@
 package com.aip.gateway.api.service.impl;
 
+import com.aip.gateway.api.aip.manager.AipFileManager;
 import com.aip.gateway.api.aip.model.SetFileInfo;
 import com.aip.gateway.api.aip.utils.AipFileUtils;
 import com.aip.gateway.api.model.app.CheckAip;
@@ -44,8 +45,6 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
             finally {
                 AipFileUtils.delete(tempOrgFileName);
             }
-            //AipFileStream fileStream = new AipFileStream(req.getFileData());
-            //return responseGetFileInfo(this.aipFile.getManager().getFileInfo(fileStream, actualFileName), req.getDispFileName());
         }
         catch (Exception e) {
             return responseInfoException(e);
@@ -64,11 +63,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -90,11 +91,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -116,11 +119,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -142,11 +147,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -168,11 +175,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -194,11 +203,13 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
                 return responseStreamFail(req.getDispFileName());
             }
 
+            AipFileManager aipFileManager = this.aipFile.attachManager();
             try {
-                SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
-                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+                SetFileInfo fileInfo = aipFileManager.deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
+                return responseSetStream(fileInfo, req.getDispFileName(), AipFileUtils.getFileName(fileInfo.newFileName));
             }
             finally {
+                this.aipFile.releaseManager(aipFileManager);
                 AipFileUtils.delete(check.getReqFileName());
                 AipFileUtils.delete(check.getActualFileName());
             }
@@ -231,9 +242,12 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
         if (result.getErrorCode() != 0) {
             return new ResponseStream(result.getErrorCode(), result.getErrorMessage(), result.getDispFileName());
         }
-
+        String savedFileName = getRequestFileName(result.getSaveFileName());
+        log.error("{}", savedFileName);
         RequestStreamDel req = new RequestStreamDel(baseReq.getApiKey(), baseReq.getEmail(), baseReq.getApiGuid(), "",
-                result.getDispFileName(), result.getSaveFileName(), "DelDecryptStream");
+                result.getDispFileName(),
+                AipFileUtils.getFileDataString(savedFileName),
+                "DelDecryptStream");
         ResponseStream response = delLabel(req);
         AipFileUtils.delete(getRequestFileName(result.getSaveFileName()));
         return response;

+ 1 - 1
src/test/java/com/aip/gateway/api/AipGatewayApiApplicationTests.java

@@ -113,7 +113,7 @@ class AipGatewayApiApplicationTests {
 
 	boolean AipFileInitialize(AipConfig aipConfig) {
 		AipFileManager aipFileManager = new AipFileManager(aipConfig);
-		if (!aipFileManager.initialize()) {
+		if (!aipFileManager.initialize(0)) {
 			log.error("AipFileManager.initialize Failed, {}, {}", aipFileManager.getLastErrNo(), aipFileManager.getLastErrMsg());
 			return false;
 		}