2017-09-29 12 views
1

私は、次のDomainモデルファイルが必要であれば配信されるようにしている考える:読むファイルパスのセクションでは、モデル化する

public class Report { 

    private String reportId; 
    private String reportName; 
    private String client; 
    private String format; 
    private Date cobDate; 
    private String filePath; 

} 

public enum ReportType { 

    PNL_REPORT("11", "pnlreport"), 
    BALANCE_SHEET("20", "balance"), 

    private final String reportId; 
    private final String name; 

    private ReportType(String reportId, String name) { 
     this.reportId = reportId; 
     this.name = name; 
    } 
} 

を、私は以下のService実装持って与えられた:

@Service 
public class FileService { 

    @Autowired 
    private FileRepository fileRepository; 


    public List<Report> getReport(String filePattern, String format) { 

     List<Report> reportDeliverables = new ArrayList<>(); 

     List<File> filesToSend = fileRepository.getFilesToSend(sourcePath, filePattern, format); 

     \\C:\pathToReports\ClientABC\COB28Sep2017\pnlreport.pdf 

     \\return list of report objects, initialised. 
    } 

} 

IをJava 8を使用していて、リストfilesToSendReportの各フィールドにあるFileオブジェクトを効率的に変換する方法を知りたい場合は、

reportID - >(接尾辞なし一致のファイル名)のIDを見て列挙型から派生

REPORTNAME - > pnlreport.pdf

クライアント - > clientABC

cobDate-> 28-SEP-2017

フォーマット - > PDF

filePathに - > C:\ pathToReports \ ClientABC \ COB28Sep2017 \ pnlreport.pdf

パスには常にクライアント、cobの日付、レポートファイルの名前が続きます。

+0

reportIDの作成方法はわかりません。他の情報は、ファイルパスからregexグループで抽出することができます。 https://docs.oracle.com/javase/tutorial/essential/regex/groups.html –

+0

ルックアップから 'name'に退避された' ReportType' enum 'reportID'へのマッピングです。 – user2781389

答えて

2

私の知る限り、あなたの問題には解決策があります。 ReportFileのregexは、ウィンドウのようなファイルパスのみを満たすことに注意してください。他のOSには、他の正規表現が必要です。

enum ReportType { 

    PNL_REPORT("11", "pnlreport"), 
    BALANCE_SHEET("20", "balance"); 

    private final String reportId; 
    private final String name; 

    ReportType(String reportId, String name) { 
     this.reportId = reportId; 
     this.name = name; 
    } 

    static ReportType fromName(String name) { 
     return Arrays.stream(values()) 
      .filter(reportType -> reportType.name.equals(name)) 
      .findFirst() 
      .orElseThrow(RuntimeException::new); 
    } 

    public String getId() { 
     return reportId; 
    } 
} 

class ReportFile { 

    private static final Pattern WINDOWS_REGEX = 
     Pattern.compile(".+\\\\(Client[^\\\\]+)\\\\COB([^\\\\]+)\\\\([^\\\\.]+).([^\\\\.]+)"); 

    private static final Pattern UNIX_REGEX = 
     Pattern.compile(".+/(Client[^/]+)/COB([^/]+)/([^/.]+).([^/.]+)"); 

    private final File file; 

    public ReportFile(File file) { 
     this.file = file; 
    } 

    Report toReport() { 
     String filePath = file.getPath(); 
     Matcher matcher = WINDOWS_REGEX.matcher(filePath); 

     if (!matcher.find()) { 
      throw new RuntimeException("Invalid path for report: " + filePath); 
     } 

     String client = matcher.group(1); 
     Date cobDate; 
     try { 
      LocalDate cobLocalDate = 
       LocalDate.parse(matcher.group(2), DateTimeFormatter.ofPattern("dMMMy").withLocale(Locale.US)); 
      cobDate = Date.from(cobLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     String reportName = matcher.group(3); 
     String id = ReportType.fromName(matcher.group(3)).getId(); 
     String extension = matcher.group(4); 

     return new Report(
      id, reportName, client, extension, cobDate, filePath 
     ); 
    } 
} 

class Ex { 
    public static void main(String[] args) { 
     List<Report> reportDeliverables = new ArrayList<>(); 

     List<File> filesToSend = ImmutableList.of(
      new File("C:\\pathToReports\\ClientABC\\COB28Sep2017\\pnlreport.pdf") 
     ); 

     System.out.println(filesToSend.stream() 
      .map(ReportFile::new) 
      .map(ReportFile::toReport) 
      .collect(Collectors.toList())); 
    } 
} 
+0

ありがとう:)私は'ReportFile'を' Component'クラスに翻訳し、configからregexを読み込みました。 UNIXのパス正規表現を含め、文字列 "クライアント"を取り除く答えを更新してください。 – user2781389

+0

私はunix regexを追加しましたが、クライアントの文字列は削除されません。 '(Client [^ /] +)'は、Client文字列が最初のグループの内部にあることを意味します。 –

+0

@ user2781389問題が解決する場合は、この回答を受け入れてください。 –

関連する問題