diff --git a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositChangeResponseDto.java b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositChangeResponseDto.java index 60318ef04e9b569bc85615995215f236a4ce69bc..8a7297df21605c727af4bf436abdc9755678617a 100644 --- a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositChangeResponseDto.java +++ b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositChangeResponseDto.java @@ -1,6 +1,6 @@ package at.tuwien.api.zenodo.deposit; -import at.tuwien.api.zenodo.files.FileDto; +import at.tuwien.api.zenodo.files.FileResponseDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; @@ -40,7 +40,7 @@ public class DepositChangeResponseDto { private CreatorDto[] contributors; - private List<FileDto> files; + private List<FileResponseDto> files; private Long id; diff --git a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositResponseDto.java b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositResponseDto.java index dee78afe09fdf472af63691c43d86a8eeb27df79..25cc5c9a90c145d0eda3c9a9ddae1cc6a27fda1d 100644 --- a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositResponseDto.java +++ b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/DepositResponseDto.java @@ -1,6 +1,6 @@ package at.tuwien.api.zenodo.deposit; -import at.tuwien.api.zenodo.files.FileDto; +import at.tuwien.api.zenodo.files.FileResponseDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; @@ -46,7 +46,7 @@ public class DepositResponseDto { private CreatorDto[] contributors; - private List<FileDto> files; + private List<FileResponseDto> files; private Long id; diff --git a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileBinaryRequestDto.java b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileBinaryRequestDto.java new file mode 100644 index 0000000000000000000000000000000000000000..1e823a91feb4e84e373c8bf774c3b8ea9728f44f --- /dev/null +++ b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileBinaryRequestDto.java @@ -0,0 +1,16 @@ +package at.tuwien.api.zenodo.deposit; + +import lombok.*; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpEntity; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileBinaryRequestDto { + + private HttpEntity<ByteArrayResource> file; + +} diff --git a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileRequestDto.java b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileRequestDto.java new file mode 100644 index 0000000000000000000000000000000000000000..6a867192b2b918d35cd3a46105566bd9e984e02c --- /dev/null +++ b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/deposit/FileRequestDto.java @@ -0,0 +1,15 @@ +package at.tuwien.api.zenodo.deposit; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileRequestDto { + + private String name; + +} diff --git a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileDto.java b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileResponseDto.java similarity index 89% rename from fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileDto.java rename to fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileResponseDto.java index 054146a746a4f723dacb26f3be31243a07faa63d..5ffd7b599e11014dd8d8bb89f9797b6bcc462860 100644 --- a/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileDto.java +++ b/fda-citation-service/api/src/main/java/at/tuwien/api/zenodo/files/FileResponseDto.java @@ -7,7 +7,7 @@ import lombok.*; @Builder @NoArgsConstructor @AllArgsConstructor -public class FileDto { +public class FileResponseDto { private String checksum; diff --git a/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java index 8466f80fec0063210f9f709b2372e5f1df3d9190..3accc542f017162950ba95c4d88269d0fcc9a72e 100644 --- a/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ b/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java @@ -1,7 +1,7 @@ package at.tuwien; import at.tuwien.api.zenodo.deposit.*; -import at.tuwien.api.zenodo.files.FileDto; +import at.tuwien.api.zenodo.files.FileResponseDto; import at.tuwien.api.zenodo.files.FileLinksDto; import org.apache.commons.lang.RandomStringUtils; import org.springframework.test.context.TestPropertySource; @@ -37,6 +37,11 @@ public abstract class BaseUnitTest { public final static String CREATOR_2_AFFIL = "TU Graz"; public final static String CREATOR_2_ORCID = "0000-0002-2606-4059"; + public final static String FILE_1_ID = "deadbeef-deafdeed"; + public final static String FILE_1_NAME = "testdata-othername.csv"; + public final static String FILE_1_CHECKSUM = "d393c7fa1240c18473133793f7901aaa"; + public final static Long FILE_1_SIZE = 34614L; + public final static Long DEPOSIT_2_ID = 2L; public final static String DEPOSIT_2_TITLE = "Test Document " + RandomStringUtils.randomAlphanumeric(10); public final static String DEPOSIT_2_DESCRIPTION = "Test Description " + RandomStringUtils.randomAlphanumeric(100); @@ -46,12 +51,6 @@ public abstract class BaseUnitTest { public final static String DEPOSIT_2_STATE = "draft"; public final static Boolean DEPOSIT_2_SUBMITTED = false; - - public final static String FILE_1_CHECKSUM = "deadbeef"; - public final static String FILE_1_NAME = "data.csv"; - public final static String FILE_1_ID = "73d5674b-2bda-400c-844e-4eef309afe5e"; - public final static Long FILE_1_SIZE = 3943498L; - public final static String FILE_1_LINKS_DOWNLOAD = "http://localhost:5500/file/" + FILE_1_ID + "/download"; public final static String FILE_1_LINKS_SELF = "http://localhost:5500/file/" + FILE_1_ID; @@ -82,7 +81,7 @@ public abstract class BaseUnitTest { .self(FILE_1_LINKS_SELF) .build(); - public final static FileDto FILE_1 = FileDto.builder() + public final static FileResponseDto FILE_1 = FileResponseDto.builder() .checksum(FILE_1_CHECKSUM) .filename(FILE_1_NAME) .id(FILE_1_ID) diff --git a/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..96f8c227c3b8351cbf5c78ee0cffdb16ed1e25f4 --- /dev/null +++ b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java @@ -0,0 +1,60 @@ +package at.tuwien.service; + +import at.tuwien.BaseUnitTest; +import at.tuwien.api.zenodo.deposit.DepositChangeRequestDto; +import at.tuwien.api.zenodo.deposit.DepositChangeResponseDto; +import at.tuwien.api.zenodo.deposit.FileRequestDto; +import at.tuwien.api.zenodo.files.FileResponseDto; +import at.tuwien.config.ReadyConfig; +import at.tuwien.exception.ZenodoApiException; +import at.tuwien.exception.ZenodoAuthenticationException; +import at.tuwien.exception.ZenodoNotFoundException; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.ResourceUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class FileServiceIntegrationTest extends BaseUnitTest { + + @MockBean + private ReadyConfig readyConfig; + + @Autowired + private ZenodoFileService fileService; + + @Autowired + private ZenodoMetadataService metadataService; + + @Test + public void createResource_succeeds() throws IOException, ZenodoApiException, ZenodoNotFoundException, ZenodoAuthenticationException { +// final DepositChangeResponseDto deposit = metadataService.storeCitation(); + final byte[] file = FileUtils.readFileToByteArray(ResourceUtils.getFile("classpath:testdata.csv")); + + /* test */ + final FileResponseDto response = fileService.createResource(1L, FILE_1_NAME, file); + assertEquals(FILE_1_NAME, response.getFilename()); + assertEquals(FILE_1_CHECKSUM, response.getChecksum()); + assertEquals(FILE_1_SIZE, response.getFilesize()); + } + +} \ No newline at end of file diff --git a/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceUnitTest.java b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceUnitTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2b86237c474f68b3d34e1b3b44b781f26418fc15 --- /dev/null +++ b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceUnitTest.java @@ -0,0 +1,80 @@ +package at.tuwien.service; + +import at.tuwien.BaseUnitTest; +import at.tuwien.api.zenodo.deposit.*; +import at.tuwien.api.zenodo.files.FileResponseDto; +import at.tuwien.config.ReadyConfig; +import at.tuwien.exception.ZenodoApiException; +import at.tuwien.exception.ZenodoAuthenticationException; +import at.tuwien.exception.ZenodoNotFoundException; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.ResourceUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.when; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class FileServiceUnitTest extends BaseUnitTest { + + @MockBean + private ReadyConfig readyConfig; + + @Autowired + private ZenodoFileService fileService; + + @MockBean + private RestTemplate zenodoTemplate; + + @Test + public void createResource_succeeds() throws IOException, ZenodoApiException, ZenodoNotFoundException, + ZenodoAuthenticationException { + final byte[] file = FileUtils.readFileToByteArray(ResourceUtils.getFile("classpath:testdata.csv")); + when(zenodoTemplate.exchange(anyString(), eq(HttpMethod.POST), Mockito.any(), + eq(FileResponseDto.class), anyLong(), anyString())) + .thenReturn(ResponseEntity.status(HttpStatus.OK) + .body(FILE_1)); + + /* test */ + final FileResponseDto response = fileService.createResource(DEPOSIT_1_ID, FILE_1_NAME, file); + assertEquals(FILE_1_NAME, response.getFilename()); + assertEquals(FILE_1_CHECKSUM, response.getChecksum()); + assertEquals(FILE_1_SIZE, response.getFilesize()); + } + + @Test + public void createResource_notExists_fails() throws IOException { + final byte[] file = FileUtils.readFileToByteArray(ResourceUtils.getFile("classpath:testdata.csv")); + when(zenodoTemplate.exchange(anyString(), eq(HttpMethod.POST), Mockito.any(), + eq(FileResponseDto.class), anyLong(), anyString())) + .thenReturn(ResponseEntity.status(HttpStatus.BAD_REQUEST) + .build()); + + /* test */ + assertThrows(ZenodoNotFoundException.class, () -> { + fileService.createResource(DEPOSIT_1_ID, FILE_1_NAME, file); + }); + } + +} \ No newline at end of file diff --git a/fda-citation-service/rest-service/src/test/resources/application.properties b/fda-citation-service/rest-service/src/test/resources/application.properties index 5002d6fb8f86b0ef84d19bef2f1e169fbd910a59..744cc55069fcf93538377de1620b9cf8e9068962 100644 --- a/fda-citation-service/rest-service/src/test/resources/application.properties +++ b/fda-citation-service/rest-service/src/test/resources/application.properties @@ -17,4 +17,4 @@ spring.jpa.show-sql=false fda.mapping.path: /tmp fda.table.path: /tmp -zenodo.endpoint: https://sandbox.zenodo.org/ \ No newline at end of file +zenodo.endpoint: http://sandbox.zenodo.org/ \ No newline at end of file diff --git a/fda-citation-service/rest-service/src/test/resources/intercept.py b/fda-citation-service/rest-service/src/test/resources/intercept.py deleted file mode 100755 index d2d36630b37651c7f3c54e028128c26cad9da4f6..0000000000000000000000000000000000000000 --- a/fda-citation-service/rest-service/src/test/resources/intercept.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 -import socket - -HOST = '' # Symbolic name meaning all available interfaces -PORT = 50000 # Arbitrary non-privileged port -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.bind((HOST, PORT)) -s.listen(1) - -conn, addr = s.accept() -print ('Connected by' + str(addr)) -while 1: - data = conn.recv(1024) - if not data: break - print("===> recv " + str(data)) -conn.close() \ No newline at end of file diff --git a/fda-citation-service/rest-service/src/test/resources/testdata.csv b/fda-citation-service/rest-service/src/test/resources/testdata.csv new file mode 100644 index 0000000000000000000000000000000000000000..f747eb5bd6c8288173dba85b146d5883a7057b8b --- /dev/null +++ b/fda-citation-service/rest-service/src/test/resources/testdata.csv @@ -0,0 +1,1001 @@ +id;Date;Location;MinTemp;MaxTemp;Rainfall +1;2008-12-01;Albury;13.4;22.9;0.6 +2;2008-12-02;Albury;7.4;25.1;0 +3;2008-12-03;Albury;12.9;25.7;0 +4;2008-12-04;Albury;9.2;28;0 +5;2008-12-05;Albury;17.5;32.3;1 +6;2008-12-06;Albury;14.6;29.7;0.2 +7;2008-12-07;Albury;14.3;25;0 +8;2008-12-08;Albury;7.7;26.7;0 +9;2008-12-09;Albury;9.7;31.9;0 +10;2008-12-10;Albury;13.1;30.1;1.4 +11;2008-12-11;Albury;13.4;30.4;0 +12;2008-12-12;Albury;15.9;21.7;2.2 +13;2008-12-13;Albury;15.9;18.6;15.6 +14;2008-12-14;Albury;12.6;21;3.6 +15;2008-12-15;Albury;8.4;24.6;0 +16;2008-12-16;Albury;9.8;27.7;NA +17;2008-12-17;Albury;14.1;20.9;0 +18;2008-12-18;Albury;13.5;22.9;16.8 +19;2008-12-19;Albury;11.2;22.5;10.6 +20;2008-12-20;Albury;9.8;25.6;0 +21;2008-12-21;Albury;11.5;29.3;0 +22;2008-12-22;Albury;17.1;33;0 +23;2008-12-23;Albury;20.5;31.8;0 +24;2008-12-24;Albury;15.3;30.9;0 +25;2008-12-25;Albury;12.6;32.4;0 +26;2008-12-26;Albury;16.2;33.9;0 +27;2008-12-27;Albury;16.9;33;0 +28;2008-12-28;Albury;20.1;32.7;0 +29;2008-12-29;Albury;19.7;27.2;0 +30;2008-12-30;Albury;12.5;24.2;1.2 +31;2008-12-31;Albury;12;24.4;0.8 +32;2009-01-01;Albury;11.3;26.5;0 +33;2009-01-02;Albury;9.6;23.9;0 +34;2009-01-03;Albury;10.5;28.8;0 +35;2009-01-04;Albury;12.3;34.6;0 +36;2009-01-05;Albury;12.9;35.8;0 +37;2009-01-06;Albury;13.7;37.9;0 +38;2009-01-07;Albury;16.1;38.9;0 +39;2009-01-08;Albury;14;28.3;0 +40;2009-01-09;Albury;12.5;28.4;0 +41;2009-01-10;Albury;17;30.8;0 +42;2009-01-11;Albury;16.9;32;0 +43;2009-01-12;Albury;17.3;34.7;0 +44;2009-01-13;Albury;17.2;37.7;0 +45;2009-01-14;Albury;17.4;43;0 +46;2009-01-15;Albury;19.8;32.7;0 +47;2009-01-16;Albury;14.9;26.7;0 +48;2009-01-17;Albury;10.5;28.4;0 +49;2009-01-18;Albury;11.3;32.2;0 +50;2009-01-19;Albury;13.9;36.6;0 +51;2009-01-20;Albury;18.6;39.9;0 +52;2009-01-21;Albury;19.3;38.1;0.8 +53;2009-01-22;Albury;24.4;34;0.6 +54;2009-01-23;Albury;18.8;35.2;6.4 +55;2009-01-24;Albury;20.8;30.6;0 +56;2009-01-25;Albury;14;34.3;0 +57;2009-01-26;Albury;15.7;38.4;0 +58;2009-01-27;Albury;18.5;38.2;0 +59;2009-01-28;Albury;20.4;40.7;0 +60;2009-01-29;Albury;21.8;41.5;0 +61;2009-01-30;Albury;22.3;42.9;0 +62;2009-01-31;Albury;22;42.7;0 +63;2009-02-01;Albury;28;43.1;0 +64;2009-02-02;Albury;24.4;38.3;0.2 +65;2009-02-03;Albury;21.5;37.7;0 +66;2009-02-04;Albury;21.7;36.9;0 +67;2009-02-05;Albury;21.5;41.2;0 +68;2009-02-06;Albury;23.5;42.2;0 +69;2009-02-07;Albury;22.3;44.8;0 +70;2009-02-08;Albury;28.3;40.2;0 +71;2009-02-09;Albury;18.4;31.2;0.4 +72;2009-02-10;Albury;14.9;27.3;0 +73;2009-02-11;Albury;13.5;26.7;0 +74;2009-02-12;Albury;16.1;21.6;0 +75;2009-02-13;Albury;14.6;29;3 +76;2009-02-14;Albury;12.4;29.2;0 +77;2009-02-15;Albury;13.3;31.3;0 +78;2009-02-16;Albury;17.2;31.1;0 +79;2009-02-17;Albury;12.5;28.8;0 +80;2009-02-18;Albury;18;32;0 +81;2009-02-19;Albury;16.2;34;0 +82;2009-02-20;Albury;18.7;29.1;0 +83;2009-02-21;Albury;13.7;31.7;0 +84;2009-02-22;Albury;15.5;33.2;0 +85;2009-02-23;Albury;14.3;34;0 +86;2009-02-24;Albury;12.9;29.6;0 +87;2009-02-25;Albury;8.9;31.9;0 +88;2009-02-26;Albury;15;32.7;0 +89;2009-02-27;Albury;15.4;32.6;0 +90;2009-02-28;Albury;16;34.5;0 +91;2009-03-01;Albury;12.8;30.3;0 +92;2009-03-02;Albury;13.2;31.9;0 +93;2009-03-03;Albury;18;31.1;0 +94;2009-03-04;Albury;13.8;22.1;0.2 +95;2009-03-05;Albury;11.5;22;0 +96;2009-03-06;Albury;7.6;24;0 +97;2009-03-07;Albury;8.3;27.9;0 +98;2009-03-08;Albury;11;30.2;0 +99;2009-03-09;Albury;13.8;31.8;0 +100;2009-03-10;Albury;15.5;32;0 +101;2009-03-11;Albury;18.4;30.5;1.2 +102;2009-03-12;Albury;20.9;25.7;0 +103;2009-03-13;Albury;17.1;25.8;5.8 +104;2009-03-14;Albury;16.4;27;3 +105;2009-03-15;Albury;10;19.7;11.6 +106;2009-03-16;Albury;8.8;21.9;0 +107;2009-03-17;Albury;8.4;25.3;0 +108;2009-03-18;Albury;9.3;28;0 +109;2009-03-19;Albury;11.3;30.1;0 +110;2009-03-20;Albury;11.5;33.5;0 +111;2009-03-21;Albury;13.8;33.6;0 +112;2009-03-22;Albury;14.6;30;0 +113;2009-03-23;Albury;14.4;31.6;0 +114;2009-03-24;Albury;10.8;31.9;0 +115;2009-03-25;Albury;15.4;22.3;0.4 +116;2009-03-26;Albury;13.3;29.8;1.8 +117;2009-03-27;Albury;10.1;27.6;0 +118;2009-03-28;Albury;9.1;28.9;0 +119;2009-03-29;Albury;10.4;31.2;0 +120;2009-03-30;Albury;13.4;30.4;0 +121;2009-03-31;Albury;12.3;29.9;0 +122;2009-04-01;Albury;12.2;30.6;0 +123;2009-04-02;Albury;14.3;32.1;0 +124;2009-04-03;Albury;18.4;28.1;8.6 +125;2009-04-04;Albury;10.7;21.4;12.6 +126;2009-04-05;Albury;7.8;21.7;0 +127;2009-04-06;Albury;8.1;21.4;0 +128;2009-04-07;Albury;7.5;22.5;0 +129;2009-04-08;Albury;8.2;24;0 +130;2009-04-09;Albury;8.1;25.7;0 +131;2009-04-10;Albury;11.6;26.7;0 +132;2009-04-11;Albury;13;24.9;8.4 +133;2009-04-12;Albury;13.5;24.2;6.2 +134;2009-04-13;Albury;9.9;25.4;0 +135;2009-04-14;Albury;12.2;25;0 +136;2009-04-15;Albury;10.7;21.9;0 +137;2009-04-16;Albury;3.5;20;0 +138;2009-04-17;Albury;6.6;21.6;0 +139;2009-04-18;Albury;7;23.4;0 +140;2009-04-19;Albury;11.2;23.9;0 +141;2009-04-20;Albury;7.4;22;0 +142;2009-04-21;Albury;5.7;21.4;0 +143;2009-04-22;Albury;6.2;22.7;0 +144;2009-04-23;Albury;6;22.9;0 +145;2009-04-24;Albury;10.6;16.2;0 +146;2009-04-25;Albury;12.9;15.8;20 +147;2009-04-26;Albury;8.6;12.9;21 +148;2009-04-27;Albury;4.5;11.5;3.2 +149;2009-04-28;Albury;7.6;14.5;4.8 +150;2009-04-29;Albury;5.4;12.2;0 +151;2009-04-30;Albury;2.1;16.5;0 +152;2009-05-01;Albury;1.8;17;0 +153;2009-05-02;Albury;7.2;19.2;0 +154;2009-05-03;Albury;4.6;18.9;0 +155;2009-05-04;Albury;4.2;19.1;0 +156;2009-05-05;Albury;5.2;18.8;0 +157;2009-05-06;Albury;4.1;19.3;0 +158;2009-05-07;Albury;3.2;18.4;0 +159;2009-05-08;Albury;4.3;19;0 +160;2009-05-09;Albury;3.7;20.5;0 +161;2009-05-10;Albury;5.4;19.5;0 +162;2009-05-11;Albury;4.3;17.7;0 +163;2009-05-12;Albury;3.6;18.5;0 +164;2009-05-13;Albury;3.6;15.1;0 +165;2009-05-14;Albury;6.9;16.3;0 +166;2009-05-15;Albury;10.3;16.6;0 +167;2009-05-16;Albury;12.4;16.4;1.8 +168;2009-05-17;Albury;3;15.6;0 +169;2009-05-18;Albury;2.6;19.7;0 +170;2009-05-19;Albury;3.7;19.1;0 +171;2009-05-20;Albury;5.1;18.6;0 +172;2009-05-21;Albury;4.4;19.8;0 +173;2009-05-22;Albury;4.7;19.8;0 +174;2009-05-23;Albury;6.2;22.9;0 +175;2009-05-24;Albury;6.7;21.1;0 +176;2009-05-25;Albury;9.3;20.3;0 +177;2009-05-26;Albury;11.6;18.1;4.2 +178;2009-05-27;Albury;8;16.2;0.8 +179;2009-05-28;Albury;2.6;15.7;0 +180;2009-05-29;Albury;2.2;16.5;0 +181;2009-05-30;Albury;2.2;16.8;0 +182;2009-05-31;Albury;1.7;17.1;0 +183;2009-06-01;Albury;8;14.3;1.2 +184;2009-06-02;Albury;8.4;13.4;1.4 +185;2009-06-03;Albury;10.6;14.3;4.8 +186;2009-06-04;Albury;8.9;17.4;8 +187;2009-06-05;Albury;2.8;16.1;0 +188;2009-06-06;Albury;1.7;10.5;0.2 +189;2009-06-07;Albury;4.7;11.6;14.4 +190;2009-06-08;Albury;9;12;4.6 +191;2009-06-09;Albury;6.3;8.8;2 +192;2009-06-10;Albury;3;10.5;5.6 +193;2009-06-11;Albury;-2;9.6;0 +194;2009-06-12;Albury;-1.3;8.2;0 +195;2009-06-13;Albury;1.8;12.4;0 +196;2009-06-14;Albury;2;15.8;0 +197;2009-06-15;Albury;0.5;14.9;0.4 +198;2009-06-16;Albury;1.2;17.7;0 +199;2009-06-17;Albury;0.6;15.9;0 +200;2009-06-18;Albury;0.5;14.7;0 +201;2009-06-19;Albury;0.5;15.3;0 +202;2009-06-20;Albury;0.9;17.3;0 +203;2009-06-21;Albury;7;17;1.6 +204;2009-06-22;Albury;5;14.9;5.6 +205;2009-06-23;Albury;3.9;15.5;0 +206;2009-06-24;Albury;7.7;14.1;6 +207;2009-06-25;Albury;4.7;12.2;0 +208;2009-06-26;Albury;6.9;13.7;4.4 +209;2009-06-27;Albury;8.4;11.9;0 +210;2009-06-28;Albury;9.3;12.3;5.4 +211;2009-06-29;Albury;8.2;15.7;3.6 +212;2009-06-30;Albury;9.1;16.1;2 +213;2009-07-01;Albury;8.3;13.3;8.4 +214;2009-07-02;Albury;8.8;11.6;5 +215;2009-07-03;Albury;7.6;12;7.8 +216;2009-07-04;Albury;5.7;13.2;0 +217;2009-07-05;Albury;3.4;12.4;0 +218;2009-07-06;Albury;0;12.1;0 +219;2009-07-07;Albury;-1.5;12.5;0 +220;2009-07-08;Albury;-1.7;13.8;0 +221;2009-07-09;Albury;-0.4;15;0.2 +222;2009-07-10;Albury;0.1;13.5;0 +223;2009-07-11;Albury;4.8;13.3;0.6 +224;2009-07-12;Albury;8.1;16.5;0.6 +225;2009-07-13;Albury;5.9;13.1;1 +226;2009-07-14;Albury;6.9;11;6.8 +227;2009-07-15;Albury;2.9;12.6;1.8 +228;2009-07-16;Albury;-0.6;13.4;0 +229;2009-07-17;Albury;-0.3;14.4;0.2 +230;2009-07-18;Albury;-1;12;0 +231;2009-07-19;Albury;3.2;14.1;0.6 +232;2009-07-20;Albury;3.6;16.5;0.2 +233;2009-07-21;Albury;0.8;17.7;0 +234;2009-07-22;Albury;6.6;12.3;0 +235;2009-07-23;Albury;6;13.5;9.8 +236;2009-07-24;Albury;-0.1;12.9;0 +237;2009-07-25;Albury;-0.3;12.2;0 +238;2009-07-26;Albury;2.1;9.8;0 +239;2009-07-27;Albury;1.3;8.8;0 +240;2009-07-28;Albury;4.2;12.7;3.8 +241;2009-07-29;Albury;8.3;13.2;2.4 +242;2009-07-30;Albury;3.3;12.1;0.2 +243;2009-07-31;Albury;6.5;14.5;5.2 +244;2009-08-01;Albury;7.4;13.9;0.2 +245;2009-08-02;Albury;7.5;14.1;0.8 +246;2009-08-03;Albury;8.3;13.8;0.8 +247;2009-08-04;Albury;3.2;14.7;0 +248;2009-08-05;Albury;5.7;13.8;5.4 +249;2009-08-06;Albury;5.1;17.1;0.4 +250;2009-08-07;Albury;8;13.9;0.8 +251;2009-08-08;Albury;-0.8;12.9;4.2 +252;2009-08-09;Albury;-1;12.2;0 +253;2009-08-10;Albury;1.9;14.8;0.2 +254;2009-08-11;Albury;5.9;17.7;0.4 +255;2009-08-12;Albury;6.9;14.3;4.8 +256;2009-08-13;Albury;7.7;11.6;0.2 +257;2009-08-14;Albury;6.8;15.2;1.2 +258;2009-08-15;Albury;2.7;17.5;0.2 +259;2009-08-16;Albury;5.1;15.5;1.6 +260;2009-08-17;Albury;4.2;13.6;3.2 +261;2009-08-18;Albury;0.6;15.6;0 +262;2009-08-19;Albury;1.6;16.4;0 +263;2009-08-20;Albury;5.5;18.4;0 +264;2009-08-21;Albury;7.3;14.8;1 +265;2009-08-22;Albury;0.2;14.1;6.6 +266;2009-08-23;Albury;5.8;18.9;3.8 +267;2009-08-24;Albury;8.9;17.1;1.2 +268;2009-08-25;Albury;7.1;12.8;2 +269;2009-08-26;Albury;4.2;14.4;3.6 +270;2009-08-27;Albury;1.1;16.7;0.4 +271;2009-08-28;Albury;1.1;18.6;0 +272;2009-08-29;Albury;7.2;17.9;4.2 +273;2009-08-30;Albury;6.3;11.1;13.4 +274;2009-08-31;Albury;6.7;14.2;1.4 +275;2009-09-01;Albury;5.1;14.2;3 +276;2009-09-02;Albury;1;16.8;0 +277;2009-09-03;Albury;6.1;20.7;0 +278;2009-09-04;Albury;6.3;16.9;1.4 +279;2009-09-05;Albury;2.1;15;0 +280;2009-09-06;Albury;1.6;16.6;0 +281;2009-09-07;Albury;8.3;17.6;0 +282;2009-09-08;Albury;5.7;16.5;0 +283;2009-09-09;Albury;7.5;14.3;0 +284;2009-09-10;Albury;2.6;NA;0 +285;2009-09-11;Albury;NA;18.8;NA +286;2009-09-12;Albury;6.5;24.7;0 +287;2009-09-13;Albury;13.2;25.1;0 +288;2009-09-14;Albury;4.3;17.8;0 +289;2009-09-15;Albury;1.6;17.2;0 +290;2009-09-16;Albury;2.8;21.1;0 +291;2009-09-17;Albury;6.3;19;0 +292;2009-09-18;Albury;7.4;20.4;10.2 +293;2009-09-19;Albury;5.4;20.6;0 +294;2009-09-20;Albury;8;18.9;0.4 +295;2009-09-21;Albury;3.7;19;0.2 +296;2009-09-22;Albury;11.5;20.2;8.4 +297;2009-09-23;Albury;9.3;16.8;28.8 +298;2009-09-24;Albury;8.2;18.2;1.4 +299;2009-09-25;Albury;5.3;20.6;0 +300;2009-09-26;Albury;6.8;12.2;6 +301;2009-09-27;Albury;4.5;12.9;1.6 +302;2009-09-28;Albury;5.5;17.9;0 +303;2009-09-29;Albury;1.7;17;0 +304;2009-09-30;Albury;4;21.4;0 +305;2009-10-01;Albury;8.9;21.1;0 +306;2009-10-02;Albury;11.7;22;0 +307;2009-10-03;Albury;8.5;13.5;3.2 +308;2009-10-04;Albury;9.6;16.2;1.8 +309;2009-10-05;Albury;8.3;19.7;0.2 +310;2009-10-06;Albury;5.2;16.2;0 +311;2009-10-07;Albury;3.8;15.9;3.6 +312;2009-10-08;Albury;1.2;16.3;0 +313;2009-10-09;Albury;3.2;18.2;0 +314;2009-10-10;Albury;4.6;19;0 +315;2009-10-11;Albury;6.4;18.7;0 +316;2009-10-12;Albury;5.8;23.3;0 +317;2009-10-13;Albury;6.6;17.7;2 +318;2009-10-14;Albury;9.5;15.1;7 +319;2009-10-15;Albury;9.7;15.7;1.4 +320;2009-10-16;Albury;4.1;16.6;6.8 +321;2009-10-17;Albury;4.6;19.2;0 +322;2009-10-18;Albury;5.1;20.3;0 +323;2009-10-19;Albury;5.1;22.7;0 +324;2009-10-20;Albury;6.9;26.6;0 +325;2009-10-21;Albury;8.8;27.1;0 +326;2009-10-22;Albury;9.1;27.1;0 +327;2009-10-23;Albury;8.1;23.9;0 +328;2009-10-24;Albury;7.4;25.4;0 +329;2009-10-25;Albury;10.6;23.1;0 +330;2009-10-26;Albury;10.8;22;0 +331;2009-10-27;Albury;5.9;24.1;0 +332;2009-10-28;Albury;11.3;26.8;0 +333;2009-10-29;Albury;14.5;26.9;0 +334;2009-10-30;Albury;13.7;29.1;0 +335;2009-10-31;Albury;15.6;30.8;0 +336;2009-11-01;Albury;17.8;34;0 +337;2009-11-02;Albury;18.7;32.4;0 +338;2009-11-03;Albury;18.7;24.3;0 +339;2009-11-04;Albury;10;23.2;0 +340;2009-11-05;Albury;6.6;25.3;0 +341;2009-11-06;Albury;10.8;27.9;0 +342;2009-11-07;Albury;11.3;29.8;0 +343;2009-11-08;Albury;13.5;31.8;0 +344;2009-11-09;Albury;15.4;33.4;0 +345;2009-11-10;Albury;15.9;35.2;0 +346;2009-11-11;Albury;17.1;36;0 +347;2009-11-12;Albury;16.7;35.1;0 +348;2009-11-13;Albury;18.1;32.8;0 +349;2009-11-14;Albury;13.4;35.4;0 +350;2009-11-15;Albury;17.2;36.3;0 +351;2009-11-16;Albury;15.3;35.1;0 +352;2009-11-17;Albury;12.1;30.5;0 +353;2009-11-18;Albury;11.4;33.5;0 +354;2009-11-19;Albury;18.6;39.7;0 +355;2009-11-20;Albury;15.3;38.2;0 +356;2009-11-21;Albury;19.3;21;10.6 +357;2009-11-22;Albury;18.3;28.3;25.8 +358;2009-11-23;Albury;11.9;23.6;0.4 +359;2009-11-24;Albury;12.8;25.8;0 +360;2009-11-25;Albury;17.2;32.9;0 +361;2009-11-26;Albury;21;34.5;0 +362;2009-11-27;Albury;15.9;26.2;10.2 +363;2009-11-28;Albury;17.1;26.4;0 +364;2009-11-29;Albury;12.8;22.3;9.4 +365;2009-11-30;Albury;13.2;23.9;2.4 +366;2009-12-01;Albury;12.3;23.6;0 +367;2009-12-02;Albury;10.6;27;0 +368;2009-12-03;Albury;11.4;31.5;0 +369;2009-12-04;Albury;12.3;27.5;0 +370;2009-12-05;Albury;10.7;26.7;0 +371;2009-12-06;Albury;11.1;30.7;0 +372;2009-12-07;Albury;13.4;31.9;0 +373;2009-12-08;Albury;18.2;24.9;0 +374;2009-12-09;Albury;9.2;25.4;1.2 +375;2009-12-10;Albury;14.2;27.4;0 +376;2009-12-11;Albury;9.2;22.6;1 +377;2009-12-12;Albury;9;26.5;0 +378;2009-12-13;Albury;11.8;29.6;0 +379;2009-12-14;Albury;13.6;32;0 +380;2009-12-15;Albury;13.1;34.7;0 +381;2009-12-16;Albury;14.6;38.6;0 +382;2009-12-17;Albury;14.5;40.3;0 +383;2009-12-18;Albury;12.2;26.4;3 +384;2009-12-19;Albury;11.1;29.2;0 +385;2009-12-20;Albury;12;31.3;0 +386;2009-12-21;Albury;12.7;33.7;0 +387;2009-12-22;Albury;15.1;36.6;0 +388;2009-12-23;Albury;18.1;38.2;0 +389;2009-12-24;Albury;22.9;34.6;0 +390;2009-12-25;Albury;18.8;28.3;9.8 +391;2009-12-26;Albury;17.1;31.3;0 +392;2009-12-27;Albury;17.6;27.3;0 +393;2009-12-28;Albury;17.8;35.9;0 +394;2009-12-29;Albury;18.7;35.9;0 +395;2009-12-30;Albury;19.8;36.8;0 +396;2009-12-31;Albury;21.1;33.2;0 +397;2010-01-01;Albury;19.4;31.9;5 +398;2010-01-02;Albury;18.6;29.1;12.4 +399;2010-01-03;Albury;12.2;29.7;0 +400;2010-01-04;Albury;14.8;32.8;0 +401;2010-01-05;Albury;15;35.8;0 +402;2010-01-06;Albury;16.3;33.8;0 +403;2010-01-07;Albury;15;33;0 +404;2010-01-08;Albury;17.4;36.4;0 +405;2010-01-09;Albury;19.6;39.8;0 +406;2010-01-10;Albury;20.6;42.2;0 +407;2010-01-11;Albury;21;42.2;0 +408;2010-01-12;Albury;24.5;42.4;0.2 +409;2010-01-13;Albury;22.6;28.4;0.4 +410;2010-01-14;Albury;15.7;31.7;3 +411;2010-01-15;Albury;17.2;36.3;0 +412;2010-01-16;Albury;21.8;36.6;0 +413;2010-01-17;Albury;16.8;25.6;0 +414;2010-01-18;Albury;10.5;22.6;0 +415;2010-01-19;Albury;8.7;25.2;0 +416;2010-01-20;Albury;11;32.9;0 +417;2010-01-21;Albury;15.4;37.3;0 +418;2010-01-22;Albury;19.2;41.8;0 +419;2010-01-23;Albury;24.7;35.4;0 +420;2010-01-24;Albury;14.4;33.7;0 +421;2010-01-25;Albury;14.3;35.8;0 +422;2010-01-26;Albury;15.1;35.9;0 +423;2010-01-27;Albury;17.7;36.4;0 +424;2010-01-28;Albury;15.2;34.4;0 +425;2010-01-29;Albury;16;35.2;0 +426;2010-01-30;Albury;18.9;36.5;0 +427;2010-01-31;Albury;21.7;36.3;0 +428;2010-02-01;Albury;21;38.2;0 +429;2010-02-02;Albury;17.8;34.3;8.6 +430;2010-02-03;Albury;17.9;35.6;0 +431;2010-02-04;Albury;23.5;32;0 +432;2010-02-05;Albury;19.2;26.1;52.2 +433;2010-02-06;Albury;19.5;30.3;5.6 +434;2010-02-07;Albury;20.3;33.9;0 +435;2010-02-08;Albury;23;34;0 +436;2010-02-09;Albury;22.1;35.1;0 +437;2010-02-10;Albury;21.7;35.6;NA +438;2010-02-11;Albury;21.5;35;0 +439;2010-02-12;Albury;22.5;29.1;NA +440;2010-02-13;Albury;20.8;27.1;0 +441;2010-02-14;Albury;20.5;30.3;0 +442;2010-02-15;Albury;17.8;26.8;0 +443;2010-02-16;Albury;17.6;29;0 +444;2010-02-17;Albury;15.5;30.6;0 +445;2010-02-18;Albury;NA;31.2;NA +446;2010-02-19;Albury;16.4;30.3;0 +447;2010-02-20;Albury;15.7;31.8;0 +448;2010-02-21;Albury;19.6;34.7;0.6 +449;2010-02-22;Albury;20.2;26.4;3.6 +450;2010-02-23;Albury;12.5;26.1;0.2 +451;2010-02-24;Albury;12.8;28.5;0 +452;2010-02-25;Albury;15;31;0 +453;2010-02-26;Albury;17.2;NA;0 +454;2010-02-27;Albury;NA;26.3;NA +455;2010-02-28;Albury;18.2;29.3;1.4 +456;2010-03-01;Albury;14.4;NA;0 +457;2010-03-02;Albury;11.2;28.5;NA +458;2010-03-03;Albury;12.5;31.2;0 +459;2010-03-04;Albury;15.1;NA;0 +460;2010-03-05;Albury;NA;22.3;0 +461;2010-03-06;Albury;18.8;30.3;20.6 +462;2010-03-07;Albury;18.3;22.9;5.8 +463;2010-03-08;Albury;18.1;25.5;66 +464;2010-03-09;Albury;15.7;22.4;6.2 +465;2010-03-10;Albury;8.8;NA;0 +466;2010-03-11;Albury;12.3;24.4;NA +467;2010-03-12;Albury;10.6;25;0 +468;2010-03-13;Albury;11.5;25.7;0 +469;2010-03-14;Albury;12.2;26.3;0 +470;2010-03-15;Albury;13.2;26.6;0 +471;2010-03-16;Albury;12.5;28.6;0 +472;2010-03-17;Albury;13.3;29.6;0 +473;2010-03-18;Albury;15.1;30.4;0 +474;2010-03-19;Albury;14.9;31.4;0 +475;2010-03-20;Albury;16.7;31.9;0 +476;2010-03-21;Albury;16.8;25.6;0 +477;2010-03-22;Albury;9.1;25.3;0 +478;2010-03-23;Albury;8.3;27;0 +479;2010-03-24;Albury;10.5;28.8;0 +480;2010-03-25;Albury;11.6;29.6;0 +481;2010-03-26;Albury;12.6;30;0 +482;2010-03-27;Albury;15.6;30.2;0 +483;2010-03-28;Albury;17.2;28.7;0 +484;2010-03-29;Albury;18.2;26.3;11 +485;2010-03-30;Albury;16.5;26.9;0.4 +486;2010-03-31;Albury;13.4;26.1;0 +487;2010-04-01;Albury;11.6;25.8;0 +488;2010-04-02;Albury;10;25.1;0 +489;2010-04-03;Albury;12.4;24.8;0 +490;2010-04-04;Albury;12.5;24.8;0 +491;2010-04-05;Albury;10.3;25.3;0 +492;2010-04-06;Albury;10.6;24.7;0 +493;2010-04-07;Albury;15.7;23.4;3 +494;2010-04-08;Albury;13.5;23.1;3.2 +495;2010-04-09;Albury;10.1;21.9;0 +496;2010-04-10;Albury;14.1;18.6;0.2 +497;2010-04-11;Albury;14.2;18.7;7 +498;2010-04-12;Albury;5.6;17.4;0 +499;2010-04-13;Albury;4.6;19.9;0 +500;2010-04-14;Albury;5.1;21.9;0 +501;2010-04-15;Albury;6.1;23.5;0 +502;2010-04-16;Albury;7.7;24.7;0 +503;2010-04-17;Albury;8.5;25.4;0 +504;2010-04-18;Albury;10.1;25.1;0 +505;2010-04-19;Albury;11.2;25.9;0 +506;2010-04-20;Albury;11.8;25.2;0 +507;2010-04-21;Albury;12.3;27.5;0 +508;2010-04-22;Albury;11.4;27.3;0 +509;2010-04-23;Albury;11.3;29;0 +510;2010-04-24;Albury;15.4;19.8;3.6 +511;2010-04-25;Albury;10.8;18.5;17 +512;2010-04-26;Albury;5.1;17.9;0 +513;2010-04-27;Albury;7.1;16.1;0 +514;2010-04-28;Albury;9.7;17.3;1.6 +515;2010-04-29;Albury;10.5;17.7;0.4 +516;2010-04-30;Albury;5.6;19.1;0 +517;2010-05-01;Albury;5.9;21.1;0.2 +518;2010-05-02;Albury;4.8;20.7;0 +519;2010-05-03;Albury;6.8;23;0 +520;2010-05-04;Albury;8;25.3;0.2 +521;2010-05-05;Albury;8.9;14.5;3 +522;2010-05-06;Albury;7.1;15.3;0 +523;2010-05-07;Albury;5.7;17.5;0 +524;2010-05-08;Albury;9.6;19.3;0 +525;2010-05-09;Albury;5.7;19.5;0 +526;2010-05-10;Albury;5;19.8;0 +527;2010-05-11;Albury;3;15.6;0 +528;2010-05-12;Albury;1.3;14.9;0 +529;2010-05-13;Albury;1;17.1;0 +530;2010-05-14;Albury;3.1;17.7;0.2 +531;2010-05-15;Albury;2.2;18.4;0 +532;2010-05-16;Albury;1.7;17.5;0 +533;2010-05-17;Albury;4.5;17;0 +534;2010-05-18;Albury;1.6;19.7;0 +535;2010-05-19;Albury;1.4;18.5;0 +536;2010-05-20;Albury;2.1;16.5;0 +537;2010-05-21;Albury;1.7;17.9;0 +538;2010-05-22;Albury;1.1;17.1;0 +539;2010-05-23;Albury;0.9;18.1;0 +540;2010-05-24;Albury;5.2;16.3;0 +541;2010-05-25;Albury;10.2;14.9;10.4 +542;2010-05-26;Albury;8.4;19;13.4 +543;2010-05-27;Albury;5.7;16.6;0.2 +544;2010-05-28;Albury;6.4;17;0 +545;2010-05-29;Albury;9.4;15;28 +546;2010-05-30;Albury;8.8;20.2;5.8 +547;2010-05-31;Albury;10.7;19.1;0 +548;2010-06-01;Albury;4.2;16.6;0 +549;2010-06-02;Albury;4.3;17.7;0 +550;2010-06-03;Albury;3.4;17.7;0 +551;2010-06-04;Albury;3.1;18.4;0 +552;2010-06-05;Albury;1.7;10.2;0 +553;2010-06-06;Albury;5;15.8;0 +554;2010-06-07;Albury;0.4;14;0 +555;2010-06-08;Albury;3.1;12.2;0 +556;2010-06-09;Albury;5.3;8.4;0 +557;2010-06-10;Albury;4.9;12.9;2.4 +558;2010-06-11;Albury;7.2;13.2;0 +559;2010-06-12;Albury;0;13.3;0 +560;2010-06-13;Albury;-1;13.1;0 +561;2010-06-14;Albury;-2;13.2;0 +562;2010-06-15;Albury;-0.3;12.8;0 +563;2010-06-16;Albury;1.5;15.5;0 +564;2010-06-17;Albury;7.4;16.2;11.6 +565;2010-06-18;Albury;3;12.2;2.2 +566;2010-06-19;Albury;6.9;15.2;1.8 +567;2010-06-20;Albury;3.6;13.1;0 +568;2010-06-21;Albury;5;12.5;0.4 +569;2010-06-22;Albury;3;14.8;0 +570;2010-06-23;Albury;3.5;16.5;0 +571;2010-06-24;Albury;3.4;17;0 +572;2010-06-25;Albury;7;16.1;0 +573;2010-06-26;Albury;6.2;12.1;10.2 +574;2010-06-27;Albury;0.6;11.9;0.2 +575;2010-06-28;Albury;-0.6;8.3;0 +576;2010-06-29;Albury;2.3;9.4;0 +577;2010-06-30;Albury;5.1;9.8;0.2 +578;2010-07-01;Albury;3.2;11.9;1.2 +579;2010-07-02;Albury;0.2;10.9;0.2 +580;2010-07-03;Albury;1;10.3;0 +581;2010-07-04;Albury;1.5;10.8;0 +582;2010-07-05;Albury;1.8;12.1;0.2 +583;2010-07-06;Albury;2.3;13.9;5.6 +584;2010-07-07;Albury;1.5;13.5;0 +585;2010-07-08;Albury;2.1;14.8;0.4 +586;2010-07-09;Albury;0;14.6;0 +587;2010-07-10;Albury;1.5;16.1;0 +588;2010-07-11;Albury;5;15.4;13.4 +589;2010-07-12;Albury;3.5;15.3;0.2 +590;2010-07-13;Albury;3.5;16.3;0 +591;2010-07-14;Albury;6.2;10;21.4 +592;2010-07-15;Albury;3.4;12.2;11 +593;2010-07-16;Albury;0.6;13.1;0 +594;2010-07-17;Albury;-0.4;11.5;0 +595;2010-07-18;Albury;0.7;12.8;0 +596;2010-07-19;Albury;5;13.5;1.6 +597;2010-07-20;Albury;0.5;11.6;0.2 +598;2010-07-21;Albury;0.6;12.9;0 +599;2010-07-22;Albury;-0.5;13.8;0 +600;2010-07-23;Albury;0.1;15.7;0 +601;2010-07-24;Albury;1;14.6;0 +602;2010-07-25;Albury;2.5;14.3;0.2 +603;2010-07-26;Albury;1.9;14.9;0.2 +604;2010-07-27;Albury;-1.2;15;0.2 +605;2010-07-28;Albury;2.1;12.6;0 +606;2010-07-29;Albury;5.8;14.8;6.2 +607;2010-07-30;Albury;8.9;14.9;0 +608;2010-07-31;Albury;7.5;12.3;2.2 +609;2010-08-01;Albury;7.5;10.1;4.2 +610;2010-08-02;Albury;5.4;14.7;18.6 +611;2010-08-03;Albury;1.2;15.7;0 +612;2010-08-04;Albury;1.2;9.6;0 +613;2010-08-05;Albury;NA;11.8;NA +614;2010-08-06;Albury;0.7;12.6;0.2 +615;2010-08-07;Albury;-0.6;13.1;0.2 +616;2010-08-08;Albury;-1.3;12.6;0 +617;2010-08-09;Albury;0.3;15.5;0 +618;2010-08-10;Albury;4.4;16;7.2 +619;2010-08-11;Albury;7.2;10.4;8.2 +620;2010-08-12;Albury;4.5;14.9;10.8 +621;2010-08-13;Albury;1.6;15;0 +622;2010-08-14;Albury;3.2;13;0 +623;2010-08-15;Albury;7.2;12.1;1.8 +624;2010-08-16;Albury;6.4;11.8;10.2 +625;2010-08-17;Albury;-1;12.1;3.8 +626;2010-08-18;Albury;1.3;11.8;0.2 +627;2010-08-19;Albury;5;15.1;15.4 +628;2010-08-20;Albury;4.5;11.7;2 +629;2010-08-21;Albury;6.3;12.9;0 +630;2010-08-22;Albury;2.1;15.3;0.2 +631;2010-08-23;Albury;4.1;12.8;0.2 +632;2010-08-24;Albury;6.4;13.3;1.8 +633;2010-08-25;Albury;4.2;10.7;1.8 +634;2010-08-26;Albury;5.4;11.8;9.6 +635;2010-08-27;Albury;6.8;13.4;4 +636;2010-08-28;Albury;0.9;14.4;0 +637;2010-08-29;Albury;1.9;15.2;0 +638;2010-08-30;Albury;2.3;15.4;0 +639;2010-08-31;Albury;2.9;14.2;0 +640;2010-09-01;Albury;7.1;15.1;0 +641;2010-09-02;Albury;10;16.8;0.8 +642;2010-09-03;Albury;7.1;17.6;0 +643;2010-09-04;Albury;10.1;17.7;21.8 +644;2010-09-05;Albury;9.8;14.2;20.8 +645;2010-09-06;Albury;6.8;12.8;2.4 +646;2010-09-07;Albury;2.3;15.1;1.2 +647;2010-09-08;Albury;1.7;15.9;0 +648;2010-09-09;Albury;7.2;14.7;0 +649;2010-09-10;Albury;8.1;14;24.8 +650;2010-09-11;Albury;2.6;15.9;3.2 +651;2010-09-12;Albury;4.5;16.3;0 +652;2010-09-13;Albury;6;18.7;0.4 +653;2010-09-14;Albury;5.8;19;0 +654;2010-09-15;Albury;5.5;13.6;0 +655;2010-09-16;Albury;7.5;13.4;0 +656;2010-09-17;Albury;4.3;14.3;0.2 +657;2010-09-18;Albury;3.3;13.9;0 +658;2010-09-19;Albury;2.4;16.4;0 +659;2010-09-20;Albury;2.8;18.7;0 +660;2010-09-21;Albury;5;19.6;0 +661;2010-09-22;Albury;8.6;20.1;0 +662;2010-09-23;Albury;5.7;19.9;0 +663;2010-09-24;Albury;3.7;19.1;0 +664;2010-09-25;Albury;5.6;19.7;0 +665;2010-09-26;Albury;5.4;20.6;0 +666;2010-09-27;Albury;6.5;20;0 +667;2010-09-28;Albury;5.4;14.6;0 +668;2010-09-29;Albury;3.7;14.3;0 +669;2010-09-30;Albury;-0.1;14.6;0 +670;2010-10-01;Albury;4.1;17.4;0 +671;2010-10-02;Albury;4.8;21.1;0 +672;2010-10-03;Albury;7.4;23;0 +673;2010-10-04;Albury;8.2;23.2;0 +674;2010-10-05;Albury;10.1;25.9;0 +675;2010-10-06;Albury;11.1;24.9;0 +676;2010-10-07;Albury;7.3;15.9;10 +677;2010-10-08;Albury;4.2;19;0 +678;2010-10-09;Albury;5.4;20.8;0 +679;2010-10-10;Albury;8.2;23.2;0 +680;2010-10-11;Albury;7.6;23.7;0 +681;2010-10-12;Albury;14.5;19.9;0.8 +682;2010-10-13;Albury;14.7;18;11.4 +683;2010-10-14;Albury;12.7;19.1;19 +684;2010-10-15;Albury;13.8;18.6;22.2 +685;2010-10-16;Albury;4.8;12.8;32.8 +686;2010-10-17;Albury;6.3;15.4;0 +687;2010-10-18;Albury;9.2;17.4;0 +688;2010-10-19;Albury;4.8;19;0 +689;2010-10-20;Albury;5.7;21.8;0 +690;2010-10-21;Albury;8;23.3;0 +691;2010-10-22;Albury;9.5;25.8;0 +692;2010-10-23;Albury;14.8;19;0.4 +693;2010-10-24;Albury;8.2;22.2;2.4 +694;2010-10-25;Albury;10.9;22.2;0 +695;2010-10-26;Albury;8.8;23.5;0 +696;2010-10-27;Albury;10.2;22.3;1.6 +697;2010-10-28;Albury;8.8;23.6;0 +698;2010-10-29;Albury;10.3;25.6;0 +699;2010-10-30;Albury;16;19.5;3.4 +700;2010-10-31;Albury;13.8;18.7;50.8 +701;2010-11-01;Albury;10.2;18.9;1.2 +702;2010-11-02;Albury;7.1;20.3;0 +703;2010-11-03;Albury;10.7;18;0 +704;2010-11-04;Albury;10.1;18.8;0 +705;2010-11-05;Albury;11.1;21;0 +706;2010-11-06;Albury;7.5;22.9;0 +707;2010-11-07;Albury;9.3;24.5;0 +708;2010-11-08;Albury;14.7;24.7;2.2 +709;2010-11-09;Albury;11.6;27.7;0 +710;2010-11-10;Albury;15.5;29;0 +711;2010-11-11;Albury;15.2;30.5;0.6 +712;2010-11-12;Albury;17.5;31.3;0 +713;2010-11-13;Albury;21.1;26.9;0 +714;2010-11-14;Albury;19.2;22.6;52.6 +715;2010-11-15;Albury;15.9;23.1;2.4 +716;2010-11-16;Albury;11.4;20.8;0 +717;2010-11-17;Albury;8.8;23.3;0 +718;2010-11-18;Albury;9.1;24.8;0 +719;2010-11-19;Albury;12.1;25.5;0 +720;2010-11-20;Albury;12;27.3;0 +721;2010-11-21;Albury;12.7;29.7;0 +722;2010-11-22;Albury;14.7;29.9;0 +723;2010-11-23;Albury;14.8;29.4;0 +724;2010-11-24;Albury;18.1;30.1;0 +725;2010-11-25;Albury;18.9;27.6;0 +726;2010-11-26;Albury;17.9;24.2;4 +727;2010-11-27;Albury;14.8;27.6;19.2 +728;2010-11-28;Albury;17.8;21.4;18.8 +729;2010-11-29;Albury;13.6;22.6;14.8 +730;2010-11-30;Albury;14.4;23.3;1.6 +731;2010-12-01;Albury;16.7;23.9;12 +732;2010-12-02;Albury;16.1;26.6;0.6 +733;2010-12-03;Albury;15.7;27.3;18.4 +734;2010-12-04;Albury;17.3;29.9;1.2 +735;2010-12-05;Albury;16.6;31.6;0 +736;2010-12-06;Albury;18.9;30.4;0 +737;2010-12-07;Albury;21.3;29.8;0 +738;2010-12-08;Albury;20.3;29.7;3.2 +739;2010-12-09;Albury;18;26.7;25.6 +740;2010-12-10;Albury;16.7;22.5;0 +741;2010-12-11;Albury;11.2;24.3;0 +742;2010-12-12;Albury;15;22.2;0 +743;2010-12-13;Albury;10.5;26.2;0 +744;2010-12-14;Albury;13.7;28.8;0 +745;2010-12-15;Albury;16.1;31.1;0 +746;2010-12-16;Albury;15.1;25.6;0.4 +747;2010-12-17;Albury;10.3;25.9;0 +748;2010-12-18;Albury;14;20.8;1 +749;2010-12-19;Albury;10.4;18;3 +750;2010-12-20;Albury;8.6;20.5;6.2 +751;2010-12-21;Albury;9.9;21.2;1.6 +752;2010-12-22;Albury;9.4;25.9;0 +753;2010-12-23;Albury;12.3;29.2;0 +754;2010-12-24;Albury;13.9;30.8;0 +755;2010-12-25;Albury;19.3;29.1;0 +756;2010-12-26;Albury;17.5;30;1 +757;2010-12-27;Albury;11.3;22.2;0 +758;2010-12-28;Albury;9.1;26.7;0 +759;2010-12-29;Albury;13.5;31;0 +760;2010-12-30;Albury;14.8;34;0 +761;2010-12-31;Albury;15.7;38.1;0 +762;2011-01-01;Albury;23.2;35.8;0 +763;2011-01-02;Albury;20.1;31.1;0.6 +764;2011-01-03;Albury;13.6;29.4;0 +765;2011-01-04;Albury;13.9;29.2;0 +766;2011-01-05;Albury;16;28.9;0 +767;2011-01-06;Albury;16.5;31.6;0 +768;2011-01-07;Albury;16.1;30.7;0 +769;2011-01-08;Albury;17.8;32;0 +770;2011-01-09;Albury;20.1;33;0 +771;2011-01-10;Albury;20.1;32;35 +772;2011-01-11;Albury;21.6;26.4;1.4 +773;2011-01-12;Albury;21.5;28.9;5 +774;2011-01-13;Albury;22.1;30.6;14.2 +775;2011-01-14;Albury;24;25.5;2.4 +776;2011-01-15;Albury;19.9;31.4;13.8 +777;2011-01-16;Albury;18.5;33.7;0 +778;2011-01-17;Albury;19.8;26.9;0 +779;2011-01-18;Albury;12.9;27.2;0 +780;2011-01-19;Albury;12.9;29.3;0 +781;2011-01-20;Albury;16.1;31.9;0 +782;2011-01-21;Albury;17.8;32.5;0 +783;2011-01-22;Albury;19.8;34.6;0 +784;2011-01-23;Albury;20.7;31.4;0 +785;2011-01-24;Albury;19.8;30.6;0 +786;2011-01-25;Albury;14.9;32;0 +787;2011-01-26;Albury;21.1;34.4;0 +788;2011-01-27;Albury;14.3;31.6;0 +789;2011-01-28;Albury;12.6;32.3;0 +790;2011-01-29;Albury;14.5;32;0 +791;2011-01-30;Albury;16.7;35.4;0 +792;2011-01-31;Albury;19.9;38.2;0 +793;2011-02-01;Albury;20.5;39.8;0 +794;2011-02-02;Albury;21.9;33.7;0 +795;2011-02-03;Albury;21.9;36;3.4 +796;2011-02-04;Albury;22.5;28.2;2.6 +797;2011-02-05;Albury;20.4;23;99.2 +798;2011-02-06;Albury;14.7;21.5;51 +799;2011-02-07;Albury;10.8;25.5;0 +800;2011-02-08;Albury;13.4;27.3;0 +801;2011-02-09;Albury;15;29.4;0 +802;2011-02-10;Albury;17;29.7;0 +803;2011-02-11;Albury;19.8;24.8;39.8 +804;2011-02-12;Albury;18.7;28.5;28.2 +805;2011-02-13;Albury;15.1;28.6;0 +806;2011-02-14;Albury;14.5;29.2;0 +807;2011-02-15;Albury;16.4;28;0 +808;2011-02-16;Albury;18.9;22;0.2 +809;2011-02-17;Albury;18.9;29.2;5.8 +810;2011-02-18;Albury;19.3;30.7;0 +811;2011-02-19;Albury;21.7;29;12.2 +812;2011-02-20;Albury;16.7;25.7;12.8 +813;2011-02-21;Albury;10.1;22.5;0 +814;2011-02-22;Albury;12.3;25.2;0 +815;2011-02-23;Albury;12.6;28;0.2 +816;2011-02-24;Albury;13.9;29.2;0 +817;2011-02-25;Albury;16.5;29.8;0 +818;2011-02-26;Albury;15.6;30.9;0 +819;2011-02-27;Albury;19.6;24.8;0.2 +820;2011-02-28;Albury;17.9;30;11.8 +821;2011-03-01;Albury;16;22.8;0 +822;2011-03-02;Albury;8.8;23.4;0 +823;2011-03-03;Albury;8.4;22.3;0 +824;2011-03-04;Albury;8.6;22.1;0 +825;2011-03-05;Albury;11.5;25;0 +826;2011-03-06;Albury;9.6;25.3;0 +827;2011-03-07;Albury;10.6;26.6;0 +828;2011-03-08;Albury;11.4;28.7;0 +829;2011-03-09;Albury;16.8;27;0 +830;2011-03-10;Albury;18.7;20.8;13.4 +831;2011-03-11;Albury;16.8;27;10.2 +832;2011-03-12;Albury;17.2;28.2;0.6 +833;2011-03-13;Albury;19.6;29.3;0.6 +834;2011-03-14;Albury;18.2;26.9;19.8 +835;2011-03-15;Albury;16.3;28.4;0.2 +836;2011-03-16;Albury;17.1;28.2;0.4 +837;2011-03-17;Albury;12.1;25.9;0.2 +838;2011-03-18;Albury;12.8;26.3;0 +839;2011-03-19;Albury;13.3;27.4;0 +840;2011-03-20;Albury;13.9;28.1;0 +841;2011-03-21;Albury;18.2;25.9;0 +842;2011-03-22;Albury;18.6;26.8;0 +843;2011-03-23;Albury;16.3;20.1;0 +844;2011-03-24;Albury;13.9;22;8 +845;2011-03-25;Albury;13.3;22.1;0 +846;2011-03-26;Albury;9.6;24.2;0 +847;2011-03-27;Albury;9.8;23;0 +848;2011-03-28;Albury;10.2;24.7;0 +849;2011-03-29;Albury;11.5;25.7;0 +850;2011-03-30;Albury;12.3;25.8;0 +851;2011-03-31;Albury;7.2;22.1;0.2 +852;2011-05-01;Albury;8.7;20.4;0 +853;2011-05-02;Albury;12.3;22.3;0 +854;2011-05-03;Albury;9;21.9;0 +855;2011-05-04;Albury;6.7;19;0.6 +856;2011-05-05;Albury;4.4;18.1;0.2 +857;2011-05-06;Albury;2.8;16.8;0 +858;2011-05-07;Albury;3.4;15.9;0 +859;2011-05-08;Albury;2.1;16.8;0 +860;2011-05-09;Albury;3.8;16.1;0 +861;2011-05-10;Albury;1.1;15.2;0 +862;2011-05-11;Albury;3;11;3.6 +863;2011-05-12;Albury;0.2;10.1;0.4 +864;2011-05-13;Albury;3.8;14.1;5 +865;2011-05-14;Albury;3.8;14.3;1.8 +866;2011-05-15;Albury;-0.7;13.7;0 +867;2011-05-16;Albury;0.8;11.2;0 +868;2011-05-17;Albury;0.5;15.8;0 +869;2011-05-18;Albury;2.3;17.9;0 +870;2011-05-19;Albury;2.7;16;0 +871;2011-05-20;Albury;4.5;18.6;0 +872;2011-05-21;Albury;3.3;20.5;0 +873;2011-05-22;Albury;5.8;22;0 +874;2011-05-23;Albury;10.2;15;17.4 +875;2011-05-24;Albury;8.9;15.6;3.6 +876;2011-05-25;Albury;3.1;14.7;0 +877;2011-05-26;Albury;1.3;14.9;0 +878;2011-05-27;Albury;1.9;13.8;0 +879;2011-05-28;Albury;2.6;13.9;0 +880;2011-05-29;Albury;2.5;14.8;0 +881;2011-05-30;Albury;3.6;15.9;0 +882;2011-05-31;Albury;2.8;19.4;0 +883;2011-06-01;Albury;3.1;19.8;0 +884;2011-06-02;Albury;2.9;17.6;0 +885;2011-06-03;Albury;4.3;18.3;0 +886;2011-06-04;Albury;8.5;14.8;8.8 +887;2011-06-05;Albury;2.2;12;0 +888;2011-06-06;Albury;4.9;12.8;2 +889;2011-06-07;Albury;-0.5;9.8;0 +890;2011-06-08;Albury;1.5;10.2;2.6 +891;2011-06-09;Albury;2.9;14.6;0 +892;2011-06-10;Albury;-1.1;14;0 +893;2011-06-11;Albury;-1.4;13.9;0 +894;2011-06-12;Albury;1;16.1;0.2 +895;2011-06-13;Albury;-0.3;15.9;0 +896;2011-06-14;Albury;1.7;16.7;0 +897;2011-06-15;Albury;0.5;16.9;0 +898;2011-06-16;Albury;1;16.1;0 +899;2011-06-17;Albury;3;12.6;1 +900;2011-06-18;Albury;5.7;12.5;0.2 +901;2011-06-19;Albury;3.3;11.8;0 +902;2011-06-20;Albury;7.6;14.6;3.6 +903;2011-06-21;Albury;6.6;11.6;10.6 +904;2011-06-22;Albury;5.9;11.1;0.6 +905;2011-06-23;Albury;6.2;14.2;3.4 +906;2011-06-24;Albury;2.9;13.1;0 +907;2011-06-25;Albury;5.5;15.5;0.4 +908;2011-06-26;Albury;3.2;15.7;0 +909;2011-06-27;Albury;0.9;16.4;0 +910;2011-06-28;Albury;-0.2;15.2;0 +911;2011-06-29;Albury;0.9;16.6;0 +912;2011-06-30;Albury;0.3;15.2;0 +913;2011-07-01;Albury;0.3;14.1;0 +914;2011-07-02;Albury;0.2;15.2;0 +915;2011-07-03;Albury;2.9;14.8;0 +916;2011-07-04;Albury;6.3;14.8;15.4 +917;2011-07-05;Albury;6.9;11.2;3.8 +918;2011-07-06;Albury;7;10.8;1.2 +919;2011-07-07;Albury;6.8;11.2;4.4 +920;2011-07-08;Albury;-0.5;8.3;0 +921;2011-07-09;Albury;4.3;9.2;4.2 +922;2011-07-10;Albury;6.4;11;0 +923;2011-07-11;Albury;4.7;11.8;6.6 +924;2011-07-12;Albury;5.7;10.5;0 +925;2011-07-13;Albury;7.1;9.8;0 +926;2011-07-14;Albury;-0.3;12.6;4 +927;2011-07-15;Albury;-1.6;12.1;0 +928;2011-07-16;Albury;0.2;14.1;0 +929;2011-07-17;Albury;5.3;11.1;0 +930;2011-07-18;Albury;8.4;11;8.8 +931;2011-07-19;Albury;0.4;14.5;1.8 +932;2011-07-20;Albury;0.3;16.7;0.2 +933;2011-07-21;Albury;3.5;17.2;0 +934;2011-07-22;Albury;6.9;15.6;0 +935;2011-07-23;Albury;0.1;14.6;0 +936;2011-07-24;Albury;1.6;9.3;0.2 +937;2011-07-25;Albury;5.5;13.2;16.2 +938;2011-07-26;Albury;4.1;14.1;2.2 +939;2011-07-27;Albury;0.5;14.5;0 +940;2011-07-28;Albury;0.2;13.1;0 +941;2011-07-29;Albury;-1.4;14.7;0 +942;2011-07-30;Albury;0.6;16.1;0.2 +943;2011-07-31;Albury;4.9;14.7;1 +944;2011-08-01;Albury;3.4;19;0 +945;2011-08-02;Albury;6.5;20.6;0 +946;2011-08-03;Albury;3.9;21.5;0.2 +947;2011-08-04;Albury;7.1;22.9;0 +948;2011-08-05;Albury;5.6;20.7;0 +949;2011-08-06;Albury;9.9;12.9;14.6 +950;2011-08-07;Albury;5.3;11.1;4.2 +951;2011-08-08;Albury;7.1;12.3;8.2 +952;2011-08-09;Albury;3.1;10.1;1.2 +953;2011-08-10;Albury;6.3;10.9;3.6 +954;2011-08-11;Albury;3.4;16.8;2.8 +955;2011-08-12;Albury;1.6;16.3;0 +956;2011-08-13;Albury;0.7;13.4;0 +957;2011-08-14;Albury;4.3;17.3;0 +958;2011-08-15;Albury;3.9;13.8;1.2 +959;2011-08-16;Albury;9;19.4;0.2 +960;2011-08-17;Albury;7.1;12.6;5.6 +961;2011-08-18;Albury;7.4;10.8;30.8 +962;2011-08-19;Albury;6.9;19.3;0.8 +963;2011-08-20;Albury;3.2;17.3;0 +964;2011-08-21;Albury;2.1;18;0 +965;2011-08-22;Albury;1.8;17.7;0 +966;2011-08-23;Albury;2.5;16.9;0 +967;2011-08-24;Albury;2.4;17.5;0 +968;2011-08-25;Albury;2.5;20.7;0 +969;2011-08-26;Albury;1.9;16.6;0 +970;2011-08-27;Albury;0.8;16.8;0 +971;2011-08-28;Albury;0.4;16.2;0 +972;2011-08-29;Albury;1.4;15.9;0 +973;2011-08-30;Albury;0.6;15.7;0 +974;2011-08-31;Albury;0.4;15.8;0 +975;2011-09-01;Albury;2.6;18.3;0 +976;2011-09-02;Albury;2.8;20.4;0 +977;2011-09-03;Albury;2.6;19.6;0 +978;2011-09-04;Albury;6.5;16.8;0 +979;2011-09-05;Albury;4.8;21.4;3.2 +980;2011-09-06;Albury;10.8;18.8;5 +981;2011-09-07;Albury;-0.1;14.4;1 +982;2011-09-08;Albury;0.4;15.9;0 +983;2011-09-09;Albury;2.7;14;0 +984;2011-09-10;Albury;4;NA;0.2 +985;2011-09-11;Albury;NA;NA;NA +986;2011-09-12;Albury;NA;NA;NA +987;2011-09-13;Albury;NA;15.8;NA +988;2011-09-14;Albury;0.9;20.8;NA +989;2011-09-15;Albury;1.7;17.2;0 +990;2011-09-16;Albury;4.4;20.8;0 +991;2011-09-17;Albury;3.7;21.7;0 +992;2011-09-18;Albury;5.5;23.9;0 +993;2011-09-19;Albury;5.3;26.7;0 +994;2011-09-20;Albury;10.1;13.6;1 +995;2011-09-21;Albury;1.7;18.2;3.6 +996;2011-09-22;Albury;4.4;22.1;0 +997;2011-09-23;Albury;10;18.4;0 +998;2011-09-24;Albury;1.9;18.3;0 +999;2011-09-25;Albury;8.6;19.8;1 +1000;2011-09-26;Albury;3.1;19.6;0 \ No newline at end of file diff --git a/fda-citation-service/services/src/main/java/at/tuwien/config/ZenodoConfig.java b/fda-citation-service/services/src/main/java/at/tuwien/config/ZenodoConfig.java index dc89fd5279c053112df47dd230be123540949020..c86042b67593c84ee824397ef86f42670589c21d 100644 --- a/fda-citation-service/services/src/main/java/at/tuwien/config/ZenodoConfig.java +++ b/fda-citation-service/services/src/main/java/at/tuwien/config/ZenodoConfig.java @@ -1,10 +1,9 @@ package at.tuwien.config; import at.tuwien.exception.ZenodoAuthenticationException; -import at.tuwien.utils.ZenodoTemplateInterceptor; -import com.fasterxml.jackson.databind.DeserializationFeature; +import at.tuwien.utils.ApiTemplateInterceptor; +import at.tuwien.utils.UploadTemplateInterceptor; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.Getter; @@ -49,13 +48,23 @@ public class ZenodoConfig { .registerModule(new Jdk8Module()); } - @Bean - public RestTemplate zenodo() { + @Bean("apiTemplate") + public RestTemplate apiTemplate() { + final UriBuilderFactory factory = new DefaultUriBuilderFactory(zenodoEndpoint); + final RestTemplate template = new RestTemplateBuilder() + .uriTemplateHandler(factory) + .build(); + template.setInterceptors(List.of(new ApiTemplateInterceptor())); + return template; + } + + @Bean("uploadTemplate") + public RestTemplate uploadTemplate() { final UriBuilderFactory factory = new DefaultUriBuilderFactory(zenodoEndpoint); final RestTemplate template = new RestTemplateBuilder() .uriTemplateHandler(factory) .build(); - template.setInterceptors(List.of(new ZenodoTemplateInterceptor())); + template.setInterceptors(List.of(new UploadTemplateInterceptor())); return template; } diff --git a/fda-citation-service/services/src/main/java/at/tuwien/mapper/ZenodoMapper.java b/fda-citation-service/services/src/main/java/at/tuwien/mapper/ZenodoMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..35f987b0990d06c264dce0dc8de030c23bdaee39 --- /dev/null +++ b/fda-citation-service/services/src/main/java/at/tuwien/mapper/ZenodoMapper.java @@ -0,0 +1,37 @@ +package at.tuwien.mapper; + +import at.tuwien.api.zenodo.deposit.FileBinaryRequestDto; +import at.tuwien.api.zenodo.deposit.FileRequestDto; +import org.mapstruct.Mapper; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.util.List; +import java.util.Map; + +@Mapper(componentModel = "spring") +public interface ZenodoMapper { + + default HttpEntity<MultiValueMap<String, Object>> resourceToHttpEntity(String name, byte[] resource) { + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + final HttpHeaders parts = new HttpHeaders(); + parts.setContentType(MediaType.TEXT_PLAIN); + final ByteArrayResource byteArrayResource = new ByteArrayResource(resource) { + @Override + public String getFilename() { + return name; + } + }; + MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); + body.add("file", new HttpEntity<>(byteArrayResource, parts)); + body.add("data", new HttpEntity<>(name, parts)); + return new HttpEntity<>(body, headers); + } + +} diff --git a/fda-citation-service/services/src/main/java/at/tuwien/service/FileService.java b/fda-citation-service/services/src/main/java/at/tuwien/service/FileService.java index c88a53972bea0fa7e978725d5b17654f4fbc819d..9547fc836f21729cc8997bd773d6e4702070e657 100644 --- a/fda-citation-service/services/src/main/java/at/tuwien/service/FileService.java +++ b/fda-citation-service/services/src/main/java/at/tuwien/service/FileService.java @@ -1,8 +1,14 @@ package at.tuwien.service; +import at.tuwien.api.zenodo.files.FileResponseDto; +import at.tuwien.exception.ZenodoApiException; +import at.tuwien.exception.ZenodoAuthenticationException; +import at.tuwien.exception.ZenodoNotFoundException; import org.springframework.stereotype.Service; @Service public interface FileService { + FileResponseDto createResource(Long id, String name, byte[] resource) + throws ZenodoAuthenticationException, ZenodoApiException, ZenodoNotFoundException; } diff --git a/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoFileService.java b/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoFileService.java index c9653292a0002fe5f9d6307d68b38a76be4c5b47..bb9aab2627e95f1241293ac8705eea31359e2604 100644 --- a/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoFileService.java +++ b/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoFileService.java @@ -1,9 +1,49 @@ package at.tuwien.service; +import at.tuwien.api.zenodo.files.FileResponseDto; +import at.tuwien.config.ZenodoConfig; +import at.tuwien.exception.ZenodoApiException; +import at.tuwien.exception.ZenodoAuthenticationException; +import at.tuwien.exception.ZenodoNotFoundException; +import at.tuwien.mapper.ZenodoMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; @Service public class ZenodoFileService implements FileService { + private final RestTemplate apiTemplate; + private final RestTemplate uploadTemplate; + private final ZenodoConfig zenodoConfig; + private final ZenodoMapper zenodoMapper; + + @Autowired + public ZenodoFileService(RestTemplate apiTemplate, RestTemplate uploadTemplate, ZenodoConfig zenodoConfig, + ZenodoMapper zenodoMapper) { + this.apiTemplate = apiTemplate; + this.uploadTemplate = uploadTemplate; + this.zenodoConfig = zenodoConfig; + this.zenodoMapper = zenodoMapper; + } + + @Override + public FileResponseDto createResource(Long id, String name, byte[] resource) + throws ZenodoAuthenticationException, ZenodoApiException, ZenodoNotFoundException { + final ResponseEntity<FileResponseDto> response = uploadTemplate.exchange("/api/deposit/depositions/{deposit_id}/files?access_token={token}", + HttpMethod.POST, zenodoMapper.resourceToHttpEntity(name, resource), FileResponseDto.class, id, + zenodoConfig.getApiKey()); + if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { + throw new ZenodoAuthenticationException("Token is missing or invalid."); + } + if (response.getStatusCode().equals(HttpStatus.BAD_REQUEST)) { + throw new ZenodoNotFoundException("Did not find the deposit with this id"); + } + if (response.getBody() == null) { + throw new ZenodoApiException("Endpoint returned null body"); + } + return response.getBody(); + } } diff --git a/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoMetadataService.java b/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoMetadataService.java index 4b9c63d05de0b45fab69ae7ac3eba718166f7a68..fd77a9512dcab67641d16014b4b8b1be34bb7edd 100644 --- a/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoMetadataService.java +++ b/fda-citation-service/services/src/main/java/at/tuwien/service/ZenodoMetadataService.java @@ -16,18 +16,18 @@ import java.util.List; @Service public class ZenodoMetadataService implements MetadataService { - private final RestTemplate zenodoRestTemplate; + private final RestTemplate apiTemplate; private final ZenodoConfig zenodoConfig; @Autowired - public ZenodoMetadataService(RestTemplate zenodoRestTemplate, ZenodoConfig zenodoConfig) { - this.zenodoRestTemplate = zenodoRestTemplate; + public ZenodoMetadataService(RestTemplate apiTemplate, ZenodoConfig zenodoConfig) { + this.apiTemplate = apiTemplate; this.zenodoConfig = zenodoConfig; } @Override public List<DepositResponseDto> listCitations() throws ZenodoAuthenticationException, ZenodoApiException { - final ResponseEntity<DepositResponseDto[]> response = zenodoRestTemplate.exchange("/api/deposit/depositions?access_token={token}", + final ResponseEntity<DepositResponseDto[]> response = apiTemplate.exchange("/api/deposit/depositions?access_token={token}", HttpMethod.GET, null, DepositResponseDto[].class, zenodoConfig.getApiKey()); if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { throw new ZenodoAuthenticationException("Token is missing or invalid."); @@ -40,7 +40,7 @@ public class ZenodoMetadataService implements MetadataService { @Override public DepositChangeResponseDto storeCitation() throws ZenodoAuthenticationException, ZenodoApiException { - final ResponseEntity<DepositChangeResponseDto> response = zenodoRestTemplate.exchange("/api/deposit/depositions?access_token={token}", + final ResponseEntity<DepositChangeResponseDto> response = apiTemplate.exchange("/api/deposit/depositions?access_token={token}", HttpMethod.POST, new HttpEntity<>("{}"), DepositChangeResponseDto.class, zenodoConfig.getApiKey()); if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { throw new ZenodoAuthenticationException("Token is missing or invalid."); @@ -57,7 +57,7 @@ public class ZenodoMetadataService implements MetadataService { @Override public DepositChangeResponseDto updateCitation(Long id, DepositChangeRequestDto data) throws ZenodoAuthenticationException, ZenodoApiException, ZenodoNotFoundException { - final ResponseEntity<DepositChangeResponseDto> response = zenodoRestTemplate.exchange("/api/deposit/depositions/{deposit_id}?access_token={token}", + final ResponseEntity<DepositChangeResponseDto> response = apiTemplate.exchange("/api/deposit/depositions/{deposit_id}?access_token={token}", HttpMethod.PUT, new HttpEntity<>(data), DepositChangeResponseDto.class, id, zenodoConfig.getApiKey()); if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { throw new ZenodoAuthenticationException("Token is missing or invalid."); @@ -76,7 +76,7 @@ public class ZenodoMetadataService implements MetadataService { @Override public void deleteCitation(Long id) throws ZenodoAuthenticationException, ZenodoApiException { - final ResponseEntity<String> response = zenodoRestTemplate.exchange("/api/deposit/depositions/{deposit_id}?access_token={token}", + final ResponseEntity<String> response = apiTemplate.exchange("/api/deposit/depositions/{deposit_id}?access_token={token}", HttpMethod.DELETE, null, String.class, id, zenodoConfig.getApiKey()); if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { throw new ZenodoAuthenticationException("Token is missing or invalid."); diff --git a/fda-citation-service/services/src/main/java/at/tuwien/utils/ZenodoTemplateInterceptor.java b/fda-citation-service/services/src/main/java/at/tuwien/utils/ApiTemplateInterceptor.java similarity index 89% rename from fda-citation-service/services/src/main/java/at/tuwien/utils/ZenodoTemplateInterceptor.java rename to fda-citation-service/services/src/main/java/at/tuwien/utils/ApiTemplateInterceptor.java index 73a0f8aecd0150f0506a3d20f26e0f0cc52a6f90..a8fdf392cdadb2b6b288599851ad1341993e88a7 100644 --- a/fda-citation-service/services/src/main/java/at/tuwien/utils/ZenodoTemplateInterceptor.java +++ b/fda-citation-service/services/src/main/java/at/tuwien/utils/ApiTemplateInterceptor.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; import java.io.IOException; @Service -public class ZenodoTemplateInterceptor implements ClientHttpRequestInterceptor { +public class ApiTemplateInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) diff --git a/fda-citation-service/services/src/main/java/at/tuwien/utils/UploadTemplateInterceptor.java b/fda-citation-service/services/src/main/java/at/tuwien/utils/UploadTemplateInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..392a523b57534626accf8c266af54f14ce007ee9 --- /dev/null +++ b/fda-citation-service/services/src/main/java/at/tuwien/utils/UploadTemplateInterceptor.java @@ -0,0 +1,21 @@ +package at.tuwien.utils; + +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +@Service +public class UploadTemplateInterceptor implements ClientHttpRequestInterceptor { + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) + throws IOException { + request.getHeaders().set("Content-Type", "multipart/form-data"); + request.getHeaders().set("Accept", "application/json"); + return execution.execute(request, body); + } +}