2121import static java .util .stream .Collectors .joining ;
2222
2323import com .google .cloud .storage .BlobId ;
24- import com .google .common .base .Splitter ;
2524import com .google .common .collect .ImmutableList ;
2625import com .google .common .collect .ImmutableMultimap ;
27- import com .google .common .collect .Iterables ;
2826import com .google .common .flogger .FluentLogger ;
2927import com .google .common .io .ByteStreams ;
3028import com .google .common .net .MediaType ;
4139import java .io .IOException ;
4240import java .io .InputStream ;
4341import java .util .Optional ;
42+ import java .util .regex .Matcher ;
43+ import java .util .regex .Pattern ;
4444
4545/** Copy all registrar detail reports in a given bucket's subdirectory from GCS to Drive. */
4646@ Action (
@@ -54,6 +54,9 @@ public final class CopyDetailReportsAction implements Runnable {
5454
5555 private static final FluentLogger logger = FluentLogger .forEnclosingClass ();
5656
57+ private static final Pattern FILENAME_PATTERN =
58+ Pattern .compile ("^invoice_details_[0-9]{4}-[0-9]{2}_(.+)_.+\\ .csv$" );
59+
5760 private final String billingBucket ;
5861 private final String invoiceDirectoryPrefix ;
5962 private final DriveConnection driveConnection ;
@@ -101,8 +104,13 @@ public void run() {
101104 new ImmutableMultimap .Builder <>();
102105 for (String detailReportName : detailReportObjectNames ) {
103106 // The standard report format is "invoice_details_yyyy-MM_registrarId_tld.csv
104- // TODO(larryruili): Determine a safer way of enforcing this.
105- String registrarId = Iterables .get (Splitter .on ('_' ).split (detailReportName ), 3 );
107+ Matcher matcher = FILENAME_PATTERN .matcher (detailReportName );
108+ if (!matcher .matches ()) {
109+ logger .atWarning ().log (
110+ "Detail report filename '%s' does not match the expected pattern." , detailReportName );
111+ continue ;
112+ }
113+ String registrarId = matcher .group (1 );
106114 Optional <Registrar > registrar = Registrar .loadByRegistrarId (registrarId );
107115 if (registrar .isEmpty ()) {
108116 logger .atWarning ().log (
0 commit comments