55import gs .mclo .api .data .LogField ;
66import gs .mclo .api .internal .JsonBodyHandler ;
77import gs .mclo .api .internal .RequestBuilder ;
8+ import gs .mclo .api .internal .filter .*;
9+ import gs .mclo .api .internal .gson .FilterTypeAdapterFactory ;
810import gs .mclo .api .internal .gson .InstantTypeAdapter ;
911import gs .mclo .api .reader .FileLogReader ;
10- import gs .mclo .api .response .GetLogResponse ;
11- import gs .mclo .api .response .InsightsResponse ;
12- import gs .mclo .api .response .Limits ;
13- import gs .mclo .api .response .UploadLogResponse ;
12+ import gs .mclo .api .response .*;
1413import org .jetbrains .annotations .ApiStatus ;
1514import org .jetbrains .annotations .Nullable ;
1615
2726public class MclogsClient {
2827 private final Gson gson = new GsonBuilder ()
2928 .registerTypeAdapter (Instant .class , new InstantTypeAdapter ())
29+ .registerTypeAdapterFactory (new FilterTypeAdapterFactory ())
3030 .create ();
3131 private final HttpClient httpClient = HttpClient .newBuilder ()
3232 .version (HttpClient .Version .HTTP_2 )
@@ -35,6 +35,7 @@ public class MclogsClient {
3535
3636 private Instance instance = new Instance ();
3737 private @ Nullable Limits limits ;
38+ private @ Nullable FilterList filters ;
3839 private final RequestBuilder requestBuilder = new RequestBuilder (gson );
3940
4041 /**
@@ -143,13 +144,13 @@ public MclogsClient setInstance(Instance instance) {
143144 * @return the response
144145 */
145146 public CompletableFuture <UploadLogResponse > uploadLog (Log log ) {
146- return getLimitsOrDefault ().thenCompose (limits -> {
147+ return getFiltersOrDefault ().thenCompose (filters -> {
147148 if (log .getSource () == null ) {
148149 log .setSource (requestBuilder .getProjectName ());
149150 }
150151
151152 try {
152- HttpRequest request = requestBuilder .uploadRequest (instance .getLogUploadUrl (), log , limits );
153+ HttpRequest request = requestBuilder .uploadRequest (instance .getLogUploadUrl (), log , filters );
153154 return asyncRequest (request , UploadLogResponse .class );
154155 } catch (IOException e ) {
155156 return CompletableFuture .failedFuture (e );
@@ -211,9 +212,9 @@ public CompletableFuture<InsightsResponse> getInsights(String logId) {
211212 * @return the insights of the log
212213 */
213214 public CompletableFuture <InsightsResponse > analyseLog (Log log ) {
214- return this .getLimitsOrDefault ().thenCompose (limits -> {
215+ return this .getFiltersOrDefault ().thenCompose (filters -> {
215216 try {
216- HttpRequest request = requestBuilder .uploadRequest (instance .getLogAnalysisUrl (), log , limits );
217+ HttpRequest request = requestBuilder .uploadRequest (instance .getLogAnalysisUrl (), log , filters );
217218 return asyncRequest (request , InsightsResponse .class );
218219 } catch (IOException e ) {
219220 return CompletableFuture .failedFuture (e );
@@ -298,6 +299,29 @@ public CompletableFuture<Void> deleteLog(String id, String token) {
298299 });
299300 }
300301
302+ /**
303+ * Get the filters that should be applied when uploading logs
304+ *
305+ * @return an array of filters
306+ */
307+ CompletableFuture <FilterList > getFilters () {
308+ var filters = this .filters ;
309+ if (filters != null ) {
310+ return CompletableFuture .completedFuture (filters );
311+ }
312+
313+ HttpRequest request = requestBuilder .request (instance .getFiltersUrl ())
314+ .header ("Accept" , "application/json" )
315+ .GET ()
316+ .build ();
317+ return asyncRequest (request , Filter [].class )
318+ .thenApply (FilterList ::new )
319+ .thenApply (result -> {
320+ this .filters = result ;
321+ return result ;
322+ });
323+ }
324+
301325 /**
302326 * List logs in the {@code logs} subdirectory of a path
303327 *
@@ -330,6 +354,7 @@ public String[] listCrashReportsInDirectory(Path directory) {
330354
331355 /**
332356 * List all files in a directory that match the allowed file name pattern
357+ *
333358 * @param directory directory to list files from
334359 * @return array of file names that can be uploaded
335360 */
@@ -346,6 +371,7 @@ public String[] listFilesInDirectory(File directory) {
346371
347372 /**
348373 * List all files in a directory that match the allowed file name pattern
374+ *
349375 * @param directory directory to list files from
350376 * @return array of file names that can be uploaded
351377 */
@@ -368,8 +394,12 @@ private <T> CompletableFuture<T> asyncRequest(HttpRequest request, Class<T> resp
368394 .thenApply (HttpResponse ::body );
369395 }
370396
371- private CompletableFuture <Limits > getLimitsOrDefault () {
372- return this .getLimits ().exceptionally (t -> Limits .DEFAULT );
397+ private CompletableFuture <FilterList > getFiltersOrDefault () {
398+ return this .getFilters ().exceptionally (t -> new FilterList (new Filter []{
399+ new TrimFilter (),
400+ new LimitBytesFilter (Limits .DEFAULT .getMaxLength ()),
401+ new LimitLinesFilter (Limits .DEFAULT .getMaxLines ())
402+ }));
373403 }
374404
375405 @ ApiStatus .Internal
0 commit comments