11package massbank_export_api .api ;
22
3+ import com .fasterxml .jackson .databind .ObjectMapper ;
34import massbank .RecordParser ;
45import massbank .export .RecordToNIST_MSP ;
56import massbank .export .RecordToRIKEN_MSP ;
1011import org .springframework .beans .factory .annotation .Autowired ;
1112import org .springframework .context .annotation .Primary ;
1213import org .springframework .core .io .ByteArrayResource ;
14+ import org .springframework .core .io .InputStreamResource ;
1315import org .springframework .core .io .Resource ;
1416import org .springframework .http .HttpHeaders ;
1517import org .springframework .http .MediaType ;
1820
1921import java .io .ByteArrayOutputStream ;
2022import java .io .IOException ;
23+ import java .io .PipedInputStream ;
24+ import java .io .PipedOutputStream ;
2125import java .nio .charset .StandardCharsets ;
2226import java .util .HashSet ;
2327import java .util .Objects ;
@@ -46,9 +50,9 @@ public ConvertApiDelegateImpl(RecordServiceImplementation recordServiceImplement
4650 @ Override
4751 public ResponseEntity <Resource > convertPost (Conversion conversion ) {
4852 String formatValue = conversion .getFormat () != null ? conversion .getFormat ().getValue () : "" ;
49- final ByteArrayResource resource ;
50- final String filename ;
51- final MediaType mediaType ;
53+ Resource resource = null ;
54+ String filename = null ;
55+ MediaType mediaType = null ;
5256
5357 final RecordParser recordparser = new RecordParser (new HashSet <>());
5458
@@ -103,9 +107,9 @@ public ResponseEntity<Resource> convertPost(Conversion conversion) {
103107 record .indexOf ("\n " , record .indexOf ("ACCESSION:" ))).trim ();
104108 try {
105109 final ZipEntry entry = new ZipEntry (accession + ".txt" );
106- synchronized (zos ) { // Synchronize access to ZipOutputStream
110+ synchronized (zos ) {
107111 zos .putNextEntry (entry );
108- zos .write (record .toString (). getBytes (StandardCharsets .UTF_8 ));
112+ zos .write (record .getBytes (StandardCharsets .UTF_8 ));
109113 zos .closeEntry ();
110114 }
111115 } catch (IOException e ) {
@@ -118,6 +122,40 @@ public ResponseEntity<Resource> convertPost(Conversion conversion) {
118122 throw new RuntimeException ("Error creating zip file" , e );
119123 }
120124 break ;
125+ case "json" :
126+ mediaType = MediaType .parseMediaType ("application/jsonl" );
127+ try {
128+ PipedOutputStream pos = new PipedOutputStream ();
129+ PipedInputStream pis = new PipedInputStream (pos );
130+ new Thread (() -> {
131+ try {
132+ ObjectMapper mapper = new ObjectMapper ();
133+ boolean first = true ;
134+ for (String accession : conversion .getRecordList ()) {
135+ DbRecord dbRecord = recordServiceImplementation .findByAccession (accession );
136+ if (dbRecord == null ) continue ;
137+ Result parseResult = recordparser .parse (dbRecord .getContent ());
138+ if (!parseResult .isSuccess ()) continue ;
139+ massbank .Record record = (massbank .Record ) parseResult .get ();
140+ String json = mapper .writeValueAsString (massbank .export .RecordToJson .convert (record ));
141+ if (!first ) {
142+ pos .write ('\n' );
143+ } else {
144+ first = false ;
145+ }
146+ pos .write (json .getBytes (StandardCharsets .UTF_8 ));
147+ }
148+ pos .close ();
149+ } catch (IOException e ) {
150+ throw new RuntimeException ("Error streaming JSONL" , e );
151+ }
152+ }).start ();
153+ resource = new InputStreamResource (pis );
154+ } catch (IOException e ) {
155+ throw new RuntimeException ("Error creating stream for JSONL" , e );
156+ }
157+ filename = null ;
158+ break ;
121159 default :
122160 String message = "Missing or unsupported format value." ;
123161 resource = new ByteArrayResource (message .getBytes (StandardCharsets .UTF_8 ));
@@ -126,14 +164,24 @@ public ResponseEntity<Resource> convertPost(Conversion conversion) {
126164 .body (resource );
127165 }
128166
129- HttpHeaders headers = new HttpHeaders ();
130- headers .add (HttpHeaders .CONTENT_DISPOSITION , "attachment; filename=" + filename );
131-
132- return ResponseEntity .ok ()
133- .headers (headers )
134- .contentLength (resource .contentLength ())
135- .contentType (mediaType )
136- .body (resource );
167+ if ("json" .equals (formatValue )) {
168+ // Kein Download, sondern Stream
169+ return ResponseEntity .ok ()
170+ .contentType (mediaType )
171+ .body (resource );
172+ } else {
173+ HttpHeaders headers = new HttpHeaders ();
174+ headers .add (HttpHeaders .CONTENT_DISPOSITION , "attachment; filename=" + filename );
175+ long contentLength = -1 ;
176+ try {
177+ contentLength = resource .contentLength ();
178+ } catch (IOException ignored ) {}
179+ return ResponseEntity .ok ()
180+ .headers (headers )
181+ .contentLength (contentLength )
182+ .contentType (mediaType )
183+ .body (resource );
184+ }
137185 }
138186
139187}
0 commit comments