package com.bayer.edam.migration; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.PropertySource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import com.bayer.edam.migration.mam.Entry; import com.bayer.edam.migration.mam.Entry.Download; import com.bayer.edam.migration.mam.Entrylist; import com.fasterxml.jackson.databind.ObjectMapper; @SpringBootApplication @PropertySource("file:secret.properties") public class EntryDownloader implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(EntryDownloader.class); @Value("${mam.auth}") private String mamAuth; static final String mamHost = "https://service.media-assistant.animalhealth.bayer.com"; static final String separator = "|~|"; private ObjectMapper jsonMapper = new ObjectMapper(); private RestTemplate restTemplate = new RestTemplate(); @Override public void run(String... strings) { HttpHeaders headers = new HttpHeaders(); headers.add("Accept", "application/json"); headers.add("Authorization", "Basic " + mamAuth); headers.add("Content-Type", "application/json"); headers.add("From", "migration@bayer.com"); HttpEntity entity = new HttpEntity("", headers); int lastPage = 1; for (int pageNum = 1; pageNum <= lastPage; pageNum++) { Entrylist entrylist = restTemplate.exchange(mamHost + "/rest/migration/entrylist?pagenumber={pagenum}&pagesize=500", HttpMethod.GET, entity, Entrylist.class, pageNum).getBody(); lastPage = entrylist.lastPage; for (int i = 0; i < entrylist.entries.length; i++) { try { String entryJson = restTemplate.exchange(mamHost + "/rest/migration/entry/{id}", HttpMethod.GET, entity, String.class, entrylist.entries[i].mediaAssistantId).getBody(); Entry entry = jsonMapper.readValue(entryJson, Entry.class); File targetDir = new File("E:\\" + entry.id); if (targetDir.exists()) { log.info("Skip " + entry.id + ", target directory already present"); continue; } List downloadSelection = new ArrayList(); // Select download: Download original only. If original is not available, download largest file Download selectedDownload = null; for (Download download : entry.downloadList) { if (download.entryFileVariation.equals("ORIGINAL")) { selectedDownload = download; break; } if (selectedDownload == null) { selectedDownload = download; } else if (selectedDownload.size < download.size) { selectedDownload = download; } } if (selectedDownload != null) downloadSelection.add(selectedDownload); // TODO extract, if zip --> postponed until upload for (Download download : entry.downloadListPublicFolder) { downloadSelection.add(download); } // clean download selection HashSet hrefs = new HashSet(); List cleanedDownloads = new ArrayList(); for (Download download : downloadSelection) { if (hrefs.add(download.href)) { cleanedDownloads.add(download); } } long aggregatedFilesize = 0; for (Download download : cleanedDownloads) { aggregatedFilesize += download.size; } log.info(entry.id + separator + entry.mediaAssistantId + separator + entry.stateId + separator + aggregatedFilesize + separator + entryJson); targetDir.mkdir(); for (Download download : cleanedDownloads) { String filenameToUse; if (download.fileNameOnDisc != null) filenameToUse = download.fileNameOnDisc; else filenameToUse = download.fileName; try { ResponseEntity response = restTemplate.exchange(download.href, HttpMethod.GET, entity, byte[].class); if (response.getStatusCode() == HttpStatus.OK) { Files.write(Paths.get("E:\\" + entry.id + "\\" + filenameToUse), response.getBody()); } else { log.error(entry.id + ", " + response.getStatusCodeValue() + ", " + download.href); } } catch (HttpClientErrorException hcee) { log.error(hcee.getMessage()); hcee.printStackTrace(); } } } catch (IOException ioe) { log.error(ioe.getMessage()); ioe.printStackTrace(); } } } } public static void main(String args[]) { SpringApplication.run(EntryDownloader.class, args); } }