package com.icil.edi.ws.common.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; import com.icil.edi.ws.common.constant.CheckpointConstant; import com.icil.edi.ws.common.constant.EdiServiceConstant; import com.icil.edi.ws.common.model.CommonResponse; import com.icil.edi.ws.common.utils.ServicePathUtils; public class FileServiceUtils { private static final Logger LOGGER = LoggerFactory.getLogger(FileServiceUtils.class); /** * Save request message as a file. * * @param String userName * @param String ediTransId */ public static void saveRequestAsFile(String checkpoint ,String type, String party, String ediTransId) { LOGGER.info(" enter in FileServiceUtils.saveRequestAsFile() method"); LOGGER.debug("type is "+type); try { /**get requestBody content from MDC*/ String text = MDC.get("requestBody"); //LOGGER.info("requestBody:"+"\n"+text); String file = ""; if(CheckpointConstant.REC_REQUEST.equalsIgnoreCase(checkpoint)) { file = createFilePath(type, party, ediTransId, EdiServiceConstant.IN_DIR,EdiServiceConstant.REQUEST_FILE_SYMBOL); }else if (CheckpointConstant.SEND_REQUEST.equalsIgnoreCase(checkpoint)) { file = createFilePath(type, party, ediTransId, EdiServiceConstant.OUT_DIR,EdiServiceConstant.REQUEST_FILE_SYMBOL); } /** append content into file*/ /**Here true is to append the content to file*/ FileWriter fw = new FileWriter(file,true); /**BufferedWriter writer give better performance*/ BufferedWriter bw = new BufferedWriter(fw); bw.write(text); bw.close(); LOGGER.info(" Save request message into file : " + file); } catch (Exception e) { LOGGER.error(" Cannot create in file, exception is " + e ); } LOGGER.info(" compile in FileServiceUtils.saveRequestAsFile() method"); } /** * Save response message as a file. * * @param CommonResponse response * @param String userName * @param String ediTransId */ public static void saveResponseAsFile(String checkpoint,CommonResponse response, String type, String party, String ediTransId,String jsonObj) { LOGGER.info(" enter in FileServiceUtils.saveResponseAsFile() method"); try { String file = ""; if(CheckpointConstant.GET_RESPONSE.equalsIgnoreCase(checkpoint)) { file = createFilePath(type, party, ediTransId, EdiServiceConstant.IN_DIR,EdiServiceConstant.RESPONSE_FILE_SYMBOL); }else if (CheckpointConstant.SEND_RESPONSE.equalsIgnoreCase(checkpoint)) { file = createFilePath(type, party, ediTransId, EdiServiceConstant.OUT_DIR,EdiServiceConstant.RESPONSE_FILE_SYMBOL); } /**generate response message*/ StringWriter sw = null; FileWriter fw = new FileWriter(file,true); BufferedWriter bw = new BufferedWriter(fw); String jsonInString = ""; if(jsonObj!=null&&!"".equals(jsonObj)) { jsonInString = jsonObj; }else { if(MDC.get("contentType")=="application/json"){ ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); jsonInString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); }else{ JAXBContext context = JAXBContext.newInstance(CommonResponse.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); sw = new StringWriter(); m.marshal(response, sw); jsonInString = sw.toString(); } } bw.write(jsonInString); bw.close(); LOGGER.info(" Save response message into file : " + file); } catch (Exception e) { LOGGER.error(" Cannot create out file, exception is " + e ); } LOGGER.info(" compile in FileServiceUtils.saveResponseAsFile() method"); } /** * generate null content file prepare to save in/out message * * datasource file like:/data/EDI/@type/@party/in/@ediTransId_request_{YYYYMMddHHmmssSSS}.txt * response file like:/data/EDI/@type/@party/out/@ediTransId_response_{YYYYMMddHHmmssSSS}.txt * * @param String type * @param String party * @param String ediTransId * @param String fileType * * @return String file * @throws IOException */ private static String createFilePath(String type, String party, String ediTransId, String fileType,String fileSymbol ) throws IOException { LOGGER.info(" enter in FileServiceUtils:createFilePath() method"); String fileFolder = null; String fileName = null; String fileFullPath = null; String userName = MDC.get("username"); String dateTime = DateUtils.getTimeFormat("yyyyMMddHHmmssSSS"); /** * 1.According to the fileType,decide filePath,dateTime,fileName */ if(EdiServiceConstant.IN_DIR.equals(fileType)){ LOGGER.info(" enter in FileServiceUtils.createFilePath() method to create in message file"); //filePath = MilestoneConstant.MESSAGE_FILE_DIR + fileDir + File.separator + MilestoneConstant.IN_DIR ; fileFolder = ServicePathUtils.getPathOfServer(userName).get(0); fileName = ediTransId + "_" + fileSymbol + "_" + dateTime + ".txt" ; fileFullPath = fileFolder + type + "/" +party + "/" + fileType + "/" + fileName; MDC.put("inFileName", fileFullPath); }else if(EdiServiceConstant.OUT_DIR.equals(fileType)){ LOGGER.info(" enter in FileServiceUtils.createFilePath() method to create out message file"); //filePath = MilestoneConstant.MESSAGE_FILE_DIR + fileDir + File.separator + MilestoneConstant.OUT_DIR ; fileFolder = ServicePathUtils.getPathOfServer(userName).get(0); fileName = ediTransId + "_" + fileSymbol + "_" + dateTime + ".txt" ; fileFullPath = fileFolder + type + "/" +party + "/" + fileType + "/" + fileName; MDC.put("outFileName", fileFullPath); }else{ //this is a undefined situation,in this situation,save file will catch exception/ return null; } //File fileDirectory = new File(filePath); LOGGER.info(" file full path is :"+fileFullPath); /**2.generate file*/ File file = new File(fileFullPath); if(!file.exists()){ LOGGER.info(" file is not exists :"+fileFullPath+",go to create it."); file.getParentFile().mkdirs(); } LOGGER.info(" leave FileServiceUtils:createFilePath() method"); return fileFullPath; } }