From f1df094b9ef5828c89d464b124f54bfc90eb8772 Mon Sep 17 00:00:00 2001 From: mracer0102 Date: Fri, 18 Aug 2023 15:46:34 +1000 Subject: [PATCH 01/62] Base on displayOption, find all images with Excluded or Included from profile.imageSetting and make minusQuery and change startIndex, count, availeImageCount. --- .../ala/profile/hub/BiocacheService.groovy | 8 ++- .../org/ala/profile/hub/ImageService.groovy | 58 +++++++++++++++---- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy index 571877b1..778f7ce7 100644 --- a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy @@ -49,8 +49,13 @@ class BiocacheService { private int countImages(String imageSearchUrl, String searchIdentifier, Map opus, String minusQuery = "") { String imagesQuery = constructQueryString(searchIdentifier, opus, minusQuery) +// Map params = ["q":"${imagesQuery}","facets":"multimedia","flimit":"0","foffset":"0","fq":"multimedia:Image","pageSize":"0"] +// Map result = webService.get("${imageSearchUrl}", params, ContentType.APPLICATION_JSON,false) + Map result = webService.get("${imageSearchUrl}?q=${imagesQuery}&facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0") +// Map result = webService.get("${imageSearchUrl}?facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0", [q: imagesQuery], ContentType.APPLICATION_FORM_URLENCODED) +// Map result = webService.get("${imageSearchUrl}?facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0", [q: imagesQuery]) int count = result?.resp?.totalRecords ?: 0 count @@ -76,7 +81,8 @@ class BiocacheService { int totalBiocacheImageCount = countImages(biocacheImageSearchUrl, searchIdentifier, opus) if (totalBiocacheImageCount > startIndex - 1) { - result = webService.get("${biocacheImageSearchUrl}?q=${imagesQuery}&fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets ) +// result = webService.get("${biocacheImageSearchUrl}?fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets, [q: imagesQuery]) + result = webService.get("${biocacheImageSearchUrl}?q=${imagesQuery}&fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets) int biocacheImageCount = result?.resp?.occurrences?.size() ?: 0 if (biocacheImageCount < pageSize) { if (grailsApplication.config.sandbox.biocache.service.url) { diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index e73bf2ac..e537175f 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -288,11 +288,34 @@ class ImageService { Map opus = model.opus String minusQuery = "" ImageOption opusDefaultOption = ImageOption.byName(opus.approvedImageOption, ImageOption.INCLUDE) + Integer numberOfIncludedLocalImages = 0; + + switch (opusDefaultOption) { + case ImageOption.INCLUDE: + List excluded = profile?.imageSettings.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} + if (privateImages?.size() > 0) { + List excludedPrivateImages = privateImages?.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + if (excludedPrivateImages?.size() > 0) { + numberOfIncludedLocalImages = privateImages.size() - excludedPrivateImages.size() + } else { + numberOfIncludedLocalImages = privateImages.size() + } + } - List excluded = profile?.imageSettings.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId - - if (readonlyView) { - minusQuery = excluded.collect { "-image_url: $it" }.join(' AND ') + if ((excluded?.size() > 0) && readonlyView) { + minusQuery = excluded.collect { "-image_url:$it" }.join(' AND ') + } + break + case ImageOption.EXCLUDE: + List included = profile?.imageSettings.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} + List includedPrivateImages = privateImages?.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + numberOfIncludedLocalImages = (includedPrivateImages)? includedPrivateImages.size() : 0 + if ((included?.size() > 0) && readonlyView) { + minusQuery = "(" + included.collect { "image_url:$it" }.join(' OR ') + ")" + } + break } Map numberOfPublishedImagesMap = biocacheService.imageCount(searchIdentifier, opus, minusQuery) @@ -329,12 +352,16 @@ class ImageService { } + Map publishedImagesMap = [:] //3.PUBLISHED IMAGES if (combinedImages.size() < Integer.valueOf(pageSize) && numberOfPublishedImagesMap && numberOfPublishedImagesMap?.size() > 0) { Integer newPageSize = Integer.valueOf(pageSize) - combinedImages.size() //partial page of private images - Integer newStartIndex = Integer.valueOf(startIndex) - numberOfLocalImages + combinedImages.size() +// Integer newStartIndex = Integer.valueOf(startIndex) - numberOfLocalImages + combinedImages.size() + Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : numberOfLocalImages) + combinedImages.size() + if (newStartIndex < 0) newStartIndex = 0 + List publishedImageList = [] - Map publishedImagesMap = [:] + if (readonlyView) { publishedImagesMap = biocacheService.retrieveImages(searchIdentifier, opus, newPageSize, newStartIndex, "&fl=id,image_url", minusQuery) } else { @@ -353,11 +380,18 @@ class ImageService { response.resp.images = combinedImages response.resp.count = numberOfPublishedImages + numberOfLocalImages - if (excluded && !readonlyView) { - int excludedCount = excluded?.size() - response.resp.availImagesCount = response.resp.count - excludedCount +// if (excluded && !readonlyView) { +// int excludedCount = excluded?.size() +// response.resp.availImagesCount = response.resp.count - excludedCount +// } else { +// response.resp.availImagesCount = response.resp.count +// } + + if (!readonlyView) { + response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages } else { - response.resp.availImagesCount = response.resp.count + response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) + response.resp.availImagesCount = response.resp.count } if (profile.primaryImage) { @@ -642,6 +676,10 @@ class ImageService { return ImageOption.byName(displayOptionStr, defaultOption) == ImageOption.EXCLUDE } + private static boolean isIncluded(ImageOption defaultOption, String displayOptionStr) { + return ImageOption.byName(displayOptionStr, defaultOption) == ImageOption.INCLUDE + } + def updateLocalImageMetadata(String imageId, Map metadata) { webService.post("${grailsApplication.config.profile.service.url}/image/${encPath(imageId)}/metadata", metadata, [:], ContentType.APPLICATION_JSON, true, false, profileService.getCustomHeaderWithUserId()) } From 76ca04e194a7b4d54d22886b02aa07d02383fad5 Mon Sep 17 00:00:00 2001 From: mracer0102 Date: Mon, 21 Aug 2023 11:05:19 +1000 Subject: [PATCH 02/62] delete useless codes --- .../services/au/org/ala/profile/hub/ImageService.groovy | 7 ------- 1 file changed, 7 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index e537175f..758494ba 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -380,13 +380,6 @@ class ImageService { response.resp.images = combinedImages response.resp.count = numberOfPublishedImages + numberOfLocalImages -// if (excluded && !readonlyView) { -// int excludedCount = excluded?.size() -// response.resp.availImagesCount = response.resp.count - excludedCount -// } else { -// response.resp.availImagesCount = response.resp.count -// } - if (!readonlyView) { response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages } else { From 17768487e10bee9f3727bd7db804e785c96d6162 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Tue, 22 Aug 2023 10:09:20 +1000 Subject: [PATCH 03/62] #691-Main image problem when profile contains private image --- .../au/org/ala/profile/hub/ImageService.groovy | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index e73bf2ac..191eb707 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -474,12 +474,10 @@ class ImageService { } if (!image) { - //if the primary image has been turned off, then default to the first image in biocache - if (biocacheImagesList && biocacheImagesList.size() > 0) { - // get the first image in the list - image = biocacheImagesList[0] - log.debug ("Set default primary image to first biocache list image: ") - // log.debug (toJson(image)) + //when local images exists in profile, find from profile primaryImage + if (biocacheImagesList && biocacheImagesList.size() > 0 && profile.primaryImage) { + image = biocacheImagesList.find(it -> it.imageId == profile.primaryImage) + //log.debug (toJson(image)) } else { String searchIdentifier = profile.guid ? "lsid:" + profile.guid : profile.scientificName List images = retrieveImages(opus, profile, searchIdentifier)?.resp From 8c1e83e9430b4631287af8cf1c6fcc610dd878f9 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Tue, 29 Aug 2023 11:42:54 +1000 Subject: [PATCH 04/62] remove comments codes and put comments for logic --- .../services/au/org/ala/profile/hub/BiocacheService.groovy | 6 ------ .../services/au/org/ala/profile/hub/ImageService.groovy | 2 ++ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy index 778f7ce7..8734b225 100644 --- a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy @@ -49,13 +49,7 @@ class BiocacheService { private int countImages(String imageSearchUrl, String searchIdentifier, Map opus, String minusQuery = "") { String imagesQuery = constructQueryString(searchIdentifier, opus, minusQuery) -// Map params = ["q":"${imagesQuery}","facets":"multimedia","flimit":"0","foffset":"0","fq":"multimedia:Image","pageSize":"0"] -// Map result = webService.get("${imageSearchUrl}", params, ContentType.APPLICATION_JSON,false) - Map result = webService.get("${imageSearchUrl}?q=${imagesQuery}&facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0") -// Map result = webService.get("${imageSearchUrl}?facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0", [q: imagesQuery], ContentType.APPLICATION_FORM_URLENCODED) - -// Map result = webService.get("${imageSearchUrl}?facets=multimedia&flimit=0&foffset=0&fq=multimedia:Image&pageSize=0", [q: imagesQuery]) int count = result?.resp?.totalRecords ?: 0 count diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index 758494ba..c9591d2c 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -293,6 +293,7 @@ class ImageService { switch (opusDefaultOption) { case ImageOption.INCLUDE: List excluded = profile?.imageSettings.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + //find all private images from profile imageSettings with same imageId from profile privateImages because there is no private info in imageSettings List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} if (privateImages?.size() > 0) { List excludedPrivateImages = privateImages?.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId @@ -309,6 +310,7 @@ class ImageService { break case ImageOption.EXCLUDE: List included = profile?.imageSettings.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + //find all private images from profile imageSettings with same imageId from profile privateImages because there is no private info in imageSettings List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} List includedPrivateImages = privateImages?.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId numberOfIncludedLocalImages = (includedPrivateImages)? includedPrivateImages.size() : 0 From 79e56b9d460b7bf1a2442a6e863077a407153462 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Tue, 29 Aug 2023 14:50:13 +1000 Subject: [PATCH 05/62] remove comments code and change variable name --- .../au/org/ala/profile/hub/BiocacheService.groovy | 3 +-- .../au/org/ala/profile/hub/ImageService.groovy | 11 ++++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy index 8734b225..eb26f17f 100644 --- a/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/BiocacheService.groovy @@ -75,8 +75,7 @@ class BiocacheService { int totalBiocacheImageCount = countImages(biocacheImageSearchUrl, searchIdentifier, opus) if (totalBiocacheImageCount > startIndex - 1) { -// result = webService.get("${biocacheImageSearchUrl}?fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets, [q: imagesQuery]) - result = webService.get("${biocacheImageSearchUrl}?q=${imagesQuery}&fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets) + result = webService.get("${biocacheImageSearchUrl}?q=${imagesQuery}&fq=multimedia:Image&format=json&sort=images&im=true&pageSize=${pageSize}&startIndex=${startIndex}" + relevantFacets ) int biocacheImageCount = result?.resp?.occurrences?.size() ?: 0 if (biocacheImageCount < pageSize) { if (grailsApplication.config.sandbox.biocache.service.url) { diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index c9591d2c..926a8ee8 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -286,10 +286,11 @@ class ImageService { Map model = profileService.getProfile(opusId, profileId, latest) Map profile = model.profile Map opus = model.opus - String minusQuery = "" + String includeExcludeQuery = "" ImageOption opusDefaultOption = ImageOption.byName(opus.approvedImageOption, ImageOption.INCLUDE) Integer numberOfIncludedLocalImages = 0; + switch (opusDefaultOption) { case ImageOption.INCLUDE: List excluded = profile?.imageSettings.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId @@ -305,7 +306,7 @@ class ImageService { } if ((excluded?.size() > 0) && readonlyView) { - minusQuery = excluded.collect { "-image_url:$it" }.join(' AND ') + includeExcludeQuery = excluded.collect { "-image_url:$it" }.join(' AND ') } break case ImageOption.EXCLUDE: @@ -315,12 +316,12 @@ class ImageService { List includedPrivateImages = privateImages?.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId numberOfIncludedLocalImages = (includedPrivateImages)? includedPrivateImages.size() : 0 if ((included?.size() > 0) && readonlyView) { - minusQuery = "(" + included.collect { "image_url:$it" }.join(' OR ') + ")" + includeExcludeQuery = "(" + included.collect { "image_url:$it" }.join(' OR ') + ")" } break } - Map numberOfPublishedImagesMap = biocacheService.imageCount(searchIdentifier, opus, minusQuery) + Map numberOfPublishedImagesMap = biocacheService.imageCount(searchIdentifier, opus, includeExcludeQuery) if (numberOfPublishedImagesMap && numberOfPublishedImagesMap?.resp && numberOfPublishedImagesMap?.resp?.totalRecords > 0) { numberOfPublishedImages = numberOfPublishedImagesMap?.resp?.totalRecords } @@ -365,7 +366,7 @@ class ImageService { List publishedImageList = [] if (readonlyView) { - publishedImagesMap = biocacheService.retrieveImages(searchIdentifier, opus, newPageSize, newStartIndex, "&fl=id,image_url", minusQuery) + publishedImagesMap = biocacheService.retrieveImages(searchIdentifier, opus, newPageSize, newStartIndex, "&fl=id,image_url", includeExcludeQuery) } else { publishedImagesMap = biocacheService.retrieveImages(searchIdentifier, opus, newPageSize, newStartIndex) } From e68b6d1ae7b87d5542181d963cd392d9f2ba617b Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Wed, 30 Aug 2023 14:42:07 +1000 Subject: [PATCH 06/62] change test case and add staged image case --- .../au/org/ala/profile/hub/ImageService.groovy | 13 +++++++------ .../au/org/ala/profile/hub/ImagePagingSpec.groovy | 10 ++++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index 926a8ee8..672defd0 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -282,6 +282,7 @@ class ImageService { Map response = [:] List combinedImages = [] Integer numberOfLocalImages = 0 + Integer numberOfStagedImages = 0 Integer numberOfPublishedImages = 0 Map model = profileService.getProfile(opusId, profileId, latest) Map profile = model.profile @@ -342,8 +343,9 @@ class ImageService { //2.STAGED IMAGES //we want to display the images in a specific order - private, staged, published + //unlikely private image, needs to define new numberOfStagedImages because there is no related to profile.imageSettings if (profile.privateMode && profile.stagedImages) { - numberOfLocalImages += profile.stagedImages.size() + numberOfStagedImages = profile.stagedImages.size() if (combinedImages.size() < pageSize && profile.stagedImages.size() > 0) { Integer newPageSize = pageSize - combinedImages.size() //partial page of private images Integer newStartIndex = startIndex - profile.privateImages.size() + combinedImages.size() @@ -359,8 +361,7 @@ class ImageService { //3.PUBLISHED IMAGES if (combinedImages.size() < Integer.valueOf(pageSize) && numberOfPublishedImagesMap && numberOfPublishedImagesMap?.size() > 0) { Integer newPageSize = Integer.valueOf(pageSize) - combinedImages.size() //partial page of private images -// Integer newStartIndex = Integer.valueOf(startIndex) - numberOfLocalImages + combinedImages.size() - Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : numberOfLocalImages) + combinedImages.size() + Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : numberOfLocalImages) + combinedImages.size() + numberOfStagedImages if (newStartIndex < 0) newStartIndex = 0 List publishedImageList = [] @@ -381,12 +382,12 @@ class ImageService { //we don't have support for JSON objects or serialization so this is a workaround response.resp = [:] response.resp.images = combinedImages - response.resp.count = numberOfPublishedImages + numberOfLocalImages + response.resp.count = numberOfPublishedImages + numberOfLocalImages + numberOfStagedImages if (!readonlyView) { - response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages + response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages + numberOfStagedImages } else { - response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) + response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) + numberOfStagedImages response.resp.availImagesCount = response.resp.count } diff --git a/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy index 4308f66e..23894a64 100644 --- a/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy @@ -31,6 +31,8 @@ class ImagePagingSpec extends Specification implements ServiceUnitTest Date: Thu, 31 Aug 2023 09:58:06 +1000 Subject: [PATCH 07/62] change the condition for readonly view --- .../services/au/org/ala/profile/hub/ImageService.groovy | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index 672defd0..5ebde40b 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -361,7 +361,13 @@ class ImageService { //3.PUBLISHED IMAGES if (combinedImages.size() < Integer.valueOf(pageSize) && numberOfPublishedImagesMap && numberOfPublishedImagesMap?.size() > 0) { Integer newPageSize = Integer.valueOf(pageSize) - combinedImages.size() //partial page of private images - Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : numberOfLocalImages) + combinedImages.size() + numberOfStagedImages + //if numberOfIncludedLocal Images is not exist on readonly view mode, doesn't need to count number Of local images + if (readonlyView) { + numberOfLocalImages = 0; + } + + Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0? numberOfIncludedLocalImages : numberOfLocalImages) + numberOfStagedImages) + combinedImages.size() + if (newStartIndex < 0) newStartIndex = 0 List publishedImageList = [] From e6ef8d850d7e2fe1c6415d7f0c8b408ce53b24a1 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Fri, 1 Sep 2023 14:39:11 +1000 Subject: [PATCH 08/62] Remove stagedImage case --- .../org/ala/profile/hub/ImageService.groovy | 25 +++---------------- .../ala/profile/hub/ImagePagingSpec.groovy | 7 ------ 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index 5ebde40b..eb4a5ce2 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -282,7 +282,6 @@ class ImageService { Map response = [:] List combinedImages = [] Integer numberOfLocalImages = 0 - Integer numberOfStagedImages = 0 Integer numberOfPublishedImages = 0 Map model = profileService.getProfile(opusId, profileId, latest) Map profile = model.profile @@ -341,22 +340,6 @@ class ImageService { } } - //2.STAGED IMAGES - //we want to display the images in a specific order - private, staged, published - //unlikely private image, needs to define new numberOfStagedImages because there is no related to profile.imageSettings - if (profile.privateMode && profile.stagedImages) { - numberOfStagedImages = profile.stagedImages.size() - if (combinedImages.size() < pageSize && profile.stagedImages.size() > 0) { - Integer newPageSize = pageSize - combinedImages.size() //partial page of private images - Integer newStartIndex = startIndex - profile.privateImages.size() + combinedImages.size() - List stagedImagesPaged = pageImages(profile.stagedImages, newStartIndex, newPageSize) - if (stagedImagesPaged && stagedImagesPaged.size() > 0) { - combinedImages.addAll(convertLocalImages(stagedImagesPaged, opus, profile, ImageType.STAGED, useInternalPaths, readonlyView)) - } - } - - } - Map publishedImagesMap = [:] //3.PUBLISHED IMAGES if (combinedImages.size() < Integer.valueOf(pageSize) && numberOfPublishedImagesMap && numberOfPublishedImagesMap?.size() > 0) { @@ -366,7 +349,7 @@ class ImageService { numberOfLocalImages = 0; } - Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0? numberOfIncludedLocalImages : numberOfLocalImages) + numberOfStagedImages) + combinedImages.size() + Integer newStartIndex = Integer.valueOf(startIndex) - ((numberOfIncludedLocalImages > 0? numberOfIncludedLocalImages : numberOfLocalImages)) + combinedImages.size() if (newStartIndex < 0) newStartIndex = 0 @@ -388,12 +371,12 @@ class ImageService { //we don't have support for JSON objects or serialization so this is a workaround response.resp = [:] response.resp.images = combinedImages - response.resp.count = numberOfPublishedImages + numberOfLocalImages + numberOfStagedImages + response.resp.count = numberOfPublishedImages + numberOfLocalImages if (!readonlyView) { - response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages + numberOfStagedImages + response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages } else { - response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) + numberOfStagedImages + response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) response.resp.availImagesCount = response.resp.count } diff --git a/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy index 23894a64..1bfbcc70 100644 --- a/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/hub/ImagePagingSpec.groovy @@ -35,9 +35,6 @@ class ImagePagingSpec extends Specification implements ServiceUnitTest Date: Wed, 6 Sep 2023 16:28:32 +1000 Subject: [PATCH 09/62] Change logic for filter private images based on readonly or edit and fix test case as AuthService --- .../org/ala/profile/hub/ImageService.groovy | 24 +++++++++++-------- .../org/ala/profile/hub/ApiServiceSpec.groovy | 7 +++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index eb4a5ce2..2a9f50c6 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -289,7 +289,7 @@ class ImageService { String includeExcludeQuery = "" ImageOption opusDefaultOption = ImageOption.byName(opus.approvedImageOption, ImageOption.INCLUDE) Integer numberOfIncludedLocalImages = 0; - + List includedPrivateImages = [] switch (opusDefaultOption) { case ImageOption.INCLUDE: @@ -297,12 +297,8 @@ class ImageService { //find all private images from profile imageSettings with same imageId from profile privateImages because there is no private info in imageSettings List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} if (privateImages?.size() > 0) { - List excludedPrivateImages = privateImages?.findAll { isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId - if (excludedPrivateImages?.size() > 0) { - numberOfIncludedLocalImages = privateImages.size() - excludedPrivateImages.size() - } else { - numberOfIncludedLocalImages = privateImages.size() - } + includedPrivateImages = privateImages?.findAll { !isExcluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + numberOfIncludedLocalImages = (includedPrivateImages)? includedPrivateImages.size() : 0 } if ((excluded?.size() > 0) && readonlyView) { @@ -313,7 +309,7 @@ class ImageService { List included = profile?.imageSettings.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId //find all private images from profile imageSettings with same imageId from profile privateImages because there is no private info in imageSettings List privateImages = profile?.imageSettings.findAll {profile?.privateImages?.imageId.contains(it?.imageId?.toString())} - List includedPrivateImages = privateImages?.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId + includedPrivateImages = privateImages?.findAll { isIncluded(opusDefaultOption, it?.displayOption?.toString()) }*.imageId numberOfIncludedLocalImages = (includedPrivateImages)? includedPrivateImages.size() : 0 if ((included?.size() > 0) && readonlyView) { includeExcludeQuery = "(" + included.collect { "image_url:$it" }.join(' OR ') + ")" @@ -334,14 +330,22 @@ class ImageService { if (profile.privateImages?.size() > 0) { numberOfLocalImages = profile.privateImages.size() } - List privateImagesPaged = pageImages(profile.privateImages, startIndex, pageSize) + + def filteredIncludedPrivateImages + if (readonlyView) { + filteredIncludedPrivateImages = profile.privateImages.findAll{includedPrivateImages.contains(it.imageId.toString())} + } else { + filteredIncludedPrivateImages = profile.privateImages as List + } + + List privateImagesPaged = pageImages(filteredIncludedPrivateImages, startIndex, pageSize) if (privateImagesPaged && privateImagesPaged.size() > 0) { combinedImages.addAll(convertLocalImages(privateImagesPaged, opus, profile, ImageType.PRIVATE, useInternalPaths, readonlyView)) } } Map publishedImagesMap = [:] - //3.PUBLISHED IMAGES + //2.PUBLISHED IMAGES if (combinedImages.size() < Integer.valueOf(pageSize) && numberOfPublishedImagesMap && numberOfPublishedImagesMap?.size() > 0) { Integer newPageSize = Integer.valueOf(pageSize) - combinedImages.size() //partial page of private images //if numberOfIncludedLocal Images is not exist on readonly view mode, doesn't need to count number Of local images diff --git a/src/test/groovy/au/org/ala/profile/hub/ApiServiceSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/ApiServiceSpec.groovy index 2ff7660b..56274d20 100644 --- a/src/test/groovy/au/org/ala/profile/hub/ApiServiceSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/hub/ApiServiceSpec.groovy @@ -2,6 +2,7 @@ package au.org.ala.profile.hub import au.org.ala.profile.api.ApiService import au.org.ala.ws.service.WebService +import au.org.ala.web.AuthService import grails.testing.services.ServiceUnitTest import org.grails.web.mapping.DefaultLinkGenerator import org.grails.web.mapping.UrlMappingsHolderFactoryBean @@ -23,7 +24,7 @@ class ApiServiceSpec extends Specification implements ServiceUnitTest Date: Wed, 6 Sep 2023 16:47:09 +1000 Subject: [PATCH 10/62] add new branch --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6e776764..10cf87f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,7 @@ on: - master - feature/** - hotfix/** + - #745-Problem selecting and displaying multiple images when there are private images env: TZ: Australia/Canberra From 9cb4074d3984b63e3c64c4825afe740f3d5abbab Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Wed, 13 Sep 2023 16:16:16 +1000 Subject: [PATCH 11/62] #777 Add API to list collections --- .../org/ala/profile/api/ApiController.groovy | 42 ++++++++++++++++++- .../org/ala/profile/api/ApiInterceptor.groovy | 2 + .../au/org/ala/profile/hub/UrlMappings.groovy | 1 + .../org/ala/profile/hub/ProfileService.groovy | 5 +++ .../ala/profile/api/ApiControllerSpec.groovy | 11 +++++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 7b9951d2..333a5c24 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -24,7 +24,7 @@ import au.org.ala.plugins.openapi.Path type = SecuritySchemeType.HTTP, scheme = "bearer" ) -@RequireApiKey() +//@RequireApiKey() class ApiController extends BaseController { static namespace = "v1" static allowedSortFields = ['scientificNameLower', 'lastUpdated', 'dateCreated'] @@ -34,6 +34,7 @@ class ApiController extends BaseController { MapService mapService ApiService apiService + @RequireApiKey() @Path("/api/opus/{opusId}") @Operation( summary = "Get collection (opus) details", @@ -106,6 +107,41 @@ class ApiController extends BaseController { } } + @Path("/api/opus/list") + @Operation( + summary = "Get all collection (opus) details", + operationId = "/api/opus/list", + method = "GET", + responses = [ + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + array = @ArraySchema( + schema = @Schema( + implementation = OpusResponse.class + ) + ) + ) + ), + @ApiResponse(responseCode = "400", + description = "opusId is a required parameter"), + @ApiResponse(responseCode = "403", + description = "You do not have the necessary permissions to perform this action."), + @ApiResponse(responseCode = "405", + description = "An unexpected error has occurred while processing your request."), + @ApiResponse(responseCode = "404", + description = "Collection not found"), + @ApiResponse(responseCode = "500", + description = "An unexpected error has occurred while processing your request.") + ] + ) + def getListCollections () { + List opus = profileService.getOpusList() as List + render opus as JSON + } + + @RequireApiKey() @Path("/api/opus/{opusId}/profile") @Operation( summary = "List profiles in a collection", @@ -245,6 +281,7 @@ class ApiController extends BaseController { } } + @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}") @Operation( summary = "Get a profile in a collection", @@ -333,6 +370,7 @@ class ApiController extends BaseController { } } + @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/draft") @Operation( summary = "Get a draft profile in a collection", @@ -416,6 +454,7 @@ class ApiController extends BaseController { } } + @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/image") @Operation( summary = "Get images associated with a profile", @@ -510,6 +549,7 @@ class ApiController extends BaseController { } } + @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/attribute/{attributeId}") @Operation( summary = "Get attributes of a profile in a collection", diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy index 00220bff..f0387c28 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy @@ -26,6 +26,8 @@ class ApiInterceptor { Class controllerClass = controller?.clazz def method = controllerClass?.getMethod(actionName, [] as Class[]) + if (method.name == "getListCollections") return true + if (authorization) { if (params.opusId && (opus = profileService.getOpus(params.opusId))) { params.isOpusPrivate = opus.privateCollection diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index 971755e6..8d855743 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -263,6 +263,7 @@ class UrlMappings { get "/opus/$opusId/profile/$profileId/image" (version: "1.0", controller: "api", action: "getImages", namespace: "v1") get "/opus/$opusId/profile/$profileId/attribute/$attributeId" (version: "1.0", controller: "api", action: "getAttributes", namespace: "v1") get "/opus/$opusId/profile/$profileId/draft" (version: "1.0", controller: "api", action: "getDraftProfile", namespace: "v1") + get "/opus/list" (version: "1.0", controller: "api", action: "getListCollections", namespace: "v1") } "/openapi/$action?/$id?(.$format)?"(controller: "openApi") diff --git a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy index d18e685b..d996e042 100644 --- a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy @@ -45,6 +45,11 @@ class ProfileService { webServiceWrapperService.get("${grailsApplication.config.profile.service.url}/opus/${encPath(opusId)}", [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId())?.resp } + def getOpusList() { + webServiceWrapperService.get("${grailsApplication.config.profile.service.url}/opus/list", [:], ContentType.APPLICATION_JSON, false, false, null)?.resp + } + + def updateOpus(String opusId, Map json) { webService.post("${grailsApplication.config.profile.service.url}/opus/${encPath(opusId)}", json, [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId()) } diff --git a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy index ee560ec6..270a4dbd 100644 --- a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy @@ -149,4 +149,15 @@ class ApiControllerSpec extends Specification implements ControllerUnitTest> [[uuid: 'abc',shortName:'alatest',title:'title1',desciption:'desc1',thubnailUrl:'test.png']] + + when: + controller.getListCollections() + + then: + response.status == 200 + } } From 734f254fed08660d20f6058600bd1fb50a68724b Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Wed, 13 Sep 2023 16:46:03 +1000 Subject: [PATCH 12/62] #777 remove comment --- .../controllers/au/org/ala/profile/api/ApiController.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 333a5c24..07969646 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -24,7 +24,7 @@ import au.org.ala.plugins.openapi.Path type = SecuritySchemeType.HTTP, scheme = "bearer" ) -//@RequireApiKey() + class ApiController extends BaseController { static namespace = "v1" static allowedSortFields = ['scientificNameLower', 'lastUpdated', 'dateCreated'] From 7109714220caef1445833f734773e15ff22d807a Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Thu, 14 Sep 2023 15:50:35 +1000 Subject: [PATCH 13/62] #777 change logic and use existing Opus --- .../org/ala/profile/api/ApiController.groovy | 20 +++++++++---------- .../org/ala/profile/api/ApiInterceptor.groovy | 2 -- .../au/org/ala/profile/hub/UrlMappings.groovy | 2 +- .../org/ala/profile/hub/ProfileService.groovy | 5 ----- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 07969646..590c2e53 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -1,6 +1,7 @@ package au.org.ala.profile.api import au.ala.org.ws.security.RequireApiKey +import au.org.ala.profile.domain.CollectionList import au.org.ala.profile.hub.BaseController import au.org.ala.profile.hub.MapService import au.org.ala.profile.hub.ProfileService @@ -25,6 +26,7 @@ import au.org.ala.plugins.openapi.Path scheme = "bearer" ) +@RequireApiKey() class ApiController extends BaseController { static namespace = "v1" static allowedSortFields = ['scientificNameLower', 'lastUpdated', 'dateCreated'] @@ -34,7 +36,6 @@ class ApiController extends BaseController { MapService mapService ApiService apiService - @RequireApiKey() @Path("/api/opus/{opusId}") @Operation( summary = "Get collection (opus) details", @@ -107,10 +108,10 @@ class ApiController extends BaseController { } } - @Path("/api/opus/list") + @Path("/api/opus") @Operation( - summary = "Get all collection (opus) details", - operationId = "/api/opus/list", + summary = "Get all public collections", + operationId = "/api/opus", method = "GET", responses = [ @ApiResponse( @@ -137,11 +138,12 @@ class ApiController extends BaseController { ] ) def getListCollections () { - List opus = profileService.getOpusList() as List - render opus as JSON + List opus = profileService.getOpus() as List + List filtered = opus.findAll(it-> !it.privateCollection) + .collect{new CollectionList(uuid: it.uuid, shortName:it.shortName, title:it.title, thumbnailUrl:it.thumbnailUrl, description:it.description)} + render filtered as JSON } - @RequireApiKey() @Path("/api/opus/{opusId}/profile") @Operation( summary = "List profiles in a collection", @@ -281,7 +283,6 @@ class ApiController extends BaseController { } } - @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}") @Operation( summary = "Get a profile in a collection", @@ -370,7 +371,6 @@ class ApiController extends BaseController { } } - @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/draft") @Operation( summary = "Get a draft profile in a collection", @@ -454,7 +454,6 @@ class ApiController extends BaseController { } } - @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/image") @Operation( summary = "Get images associated with a profile", @@ -549,7 +548,6 @@ class ApiController extends BaseController { } } - @RequireApiKey() @Path("/api/opus/{opusId}/profile/{profileId}/attribute/{attributeId}") @Operation( summary = "Get attributes of a profile in a collection", diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy index f0387c28..00220bff 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy @@ -26,8 +26,6 @@ class ApiInterceptor { Class controllerClass = controller?.clazz def method = controllerClass?.getMethod(actionName, [] as Class[]) - if (method.name == "getListCollections") return true - if (authorization) { if (params.opusId && (opus = profileService.getOpus(params.opusId))) { params.isOpusPrivate = opus.privateCollection diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index 8d855743..8e6e0d02 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -263,7 +263,7 @@ class UrlMappings { get "/opus/$opusId/profile/$profileId/image" (version: "1.0", controller: "api", action: "getImages", namespace: "v1") get "/opus/$opusId/profile/$profileId/attribute/$attributeId" (version: "1.0", controller: "api", action: "getAttributes", namespace: "v1") get "/opus/$opusId/profile/$profileId/draft" (version: "1.0", controller: "api", action: "getDraftProfile", namespace: "v1") - get "/opus/list" (version: "1.0", controller: "api", action: "getListCollections", namespace: "v1") + get "/opus" (version: "1.0", controller: "api", action: "getListCollections", namespace: "v1") } "/openapi/$action?/$id?(.$format)?"(controller: "openApi") diff --git a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy index d996e042..d18e685b 100644 --- a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy @@ -45,11 +45,6 @@ class ProfileService { webServiceWrapperService.get("${grailsApplication.config.profile.service.url}/opus/${encPath(opusId)}", [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId())?.resp } - def getOpusList() { - webServiceWrapperService.get("${grailsApplication.config.profile.service.url}/opus/list", [:], ContentType.APPLICATION_JSON, false, false, null)?.resp - } - - def updateOpus(String opusId, Map json) { webService.post("${grailsApplication.config.profile.service.url}/opus/${encPath(opusId)}", json, [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId()) } From 9f28e226a531f2aa901c070e28ad4ca1654c63ae Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Thu, 14 Sep 2023 15:51:43 +1000 Subject: [PATCH 14/62] #777 add pojo --- .../au/org/ala/profile/domain/CollectionList.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy diff --git a/grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy b/grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy new file mode 100644 index 00000000..56a1ee62 --- /dev/null +++ b/grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy @@ -0,0 +1,12 @@ +package au.org.ala.profile.domain + +import groovy.transform.ToString + +@ToString +class CollectionList { + String uuid + String shortName + String title + String thumbnailUrl + String description +} From d6e3c9dbb6575705fb466f40c5263781cac08726 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Thu, 14 Sep 2023 16:59:46 +1000 Subject: [PATCH 15/62] #777 add @GrantAccess and logic for grant access --- .../au/org/ala/profile/api/ApiController.groovy | 2 ++ .../au/org/ala/profile/api/ApiInterceptor.groovy | 3 +++ .../au/org/ala/profile/security/GrantAccess.groovy | 13 +++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 590c2e53..4820f585 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -5,6 +5,7 @@ import au.org.ala.profile.domain.CollectionList import au.org.ala.profile.hub.BaseController import au.org.ala.profile.hub.MapService import au.org.ala.profile.hub.ProfileService +import au.org.ala.profile.security.GrantAccess import au.org.ala.profile.security.RequiresAccessToken import grails.converters.JSON @@ -108,6 +109,7 @@ class ApiController extends BaseController { } } + @GrantAccess @Path("/api/opus") @Operation( summary = "Get all public collections", diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy index 00220bff..7ed11ca5 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy @@ -2,6 +2,7 @@ package au.org.ala.profile.api import au.org.ala.profile.hub.ProfileService import au.org.ala.profile.security.RequiresAccessToken +import au.org.ala.profile.security.GrantAccess import au.org.ala.web.AuthService import grails.converters.JSON import org.apache.http.HttpStatus @@ -38,6 +39,8 @@ class ApiInterceptor { } else { authorised = true } + } else if (method?.isAnnotationPresent(GrantAccess)){ + authorised = true } } diff --git a/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy b/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy new file mode 100644 index 00000000..b32eb50a --- /dev/null +++ b/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy @@ -0,0 +1,13 @@ +package au.org.ala.profile.security + +import java.lang.annotation.* + +/** + * Annotation to check that a valid collection-specific access token has been provided. + */ +@Target([ElementType.TYPE, ElementType.METHOD]) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface GrantAccess { + +} \ No newline at end of file From 056631b13c3003e1e5c0e89d6144c2c967e3f3a8 Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 14 Sep 2023 22:31:02 +1000 Subject: [PATCH 16/62] 4.2-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8f78d7b5..249f4d49 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -profileHubVersion=4.1 +profileHubVersion=4.2-SNAPSHOT grailsVersion=5.2.4 grailsGradlePluginVersion=5.2.3 groovyVersion=3.0.11 From 552564c87f22237a31361e2c09747454d7207fa7 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Fri, 15 Sep 2023 14:25:35 +1000 Subject: [PATCH 17/62] #647 Move the "Delete Collection" button --- .../org/ala/profile/hub/OpusController.groovy | 4 ++++ .../views/opus/_editDeleteCollectionPage.gsp | 18 ++++++++++++++++++ grails-app/views/opus/edit.gsp | 9 +++------ 3 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 grails-app/views/opus/_editDeleteCollectionPage.gsp diff --git a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy index 72b02a6a..c5119a20 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy @@ -677,6 +677,10 @@ class OpusController extends OpusBaseController { render template: "editAboutPage" } + def editDeleteCollectionPanel = { + render template: "editDeleteCollectionPage" + } + def reportPanel = { render template: "report" } diff --git a/grails-app/views/opus/_editDeleteCollectionPage.gsp b/grails-app/views/opus/_editDeleteCollectionPage.gsp new file mode 100644 index 00000000..d581bfda --- /dev/null +++ b/grails-app/views/opus/_editDeleteCollectionPage.gsp @@ -0,0 +1,18 @@ +
+ + +
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/grails-app/views/opus/edit.gsp b/grails-app/views/opus/edit.gsp index 01b150a9..88c4983d 100644 --- a/grails-app/views/opus/edit.gsp +++ b/grails-app/views/opus/edit.gsp @@ -30,12 +30,6 @@ Public View - - - @@ -127,7 +121,10 @@ + + + From 8342719018abb03da9a4724f129291bb370adf1a Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Fri, 15 Sep 2023 15:10:29 +1000 Subject: [PATCH 18/62] #647 add help text --- grails-app/views/opus/_editDeleteCollectionPage.gsp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/grails-app/views/opus/_editDeleteCollectionPage.gsp b/grails-app/views/opus/_editDeleteCollectionPage.gsp index d581bfda..19534b86 100644 --- a/grails-app/views/opus/_editDeleteCollectionPage.gsp +++ b/grails-app/views/opus/_editDeleteCollectionPage.gsp @@ -2,16 +2,21 @@
- +

+ + Error:Please note clicking delete button will delete this collection. All data of the collection will be lost and cannot be recovered. Only proceed if you are absolutely sure. +

+
+
+
From cf26e1c266dcfbb48a4d7f760370bb2bdedf6593 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Mon, 18 Sep 2023 10:14:43 +1000 Subject: [PATCH 19/62] #647 check if user is alaAdmin --- .../profileEditor/controllers/UserAccessController.js | 6 +----- grails-app/views/opus/edit.gsp | 4 +++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 1e1ff7b5..60012cc7 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -81,11 +81,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, }; self.privateModeChanged = function() { - if (self.opus.privateCollection) { - self.roles.push(userRole); - } else { - self.roles.splice(4, 1) - } + self.roles.push(userRole); }; function showPopup(user) { diff --git a/grails-app/views/opus/edit.gsp b/grails-app/views/opus/edit.gsp index 88c4983d..7d221e05 100644 --- a/grails-app/views/opus/edit.gsp +++ b/grails-app/views/opus/edit.gsp @@ -122,7 +122,9 @@ - + + + From 6cbb2be845b722d6f6af680e54fa562a9226f69b Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Mon, 18 Sep 2023 10:18:50 +1000 Subject: [PATCH 20/62] #647 revert --- .../profileEditor/controllers/UserAccessController.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 60012cc7..1e1ff7b5 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -81,7 +81,11 @@ profileEditor.controller('UserAccessController', function (messageService, util, }; self.privateModeChanged = function() { - self.roles.push(userRole); + if (self.opus.privateCollection) { + self.roles.push(userRole); + } else { + self.roles.splice(4, 1) + } }; function showPopup(user) { From dc9cc21de8d894417bdf22eda1db468e156b5dba Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Tue, 19 Sep 2023 11:04:47 +1000 Subject: [PATCH 21/62] Placeholder - Editing user roles comes back with error " User already exiss" --- .../controllers/UserAccessController.js | 12 +++++++++++- grails-app/views/opus/_editAccessControl.gsp | 12 ++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 1e1ff7b5..13568c64 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -80,11 +80,21 @@ profileEditor.controller('UserAccessController', function (messageService, util, }); }; - self.privateModeChanged = function() { + self.privateModeChanged = function(form) { if (self.opus.privateCollection) { self.roles.push(userRole); } else { self.roles.splice(4, 1) + if (form.$dirty) { + self.users = self.users.filter(it => it.role !== 'ROLE_USER') + var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; + var promise = profileService.updateUsers(self.opusId, data); + promise.then(function () { + messageService.success("User access has been successfully updated."); + }, function () { + messageService.alert("An error has occurred while updating user access."); + }); + } } }; diff --git a/grails-app/views/opus/_editAccessControl.gsp b/grails-app/views/opus/_editAccessControl.gsp index 79ee140a..b23949c9 100644 --- a/grails-app/views/opus/_editAccessControl.gsp +++ b/grails-app/views/opus/_editAccessControl.gsp @@ -21,12 +21,16 @@
When the collection is 'private' only people who have been added to the collection with at least the 'User' role will be allowed to view the profiles within the collection. +

+ + Error:When you change collection private to public, existing all users who have USER ROLE will be deleted. +

@@ -118,9 +122,9 @@
- - + +
From 333225917645b271b32e6b35f34fc0387db25e27 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Wed, 20 Sep 2023 09:24:24 +1000 Subject: [PATCH 22/62] #700 change codes for removing disabled button --- .../profileEditor/controllers/UserAccessController.js | 5 +++-- grails-app/views/opus/_editAccessControl.gsp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 13568c64..84c4e3fe 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -84,8 +84,8 @@ profileEditor.controller('UserAccessController', function (messageService, util, if (self.opus.privateCollection) { self.roles.push(userRole); } else { - self.roles.splice(4, 1) - if (form.$dirty) { + var hasRole_USER = self.users.find(it=>it.role === 'ROLE_USER') + if (form.$dirty && hasRole_USER) { self.users = self.users.filter(it => it.role !== 'ROLE_USER') var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; var promise = profileService.updateUsers(self.opusId, data); @@ -95,6 +95,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, messageService.alert("An error has occurred while updating user access."); }); } + self.roles.splice(4, 1) } }; diff --git a/grails-app/views/opus/_editAccessControl.gsp b/grails-app/views/opus/_editAccessControl.gsp index b23949c9..c3a50c83 100644 --- a/grails-app/views/opus/_editAccessControl.gsp +++ b/grails-app/views/opus/_editAccessControl.gsp @@ -122,9 +122,9 @@
- - +
From 555d64b27c350a9d1ccbde1bb236e9cd2323008b Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Wed, 20 Sep 2023 10:17:59 +1000 Subject: [PATCH 23/62] #700 fix javascript fail during build --- .../profileEditor/controllers/UserAccessController.js | 4 ++-- grails-app/views/opus/_editAccessControl.gsp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 84c4e3fe..2e9258c0 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -80,12 +80,12 @@ profileEditor.controller('UserAccessController', function (messageService, util, }); }; - self.privateModeChanged = function(form) { + self.privateModeChanged = function() { if (self.opus.privateCollection) { self.roles.push(userRole); } else { var hasRole_USER = self.users.find(it=>it.role === 'ROLE_USER') - if (form.$dirty && hasRole_USER) { + if (hasRole_USER) { self.users = self.users.filter(it => it.role !== 'ROLE_USER') var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; var promise = profileService.updateUsers(self.opusId, data); diff --git a/grails-app/views/opus/_editAccessControl.gsp b/grails-app/views/opus/_editAccessControl.gsp index c3a50c83..dce2fd9e 100644 --- a/grails-app/views/opus/_editAccessControl.gsp +++ b/grails-app/views/opus/_editAccessControl.gsp @@ -21,7 +21,7 @@
From f3fb553a11325b43715a8861e790cd3cb6574052 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Thu, 21 Sep 2023 12:49:42 +1000 Subject: [PATCH 24/62] #658 Error when saving comments --- .../profileEditor/controllers/CommentController.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js index 06301df8..6d9960ee 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js @@ -66,6 +66,7 @@ profileEditor.controller('CommentController', function (profileService, util, co messageService.success("Comment successfully saved."); var comment = null; + if (self.currentComment.uuid) { comment = find(path); comment.text = self.currentComment.text; @@ -76,6 +77,9 @@ profileEditor.controller('CommentController', function (profileService, util, co } comment.children.push(data); } else { + if (!Array.isArray(self.comments)) { + self.comments = []; + } self.comments.push(data); } From 3d334b2278b7ee63c9411782361cb78d1a408ecb Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Thu, 21 Sep 2023 12:51:59 +1000 Subject: [PATCH 25/62] #658 Error when saving comments --- .../javascripts/profileEditor/controllers/CommentController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js index 6d9960ee..f1fd17ab 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js @@ -66,7 +66,6 @@ profileEditor.controller('CommentController', function (profileService, util, co messageService.success("Comment successfully saved."); var comment = null; - if (self.currentComment.uuid) { comment = find(path); comment.text = self.currentComment.text; From ac05c49ee007909998bff91603d263f4fb209713 Mon Sep 17 00:00:00 2001 From: Steven Choi Date: Tue, 26 Sep 2023 12:57:44 +1000 Subject: [PATCH 26/62] #785 Add APIs to access images --- .../org/ala/profile/api/ApiController.groovy | 174 ++++++++++++++++++ .../org/ala/profile/api/ApiInterceptor.groovy | 2 + .../au/org/ala/profile/hub/UrlMappings.groovy | 2 + .../au/org/ala/profile/api/ApiService.groovy | 34 ++++ .../ala/profile/api/ApiControllerSpec.groovy | 55 ++++++ 5 files changed, 267 insertions(+) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 7b9951d2..7d9a3449 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -2,8 +2,11 @@ package au.org.ala.profile.api import au.ala.org.ws.security.RequireApiKey import au.org.ala.profile.hub.BaseController +import au.org.ala.profile.hub.ImageType import au.org.ala.profile.hub.MapService import au.org.ala.profile.hub.ProfileService +import au.org.ala.profile.hub.Utils +import au.org.ala.profile.security.GrantAccess import au.org.ala.profile.security.RequiresAccessToken import grails.converters.JSON @@ -510,6 +513,177 @@ class ApiController extends BaseController { } } + @GrantAccess + @Path("/api/opus/{opusId}/profile/{profileId}/image/{imageId}") + @Operation( + summary = "Get images associated with a profile", + operationId = "/api/opus/{opusId}/profile/{profileId}/image/{imageId}", + method = "GET", + responses = [ + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema( + implementation = ImageListResponse.class + ) + ), + headers = [ + @Header(name = 'X-Total-Count', description = "Total number of images", schema = @Schema(type = "integer")), + @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) + ] + ), + @ApiResponse(responseCode = "400", + description = "opusId and profileId are required parameters"), + @ApiResponse(responseCode = "403", + description = "You do not have the necessary permissions to perform this action."), + @ApiResponse(responseCode = "405", + description = "An unexpected error has occurred while processing your request."), + @ApiResponse(responseCode = "404", + description = "Opus or profile not found"), + @ApiResponse(responseCode = "500", + description = "An unexpected error has occurred while processing your request.") + ], + parameters = [ + @Parameter(name = "opusId", + in = ParameterIn.PATH, + required = true, + description = "Collection id - UUID or short name"), + @Parameter(name = "profileId", + in = ParameterIn.PATH, + required = true, + description = "Profile id - UUID or Scientific name"), + @Parameter(name = "type", + in = ParameterIn.PATH, + required = true, + description = "type - private or open"), + @Parameter(name = "Access-Token", + in = ParameterIn.HEADER, + required = false, + description = "Access token to read private collection"), + @Parameter(name = "Accept-Version", + in = ParameterIn.HEADER, + required = true, + description = "The API version", + schema = @Schema( + name = "Accept-Version", + type = "string", + defaultValue = '1.0', + allowableValues = ["1.0"] + ) + ) + ], + security = [@SecurityRequirement(name="auth"), @SecurityRequirement(name = "oauth")] + ) + def getLocalImage () { + if (!params.type) { + badRequest "type is a required parameter" + } else { + try { + ImageType type = params.type as ImageType + if (type == ImageType.PRIVATE) { + def result = apiService.displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, false) + if (result) { + response.setHeader("Content-disposition", "attachment;filename=${params.imageId}") + response.setContentType(Utils.getContentType(result)) + result.withInputStream { response.outputStream << it } + } + } + } catch (IllegalArgumentException e) { + log.warn(e) + badRequest "Invalid image type ${params.type}" + } + } + } + + @GrantAccess + @Path("/api/opus/{opusId}/profile/{profileId}/image/{imageId}") + @Operation( + summary = "Get images associated with a profile", + operationId = "/api/opus/{opusId}/profile/{profileId}/image/{imageId}", + method = "GET", + responses = [ + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema( + implementation = ImageListResponse.class + ) + ), + headers = [ + @Header(name = 'X-Total-Count', description = "Total number of images", schema = @Schema(type = "integer")), + @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) + ] + ), + @ApiResponse(responseCode = "400", + description = "opusId and profileId are required parameters"), + @ApiResponse(responseCode = "403", + description = "You do not have the necessary permissions to perform this action."), + @ApiResponse(responseCode = "405", + description = "An unexpected error has occurred while processing your request."), + @ApiResponse(responseCode = "404", + description = "Opus or profile not found"), + @ApiResponse(responseCode = "500", + description = "An unexpected error has occurred while processing your request.") + ], + parameters = [ + @Parameter(name = "opusId", + in = ParameterIn.PATH, + required = true, + description = "Collection id - UUID or short name"), + @Parameter(name = "profileId", + in = ParameterIn.PATH, + required = true, + description = "Profile id - UUID or Scientific name"), + @Parameter(name = "type", + in = ParameterIn.PATH, + required = true, + description = "type - private or open"), + @Parameter(name = "Access-Token", + in = ParameterIn.HEADER, + required = false, + description = "Access token to read private collection"), + @Parameter(name = "Accept-Version", + in = ParameterIn.HEADER, + required = true, + description = "The API version", + schema = @Schema( + name = "Accept-Version", + type = "string", + defaultValue = '1.0', + allowableValues = ["1.0"] + ) + ) + ], + security = [@SecurityRequirement(name="auth"), @SecurityRequirement(name = "oauth")] + ) + + def retrieveLocalThumbnailImage () { + if (!params.type) { + badRequest "type is a required parameter" + } else { + try { + ImageType type = params.type as ImageType + if (type == ImageType.PRIVATE) { + def result = apiService.displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, true) + if (result) { + response.setHeader("Content-disposition", "attachment;filename=${params.imageId}") + response.setContentType(Utils.getContentType(result)) + result.withInputStream { response.outputStream << it } + } + } + } catch (IllegalArgumentException e) { + log.warn(e) + badRequest "Invalid image type ${params.type}" + } + } + } + @Path("/api/opus/{opusId}/profile/{profileId}/attribute/{attributeId}") @Operation( summary = "Get attributes of a profile in a collection", diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy index 00220bff..adf01e8d 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy @@ -38,6 +38,8 @@ class ApiInterceptor { } else { authorised = true } + } else if (method?.isAnnotationPresent(GrantAccess)) { + authorised = true } } diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index 971755e6..ebc56f20 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -261,6 +261,8 @@ class UrlMappings { get "/opus/$opusId/profile" (version: "1.0", controller: "api", action: "getProfiles", namespace: "v1") get "/opus/$opusId/profile/$profileId" (version: "1.0", controller: "api", action: "get", namespace: "v1") get "/opus/$opusId/profile/$profileId/image" (version: "1.0", controller: "api", action: "getImages", namespace: "v1") + get "/opus/$opusId/profile/$profileId/image/$imageId" (version: "1.0", controller: "api", action: "getLocalImage", namespace: "v1") + get "/opus/$opusId/profile/$profileId/image/thumbnail/$imageId" (version: "1.0", controller: "api", action: "retrieveLocalThumbnailImage", namespace: "v1") get "/opus/$opusId/profile/$profileId/attribute/$attributeId" (version: "1.0", controller: "api", action: "getAttributes", namespace: "v1") get "/opus/$opusId/profile/$profileId/draft" (version: "1.0", controller: "api", action: "getDraftProfile", namespace: "v1") } diff --git a/grails-app/services/au/org/ala/profile/api/ApiService.groovy b/grails-app/services/au/org/ala/profile/api/ApiService.groovy index d702961b..8ffa81b9 100644 --- a/grails-app/services/au/org/ala/profile/api/ApiService.groovy +++ b/grails-app/services/au/org/ala/profile/api/ApiService.groovy @@ -3,6 +3,7 @@ package au.org.ala.profile.api import au.org.ala.profile.hub.ImageService import au.org.ala.profile.hub.NslService import au.org.ala.profile.hub.ProfileService +import au.org.ala.profile.hub.Utils import grails.web.mapping.LinkGenerator import static au.org.ala.profile.hub.Utils.encPath @@ -138,4 +139,37 @@ class ApiService { protected isSuccessful(int statusCode) { return statusCode >= SC_OK && statusCode <= 299 } + + def displayLocalImage(String path, String collectionId, String profileId, String fileName, Boolean thumbnail) { + if (!fileName) { + badRequest "fileId is a required parameter" + } else { + File file + String imageId = fileName.substring(0, fileName.lastIndexOf(".")) + if (thumbnail) { + String thumbnailName = makeThumbnailName(fileName) + file = new File("${path}/${collectionId}/${profileId}/${imageId}/${imageId}_thumbnails/${thumbnailName}") + if (!file.exists()) { //use the image if there is no thumbnail + file = new File("${path}/${collectionId}/${profileId}/${imageId}/${fileName}") + } + } else { + file = new File("${path}/${collectionId}/${profileId}/${imageId}/${fileName}") + } + + if (!file.exists()) { //support for version 1 file locations + file = new File("${path}/${profileId}/${fileName}") + } + if (!file.exists()) { + notFound "The requested file could not be found" + } else { + return file + } + } + } + + String makeThumbnailName(String fileName) { + String extension = Utils.getExtension(fileName) + String imageId = fileName.substring(0, fileName.lastIndexOf('.')) + "${imageId}_thumbnail${extension}" + } } diff --git a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy index ee560ec6..d1c6c3d8 100644 --- a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy @@ -149,4 +149,59 @@ class ApiControllerSpec extends Specification implements ControllerUnitTest Date: Tue, 26 Sep 2023 13:07:57 +1000 Subject: [PATCH 27/62] #785 Add GrantAccess --- .../au/org/ala/profile/security/GrantAccess.groovy | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy diff --git a/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy b/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy new file mode 100644 index 00000000..b32eb50a --- /dev/null +++ b/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy @@ -0,0 +1,13 @@ +package au.org.ala.profile.security + +import java.lang.annotation.* + +/** + * Annotation to check that a valid collection-specific access token has been provided. + */ +@Target([ElementType.TYPE, ElementType.METHOD]) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface GrantAccess { + +} \ No newline at end of file From 25cd8c381d0de0d341a1d5333ba6f1eb9339c663 Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 29 Sep 2023 15:44:30 +1000 Subject: [PATCH 28/62] #728 Add a feature to clear cache --- .../controllers/AdminController.js | 22 ++++++++++ grails-app/conf/application.yml | 3 ++ grails-app/conf/profile-ehcache.xml | 43 +++++++++++++++++++ .../ala/profile/hub/AdminController.groovy | 16 +++++++ .../au/org/ala/profile/hub/UrlMappings.groovy | 2 + grails-app/views/admin/admin.gsp | 10 +++++ 6 files changed, 96 insertions(+) create mode 100644 grails-app/conf/profile-ehcache.xml diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js index 1c76257a..69f7e684 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js @@ -35,11 +35,13 @@ profileEditor.controller('ALAAdminController', function ($http, util, messageSer }; self.tags = []; + self.cacheRegions = []; loadBackupFileList(); loadOpusList(); loadPendingJobs(); loadTags(); + cacheManagement(); self.reloadHelpUrls = function() { var promise = $http.post(util.contextRoot() + "/admin/reloadHelpUrls"); @@ -225,4 +227,24 @@ profileEditor.controller('ALAAdminController', function ($http, util, messageSer self.loadingTags = false; }); } + + function cacheManagement() { + self.loadingCacheManagement = true; + var promise = $http.get(util.contextRoot() + "/admin/cacheManagement/"); + promise.then(function (response) { + self.cacheRegions = response.data || []; + self.loadingCacheManagement = false; + }, function() { + self.loadingCacheManagement = false; + }); + } + + self.clearCache = function (cache) { + var promise = $http.get(util.contextRoot() + "/admin/clearCache/" + cache); + promise.then(function() { + messageService.success("Job clear cache for " + cache); + }, function() { + messageService.alert("Failed to clear cache the job"); + }); + } }); diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml index e1bf4180..ec5e2f24 100644 --- a/grails-app/conf/application.yml +++ b/grails-app/conf/application.yml @@ -3,6 +3,9 @@ grails: profile: web codegen: defaultPackage: au.org.ala.profile.hub + cache: + ehcache: + ehcacheXmlLocation: 'classpath:profile-ehcache.xml' gorm: reactor: # Whether to translate GORM events into Reactor events diff --git a/grails-app/conf/profile-ehcache.xml b/grails-app/conf/profile-ehcache.xml new file mode 100644 index 00000000..82b9db6d --- /dev/null +++ b/grails-app/conf/profile-ehcache.xml @@ -0,0 +1,43 @@ + + + + + + + 1 + + + 2000 + + + + + + 1 + + + 2000 + + + + + + 1 + + + 2000 + + + + + + 1 + + + 20000 + + + + \ No newline at end of file diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index b3c7a9a0..e01cf3dc 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -10,10 +10,12 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver import javax.validation.constraints.NotNull import static groovy.io.FileType.DIRECTORIES +import org.grails.plugin.cache.GrailsCacheManager class AdminController extends BaseController { WebService webService ProfileService profileService + GrailsCacheManager grailsCacheManager @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def index() { @@ -120,4 +122,18 @@ class AdminController extends BaseController { return grailsApplication.config.backupRestoreDir?: '/data/profile-service/backup/db' } + @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) + def cacheManagement() { + def cacheNames = grailsCacheManager.getCacheNames() + success cacheNames + } + + @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) + def clearCache() { + if (params.id) { + grailsCacheManager.getCache(params.id).clear() + } + render view: "admin.gsp" + } + } diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index 971755e6..156b2597 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -202,6 +202,8 @@ class UrlMappings { "/admin/job/$jobType/$jobId" controller: "admin", action: [DELETE: "deleteJob"] "/admin/job/" controller: "admin", action: [GET: "listPendingJobs"] "/admin/tag/$tagId?" controller: "admin", action: [GET: "getTag", PUT: "createTag", POST: "updateTag", DELETE: "deleteTag"] + "/admin/cacheManagement/" controller: "admin", action: [GET: "cacheManagement"] + "/admin/clearCache" controller: "admin", action: [GET: "clearCache"] "/admin/reloadHelpUrls" controller: "admin", action: [POST: "reloadHelpUrls"] "/admin" controller: "admin", action: [GET: "index"] "/alaAdmin/index" controller: "admin", action: [GET: "alaIndex"] diff --git a/grails-app/views/admin/admin.gsp b/grails-app/views/admin/admin.gsp index bb997897..23705c66 100644 --- a/grails-app/views/admin/admin.gsp +++ b/grails-app/views/admin/admin.gsp @@ -165,6 +165,16 @@

+
+

Caches Management

+
+ + + +
+
From 7fa17b943e849cc51791a918b3f260b21d3bb565 Mon Sep 17 00:00:00 2001 From: steven choi Date: Thu, 5 Oct 2023 14:22:23 +1100 Subject: [PATCH 29/62] #728 replace UI as table and remove unused import --- .../ala/profile/hub/AdminController.groovy | 4 ---- grails-app/views/admin/admin.gsp | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index e01cf3dc..cf97c683 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -3,10 +3,7 @@ package au.org.ala.profile.hub import au.org.ala.profile.security.Role import au.org.ala.profile.security.Secured import au.org.ala.ws.service.WebService -import grails.converters.JSON -import grails.util.Environment import org.apache.http.entity.ContentType -import org.springframework.core.io.support.PathMatchingResourcePatternResolver import javax.validation.constraints.NotNull import static groovy.io.FileType.DIRECTORIES @@ -135,5 +132,4 @@ class AdminController extends BaseController { } render view: "admin.gsp" } - } diff --git a/grails-app/views/admin/admin.gsp b/grails-app/views/admin/admin.gsp index 23705c66..7535b22d 100644 --- a/grails-app/views/admin/admin.gsp +++ b/grails-app/views/admin/admin.gsp @@ -167,12 +167,19 @@

Caches Management

-
- - - +
+ + + + + + + + + + + +
Cache NameCache Clear
{{ cache }}
From f4e5adfd00bec66fcff89c5578610b0ec07402d1 Mon Sep 17 00:00:00 2001 From: steven choi Date: Thu, 5 Oct 2023 16:05:59 +1100 Subject: [PATCH 30/62] #728 update APIController --- .../org/ala/profile/api/ApiController.groovy | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 7d9a3449..c4f73138 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -513,23 +513,19 @@ class ApiController extends BaseController { } } - @GrantAccess @Path("/api/opus/{opusId}/profile/{profileId}/image/{imageId}") @Operation( - summary = "Get images associated with a profile", + summary = "Get image associated with a profile", operationId = "/api/opus/{opusId}/profile/{profileId}/image/{imageId}", method = "GET", responses = [ @ApiResponse( responseCode = "200", content = @Content( - mediaType = "application/json", - schema = @Schema( - implementation = ImageListResponse.class - ) + mediaType = "image/*", + schema = @Schema(type = "String", format = "binary") ), headers = [ - @Header(name = 'X-Total-Count', description = "Total number of images", schema = @Schema(type = "integer")), @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) @@ -548,23 +544,22 @@ class ApiController extends BaseController { ], parameters = [ @Parameter(name = "opusId", - in = ParameterIn.PATH, required = true, description = "Collection id - UUID or short name"), @Parameter(name = "profileId", - in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), @Parameter(name = "type", - in = ParameterIn.PATH, required = true, - description = "type - private or open"), + description = "type - private", + schema = @Schema( + type = "string", + allowableValues = ['PRIVATE'] + ), @Parameter(name = "Access-Token", - in = ParameterIn.HEADER, required = false, description = "Access token to read private collection"), @Parameter(name = "Accept-Version", - in = ParameterIn.HEADER, required = true, description = "The API version", schema = @Schema( From f567174cc048fc63ec13de0ff56f985ea0bbaabf Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 6 Oct 2023 09:06:26 +1100 Subject: [PATCH 31/62] #785 fix code --- .../controllers/au/org/ala/profile/api/ApiController.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index c4f73138..24e30851 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -555,7 +555,8 @@ class ApiController extends BaseController { schema = @Schema( type = "string", allowableValues = ['PRIVATE'] - ), + ) + ), @Parameter(name = "Access-Token", required = false, description = "Access token to read private collection"), From c683d024db2c9dbf1c27ca7fc60013845485d1d2 Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 6 Oct 2023 11:09:10 +1100 Subject: [PATCH 32/62] #700 save button should disable when public access mode is back --- .../profileEditor/controllers/UserAccessController.js | 5 +++-- grails-app/views/opus/_editAccessControl.gsp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 2e9258c0..12da2827 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -80,7 +80,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, }); }; - self.privateModeChanged = function() { + self.privateModeChanged = function(form) { if (self.opus.privateCollection) { self.roles.push(userRole); } else { @@ -90,6 +90,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; var promise = profileService.updateUsers(self.opusId, data); promise.then(function () { + form.$setPristine(); messageService.success("User access has been successfully updated."); }, function () { messageService.alert("An error has occurred while updating user access."); @@ -142,7 +143,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, popupateUserDetails(user); }); - self.privateModeChanged(); + self.privateModeChanged(form); if (form) { form.$setPristine(); diff --git a/grails-app/views/opus/_editAccessControl.gsp b/grails-app/views/opus/_editAccessControl.gsp index dce2fd9e..c3a50c83 100644 --- a/grails-app/views/opus/_editAccessControl.gsp +++ b/grails-app/views/opus/_editAccessControl.gsp @@ -21,7 +21,7 @@
From f7f6f44ef79a1be8a879a935b49afe6d69df2d47 Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 6 Oct 2023 11:59:14 +1100 Subject: [PATCH 33/62] #700 make sure this function if reset action --- .../profileEditor/controllers/UserAccessController.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 12da2827..1b1161b3 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -124,10 +124,10 @@ profileEditor.controller('UserAccessController', function (messageService, util, } self.reset = function (form) { - loadOpus(form); + loadOpus(form, true); }; - function loadOpus(form) { + function loadOpus(form, isReset) { if (!self.opusId) { return; } @@ -143,7 +143,9 @@ profileEditor.controller('UserAccessController', function (messageService, util, popupateUserDetails(user); }); - self.privateModeChanged(form); + if (isReset) { + self.privateModeChanged(form); + } if (form) { form.$setPristine(); From 175ce3bf5c161b29576e3b568a9a3065972c3a08 Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 6 Oct 2023 13:34:13 +1100 Subject: [PATCH 34/62] #700 make sure only access option has changed --- .../controllers/UserAccessController.js | 34 +++++++++---------- grails-app/views/opus/_editAccessControl.gsp | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js index 1b1161b3..fb5a5f2d 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/UserAccessController.js @@ -80,21 +80,23 @@ profileEditor.controller('UserAccessController', function (messageService, util, }); }; - self.privateModeChanged = function(form) { + self.privateModeChanged = function(form, isOptionChanged) { if (self.opus.privateCollection) { self.roles.push(userRole); } else { - var hasRole_USER = self.users.find(it=>it.role === 'ROLE_USER') - if (hasRole_USER) { - self.users = self.users.filter(it => it.role !== 'ROLE_USER') - var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; - var promise = profileService.updateUsers(self.opusId, data); - promise.then(function () { - form.$setPristine(); - messageService.success("User access has been successfully updated."); - }, function () { - messageService.alert("An error has occurred while updating user access."); - }); + if (isOptionChanged) { + var hasRole_USER = self.users.find(it => it.role === 'ROLE_USER') + if (hasRole_USER) { + self.users = self.users.filter(it => it.role !== 'ROLE_USER') + var data = {privateCollection: self.opus.privateCollection, authorities: self.users}; + var promise = profileService.updateUsers(self.opusId, data); + promise.then(function () { + form.$setPristine(); + messageService.success("User access has been successfully updated."); + }, function () { + messageService.alert("An error has occurred while updating user access."); + }); + } } self.roles.splice(4, 1) } @@ -124,10 +126,10 @@ profileEditor.controller('UserAccessController', function (messageService, util, } self.reset = function (form) { - loadOpus(form, true); + loadOpus(form); }; - function loadOpus(form, isReset) { + function loadOpus(form) { if (!self.opusId) { return; } @@ -143,9 +145,7 @@ profileEditor.controller('UserAccessController', function (messageService, util, popupateUserDetails(user); }); - if (isReset) { - self.privateModeChanged(form); - } + self.privateModeChanged(); if (form) { form.$setPristine(); diff --git a/grails-app/views/opus/_editAccessControl.gsp b/grails-app/views/opus/_editAccessControl.gsp index c3a50c83..1439483f 100644 --- a/grails-app/views/opus/_editAccessControl.gsp +++ b/grails-app/views/opus/_editAccessControl.gsp @@ -21,7 +21,7 @@
From afa67ccca1d6a9019fe8e7e21b98066fcbc02580 Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 6 Oct 2023 16:36:47 +1100 Subject: [PATCH 35/62] #785 chang logic as code review comments --- .../org/ala/profile/api/ApiController.groovy | 70 ++++--------------- .../org/ala/profile/api/ApiInterceptor.groovy | 2 - .../au/org/ala/profile/api/ApiService.groovy | 33 --------- .../ala/profile/security/GrantAccess.groovy | 13 ---- 4 files changed, 15 insertions(+), 103 deletions(-) delete mode 100644 src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 24e30851..b6bd72d4 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -2,11 +2,8 @@ package au.org.ala.profile.api import au.ala.org.ws.security.RequireApiKey import au.org.ala.profile.hub.BaseController -import au.org.ala.profile.hub.ImageType import au.org.ala.profile.hub.MapService import au.org.ala.profile.hub.ProfileService -import au.org.ala.profile.hub.Utils -import au.org.ala.profile.security.GrantAccess import au.org.ala.profile.security.RequiresAccessToken import grails.converters.JSON @@ -573,44 +570,24 @@ class ApiController extends BaseController { ], security = [@SecurityRequirement(name="auth"), @SecurityRequirement(name = "oauth")] ) - def getLocalImage () { - if (!params.type) { - badRequest "type is a required parameter" - } else { - try { - ImageType type = params.type as ImageType - if (type == ImageType.PRIVATE) { - def result = apiService.displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, false) - if (result) { - response.setHeader("Content-disposition", "attachment;filename=${params.imageId}") - response.setContentType(Utils.getContentType(result)) - result.withInputStream { response.outputStream << it } - } - } - } catch (IllegalArgumentException e) { - log.warn(e) - badRequest "Invalid image type ${params.type}" - } - } + + def getLocalImage() { + forward controller: "profile", action: "getLocalImage", namespace: "v1" } - @GrantAccess - @Path("/api/opus/{opusId}/profile/{profileId}/image/{imageId}") + @Path("/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{imageId}") @Operation( - summary = "Get images associated with a profile", - operationId = "/api/opus/{opusId}/profile/{profileId}/image/{imageId}", + summary = "Get thumbnail image associated with a profile", + operationId = "/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{imageId}", method = "GET", responses = [ @ApiResponse( responseCode = "200", content = @Content( - mediaType = "application/json", - schema = @Schema( - implementation = ImageListResponse.class - ) + mediaType = "image/*", + schema = @Schema(type = "String", format = "binary") ), headers = [ - @Header(name = 'X-Total-Count', description = "Total number of images", schema = @Schema(type = "integer")), @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) @@ -629,23 +606,23 @@ class ApiController extends BaseController { ], parameters = [ @Parameter(name = "opusId", - in = ParameterIn.PATH, required = true, description = "Collection id - UUID or short name"), @Parameter(name = "profileId", - in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), @Parameter(name = "type", - in = ParameterIn.PATH, required = true, - description = "type - private or open"), + description = "type - private", + schema = @Schema( + type = "string", + allowableValues = ['PRIVATE'] + ) + ), @Parameter(name = "Access-Token", - in = ParameterIn.HEADER, required = false, description = "Access token to read private collection"), @Parameter(name = "Accept-Version", - in = ParameterIn.HEADER, required = true, description = "The API version", schema = @Schema( @@ -660,24 +637,7 @@ class ApiController extends BaseController { ) def retrieveLocalThumbnailImage () { - if (!params.type) { - badRequest "type is a required parameter" - } else { - try { - ImageType type = params.type as ImageType - if (type == ImageType.PRIVATE) { - def result = apiService.displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, true) - if (result) { - response.setHeader("Content-disposition", "attachment;filename=${params.imageId}") - response.setContentType(Utils.getContentType(result)) - result.withInputStream { response.outputStream << it } - } - } - } catch (IllegalArgumentException e) { - log.warn(e) - badRequest "Invalid image type ${params.type}" - } - } + forward controller: "profile", action: "retrieveLocalThumbnailImage", namespace: "v1" } @Path("/api/opus/{opusId}/profile/{profileId}/attribute/{attributeId}") diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy index adf01e8d..00220bff 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiInterceptor.groovy @@ -38,8 +38,6 @@ class ApiInterceptor { } else { authorised = true } - } else if (method?.isAnnotationPresent(GrantAccess)) { - authorised = true } } diff --git a/grails-app/services/au/org/ala/profile/api/ApiService.groovy b/grails-app/services/au/org/ala/profile/api/ApiService.groovy index 8ffa81b9..fe06f1f0 100644 --- a/grails-app/services/au/org/ala/profile/api/ApiService.groovy +++ b/grails-app/services/au/org/ala/profile/api/ApiService.groovy @@ -139,37 +139,4 @@ class ApiService { protected isSuccessful(int statusCode) { return statusCode >= SC_OK && statusCode <= 299 } - - def displayLocalImage(String path, String collectionId, String profileId, String fileName, Boolean thumbnail) { - if (!fileName) { - badRequest "fileId is a required parameter" - } else { - File file - String imageId = fileName.substring(0, fileName.lastIndexOf(".")) - if (thumbnail) { - String thumbnailName = makeThumbnailName(fileName) - file = new File("${path}/${collectionId}/${profileId}/${imageId}/${imageId}_thumbnails/${thumbnailName}") - if (!file.exists()) { //use the image if there is no thumbnail - file = new File("${path}/${collectionId}/${profileId}/${imageId}/${fileName}") - } - } else { - file = new File("${path}/${collectionId}/${profileId}/${imageId}/${fileName}") - } - - if (!file.exists()) { //support for version 1 file locations - file = new File("${path}/${profileId}/${fileName}") - } - if (!file.exists()) { - notFound "The requested file could not be found" - } else { - return file - } - } - } - - String makeThumbnailName(String fileName) { - String extension = Utils.getExtension(fileName) - String imageId = fileName.substring(0, fileName.lastIndexOf('.')) - "${imageId}_thumbnail${extension}" - } } diff --git a/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy b/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy deleted file mode 100644 index b32eb50a..00000000 --- a/src/main/groovy/au/org/ala/profile/security/GrantAccess.groovy +++ /dev/null @@ -1,13 +0,0 @@ -package au.org.ala.profile.security - -import java.lang.annotation.* - -/** - * Annotation to check that a valid collection-specific access token has been provided. - */ -@Target([ElementType.TYPE, ElementType.METHOD]) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface GrantAccess { - -} \ No newline at end of file From d8ef7833063b4349dde8852e7b2c833117350f98 Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 9 Oct 2023 09:27:01 +1100 Subject: [PATCH 36/62] #785 chang logic as code review comments --- .../ala/profile/api/ApiControllerSpec.groovy | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy index d1c6c3d8..b88f5f68 100644 --- a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy @@ -150,24 +150,8 @@ class ApiControllerSpec extends Specification implements ControllerUnitTest Date: Mon, 9 Oct 2023 13:18:25 +1100 Subject: [PATCH 37/62] #785 fix as comment --- .../org/ala/profile/api/ApiController.groovy | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index b6bd72d4..fd6a0379 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -541,12 +541,19 @@ class ApiController extends BaseController { ], parameters = [ @Parameter(name = "opusId", + in = ParameterIn.PATH, required = true, description = "Collection id - UUID or short name"), @Parameter(name = "profileId", + in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), + @Parameter(name = "imageId", + in = ParameterIn.PATH, + required = true, + description = "Image id - UUID or Scientific name"), @Parameter(name = "type", + in = ParameterIn.QUERY, required = true, description = "type - private", schema = @Schema( @@ -555,9 +562,11 @@ class ApiController extends BaseController { ) ), @Parameter(name = "Access-Token", + in = ParameterIn.HEADER, required = false, description = "Access token to read private collection"), @Parameter(name = "Accept-Version", + in = ParameterIn.HEADER, required = true, description = "The API version", schema = @Schema( @@ -572,7 +581,7 @@ class ApiController extends BaseController { ) def getLocalImage() { - forward controller: "profile", action: "getLocalImage", namespace: "v1" + forward controller: "profile", action: "getLocalImage" } @Path("/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{imageId}") @@ -606,12 +615,19 @@ class ApiController extends BaseController { ], parameters = [ @Parameter(name = "opusId", + in = ParameterIn.PATH, required = true, description = "Collection id - UUID or short name"), @Parameter(name = "profileId", + in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), + @Parameter(name = "imageId", + in = ParameterIn.PATH, + required = true, + description = "Image id - UUID or Scientific name"), @Parameter(name = "type", + in = ParameterIn.QUERY, required = true, description = "type - private", schema = @Schema( @@ -620,9 +636,11 @@ class ApiController extends BaseController { ) ), @Parameter(name = "Access-Token", + in = ParameterIn.HEADER, required = false, description = "Access token to read private collection"), @Parameter(name = "Accept-Version", + in = ParameterIn.HEADER, required = true, description = "The API version", schema = @Schema( @@ -637,7 +655,7 @@ class ApiController extends BaseController { ) def retrieveLocalThumbnailImage () { - forward controller: "profile", action: "retrieveLocalThumbnailImage", namespace: "v1" + forward controller: "profile", action: "retrieveLocalThumbnailImage" } @Path("/api/opus/{opusId}/profile/{profileId}/attribute/{attributeId}") From fa0e082d489b9e5c95f657da27efce7cf64dfdb8 Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 9 Oct 2023 13:35:13 +1100 Subject: [PATCH 38/62] #790 Adding a private image on gives error --- grails-app/services/au/org/ala/profile/hub/ImageService.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy index 2a9f50c6..816ef86b 100644 --- a/grails-app/services/au/org/ala/profile/hub/ImageService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ImageService.groovy @@ -378,7 +378,7 @@ class ImageService { response.resp.count = numberOfPublishedImages + numberOfLocalImages if (!readonlyView) { - response.resp.availImagesCount = publishedImagesMap?.resp?.totalRecords + numberOfLocalImages + response.resp.availImagesCount = (publishedImagesMap.resp?publishedImagesMap?.resp?.totalRecords:0) + numberOfLocalImages } else { response.resp.count = numberOfPublishedImages + ((numberOfIncludedLocalImages > 0)? numberOfIncludedLocalImages : 0) response.resp.availImagesCount = response.resp.count From ce5f56d46212ae7a9c527a1fd53582a8efdb79f8 Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 9 Oct 2023 13:55:33 +1100 Subject: [PATCH 39/62] #777 fix them as comments --- .../controllers/au/org/ala/profile/api/ApiController.groovy | 3 +-- .../au/org/ala/profile/{domain => api}/CollectionList.groovy | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename grails-app/controllers/au/org/ala/profile/{domain => api}/CollectionList.groovy (83%) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index 4820f585..06580107 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -1,7 +1,6 @@ package au.org.ala.profile.api import au.ala.org.ws.security.RequireApiKey -import au.org.ala.profile.domain.CollectionList import au.org.ala.profile.hub.BaseController import au.org.ala.profile.hub.MapService import au.org.ala.profile.hub.ProfileService @@ -122,7 +121,7 @@ class ApiController extends BaseController { mediaType = "application/json", array = @ArraySchema( schema = @Schema( - implementation = OpusResponse.class + implementation = CollectionList.class ) ) ) diff --git a/grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy b/grails-app/controllers/au/org/ala/profile/api/CollectionList.groovy similarity index 83% rename from grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy rename to grails-app/controllers/au/org/ala/profile/api/CollectionList.groovy index 56a1ee62..e5f0131b 100644 --- a/grails-app/controllers/au/org/ala/profile/domain/CollectionList.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/CollectionList.groovy @@ -1,4 +1,4 @@ -package au.org.ala.profile.domain +package au.org.ala.profile.api import groovy.transform.ToString From b446fc1147aca712e9c6cd5d956ae6c790258cab Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 9 Oct 2023 14:41:32 +1100 Subject: [PATCH 40/62] #777 move class --- .../main/groovy}/au/org/ala/profile/api/CollectionList.groovy | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {grails-app/controllers => src/main/groovy}/au/org/ala/profile/api/CollectionList.groovy (100%) diff --git a/grails-app/controllers/au/org/ala/profile/api/CollectionList.groovy b/src/main/groovy/au/org/ala/profile/api/CollectionList.groovy similarity index 100% rename from grails-app/controllers/au/org/ala/profile/api/CollectionList.groovy rename to src/main/groovy/au/org/ala/profile/api/CollectionList.groovy From 1a3c819a6d042342b88780ea433b5ec025e32cb5 Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 9 Oct 2023 15:33:01 +1100 Subject: [PATCH 41/62] #785 fix as comments --- .../controllers/au/org/ala/profile/api/ApiController.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index fd6a0379..4141cf6c 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -551,7 +551,7 @@ class ApiController extends BaseController { @Parameter(name = "imageId", in = ParameterIn.PATH, required = true, - description = "Image id - UUID or Scientific name"), + description = "Image id - UUID"), @Parameter(name = "type", in = ParameterIn.QUERY, required = true, @@ -625,7 +625,7 @@ class ApiController extends BaseController { @Parameter(name = "imageId", in = ParameterIn.PATH, required = true, - description = "Image id - UUID or Scientific name"), + description = "Image id - UUID"), @Parameter(name = "type", in = ParameterIn.QUERY, required = true, From a5cfb6e9f1fd1d80c518b1db4908d420003d2d5b Mon Sep 17 00:00:00 2001 From: steven choi Date: Wed, 11 Oct 2023 10:40:54 +1100 Subject: [PATCH 42/62] #728 fix as comments --- .../profileEditor/controllers/AdminController.js | 12 ++++++++---- .../au/org/ala/profile/hub/AdminController.groovy | 8 +++++++- .../au/org/ala/profile/hub/UrlMappings.groovy | 4 ++-- grails-app/views/admin/admin.gsp | 6 ++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js index 69f7e684..9239bcd0 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js @@ -230,7 +230,7 @@ profileEditor.controller('ALAAdminController', function ($http, util, messageSer function cacheManagement() { self.loadingCacheManagement = true; - var promise = $http.get(util.contextRoot() + "/admin/cacheManagement/"); + var promise = $http.get(util.contextRoot() + "/admin/cacheManagement"); promise.then(function (response) { self.cacheRegions = response.data || []; self.loadingCacheManagement = false; @@ -241,10 +241,14 @@ profileEditor.controller('ALAAdminController', function ($http, util, messageSer self.clearCache = function (cache) { var promise = $http.get(util.contextRoot() + "/admin/clearCache/" + cache); - promise.then(function() { - messageService.success("Job clear cache for " + cache); + promise.then(function(response) { + if (response.data.error) { + messageService.alert(response.data.error); + } else { + messageService.success(response.data.resp); + } }, function() { - messageService.alert("Failed to clear cache the job"); + messageService.alert(response.data.error); }); } }); diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index cf97c683..25fdbfe6 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -127,9 +127,15 @@ class AdminController extends BaseController { @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def clearCache() { + Map result = [:] if (params.id) { grailsCacheManager.getCache(params.id).clear() + result.resp = "Successfully cleared cache - " + params.id + result.statusCode = HttpStatus.SC_OK + } else { + result.error = "Failed to clear cache the job" + result.statusCode = HttpStatus.SC_INTERNAL_SERVER_ERROR } - render view: "admin.gsp" + success result } } diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index 156b2597..3d00d407 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -202,8 +202,8 @@ class UrlMappings { "/admin/job/$jobType/$jobId" controller: "admin", action: [DELETE: "deleteJob"] "/admin/job/" controller: "admin", action: [GET: "listPendingJobs"] "/admin/tag/$tagId?" controller: "admin", action: [GET: "getTag", PUT: "createTag", POST: "updateTag", DELETE: "deleteTag"] - "/admin/cacheManagement/" controller: "admin", action: [GET: "cacheManagement"] - "/admin/clearCache" controller: "admin", action: [GET: "clearCache"] + "/admin/cacheManagement" controller: "admin", action: [GET: "cacheManagement"] + "/admin/clearCache/$id" controller: "admin", action: [GET: "clearCache"] "/admin/reloadHelpUrls" controller: "admin", action: [POST: "reloadHelpUrls"] "/admin" controller: "admin", action: [GET: "index"] "/alaAdmin/index" controller: "admin", action: [GET: "alaIndex"] diff --git a/grails-app/views/admin/admin.gsp b/grails-app/views/admin/admin.gsp index 7535b22d..49db8f18 100644 --- a/grails-app/views/admin/admin.gsp +++ b/grails-app/views/admin/admin.gsp @@ -170,8 +170,10 @@
- - + + + + From c12a994c76b202919fee5cad5ae91fe1a3dee42c Mon Sep 17 00:00:00 2001 From: steven choi Date: Wed, 11 Oct 2023 15:43:19 +1100 Subject: [PATCH 43/62] #728 write test case --- .../profile/hub/AdminControllerSpec.groovy | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy diff --git a/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy new file mode 100644 index 00000000..c23f9592 --- /dev/null +++ b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy @@ -0,0 +1,31 @@ +package au.org.ala.profile.hub + +import grails.testing.web.controllers.ControllerUnitTest +import org.apache.http.HttpStatus +import spock.lang.Specification + +class AdminControllerSpec extends Specification implements ControllerUnitTest { + + AdminController mockAdminController + + def setup() { + mockAdminController = Mock(AdminController) + } + + def "cache management should display to the admin controller when admin mode"() { + when: + mockAdminController.cacheManagement() + + then: + assert response.status == HttpStatus.SC_OK + } + + def "clearCache() should return a 200 (OK_REQUEST) if id has been provided"() { + when: + params.id = "userDetailsCache" + mockAdminController.clearCache() + + then: + response.status == HttpStatus.SC_OK + } +} From 818b019f8cb5531e49e1d8a437dfd9bd491f18e0 Mon Sep 17 00:00:00 2001 From: steven choi Date: Wed, 11 Oct 2023 16:31:55 +1100 Subject: [PATCH 44/62] #728 add send error and HttpStatus --- .../controllers/au/org/ala/profile/hub/AdminController.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index 25fdbfe6..49c63f9b 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -3,6 +3,7 @@ package au.org.ala.profile.hub import au.org.ala.profile.security.Role import au.org.ala.profile.security.Secured import au.org.ala.ws.service.WebService +import org.apache.http.HttpStatus import org.apache.http.entity.ContentType import javax.validation.constraints.NotNull @@ -132,10 +133,11 @@ class AdminController extends BaseController { grailsCacheManager.getCache(params.id).clear() result.resp = "Successfully cleared cache - " + params.id result.statusCode = HttpStatus.SC_OK + success result } else { result.error = "Failed to clear cache the job" result.statusCode = HttpStatus.SC_INTERNAL_SERVER_ERROR + sendError result } - success result } } From 0103d971477a7ec1f11d56dbe48307bdf48290b2 Mon Sep 17 00:00:00 2001 From: Steven Choi <141379969+schoicsiro@users.noreply.github.com> Date: Fri, 13 Oct 2023 11:40:16 +1100 Subject: [PATCH 45/62] Feature/#781 (#782) * #781 remove PDF export --- build.gradle | 34 - .../profileEditor/templates/exportPdf.tpl.htm | 49 - grails-app/conf/jasperreports.properties | 3 - .../reports/profiles/Acacia-paradoxa-DC.json | 6048 ----------------- .../conf/reports/profiles/PROFILES.jrxml | 117 - .../reports/profiles/PROFILES_backcover.jrxml | 42 - .../reports/profiles/PROFILES_colophon.jrxml | 132 - .../reports/profiles/PROFILES_cover.jrxml | 154 - .../reports/profiles/PROFILES_detail.jrxml | 277 - .../PROFILES_detail_acknowledgements.jrxml | 77 - .../profiles/PROFILES_detail_attributes.jrxml | 116 - .../profiles/PROFILES_detail_bhl.jrxml | 182 - .../PROFILES_detail_bibliography.jrxml | 66 - .../PROFILES_detail_conservation.jrxml | 65 - .../profiles/PROFILES_detail_images.jrxml | 135 - .../profiles/PROFILES_detail_key.jrxml | 49 - .../profiles/PROFILES_detail_key_item.jrxml | 31 - .../profiles/PROFILES_detail_links.jrxml | 70 - .../profiles/PROFILES_detail_map.jrxml | 73 - .../PROFILES_detail_nomenclature.jrxml | 77 - .../profiles/PROFILES_detail_specimens.jrxml | 125 - .../profiles/PROFILES_detail_status.jrxml | 64 - .../profiles/PROFILES_detail_taxonomy.jrxml | 67 - .../reports/profiles/PROFILES_styles.jrtx | 33 - .../conf/reports/profiles/PROFILES_toc.jrxml | 172 - .../profiles/img/ALA-logo-inline-reverse.png | Bin 9940 -> 0 bytes .../reports/profiles/img/ALA-logo-inline.png | Bin 10546 -> 0 bytes .../conf/reports/profiles/img/Gahnia.png | Bin 245578 -> 0 bytes .../conf/reports/profiles/img/PDF banner.png | Bin 222993 -> 0 bytes .../img/atlas-poweredby_rgb-lightbg.png | Bin 7003 -> 0 bytes .../conf/reports/profiles/img/gahnia2.png | Bin 346285 -> 0 bytes .../conf/reports/profiles/img/gradient.svg | 11 - grails-app/conf/reports/profiles/img/wave.png | Bin 199983 -> 0 bytes .../ala/profile/hub/ExportController.groovy | 72 - .../ala/profile/hub/ProfileController.groovy | 53 - .../ala/profile/hub/jobs/AsynchPDFJob.groovy | 69 - .../org/ala/profile/hub/ExportService.groovy | 795 --- .../org/ala/profile/hub/JasperService.groovy | 348 - .../org/ala/profile/hub/ProfileService.groovy | 6 - grails-app/views/pdf/_pdfFooter.gsp | 32 - grails-app/views/pdf/_pdfHeader.gsp | 28 - grails-app/views/pdf/_profile.gsp | 187 - grails-app/views/profile/_optionsMenu.gsp | 7 - grails-app/views/profile/_publications.gsp | 14 - .../hub/reports/BackCoverImageRenderer.groovy | 195 - .../hub/reports/GradientRenderer.groovy | 59 - .../hub/reports/JasperExportFormat.groovy | 123 - .../hub/reports/JasperReportDef.groovy | 140 - .../AccessControlInterceptorSpec.groovy | 12 - .../ala/profile/hub/ExportServiceSpec.groovy | 64 - .../specs/controllers/ReportControllerSpec.js | 118 - 51 files changed, 10591 deletions(-) delete mode 100644 grails-app/assets/javascripts/profileEditor/templates/exportPdf.tpl.htm delete mode 100644 grails-app/conf/jasperreports.properties delete mode 100644 grails-app/conf/reports/profiles/Acacia-paradoxa-DC.json delete mode 100644 grails-app/conf/reports/profiles/PROFILES.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_backcover.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_colophon.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_cover.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_acknowledgements.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_attributes.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_bhl.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_bibliography.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_conservation.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_images.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_key.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_key_item.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_links.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_map.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_nomenclature.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_specimens.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_status.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_detail_taxonomy.jrxml delete mode 100644 grails-app/conf/reports/profiles/PROFILES_styles.jrtx delete mode 100644 grails-app/conf/reports/profiles/PROFILES_toc.jrxml delete mode 100644 grails-app/conf/reports/profiles/img/ALA-logo-inline-reverse.png delete mode 100644 grails-app/conf/reports/profiles/img/ALA-logo-inline.png delete mode 100644 grails-app/conf/reports/profiles/img/Gahnia.png delete mode 100644 grails-app/conf/reports/profiles/img/PDF banner.png delete mode 100644 grails-app/conf/reports/profiles/img/atlas-poweredby_rgb-lightbg.png delete mode 100644 grails-app/conf/reports/profiles/img/gahnia2.png delete mode 100644 grails-app/conf/reports/profiles/img/gradient.svg delete mode 100644 grails-app/conf/reports/profiles/img/wave.png delete mode 100644 grails-app/controllers/au/org/ala/profile/hub/ExportController.groovy delete mode 100644 grails-app/jobs/au/org/ala/profile/hub/jobs/AsynchPDFJob.groovy delete mode 100644 grails-app/services/au/org/ala/profile/hub/ExportService.groovy delete mode 100644 grails-app/services/au/org/ala/profile/hub/JasperService.groovy delete mode 100644 grails-app/views/pdf/_pdfFooter.gsp delete mode 100644 grails-app/views/pdf/_pdfHeader.gsp delete mode 100644 grails-app/views/pdf/_profile.gsp delete mode 100644 src/main/groovy/au/org/ala/profile/hub/reports/BackCoverImageRenderer.groovy delete mode 100644 src/main/groovy/au/org/ala/profile/hub/reports/GradientRenderer.groovy delete mode 100644 src/main/groovy/au/org/ala/profile/hub/reports/JasperExportFormat.groovy delete mode 100644 src/main/groovy/au/org/ala/profile/hub/reports/JasperReportDef.groovy delete mode 100644 src/test/groovy/au/org/ala/profile/hub/ExportServiceSpec.groovy delete mode 100644 src/test/js/specs/controllers/ReportControllerSpec.js diff --git a/build.gradle b/build.gradle index ccb9e37e..1351f98d 100644 --- a/build.gradle +++ b/build.gradle @@ -101,9 +101,6 @@ dependencies { implementation 'org.apache.tika:tika-parsers:1.3' implementation "commons-fileupload:commons-fileupload:1.3.1" - implementation 'net.sf.jasperreports:jasperreports:6.4.1' - implementation 'net.sf.jasperreports:jasperreports-functions:6.4.1' - implementation 'au.org.ala:jasper-liberation-fonts-2.00.1:1.3' implementation 'net.glxn:qrgen:1.4' implementation 'org.apache.xmlgraphics:batik-bridge:1.9' implementation 'org.apache.xmlgraphics:batik-svggen:1.9' @@ -218,35 +215,4 @@ bootWar { publish { dependsOn assemble -} - - -tasks.register('reportCompile') { - ant.property(name: 'jasper.path', value: 'jasperreports-6.4.1.jar') - -// ant.taskdef(resource: "com/abc/ant/antlib.xml", classpath: ant.properties['jasper.path'], loaderref: 'abc') - - - println "\n- Starting JasperReports *.jrxml compilation process..." - println configurations.runtimeClasspath.asPath - // define the Jasper Reports Compile Task - ant.taskdef(name:'reportCompile', classname: 'net.sf.jasperreports.ant.JRAntCompileTask', classpath: configurations.runtimeClasspath.asPath) - - // remove existing jasper files - ant.delete{ - fileset('dir':'grails-app/conf/reports', 'defaultexcludes':'yes'){ - include('name':'**/*.jasper') - } - } - - // create a temporary directory for use by the jasper compiler - ant.mkdir(dir:'target/jasper') - - // compile the reports - ant.reportCompile(srcdir:'grails-app/conf/reports', destdir:'grails-app/conf/reports', tempdir:'target/jasper', keepJava:true, xmlvalidation:true){ - include(name:'**/*.jrxml') -// include(classpath: configurations.developmentOnly.asPath) -// include(name:'**/*.jrtx') - } - println "-------\n- JasperReports compilation process finished" } \ No newline at end of file diff --git a/grails-app/assets/javascripts/profileEditor/templates/exportPdf.tpl.htm b/grails-app/assets/javascripts/profileEditor/templates/exportPdf.tpl.htm deleted file mode 100644 index 1cd24597..00000000 --- a/grails-app/assets/javascripts/profileEditor/templates/exportPdf.tpl.htm +++ /dev/null @@ -1,49 +0,0 @@ -
- - - - - -
\ No newline at end of file diff --git a/grails-app/conf/jasperreports.properties b/grails-app/conf/jasperreports.properties deleted file mode 100644 index b1052362..00000000 --- a/grails-app/conf/jasperreports.properties +++ /dev/null @@ -1,3 +0,0 @@ -#net.sf.jasperreports.default.font.name=DejaVu Sans -#net.sf.jasperreports.default.pdf.font.name=Helvetica -net.sf.jasperreports.default.font.name=Liberation Sans \ No newline at end of file diff --git a/grails-app/conf/reports/profiles/Acacia-paradoxa-DC.json b/grails-app/conf/reports/profiles/Acacia-paradoxa-DC.json deleted file mode 100644 index 19517335..00000000 --- a/grails-app/conf/reports/profiles/Acacia-paradoxa-DC.json +++ /dev/null @@ -1,6048 +0,0 @@ -{ - "cover": { - "logo": "http://root.ala.org.au/bdrs-core/files/download.htm?className=au.com.gaiaresources.bdrs.model.theme.Theme&id=217&fileName=processed/images/bdrs/atlasoflivingaust.png", - "title": "NSW flora", - "subtitle": "Acacia paradoxa DC.", - "primaryImage": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "banner": "http://images.ala.org.au//store/7/4/4/e/a08a52f2-7bbe-40d9-8f1a-fe8acb28e447/original", - "authorship": "P.G. Kodela", - "citation": "P.G. Kodela (2015) Acacia paradoxa DC.. In: Kellermann, J. (ed.), Flora of South Australia (ed. 5). 10 pp. (State Herbarium of South Australia: Adelaide). http://localhost:8080/profile-hub/opus/39295895-f9cd-4189-bc19-64bd46cd689b. 27 July 2015 - 02:38", - "headerTitleHtml": "Flora
of Australia", - "logoUrl1": "https://profiles-dev.ala.org.au/opus/845def7a-5082-4750-b4fe-c360f73232fc/image/m9buxc1sjor.png", - "logoUrl2": "https://profiles-dev.ala.org.au/opus/845def7a-5082-4750-b4fe-c360f73232fc/image/gj82geyu8fr.png", - "logoUrl3": "https://www.environment.gov.au/system/files/styles/banner/private/pages/2a4683ff-a751-47aa-b12b-c50e3c1d881b/images/eadig03253.jpg?itok=21B4eLoH" - }, - "colophon": { - "citation": "P.G. Kodela (2015) Acacia paradoxa DC.. In: Kellermann, J. (ed.), Flora of South Australia (ed. 5). 10 pp. (State Herbarium of South Australia: Adelaide). http://localhost:8080/profile-hub/opus/39295895-f9cd-4189-bc19-64bd46cd689b. 27 July 2015 - 02:38", - "logo": "http://root.ala.org.au/bdrs-core/files/download.htm?className=au.com.gaiaresources.bdrs.model.theme.Theme&id=217&fileName=processed/images/bdrs/atlasoflivingaust.png", - "collectionCopyright": "© Flora of Australia 2015.", - "genericCopyright": "

The material in profiles is protected by copyright laws and may be used as permitted under the Copyright Act 1968 or in accordance with licences granted by the copyright owner.

Images and maps used in this profile have been contributed to the ALA and are subject to copyright. Your right to use these is subject to the terms of the licence that the contributor has applied to the image or map. You may not remove any copyright or other notices applied to maps. In some cases you may need to seek the permission of the copyright owner to use images. Information on using images can be found here.

Text used in this profile has been contributed by the editors and others identified. Except where indicated, text is licensed under a Creative Commons Attribution 4.0 License.

No rights are granted to the Commonwealth Coat of Arms or to any logos or trademarks used on the site.

If you believe material available on this website infringes any rights or breaches any contract or licence obligations please contact us support@ala.org.au with details.

", - "profileLink": "http://localhost:8080/profile-hub/opus/39295895-f9cd-4189-bc19-64bd46cd689b/profile/bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "version": "1", - "lastUpdated": "2016-02-05T02:06:09Z", - "issn": "2207-7820" - }, - "profiles": [ - { - "profile": { - "status": [ - { - "value": "Racemose", - "key": "Inflorescence arrangement" - }, - { - "value": "Globular", - "key": "Inflorescence shape" - }, - { - "value": "Lemon yellow to golden", - "key": "Inflorescence colour" - }, - { - "value": "Scattered", - "key": "Phyllode arrangement" - }, - { - "value": "Phyllodineae", - "key": "Section taxonomy" - }, - { - "value": "3.87", - "key": "Pca1" - }, - { - "value": "4.48", - "key": "Pca2" - }, - { - "value": "10.7", - "key": "Pca3" - }, - { - "value": "1.15", - "key": "Plant height" - }, - { - "value": "5.5", - "key": "Phyllode length median" - }, - { - "value": "0.09", - "key": "Annual mean temp" - }, - { - "value": "0.05", - "key": "Annual precip" - }, - { - "value": "0.1", - "key": "Annual mean rad" - }, - { - "value": "0.06", - "key": "Precip seasonality" - }, - { - "value": "0.11", - "key": "Temperature season" - }, - { - "value": "0.12", - "key": "Rad season" - }, - { - "value": "0.11", - "key": "Ridgetop" - }, - { - "value": "0.01", - "key": "Rockgrainsz" - }, - { - "value": "0.08", - "key": "Precip cold quart" - }, - { - "value": "0.1", - "key": "Clay" - }, - { - "value": "0.1", - "key": "Sand" - } - ], - "nslProtologue": "Candolle, A.P. de (ed.) (1825), Leguminosae. Prodromus Systematis Naturalis Regni Vegetabilis 2", - "occurrencesUrl": "http://avh.ala.org.au/occurrences/search?q=lsid%3Aurn%3Alsid%3Abiodiversity.org.au%3Aapni.taxon%3A298640+AND+%28data_resource_uid%3A%22dr376%22%29", - "hasConservationStatus": true, - "lastAttributeChange": null, - "description": "Woody trees or shrubs, rarely (in Australia) lianas; branches rarely (in Australia) with prickles. Leaves bipinnate or modified to polymorphic phyllodes, rarely reduced to scales or absent; foliar glands normally present; stipules normally present (but commonly caducous) and scarious, sometimes spinose. Inflorescences simple or racemose, infrequently paniculate; flowers white to golden (rarely mauve-pink), 2 or more aggregated into globular heads or oblongoid to cylindrical spikes, (3–) 4 or 5 (–6)-merous; sepals free to united, rarely absent; stamens numerous, normally free, rarely united basally into a short tube or irregularly faciculate; ovary single (rarely to 5), sessile or (rarely in Australia) stipitate. Legumes dehiscent or (rarely in Australia) indehiscent. Seeds normally with a pleurogram and without endosperm; funicle arillate or exarillate.", - "distribution": { - "creators": "P.G. Kodela", - "title": "Occurrence", - "text": "widely distributed from the coast west to Moree and Griffith areas.\nGrows in many different communities in various soil types.\nNC CC SC NT CT ST NWS CWS SWS NWP SWP\n\nQld Vic. *Tas. W.A. S.A.", - "order": -1, - "source": null, - "original": null, - "uuid": "db7ded4f-ab7c-4b1b-8ccb-465f540786ee", - "editors": "", - "required": false, - "mapImageUrl": "http://biocache.ala.org.au//ws/mapping/wms/image?q=lsid%3Aurn%3Alsid%3Abiodiversity.org.au%3Aapni.taxon%3A298640+AND+%28data_resource_uid%3A%22dr376%22%29&extents=96.173828125,-47.11468820158343,169.826171875,-2.5694811631203973&outlineColour=0&dpi=300&scale=on&baselayer=world&fileName=occurrencemap.jpg&format=jpg&outline=true&popacity=1&pradiuspx=5&pcolour=00ff85", - "occurrencesUrl": "http://avh.ala.org.au/occurrences/search?q=lsid%3Aurn%3Alsid%3Abiodiversity.org.au%3Aapni.taxon%3A298640+AND+%28data_resource_uid%3A%22dr376%22%29", - "plainText": "widely distributed from the coast west to Moree and Griffith areas.\nGrows in many different communities in various soil types.\nNC CC SC NT CT ST NWS CWS SWS NWP SWP\n\nQld Vic. *Tas. W.A. S.A.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - "acknowledgements": [ - { - "category": "Tester", - "text": "Angel" - } - ], - "bibliography": [ - { - "text": "

Aiton, W. 1789: Hortus Kewensis 3

", - "order": 0, - "uuid": "e2874907-c8c4-457e-956a-011c40f43ba2", - "plainText": "Aiton, W. 1789: Hortus Kewensis 3" - }, - { - "text": "

Allan, H.H. 1961: Flora of New Zealand. Vol. I. Indigenous Tracheophyta: Psilopsida, Lycopsida,Filicopsida, Gymnospermae, Dicotyledones. Government Printer, Wellington.

", - "order": 1, - "uuid": "268fd12a-d3ac-43c9-8216-82670e63483f", - "plainText": "Allan, H.H. 1961: Flora of New Zealand. Vol. I. Indigenous Tracheophyta: Psilopsida, Lycopsida,Filicopsida, Gymnospermae, Dicotyledones. Government Printer, Wellington." - }, - { - "text": "

de Labillardière, J.J.H. 1806: Novae Hollandiae Plantarum Specimen. Vol. Vol. 2. Huzard, Paris.

", - "order": 2, - "uuid": "cc67e09b-ff23-45d4-84b7-0f7637764669", - "plainText": "de Labillardière, J.J.H. 1806: Novae Hollandiae Plantarum Specimen. Vol. Vol. 2. Huzard, Paris." - } - ], - "images": [ - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "occurrenceId": "d8209b4a-bc82-40cc-8814-bd7d43fc892c", - "imageNumber": 2, - "staged": false, - "metadata": null, - "licenceIcon": "https://licensebuttons.net/l/by-nc/3.0/80x15.png" - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "dfc0883d-1fab-4689-a922-b6f30ab93236", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "occurrenceId": "50786efe-acdc-4b12-b80d-7cfc28247e12", - "imageNumber": 1, - "staged": false, - "metadata": { - "title": "image title" - }, - "licenceIcon": "https://licensebuttons.net/l/by-nc/3.0/80x15.png" - } - }, - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "f87468e0-7157-4cee-a18c-4f5735d9935d", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "occurrenceId": "ca8cbe7a-a05c-45d8-ae09-fe3e8caffc07", - "imageNumber": 4, - "staged": false, - "metadata": null - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "occurrenceId": "4d813920-15cb-488c-93d1-bec269e110db", - "imageNumber": 3, - "staged": false, - "metadata": null - } - }, - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=fa67563d-d1b6-47e2-9c7e-b0d3e8f6d24a", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "fa67563d-d1b6-47e2-9c7e-b0d3e8f6d24a", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=fa67563d-d1b6-47e2-9c7e-b0d3e8f6d24a", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=fa67563d-d1b6-47e2-9c7e-b0d3e8f6d24a", - "occurrenceId": "b9d26fb3-eb8b-45af-bb9b-1e5383bd6a51", - "imageNumber": 6, - "staged": false, - "metadata": null - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=311de364-1420-4fbf-a96f-dda22f4ad8e9", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "311de364-1420-4fbf-a96f-dda22f4ad8e9", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=311de364-1420-4fbf-a96f-dda22f4ad8e9", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=311de364-1420-4fbf-a96f-dda22f4ad8e9", - "occurrenceId": "e6a4d1d7-a394-462e-8a56-069134ac36a9", - "imageNumber": 5, - "staged": false, - "metadata": null - } - }, - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=0f38cdb2-854a-4589-be3f-45a66645ac97", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "0f38cdb2-854a-4589-be3f-45a66645ac97", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=0f38cdb2-854a-4589-be3f-45a66645ac97", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=0f38cdb2-854a-4589-be3f-45a66645ac97", - "occurrenceId": "dbba93b2-5f50-41cc-8cf9-d5341d9d517a", - "imageNumber": 8, - "staged": false, - "metadata": null - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=5bb287ca-1602-4126-bc4f-4bbb943a6ff8", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "5bb287ca-1602-4126-bc4f-4bbb943a6ff8", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=5bb287ca-1602-4126-bc4f-4bbb943a6ff8", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=5bb287ca-1602-4126-bc4f-4bbb943a6ff8", - "occurrenceId": "ef183465-fc4a-426b-9b41-20de080ddd07", - "imageNumber": 7, - "staged": false, - "metadata": null - } - }, - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=a63572c8-6e2b-4610-bfd9-f84b41a41890", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "a63572c8-6e2b-4610-bfd9-f84b41a41890", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=a63572c8-6e2b-4610-bfd9-f84b41a41890", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=a63572c8-6e2b-4610-bfd9-f84b41a41890", - "occurrenceId": "728a07ed-3f1b-4592-8163-33023c21b61f", - "imageNumber": 10, - "staged": false, - "metadata": null - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=79e3f6e3-53fa-45ad-a833-a6a2d2122722", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "79e3f6e3-53fa-45ad-a833-a6a2d2122722", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=79e3f6e3-53fa-45ad-a833-a6a2d2122722", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=79e3f6e3-53fa-45ad-a833-a6a2d2122722", - "occurrenceId": "6cfba9c2-1b36-49f4-8bd9-0d8600228879", - "imageNumber": 9, - "staged": false, - "metadata": null - } - } - ], - "bracketedKey": { - "keyName": "Acacia", - "projectName": "Flora of Victoria", - "projectIcon": "http://keybase.rbg.vic.gov.au/images/projecticons/epacris.png", - "source": "Modified from: Entwisle, T.J.; Maslin, B.R.; Cowan, R.S.; Court, A.B. (1996). Mimosaceae. In: Walsh, N.G.; Entwisle, T.J. (eds), Flora of Victoria. Vol. 3. Dicotyledons Winteraceae to Myrtaceae. Inkata Press, Melbourne.", - "items": [ - { - "id": 1, - "text": "Mature leaves modified into phyllodes (either flat, spiny or needle-like) or absent", - "target": 2 - }, - { - "id": 1, - "text": "Mature leaves bipinnate", - "target": 114 - }, - { - "id": 2, - "text": "Flowers in globular (rarely obloid) heads", - "target": 3 - }, - { - "id": 2, - "text": "Flowers in cylindric spikes", - "target": 100 - }, - { - "id": 3, - "text": "Phyllodes with more than 1 main vein or veins obscure", - "target": 4 - }, - { - "id": 3, - "text": "Phyllodes with 1 main vein per face (if 4-angled in cross-section then 4-veined overall)", - "target": 37 - } - ] - }, - "nomenclature": { - "formattedName": "bla bla bla bla", - "details": [ - { - "text": "line 1" - }, - { - "text": "line 2" - }, - { - "text": "line 3" - }, - { - "text": "line 4" - } - ] - }, - "classifications": [ - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:661518", - "rawRank": "Kingdom", - "rank": "kingdom", - "scientificName": "Plantae", - "profileUuid": "" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:412162", - "rawRank": "", - "rank": "phylum", - "scientificName": "Charophyta", - "profileUuid": "" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:406945", - "rawRank": "Class", - "rank": "class", - "scientificName": "Equisetopsida", - "profileUuid": "58b5597f-d14b-42a5-b07d-b1e90d05b86e" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:417544", - "rawRank": "Subclass", - "rank": "subclass", - "scientificName": "Magnoliidae", - "profileUuid": "" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:418427", - "rawRank": "Order", - "rank": "order", - "scientificName": "Fabales", - "profileUuid": "" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:397778", - "rawRank": "Family", - "rank": "family", - "scientificName": "Fabaceae", - "profileUuid": "8ec788eb-ad22-4bf4-bd16-675d2d86c05f" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:295861", - "rawRank": "Genus", - "rank": "genus", - "scientificName": "Acacia", - "profileUuid": "f5f0ea82-3b3c-46d2-ad82-89d631bc9f48" - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "rawRank": "Species", - "rank": "species", - "scientificName": "Acacia paradoxa", - "profileUuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa" - } - ], - "bhl": [ - { - "id": null, - "edition": "Rev. and adapted to American zoology / by Joseph B. Holder.", - "title": "link to the biodiversity heritage library", - "publisherName": "Selmar Hess,", - "description": "link to the biodiversity heritage library", - "fullTitle": "Animate creation : popular edition of \"Our living world\" : a natural history / by the Rev. J.G. Wood.", - "class": "au.org.ala.profile.Link", - "uuid": "500b695e-da14-4a9a-bd0f-ddfbfa8b3902", - "doi": "10.5962/bhl.title.41363", - "url": "http://biodiversitylibrary.org/page/29003916" - } - ], - "specimens": [ - { - "catalogNumber": "MBA 1734.1", - "institutionName": "Australian Tropical Herbarium", - "collectionName": "Australian Tropical Herbarium" - } - ], - "opusName": "NSW flora", - "rank": "species", - "authorship": "P.G. Kodela", - "matchedName": { - "scientificName": "Acacia paradoxa", - "fullName": "Acacia paradoxa DC.", - "nameAuthor": "DC." - }, - "createdDate": "2015-07-01T07:14:01Z", - "nslNameIdentifier": "68149", - "nameAuthor": "DC.", - "scientificName": "Acacia paradoxa", - "speciesProfile": { - "taxonName": { - "microReference": "74", - "nomenclaturalCode": "Botanical", - "typificationString": " \"Hab. ... in hortis occurrit sub nomine Mimosae paradoxae,\"", - "genusPart": "Acacia", - "nomenclaturalStatus": "", - "basionymAuthorship": "", - "infraspecificEpithet": "", - "guid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "hybridForm": "", - "authorship": "DC.", - "rankString": "sp", - "nameComplete": "Acacia paradoxa", - "publishedInCitation": "urn:lsid:biodiversity.org.au:apni.reference:74661", - "infragenericEpithet": "", - "specificEpithet": "paradoxa" - }, - "simpleProperties": [ - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasDescriptiveText", - "value": "Kangaroo Thorn ( Acacia paradoxa ) is an upright or spreading shrub growing to 1-4 m high with smooth or finely fissured brownish grey bark. The branchlets are vertically ridged and frequently hairy (sometimes hairless). The phyllodes (flattened leaf-stalks that look like, and function as, leaves) are generally straight-sided or slightly curved, narrowed at both ends, 8-20 mm long, usually 2-7 mm wide and hairless or sparsely hairy. The phyllode margins are generally wavy and the main nerve is off-centre. At the base of each phyllode there are two spines (actually stipules) 4-12 mm long that spread widely apart. The ball-shaped, bright yellow flower heads, on stalks 6-20 mm long, are borne singly (rarely in pairs) at the bases of the phyllodes. These are followed by generally straight-sided, hairy seedpods, 2-7 cm long and 3-5 mm wide. The hard, dark-brown seeds are 4-5 mm long and 2-2.5 mm wide (Maslin 2001; Kodela & Harden 2002; Reid 2008 pers. comm.). For further information and assistance with identification of Kangaroo Thorn contact the herbarium in your state or territory.", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasDescriptiveText", - "value": "Erect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm long.", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasDistributionText", - "value": "Kangaroo Thorn is a native species in mainland south-eastern Australia. Since European settlement, it has been introduced to Tasmania and become naturalised in the west of that state (Maslin 2001; Parsons & Cuthbertson 2001; Buchanan 2005). It is also now considered to be a naturalised introduction in south-western Western Australia where it was formerly considered to be native (Paczkowska & Chapman 2000; Western Australian Herbarium 1998-). Isolated records from a homestead south of Halls Creek in Western Australia and on a station in the Northern Territory south-east of the former location are well north of its known native range and are probably naturalisations and/or planted specimens (National Herbarium of Victoria 2007).", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasDistributionText", - "value": "Grows in many different communities in various soil types; widely distributed from the coast west to Moree and Griffith areas. NSW subdivisions: NC, CC, SC, NT, CT, ST, NWS, CWS, SWS, NWP, SWP Other Australian states: Qld Vic. *Tas. W.A. S.A.", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasHabitatText", - "value": "Shrub", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasHabitatText", - "value": "Kangaroo Thorn is found mainly in woodland or open forest on a wide range of soils ( Maslin 2001; Parsons & Cuthbertson 2001).", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasReproductionText", - "value": "Kangaroo Thorn has been extensively planted as a hedge plant and along roadsides, and naturalisations can originate from seeds of these plantings. The hard, long-lived seeds may be spread as contaminants of vehicles, animals, mud, water and produce (Entwisle et al. 1996; Parsons & Cuthbertson 2001).", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasFloweringSeason", - "value": "Flowers July–November", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr415", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasReference", - "value": "USDA Plants Profile EncycloWeedia Profile Photo gallery", - "infoSourceId": "1036", - "infoSourceURL": "http://en.wikipedia.org/", - "identifier": "http://en.wikipedia.org/wiki/Acacia_paradoxa", - "documentId": "189873", - "infoSourceName": "Wikipedia" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa DC.: FloraBase: Flora of Western Australia", - "name": "http://ala.org.au/ontology/ALA#hasReference", - "value": "Cat.Pl.Hort.Monspel. 74 (1813)", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/browse/profile/3482", - "documentId": "1130913", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Kangaroo Thorn", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Hedge Wattle", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Prickly Wattle", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Prickly Acacia", - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Acacia armata R.Br. A.Dietr. Sweet Graham", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Acacia microcantha R.Br. A.Dietr. Sweet Graham", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Acacia ornithophora R.Br. A.Dietr. Sweet Graham", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasSynonym", - "value": "Acacia tristis R.Br. A.Dietr. Sweet Graham", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr395", - "name": "http://ala.org.au/ontology/ALA#hasDistributionMapImageUrl", - "value": "http://plantnet.rbgsyd.nsw.gov.au/avh/tmp/NSWsubmap23319125564.gif", - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/avh/tmp/NSWsubmap23319125564.gif", - "documentId": "1559354", - "infoSourceName": "Plant NET Flora Online" - }, - { - "infoSourceUid": "dr703", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "infoSourceId": "1123", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr703", - "identifier": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "documentId": "1932999", - "infoSourceName": "Images of Flora and Fauna of 290 Leppitt Rd, Upper Beaconsfield" - }, - { - "infoSourceUid": "dr703", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "d94ae0a1-7848-4b57-a6b6-e1279b061a2c", - "infoSourceId": "1123", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr703", - "identifier": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "documentId": "1932999", - "infoSourceName": "Images of Flora and Fauna of 290 Leppitt Rd, Upper Beaconsfield" - }, - { - "infoSourceUid": "dr703", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr703|d94ae0a1-7848-4b57-a6b6-e1279b061a2c", - "infoSourceId": "1123", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr703", - "identifier": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "documentId": "1932999", - "infoSourceName": "Images of Flora and Fauna of 290 Leppitt Rd, Upper Beaconsfield" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr705/11818/e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn3.jpg", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/11818/e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn3.jpg", - "documentId": "1933890", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/11818/e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn3.jpg", - "documentId": "1933890", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr705|e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/11818/e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn3.jpg", - "documentId": "1933890", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr705/1915/cfba92cf-d6c5-425a-8b35-b3601b376abd/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn2.jpg", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/1915/cfba92cf-d6c5-425a-8b35-b3601b376abd/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn2.jpg", - "documentId": "1933822", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "cfba92cf-d6c5-425a-8b35-b3601b376abd", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/1915/cfba92cf-d6c5-425a-8b35-b3601b376abd/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn2.jpg", - "documentId": "1933822", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr705|cfba92cf-d6c5-425a-8b35-b3601b376abd", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/1915/cfba92cf-d6c5-425a-8b35-b3601b376abd/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn2.jpg", - "documentId": "1933822", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr705/24020/fbf5d232-489a-4ea9-9f4c-9b78ddb60041/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn4.jpg", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/24020/fbf5d232-489a-4ea9-9f4c-9b78ddb60041/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn4.jpg", - "documentId": "1933968", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "fbf5d232-489a-4ea9-9f4c-9b78ddb60041", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/24020/fbf5d232-489a-4ea9-9f4c-9b78ddb60041/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn4.jpg", - "documentId": "1933968", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr705|fbf5d232-489a-4ea9-9f4c-9b78ddb60041", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/24020/fbf5d232-489a-4ea9-9f4c-9b78ddb60041/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn4.jpg", - "documentId": "1933968", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr705/25932/ce0f8ba2-f810-462a-abd9-671417ca2add/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn5.jpg", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/25932/ce0f8ba2-f810-462a-abd9-671417ca2add/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn5.jpg", - "documentId": "1933813", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "ce0f8ba2-f810-462a-abd9-671417ca2add", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/25932/ce0f8ba2-f810-462a-abd9-671417ca2add/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn5.jpg", - "documentId": "1933813", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr705", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr705|ce0f8ba2-f810-462a-abd9-671417ca2add", - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/25932/ce0f8ba2-f810-462a-abd9-671417ca2add/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn5.jpg", - "documentId": "1933813", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison" - }, - { - "infoSourceUid": "dr534", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr534/2542/4e1083bf-aa57-408b-aa50-925243eb4a61/raw.jpg", - "infoSourceId": "1099", - "infoSourceURL": "http://www.ala.org.au", - "identifier": "http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "documentId": "1676656", - "infoSourceName": "Richard Hartland" - }, - { - "infoSourceUid": "dr534", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "4e1083bf-aa57-408b-aa50-925243eb4a61", - "infoSourceId": "1099", - "infoSourceURL": "http://www.ala.org.au", - "identifier": "http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "documentId": "1676656", - "infoSourceName": "Richard Hartland" - }, - { - "infoSourceUid": "dr534", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr534|http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "infoSourceId": "1099", - "infoSourceURL": "http://www.ala.org.au", - "identifier": "http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "documentId": "1676656", - "infoSourceName": "Richard Hartland" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr430/25882/9cf924e1-ca01-4471-8199-254c3bcb3f06/raw.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "documentId": "1874584", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "9cf924e1-ca01-4471-8199-254c3bcb3f06", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "documentId": "1874584", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr430|http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "documentId": "1874584", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa DC.", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://media.eol.org/content/2011/08/30/22/20874_orig.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://www.eol.org/pages/648693", - "documentId": "1874582", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa DC.", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://www.eol.org/pages/648693", - "documentId": "1874582", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa DC.", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://www.eol.org/pages/648693", - "documentId": "1874582", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr430/20859/c1744165-f0cd-4133-8c31-e1c48e48ab73/raw.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "documentId": "1874583", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "c1744165-f0cd-4133-8c31-e1c48e48ab73", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "documentId": "1874583", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr430", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr430|http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "identifier": "http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "documentId": "1874583", - "infoSourceName": "Encyclopedia of Life" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/29107/57acc4f7-0561-4b2e-a2d3-f845a04c36d6/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "documentId": "1230232", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "57acc4f7-0561-4b2e-a2d3-f845a04c36d6", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "documentId": "1230232", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "documentId": "1230232", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/16644/728a07ed-3f1b-4592-8163-33023c21b61f/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "documentId": "1230226", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "728a07ed-3f1b-4592-8163-33023c21b61f", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "documentId": "1230226", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "documentId": "1230226", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/4541/d8209b4a-bc82-40cc-8814-bd7d43fc892c/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "documentId": "1230220", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "d8209b4a-bc82-40cc-8814-bd7d43fc892c", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "documentId": "1230220", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "documentId": "1230220", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/11854/b9d26fb3-eb8b-45af-bb9b-1e5383bd6a51/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "documentId": "1230236", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "b9d26fb3-eb8b-45af-bb9b-1e5383bd6a51", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "documentId": "1230236", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "documentId": "1230236", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/2852/6cfba9c2-1b36-49f4-8bd9-0d8600228879/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "documentId": "1230228", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "6cfba9c2-1b36-49f4-8bd9-0d8600228879", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "documentId": "1230228", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "documentId": "1230228", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/9938/50786efe-acdc-4b12-b80d-7cfc28247e12/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "documentId": "1230234", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "50786efe-acdc-4b12-b80d-7cfc28247e12", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "documentId": "1230234", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "documentId": "1230234", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/898/e6a4d1d7-a394-462e-8a56-069134ac36a9/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "documentId": "1230218", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "e6a4d1d7-a394-462e-8a56-069134ac36a9", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "documentId": "1230218", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "documentId": "1230218", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/20368/dbba93b2-5f50-41cc-8cf9-d5341d9d517a/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "documentId": "1230224", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "dbba93b2-5f50-41cc-8cf9-d5341d9d517a", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "documentId": "1230224", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "documentId": "1230224", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/8688/4d813920-15cb-488c-93d1-bec269e110db/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "documentId": "1230214", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "4d813920-15cb-488c-93d1-bec269e110db", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "documentId": "1230214", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "documentId": "1230214", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/25721/c41720c0-c6ca-4221-979d-8e6336d91a02/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "documentId": "1230230", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "c41720c0-c6ca-4221-979d-8e6336d91a02", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "documentId": "1230230", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "documentId": "1230230", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/22044/ef183465-fc4a-426b-9b41-20de080ddd07/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "documentId": "1230222", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "ef183465-fc4a-426b-9b41-20de080ddd07", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "documentId": "1230222", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "documentId": "1230222", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr413/20314/ca8cbe7a-a05c-45d8-ae09-fe3e8caffc07/raw.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "documentId": "1230216", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "ca8cbe7a-a05c-45d8-ae09-fe3e8caffc07", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "documentId": "1230216", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr413", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "documentId": "1230216", - "infoSourceName": "Australian Plant Image Index" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/26599/e5c366d1-1d5b-459c-9255-e631817a958d/6009735357_c1b65b90cb.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009735357/", - "documentId": "1673398", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "e5c366d1-1d5b-459c-9255-e631817a958d", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009735357/", - "documentId": "1673398", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6009735357/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009735357/", - "documentId": "1673398", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/28679/90fc819d-46d0-4fe6-b3db-6459373744ed/6009731837_ecffb83fcf.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009731837/", - "documentId": "1673395", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "90fc819d-46d0-4fe6-b3db-6459373744ed", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009731837/", - "documentId": "1673395", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6009731837/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009731837/", - "documentId": "1673395", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/5693/03706829-ea23-4f5a-a654-628958dbc853/6009729039_8a4bba7df5.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009729039/", - "documentId": "1673397", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "03706829-ea23-4f5a-a654-628958dbc853", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009729039/", - "documentId": "1673397", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6009729039/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009729039/", - "documentId": "1673397", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/12148/faa7e252-b2b3-4812-8379-d83c0ee16c80/6067213053_9e1ffb18bc.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067213053/", - "documentId": "1760312", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "faa7e252-b2b3-4812-8379-d83c0ee16c80", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067213053/", - "documentId": "1760312", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6067213053/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067213053/", - "documentId": "1760312", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/28117/e2d12ab6-be66-4170-9455-17b420c35164/6067759520_9fa6d866e7.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067759520/", - "documentId": "1760318", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "e2d12ab6-be66-4170-9455-17b420c35164", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067759520/", - "documentId": "1760318", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6067759520/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067759520/", - "documentId": "1760318", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/17821/f21d593a-a0b6-4f66-bc81-f06caaabd3a1/6067216899_cf64c9bdd3.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067216899/", - "documentId": "1760313", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "f21d593a-a0b6-4f66-bc81-f06caaabd3a1", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067216899/", - "documentId": "1760313", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/arthur_chapman/6067216899/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067216899/", - "documentId": "1760313", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/1198/d9c68d12-12d0-4bce-8f77-9d6b54a8b8de/6257409296_dce851536a.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/31031835@N08/6257409296/", - "documentId": "1767070", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "d9c68d12-12d0-4bce-8f77-9d6b54a8b8de", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/31031835@N08/6257409296/", - "documentId": "1767070", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/31031835@N08/6257409296/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/31031835@N08/6257409296/", - "documentId": "1767070", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr360/12794/dd377a38-7786-4dcc-9330-9ac9962d5bfd/3004490043_81ef9291f5.jpg", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/dhobern/3004490043/", - "documentId": "1541569", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "dd377a38-7786-4dcc-9330-9ac9962d5bfd", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/dhobern/3004490043/", - "documentId": "1541569", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr360", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr360|http://www.flickr.com/photos/dhobern/3004490043/", - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "identifier": "http://www.flickr.com/photos/dhobern/3004490043/", - "documentId": "1541569", - "infoSourceName": "Flickr EOL" - }, - { - "infoSourceUid": "dr415", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr415/24225/d66e9c6f-093a-46e5-baa0-50e5cdecc4ca/raw.jpg", - "infoSourceId": "1036", - "infoSourceURL": "http://en.wikipedia.org/", - "identifier": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "documentId": "149726", - "infoSourceName": "Wikipedia" - }, - { - "infoSourceUid": "dr415", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "d66e9c6f-093a-46e5-baa0-50e5cdecc4ca", - "infoSourceId": "1036", - "infoSourceURL": "http://en.wikipedia.org/", - "identifier": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "documentId": "149726", - "infoSourceName": "Wikipedia" - }, - { - "infoSourceUid": "dr415", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr415|http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "infoSourceId": "1036", - "infoSourceURL": "http://en.wikipedia.org/", - "identifier": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "documentId": "149726", - "infoSourceName": "Wikipedia" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/26545/4f2d3275-6a38-4e9c-8da5-f5cfb484a83a/134692685128.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26545/4f2d3275-6a38-4e9c-8da5-f5cfb484a83a/134692685128.jpg", - "documentId": "2025163", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "4f2d3275-6a38-4e9c-8da5-f5cfb484a83a", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26545/4f2d3275-6a38-4e9c-8da5-f5cfb484a83a/134692685128.jpg", - "documentId": "2025163", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|6767_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26545/4f2d3275-6a38-4e9c-8da5-f5cfb484a83a/134692685128.jpg", - "documentId": "2025163", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/22856/74685117-099f-4ebe-ac5f-e6bbea2aae6b/134874045028.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/22856/74685117-099f-4ebe-ac5f-e6bbea2aae6b/134874045028.jpg", - "documentId": "2025884", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "74685117-099f-4ebe-ac5f-e6bbea2aae6b", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/22856/74685117-099f-4ebe-ac5f-e6bbea2aae6b/134874045028.jpg", - "documentId": "2025884", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|7283_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/22856/74685117-099f-4ebe-ac5f-e6bbea2aae6b/134874045028.jpg", - "documentId": "2025884", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "65f71e7f-19b4-4a0c-975c-d5acacae1e18", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3882_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "65f71e7f-19b4-4a0c-975c-d5acacae1e18", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3882_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "documentId": "2029242", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "documentId": "2029241", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "65f71e7f-19b4-4a0c-975c-d5acacae1e18", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "documentId": "2029241", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3882_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "documentId": "2029241", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/9715/26b5fddc-b01f-4f6c-b5d2-af4690a79c11/134785477524.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/9715/26b5fddc-b01f-4f6c-b5d2-af4690a79c11/134785477524.jpg", - "documentId": "2025384", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "26b5fddc-b01f-4f6c-b5d2-af4690a79c11", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/9715/26b5fddc-b01f-4f6c-b5d2-af4690a79c11/134785477524.jpg", - "documentId": "2025384", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|6926_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/9715/26b5fddc-b01f-4f6c-b5d2-af4690a79c11/134785477524.jpg", - "documentId": "2025384", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/3644/06b80160-a96b-472b-8cd9-3c17f3e33e50/134856237611.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/3644/06b80160-a96b-472b-8cd9-3c17f3e33e50/134856237611.jpg", - "documentId": "2025860", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "06b80160-a96b-472b-8cd9-3c17f3e33e50", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/3644/06b80160-a96b-472b-8cd9-3c17f3e33e50/134856237611.jpg", - "documentId": "2025860", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|7265_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/3644/06b80160-a96b-472b-8cd9-3c17f3e33e50/134856237611.jpg", - "documentId": "2025860", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/8370/2aab8651-ea5b-4169-854d-66fce083a9be/134596790876.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8370/2aab8651-ea5b-4169-854d-66fce083a9be/134596790876.jpg", - "documentId": "2024952", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "2aab8651-ea5b-4169-854d-66fce083a9be", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8370/2aab8651-ea5b-4169-854d-66fce083a9be/134596790876.jpg", - "documentId": "2024952", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|6611_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8370/2aab8651-ea5b-4169-854d-66fce083a9be/134596790876.jpg", - "documentId": "2024952", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "documentId": "2029516", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "a49222ee-83e0-4446-a868-bc1646937f16", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "documentId": "2029516", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|4142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "documentId": "2029516", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/12285/bd397e9f-d19c-4b51-877d-c02170ea035d/134727156794.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/12285/bd397e9f-d19c-4b51-877d-c02170ea035d/134727156794.jpg", - "documentId": "2025259", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "bd397e9f-d19c-4b51-877d-c02170ea035d", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/12285/bd397e9f-d19c-4b51-877d-c02170ea035d/134727156794.jpg", - "documentId": "2025259", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|6835_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/12285/bd397e9f-d19c-4b51-877d-c02170ea035d/134727156794.jpg", - "documentId": "2025259", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "a49222ee-83e0-4446-a868-bc1646937f16", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|4142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "a49222ee-83e0-4446-a868-bc1646937f16", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|4142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "documentId": "2029517", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "documentId": "2029086", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "5934855c-85d2-4056-b212-35c0c5395262", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "documentId": "2029086", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3759_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "documentId": "2029086", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/4810/dc95a71a-1bd1-435f-8380-c16fc471c033/131874695735.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/4810/dc95a71a-1bd1-435f-8380-c16fc471c033/131874695735.jpg", - "documentId": "2029649", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "dc95a71a-1bd1-435f-8380-c16fc471c033", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/4810/dc95a71a-1bd1-435f-8380-c16fc471c033/131874695735.jpg", - "documentId": "2029649", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|4267_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/4810/dc95a71a-1bd1-435f-8380-c16fc471c033/131874695735.jpg", - "documentId": "2029649", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "5934855c-85d2-4056-b212-35c0c5395262", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3759_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "5934855c-85d2-4056-b212-35c0c5395262", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3759_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "documentId": "2029087", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/10548/20b14d93-5ed7-41ae-9234-c77e271d33fe/131384019006.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/10548/20b14d93-5ed7-41ae-9234-c77e271d33fe/131384019006.jpg", - "documentId": "2028678", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "20b14d93-5ed7-41ae-9234-c77e271d33fe", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/10548/20b14d93-5ed7-41ae-9234-c77e271d33fe/131384019006.jpg", - "documentId": "2028678", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3403_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/10548/20b14d93-5ed7-41ae-9234-c77e271d33fe/131384019006.jpg", - "documentId": "2028678", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/26259/bf8380bb-c3e2-4a01-a241-2b9843ffeb4b/131625257883.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26259/bf8380bb-c3e2-4a01-a241-2b9843ffeb4b/131625257883.jpg", - "documentId": "2029044", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "bf8380bb-c3e2-4a01-a241-2b9843ffeb4b", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26259/bf8380bb-c3e2-4a01-a241-2b9843ffeb4b/131625257883.jpg", - "documentId": "2029044", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3725_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26259/bf8380bb-c3e2-4a01-a241-2b9843ffeb4b/131625257883.jpg", - "documentId": "2029044", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/8723/4fa802a1-576a-4b4b-9a4c-f26b15046c1d/131647916827.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8723/4fa802a1-576a-4b4b-9a4c-f26b15046c1d/131647916827.jpg", - "documentId": "2029137", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "4fa802a1-576a-4b4b-9a4c-f26b15046c1d", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8723/4fa802a1-576a-4b4b-9a4c-f26b15046c1d/131647916827.jpg", - "documentId": "2029137", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|3807_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8723/4fa802a1-576a-4b4b-9a4c-f26b15046c1d/131647916827.jpg", - "documentId": "2029137", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/13875/bd4ef589-494c-4ba1-960f-0350f3af0762/132342196065.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13875/bd4ef589-494c-4ba1-960f-0350f3af0762/132342196065.jpg", - "documentId": "2030614", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "bd4ef589-494c-4ba1-960f-0350f3af0762", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13875/bd4ef589-494c-4ba1-960f-0350f3af0762/132342196065.jpg", - "documentId": "2030614", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|4990_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13875/bd4ef589-494c-4ba1-960f-0350f3af0762/132342196065.jpg", - "documentId": "2030614", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/8828/e7caaa9f-fe9c-4986-903a-064fb3ba24ee/127305389869.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8828/e7caaa9f-fe9c-4986-903a-064fb3ba24ee/127305389869.jpg", - "documentId": "2032490", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "e7caaa9f-fe9c-4986-903a-064fb3ba24ee", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8828/e7caaa9f-fe9c-4986-903a-064fb3ba24ee/127305389869.jpg", - "documentId": "2032490", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|180_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8828/e7caaa9f-fe9c-4986-903a-064fb3ba24ee/127305389869.jpg", - "documentId": "2032490", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/6747/437c4edb-9ddc-4ab5-a0dc-37136bec96a7/12729796479.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/6747/437c4edb-9ddc-4ab5-a0dc-37136bec96a7/12729796479.jpg", - "documentId": "2032468", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "437c4edb-9ddc-4ab5-a0dc-37136bec96a7", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/6747/437c4edb-9ddc-4ab5-a0dc-37136bec96a7/12729796479.jpg", - "documentId": "2032468", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|177_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/6747/437c4edb-9ddc-4ab5-a0dc-37136bec96a7/12729796479.jpg", - "documentId": "2032468", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/13957/307a12ee-e892-41cf-a5d8-ffff6f837f5b/127220241635.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13957/307a12ee-e892-41cf-a5d8-ffff6f837f5b/127220241635.jpg", - "documentId": "2032096", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "307a12ee-e892-41cf-a5d8-ffff6f837f5b", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13957/307a12ee-e892-41cf-a5d8-ffff6f837f5b/127220241635.jpg", - "documentId": "2032096", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|144_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13957/307a12ee-e892-41cf-a5d8-ffff6f837f5b/127220241635.jpg", - "documentId": "2032096", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "documentId": "2031696", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "f5f37674-d218-4035-90e1-0aa3025bfef8", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "documentId": "2031696", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|1142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "documentId": "2031696", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "f5f37674-d218-4035-90e1-0aa3025bfef8", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|1142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "f5f37674-d218-4035-90e1-0aa3025bfef8", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr635", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr635|1142_Acacia_paradoxa", - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "documentId": "2031697", - "infoSourceName": "NatureShare" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa DC.: FloraBase: Flora of Western Australia", - "name": "http://ala.org.au/ontology/ALA#hasScientificDescriptionAuthor", - "value": "Amanda Spooner, Monday 11 August 1997", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/browse/profile/3482", - "documentId": "1130913", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa DC.: FloraBase: Flora of Western Australia", - "name": "http://ala.org.au/ontology/ALA#hasNameStatus", - "value": "Current", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/browse/profile/3482", - "documentId": "1130913", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr394/21901/227f1307-55fa-45cc-8b8d-8fe904a1350c/raw.jpg", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "documentId": "1130914", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "227f1307-55fa-45cc-8b8d-8fe904a1350c", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "documentId": "1130914", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr394|http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "documentId": "1130914", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr394", - "title": "Acacia armata R.Br.: FloraBase: Flora of Western Australia", - "name": "http://ala.org.au/ontology/ALA#hasNameStatus", - "value": "Not Current", - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "identifier": "http://florabase.dec.wa.gov.au/browse/profile/8924", - "documentId": "1168645", - "infoSourceName": "FloraBase - the Western Australian Flora" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr689/12138/7370399f-ead5-4d39-9334-006acf6b9f5b/Acacia_paradoxa_C235_2-070.jpg", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/12138/7370399f-ead5-4d39-9334-006acf6b9f5b/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2077087", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "7370399f-ead5-4d39-9334-006acf6b9f5b", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/12138/7370399f-ead5-4d39-9334-006acf6b9f5b/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2077087", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr689|1998-08-11|Acacia paradoxa |-35? 43' 14.9\"S|150? 11' 28.1\"E|S35 43 14.9 E150 11 28.1||", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/12138/7370399f-ead5-4d39-9334-006acf6b9f5b/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2077087", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasImageUrl", - "value": "http://biocache.ala.org.au/biocache-media/dr689/24676/2212733c-6711-459f-aa8e-859952eebaca/Acacia_paradoxa_C235_2-070.jpg", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/24676/2212733c-6711-459f-aa8e-859952eebaca/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2075592", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceUid", - "value": "2212733c-6711-459f-aa8e-859952eebaca", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/24676/2212733c-6711-459f-aa8e-859952eebaca/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2075592", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - }, - { - "infoSourceUid": "dr689", - "title": "Acacia paradoxa", - "name": "http://ala.org.au/ontology/ALA#hasOccurrenceRowKey", - "value": "dr689|1998-08-11|Acacia paradoxa |35? 43' 14.9\"S|150? 11' 28.1\"E|S35 43 14.9 E150 11 28.1||", - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/24676/2212733c-6711-459f-aa8e-859952eebaca/Acacia_paradoxa_C235_2-070.jpg", - "documentId": "2075592", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood" - } - ], - "habitats": [ - { - "status": "N", - "infoSourceId": "4", - "infoSourceURL": "http://www.marine.csiro.au/mirrorsearch/ir_search.list_species?sp_id=10179087", - "statusAsString": "Non-marine", - "infoSourceName": "Interim Register of Marine and Non-marine Genera" - } - ], - "parentConcepts": [], - "conservationStatuses": [ - { - "region": "New South Wales", - "colour": "yellow", - "regionAbbrev": "NSW", - "rawStatus": "Endangered", - "system": "Threatened Species Conservation Act 1995", - "status": "Endangered", - "rawCode": "E1", - "infoSourceId": "506", - "infoSourceURL": "http://www.environment.nsw.gov.au", - "infoSourceName": "Office of Environment and Heritage", - "regionId": "aus_states/New South Wales" - }, - { - "region": "New South Wales", - "colour": "yellow", - "regionAbbrev": "NSW", - "rawStatus": "Endangered", - "system": "Threatened Species Conservation Act 1995", - "status": "Endangered", - "rawCode": "E1", - "infoSourceId": "506", - "infoSourceURL": "http://www.environment.nsw.gov.au", - "infoSourceName": "Office of Environment and Heritage", - "regionId": "aus_states/New South Wales" - } - ], - "isAustralian": true, - "identifiers": [ - "urn:lsid:biodiversity.org.au:apni.taxon:246943", - "urn:lsid:biodiversity.org.au:apni.taxon:255282", - "urn:lsid:biodiversity.org.au:apni.taxon:255283", - "urn:lsid:biodiversity.org.au:apni.taxon:255284", - "urn:lsid:biodiversity.org.au:apni.taxon:255285", - "urn:lsid:biodiversity.org.au:apni.taxon:255286", - "urn:lsid:biodiversity.org.au:apni.taxon:255287", - "urn:lsid:biodiversity.org.au:apni.taxon:255288", - "urn:lsid:biodiversity.org.au:apni.taxon:255289", - "urn:lsid:biodiversity.org.au:apni.taxon:255636", - "urn:lsid:biodiversity.org.au:apni.taxon:276680", - "urn:lsid:biodiversity.org.au:apni.taxon:463049", - "urn:lsid:biodiversity.org.au:apni.taxon:474085", - "urn:lsid:biodiversity.org.au:apni.taxon:482174", - "urn:lsid:biodiversity.org.au:apni.taxon:499434", - "urn:lsid:biodiversity.org.au:apni.taxon:528419", - "urn:lsid:biodiversity.org.au:apni.taxon:549294", - "urn:lsid:biodiversity.org.au:apni.taxon:567400", - "urn:lsid:biodiversity.org.au:apni.taxon:568420", - "urn:lsid:biodiversity.org.au:apni.taxon:571167", - "urn:lsid:biodiversity.org.au:apni.taxon:600159", - "urn:lsid:biodiversity.org.au:apni.taxon:603372", - "urn:lsid:biodiversity.org.au:apni.taxon:617723", - "urn:lsid:biodiversity.org.au:apni.taxon:621448", - "urn:lsid:biodiversity.org.au:apni.taxon:655656", - "urn:lsid:biodiversity.org.au:apni.taxon:665149", - "urn:lsid:biodiversity.org.au:apni.taxon:665152", - "urn:lsid:biodiversity.org.au:apni.taxon:676100", - "urn:lsid:biodiversity.org.au:apni.taxon:676117", - "urn:lsid:biodiversity.org.au:apni.taxon:68635", - "urn:lsid:biodiversity.org.au:apni.taxon:690381", - "urn:lsid:biodiversity.org.au:apni.taxon:690767", - "urn:lsid:biodiversity.org.au:apni.taxon:692845", - "urn:lsid:biodiversity.org.au:apni.taxon:728651", - "urn:lsid:biodiversity.org.au:apni.taxon:75220", - "urn:lsid:biodiversity.org.au:apni.taxon:75221", - "urn:lsid:biodiversity.org.au:apni.taxon:754811" - ], - "extantStatusus": [ - { - "status": "E", - "infoSourceId": "4", - "infoSourceURL": "http://www.marine.csiro.au/mirrorsearch/ir_search.list_species?sp_id=10179087", - "statusAsString": "Extant", - "infoSourceName": "Interim Register of Marine and Non-marine Genera" - } - ], - "extantStatuses": [ - { - "status": "E", - "infoSourceId": "4", - "infoSourceURL": "http://www.marine.csiro.au/mirrorsearch/ir_search.list_species?sp_id=10179087", - "statusAsString": "Extant", - "infoSourceName": "Interim Register of Marine and Non-marine Genera" - } - ], - "synonyms": [ - { - "isPreferred": true, - "nameString": "Acacia armata R.Br. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57736", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:54786", - "type": 27, - "relationship": "includes", - "id": 441877, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57736", - "referencedIn": "Brown, R. 1813, Hortus Kewensis Edn. 2. 5", - "author": "R.Br.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "description": "taxonomic", - "authorYear": "1813", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata Willd. nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298639", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182266", - "type": 27, - "relationship": "includes", - "id": 442376, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298639", - "referencedIn": "Willdenow, C.L. 1814, Enumeratio Plantarum Horti Regii Botanici Berolinensis Suppl.", - "author": "Willd.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265203", - "description": "taxonomic", - "authorYear": "1814", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Mimosa paradoxa Dum.Cours. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/87626", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:69585", - "type": 27, - "relationship": "includes", - "id": 442482, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:87626", - "referencedIn": "Dumont de Courset, G.L.M. 1814, Le Botaniste Cultivateur Edn. 2. 7", - "author": "Dum.Cours.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:20006", - "description": "taxonomic", - "authorYear": "1814", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Mimosa armata (R.Br.) Poir. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/86503", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:61127", - "type": 27, - "relationship": "includes", - "id": 442448, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:86503", - "referencedIn": "Poiret, J.L.M. 1817, Encyclopedie Methodique, Botanique Suppl. 5(1) 1-526", - "author": "(R.Br.) Poir.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:19390", - "description": "taxonomic", - "authorYear": "1817", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Mimosa paradoxa (DC.) Poir. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298636", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:61127", - "type": 25, - "relationship": "includes", - "id": 442465, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298636", - "referencedIn": "Poiret, J.L.M. 1817, Encyclopedie Methodique, Botanique Suppl. 5(1) 1-526", - "author": "(DC.) Poir.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265199", - "description": "nomenclatural", - "authorYear": "1817", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata Spin nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82350", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:77374", - "type": 27, - "relationship": "includes", - "id": 442348, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82350", - "referencedIn": "Spin, Marquis de 1818, Le Jardin de St. Sebastien Edn. 2.", - "author": "Spin", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17113", - "description": "taxonomic", - "authorYear": "1818", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata Willd. ex H.L.Wendl. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82351", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:72969", - "type": 27, - "relationship": "includes", - "id": 442392, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82351", - "referencedIn": "Wendland, H.L. 1820, Commentatio de Acaciis aphyllis", - "author": "Willd. ex H.L.Wendl.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17114", - "description": "taxonomic", - "authorYear": "1820", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata Willd. ex Spreng. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82360", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:82360", - "type": 27, - "relationship": "includes", - "id": 442405, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82360", - "referencedIn": "Willdenow, C.L. von ex Sprengel, C.P.J. 1820, Neue Entdeckungen im ganzen Umfang der Pflanzenkunde 1", - "author": "Willd. ex Spreng.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17120", - "description": "taxonomic", - "authorYear": "1820", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia ornithophora Sweet ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/74756", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:54592", - "type": 27, - "relationship": "includes", - "id": 442318, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:74756", - "referencedIn": "Sweet, R. 1827, Flora Australasica", - "author": "Sweet", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13463", - "description": "taxonomic", - "authorYear": "1827", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia hybrida Lodd., G.Lodd. & W.Lodd. nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298641", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182292", - "type": 27, - "relationship": "includes", - "id": 442294, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298641", - "referencedIn": "Loddiges, C., Loddiges, G. & Loddiges, W. 1828, The Botanical Cabinet 14", - "author": "Lodd., G.Lodd. & W.Lodd.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265204", - "description": "taxonomic", - "authorYear": "1828", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Phyllodoce armata (R.Br.) Link ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/128225", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:62011", - "type": 27, - "relationship": "includes", - "id": 442489, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:128225", - "referencedIn": "Link, J.H.F. 1829, Handbuch zur Erkennung der nutzbarsten und am häufigsten vorkommenden Gewachse 2 [ i ]-533", - "author": "(R.Br.) Link", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:41739", - "description": "taxonomic", - "authorYear": "1829", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Phyllodoce undulata Link ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/128521", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:62011", - "type": 25, - "relationship": "includes", - "id": 442499, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:128521", - "referencedIn": "Link, J.H.F. 1829, Handbuch zur Erkennung der nutzbarsten und am häufigsten vorkommenden Gewachse 2 [ i ]-533", - "author": "Link", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:41885", - "description": "nomenclatural", - "authorYear": "1829", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia microcantha A.Dietr. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/72548", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:72548", - "type": 27, - "relationship": "includes", - "id": 442306, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:72548", - "referencedIn": "Dietrich, A.G. 1833, Allgemeine Gartenzeitung 1", - "author": "A.Dietr.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:12308", - "description": "taxonomic", - "authorYear": "1833", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia tristis Graham ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82149", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:82149", - "type": 27, - "relationship": "includes", - "id": 442331, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82149", - "referencedIn": "Graham, R. in Hooker, W.J. 1835, Botanical Magazine", - "author": "Graham", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17005", - "description": "taxonomic", - "authorYear": "1835", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Racosperma armata (R.Br.) Mart. nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/302375", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:65319", - "type": 27, - "relationship": "includes", - "id": 442516, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:302375", - "referencedIn": "Martius, C.P. von 1835, Hortus Regius Monacensis Seminifer", - "author": "(R.Br.) Mart.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:266986", - "description": "taxonomic", - "authorYear": "1835", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Racosperma undulata (Willd. ex H.L.Wendl.) Mart. nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/302376", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:65319", - "type": 27, - "relationship": "includes", - "id": 442535, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:302376", - "referencedIn": "Martius, C.P. von 1835, Hortus Regius Monacensis Seminifer", - "author": "(Willd. ex H.L.Wendl.) Mart.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:266987", - "description": "taxonomic", - "authorYear": "1835", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia bartheriana Hort. ex Jacques ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/58545", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58545", - "type": 27, - "relationship": "includes", - "id": 442245, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:58545", - "referencedIn": "Jacques, H.A. 1837, Annales de Flore et de Pomone; ou journal des jardins et des champs", - "author": "Hort. ex Jacques", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4559", - "description": "taxonomic", - "authorYear": "1837", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia furcifera Lindl. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/65696", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:57315", - "type": 27, - "relationship": "includes", - "id": 442261, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:65696", - "referencedIn": "Lindley, J. 1838, Three Expeditions into the interior of Eastern Australia 2", - "author": "Lindl.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:8777", - "description": "taxonomic", - "authorYear": "1838", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata R.Br. var. armata ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57787", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58321", - "type": 27, - "relationship": "includes", - "id": 441910, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57787", - "referencedIn": "Bentham, G. 1842, Notes on Mimoseae, with a synopsis of species. London Journal of Botany 1 318-392", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4107", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. angustifolia Benth. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57760", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58321", - "type": 25, - "relationship": "includes", - "id": 442012, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57760", - "referencedIn": "Bentham, G. 1842, Notes on Mimoseae, with a synopsis of species. London Journal of Botany 1 318-392", - "author": "Benth.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4091", - "description": "nomenclatural", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. microphylla Benth. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57844", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58321", - "type": 27, - "relationship": "includes", - "id": 442091, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57844", - "referencedIn": "Bentham, G. 1842, Notes on Mimoseae, with a synopsis of species. London Journal of Botany 1 318-392", - "author": "Benth.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4137", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. ornithophora (Sweet) Benth. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57860", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58321", - "type": 27, - "relationship": "includes", - "id": 442109, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57860", - "referencedIn": "Bentham, G. 1842, Notes on Mimoseae, with a synopsis of species. London Journal of Botany 1 318-392", - "author": "(Sweet) Benth.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4146", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia hybrida Lodd. ex Benth. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/68146", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58321", - "type": 27, - "relationship": "includes", - "id": 442277, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:68146", - "referencedIn": "Bentham, G. 1842, Notes on Mimoseae, with a synopsis of species. London Journal of Botany 1 318-392", - "author": "Lodd. ex Benth.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:10091", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata Spin var. undulata ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82372", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:82366", - "type": 27, - "relationship": "includes", - "id": 442363, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82372", - "referencedIn": "Visiani R. de 1842, L'Orto Botanico di Padova", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17128", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata var. longispina Hort. ex Vis. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82366", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:82366", - "type": 27, - "relationship": "includes", - "id": 442434, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82366", - "referencedIn": "Visiani R. de 1842, L'Orto Botanico di Padova", - "author": "Hort. ex Vis.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17125", - "description": "taxonomic", - "authorYear": "1842", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armatoides Walp. nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57964", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:57964", - "type": 27, - "relationship": "includes", - "id": 442212, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57964", - "referencedIn": "Walpers, W.G. 1843, Repertorium Botanices Systematicae 1(5) 769-947", - "author": "Walp.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4214", - "description": "taxonomic", - "authorYear": "1843", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia undulata var. elegans Hort. ex Jacques ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/82364", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:68053", - "type": 27, - "relationship": "includes", - "id": 442419, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:82364", - "referencedIn": "Jacques, H.A. Jan. 1844, Annales de Flore et de Pomone; ou journal des jardins et des champs", - "author": "Hort. ex Jacques", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17123", - "description": "taxonomic", - "authorYear": "1844", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. pendula Seem. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57893", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:57893", - "type": 27, - "relationship": "includes", - "id": 442137, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57893", - "referencedIn": "Seemann, B.C. 1846, Verhandlungen der Kaiserlich-Koniglichen Gartenbaugesellschaft in Wien im Jahre 1846", - "author": "Seem.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4170", - "description": "taxonomic", - "authorYear": "1846", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. linearifolia Ser. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57806", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53841", - "type": 27, - "relationship": "includes", - "id": 442057, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57806", - "referencedIn": "Seringe, N.C. 1849, Flore des Jardins et des Grandes Cultures 3", - "author": "Ser.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4116", - "description": "taxonomic", - "authorYear": "1849", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. paradoxa (DC.) Ser. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57874", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53841", - "type": 25, - "relationship": "includes", - "id": 442120, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57874", - "referencedIn": "Seringe, N.C. 1849, Flore des Jardins et des Grandes Cultures 3", - "author": "(DC.) Ser.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4158", - "description": "nomenclatural", - "authorYear": "1849", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. plana Ser. ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57911", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53841", - "type": 27, - "relationship": "includes", - "id": 442159, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57911", - "referencedIn": "Seringe, N.C. 1849, Flore des Jardins et des Grandes Cultures 3", - "author": "Ser.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4181", - "description": "taxonomic", - "authorYear": "1849", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. longipedunculata Regel ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57828", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:57828", - "type": 27, - "relationship": "includes", - "id": 442076, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57828", - "referencedIn": "Regel, E.A. von 1859, Index Seminum, quae hortus botanicus Imperialis Petropolitanus pro mutua commutatione offert.", - "author": "Regel", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4126", - "description": "taxonomic", - "authorYear": "1859", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia barteriana Hort. ex Jacques ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/58526", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:58526", - "type": 27, - "relationship": "includes", - "id": 442224, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:58526", - "referencedIn": "Jacques, H.A. 1863, Journal de la Societe Imperiale et Centrale d'Horticulture", - "author": "Hort. ex Jacques", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4548", - "description": "taxonomic", - "authorYear": "1863", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata R.Br. f. armata ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57794", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441892, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57794", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4110", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. hybrida (Benth.) Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57805", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441925, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57805", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "(Benth.) Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4115", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. micrantha orth. var. Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298638", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441942, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298638", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "orth. var. Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265201", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. microcantha (A.Dietr.) Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57836", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441961, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57836", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "(A.Dietr.) Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4132", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. ornithophora (Sweet) Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57868", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441977, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57868", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "(Sweet) Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4152", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. tristis (Graham) Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57923", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 27, - "relationship": "includes", - "id": 441984, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57923", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "(Graham) Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4188", - "description": "taxonomic", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata f. undulata Voss ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57959", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:121985", - "type": 25, - "relationship": "includes", - "id": 441998, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57959", - "referencedIn": "Voss, A. 1894, Vilmorin's Blumengartnerei Edn. 3. 1(1) 1-832", - "author": "Voss", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4210", - "description": "nomenclatural", - "authorYear": "1894", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. undulata Riebe nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57937", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:57937", - "type": 27, - "relationship": "includes", - "id": 442196, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57937", - "referencedIn": "Riebe, H. 1907, Zwei schone Akazien. Gartenwelt 11(27) 313-315", - "author": "Riebe", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4197", - "description": "taxonomic", - "authorYear": "1907", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. typica Domin nom. inval.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57925", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182153", - "type": 27, - "relationship": "includes", - "id": 442170, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57925", - "referencedIn": "Domin, K. 1926, Beitrage zur Flora und Pflanzengeographie Australiens. Bibliotheca Botanica 22(89) 741-840", - "author": "Domin", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4190", - "description": "taxonomic", - "authorYear": "1926", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. undulata Domin nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57952", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182153", - "type": 25, - "relationship": "includes", - "id": 442179, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57952", - "referencedIn": "Domin, K. 1926, Beitrage zur Flora und Pflanzengeographie Australiens. Bibliotheca Botanica 22(89) 741-840", - "author": "Domin", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4206", - "description": "nomenclatural", - "authorYear": "1926", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. bartheriana Hort. ex Chopinet ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298642", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182293", - "type": 27, - "relationship": "includes", - "id": 442051, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298642", - "referencedIn": "Chopinet, R.G. 1951, Annales de l'institut national de la recherche agronomique. Series B. Annales de l'ameloration des plantes 1(4)", - "author": "Hort. ex Chopinet", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265205", - "description": "taxonomic", - "authorYear": "1951", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Acacia armata var. angustifolia Benth. ex A.D.Chapm. nom. illeg.", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/57778", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:54952", - "type": 27, - "relationship": "includes", - "id": 442035, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:57778", - "referencedIn": "Chapman, A.D. 1991, Australian Plant Name Index", - "author": "Benth. ex A.D.Chapm.", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4101", - "description": "taxonomic", - "authorYear": "1991", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "isPreferred": true, - "nameString": "Racosperma paradoxum (DC.) Pedley ", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/284553", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:180311", - "type": 25, - "relationship": "includes", - "id": 442524, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:284553", - "referencedIn": "Pedley, L. 2003, A synopsis of Racosperma C.Mart. (Leguminosae: Mimosoideae). Austrobaileya 6(3) 445-496", - "author": "(DC.) Pedley", - "isExcluded": false, - "isDraft": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:258210", - "description": "nomenclatural", - "authorYear": "2003", - "isProtologue": false, - "infoSourceName": "Australian Plant Census" - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:246943", - "referencedIn": "Maslin, B.R. & Cowan, R.S. 1995, Robert Brown, the typification of his new Acacia names in edition 2 of Aiton's \"Hortus Kewensis\". Nuytsia 10(1) 107-118", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:177706", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:474085", - "referencedIn": "Mueller, F.J.H. von 1853, First General Report of the Government Botanist on the Vegetation of the Colony. Victoria - Parliamentary Papers- Votes and Proceedings of the Legislative Assembly 1-22", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:59612", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:482174", - "referencedIn": "Burbidge, N.T. & Gray, M. 1970, Flora of the Australian Capital Territory", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:90595", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:567400", - "referencedIn": "Black, J.M. 1924, Casuarinaceae - Euphorbiaceae. Flora of South Australia 2 155-358", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:177340", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:568420", - "referencedIn": "Curtis, W.M. 1956, The Student's Flora of Tasmania 1", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:50111", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:600159", - "referencedIn": "Curtis, W.M. & Morris, D.I. 1975, Angiospermae: Ranunculaceae to Myrtaceae. The Student's Flora of Tasmania Edn. 2. 1", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53270", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:617723", - "referencedIn": "Beadle, N.C.W., Evans, O.D. & Carolin, R.C. 1962, Handbook of the Vascular Plants of the Sydney District and Blue Mountains", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:50259", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:665149", - "referencedIn": "Bailey, F.M. 1913, Comprehensive Catalogue of Queensland Plants", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:50631", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:676100", - "referencedIn": "Pedley, L. 1979, A revision of Acacia Mill. in Queensland. Austrobaileya 1(3) 235-337", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53820", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:690381", - "referencedIn": "Loddiges, C., Loddiges, G. & Loddiges, W. 1817, The Botanical Cabinet 1", - "isPreferred": false, - "author": "R.Br.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4081", - "nameString": "Acacia armata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:65357", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255285", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "(Benth.) Voss", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4115", - "nameString": "Acacia armata f. hybrida", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255286", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "(A.Dietr.) Voss", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4132", - "nameString": "Acacia armata f. microcantha", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255289", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "(Graham) Voss", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4188", - "nameString": "Acacia armata f. tristis", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:665152", - "referencedIn": "Bailey, F.M. 1913, Comprehensive Catalogue of Queensland Plants", - "isPreferred": false, - "author": "Benth.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4091", - "nameString": "Acacia armata var. angustifolia", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:50631", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:728651", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11B", - "isPreferred": false, - "author": "Riebe", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4197", - "nameString": "Acacia armata var. undulata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178722", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255287", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "Hort. ex Jacques", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:4559", - "nameString": "Acacia bartheriana", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255283", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "Lodd. ex Benth.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:10091", - "nameString": "Acacia hybrida", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255284", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "A.Dietr.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:12308", - "nameString": "Acacia microcantha", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:676117", - "referencedIn": "Pedley, L. 1979, A revision of Acacia Mill. in Queensland. Austrobaileya 1(3) 235-337", - "isPreferred": false, - "author": "Sweet", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13463", - "nameString": "Acacia ornithophora", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53820", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:692845", - "referencedIn": "Loddiges, C., Loddiges, G. & Loddiges, W. 1828, The Botanical Cabinet 15", - "isPreferred": false, - "author": "Sweet", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13463", - "nameString": "Acacia ornithophora", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:66822", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255288", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "Graham", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:17005", - "nameString": "Acacia tristis", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:690767", - "referencedIn": "Loddiges, C., Loddiges, G. & Loddiges, W. 1823, The Botanical Cabinet 8", - "isPreferred": false, - "author": "Willd.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:265203", - "nameString": "Acacia undulata", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:192316", - "isProtologue": false - } - ], - "regionTypes": [], - "specimenHolding": [], - "commonNames": [ - { - "guid": "", - "isPreferred": true, - "nameString": "Acacia Hedge", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Hedge Acacia", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Hedge Wattle", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Kangaroo Thorn", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Prickly Acacia", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Prickly Moses", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Prickly Shrub Wattle", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "guid": "", - "isPreferred": true, - "nameString": "Prickly Wattle", - "noOfRankings": 2, - "isBlackListed": false, - "infoSourceId": "2", - "infoSourceURL": "http://www.anbg.gov.au/apni/", - "ranking": 2, - "preferred": true, - "infoSourceName": "Australian Plant Names Index" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Acacia Hedge", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Hedge Wattle", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Kangaroo Acacia", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Kangaroo Thorn", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr395", - "title": "Acacia paradoxa", - "nameString": "Kangaroo Thorn", - "isBlackListed": false, - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "preferred": false, - "documentId": "1559353", - "infoSourceName": "Plant NET Flora Online" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Paradoxa Wattle", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Prickly Acacia", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - }, - { - "isPreferred": false, - "infoSourceUid": "dr416", - "title": "Acacia paradoxa", - "nameString": "Prickly Wattle", - "isBlackListed": false, - "infoSourceId": "1037", - "infoSourceURL": "http://www.weeds.gov.au/", - "identifier": "http://www.weeds.gov.au/cgi-bin/weeddetails.pl?taxon_id=18282", - "preferred": false, - "documentId": "252077", - "infoSourceName": "Weeds in Australia" - } - ], - "taxonConcept": { - "isPreferred": true, - "nameString": "Acacia paradoxa", - "infoSourceId": "5", - "infoSourceURL": "http://biodiversity.org.au/apni.taxon/298640", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:181584", - "referencedIn": "CHAH 2006, Australian Plant Census", - "id": 166350, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "author": "DC.", - "parentGuid": "urn:lsid:biodiversity.org.au:apni.taxon:295861", - "isExcluded": false, - "isDraft": false, - "rawRankString": "Species", - "parentId": "170505", - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "rankString": "species", - "authorYear": "1813", - "rankID": 7000, - "left": 246358, - "isProtologue": false, - "right": 246359, - "infoSourceName": "Australian Plant Census" - }, - "references": [], - "linkIdentifier": "Acacia paradoxa", - "publicationReference": [ - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:180187", - "title": "Williams, K.A.W. 1999, Native Plants of Queensland 4", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:51989", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:191408", - "title": "Wheeler, J.R. 1987, Mimosaceae. Flora of the Perth Region 1 211-234", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:167394", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:191270", - "title": "Pedley, L. 1984, Mimosaceae. Flora of South-eastern Queensland 1 332-386", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:131964", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:189431", - "title": "Morrison, D.A. & Davies, S.J. 1991, Acacia. Flora of New South Wales 2 327-392", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:99505", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:180159", - "title": "Lazarides, M., Cowley, K. & Hohnen, P. 1997, CSIRO Handbook of Australian Weeds", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:181175", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:180878", - "title": "Kodela, P.G. & Harden, G.J. 2002, Acacia. Flora of New South Wales Revised Edition 2 381-476", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:181204", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:182146", - "title": "Entwisle, T.J., Maslin, B.R., Cowan, R.S. & Court, A.B. 1996, Mimosaceae. Flora of Victoria 3 585-656", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:180497", - "pageIdentifiers": [] - }, - { - "guid": "urn:lsid:biodiversity.org.au:apni.reference:74661", - "title": "Candolle, A.P. de 1813, Catalogus Plantarum Horti Botanici Monspeliensis", - "containedIn": "urn:lsid:biodiversity.org.au:apni.publication:59499", - "pageIdentifiers": [] - } - ], - "classification": { - "scientificName": "Acacia paradoxa", - "species": "Acacia paradoxa", - "phylumGuid": "urn:lsid:biodiversity.org.au:apni.taxon:412162", - "speciesGuid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "kingdomGuid": "urn:lsid:biodiversity.org.au:apni.taxon:661518", - "genus": "Acacia", - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "phylum": "Charophyta", - "rank": "species", - "familyGuid": "urn:lsid:biodiversity.org.au:apni.taxon:397778", - "clazzGuid": "urn:lsid:biodiversity.org.au:apni.taxon:406945", - "order": "Fabales", - "kingdom": "Plantae", - "orderGuid": "urn:lsid:biodiversity.org.au:apni.taxon:418427", - "family": "Fabaceae", - "rankId": 7000, - "genusGuid": "urn:lsid:biodiversity.org.au:apni.taxon:295861", - "clazz": "Equisetopsida" - }, - "images": [ - { - "infoSourceUid": "dr413", - "noOfRankings": 1, - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230222/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230222/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "ef183465-fc4a-426b-9b41-20de080ddd07", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230222/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230222/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230222/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa07_3.jpg", - "ranking": 1, - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230222" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr703", - "repoLocation": "http://bie.ala.org.au/repo/1123/193/1932999/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1123/193/1932999/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1123", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr703", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "d94ae0a1-7848-4b57-a6b6-e1279b061a2c", - "dcLocation": "http://bie.ala.org.au/repo/1123/193/1932999/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1123/193/1932999/thumbnail.jpg", - "occurrenceRowKey": "dr703|d94ae0a1-7848-4b57-a6b6-e1279b061a2c", - "largeImageUrl": "http://bie.ala.org.au/repo/1123/193/1932999/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "identifier": "http://biocache.ala.org.au/biocache-media/dr703/8448/d94ae0a1-7848-4b57-a6b6-e1279b061a2c/Acacia_paradoxa.jpg", - "infoSourceName": "Images of Flora and Fauna of 290 Leppitt Rd, Upper Beaconsfield", - "documentId": "1932999" - }, - { - "infoSourceUid": "dr705", - "repoLocation": "http://bie.ala.org.au/repo/1124/193/1933890/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1124/193/1933890/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca", - "creator": "Lyn Allison", - "dcLocation": "http://bie.ala.org.au/repo/1124/193/1933890/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1124/193/1933890/thumbnail.jpg", - "occurrenceRowKey": "dr705|e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca", - "largeImageUrl": "http://bie.ala.org.au/repo/1124/193/1933890/largeRaw.jpg", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/11818/e7e48b39-db24-4f9b-8ee6-f294a7b6d1ca/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn3.jpg", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison", - "documentId": "1933890" - }, - { - "infoSourceUid": "dr705", - "repoLocation": "http://bie.ala.org.au/repo/1124/193/1933822/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1124/193/1933822/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "cfba92cf-d6c5-425a-8b35-b3601b376abd", - "creator": "Lyn Allison", - "dcLocation": "http://bie.ala.org.au/repo/1124/193/1933822/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1124/193/1933822/thumbnail.jpg", - "occurrenceRowKey": "dr705|cfba92cf-d6c5-425a-8b35-b3601b376abd", - "largeImageUrl": "http://bie.ala.org.au/repo/1124/193/1933822/largeRaw.jpg", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/1915/cfba92cf-d6c5-425a-8b35-b3601b376abd/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn2.jpg", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison", - "documentId": "1933822" - }, - { - "infoSourceUid": "dr705", - "repoLocation": "http://bie.ala.org.au/repo/1124/193/1933968/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1124/193/1933968/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "fbf5d232-489a-4ea9-9f4c-9b78ddb60041", - "creator": "Lyn Allison", - "dcLocation": "http://bie.ala.org.au/repo/1124/193/1933968/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1124/193/1933968/thumbnail.jpg", - "occurrenceRowKey": "dr705|fbf5d232-489a-4ea9-9f4c-9b78ddb60041", - "largeImageUrl": "http://bie.ala.org.au/repo/1124/193/1933968/largeRaw.jpg", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/24020/fbf5d232-489a-4ea9-9f4c-9b78ddb60041/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn4.jpg", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison", - "documentId": "1933968" - }, - { - "infoSourceUid": "dr705", - "repoLocation": "http://bie.ala.org.au/repo/1124/193/1933813/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1124/193/1933813/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1124", - "infoSourceURL": "http://www.westgatepark.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "ce0f8ba2-f810-462a-abd9-671417ca2add", - "creator": "Lyn Allison", - "dcLocation": "http://bie.ala.org.au/repo/1124/193/1933813/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1124/193/1933813/thumbnail.jpg", - "occurrenceRowKey": "dr705|ce0f8ba2-f810-462a-abd9-671417ca2add", - "largeImageUrl": "http://bie.ala.org.au/repo/1124/193/1933813/largeRaw.jpg", - "identifier": "http://biocache.ala.org.au/biocache-media/dr705/25932/ce0f8ba2-f810-462a-abd9-671417ca2add/Acacia_paradoxa_-_Hedge_Wattle,_Kangaroo_Thorn5.jpg", - "infoSourceName": "Flora of Westgate Park - Photos from Lyn Allison", - "documentId": "1933813" - }, - { - "licence": "Copyright Richard Hartland", - "infoSourceUid": "dr534", - "repoLocation": "http://bie.ala.org.au/repo/1099/167/1676656/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1099/167/1676656/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1099", - "infoSourceURL": "http://www.ala.org.au", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "4e1083bf-aa57-408b-aa50-925243eb4a61", - "dcLocation": "http://bie.ala.org.au/repo/1099/167/1676656/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1099/167/1676656/thumbnail.jpg", - "occurrenceRowKey": "dr534|http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "largeImageUrl": "http://bie.ala.org.au/repo/1099/167/1676656/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr534", - "identifier": "http://www2.ala.org.au/datasets/dr534/Trees large shrubs/Acacia paradoxa.JPG", - "infoSourceName": "Richard Hartland", - "documentId": "1676656" - }, - { - "infoSourceUid": "dr430", - "repoLocation": "http://bie.ala.org.au/repo/1051/187/1874584/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1051/187/1874584/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "9cf924e1-ca01-4471-8199-254c3bcb3f06", - "dcLocation": "http://bie.ala.org.au/repo/1051/187/1874584/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1051/187/1874584/thumbnail.jpg", - "occurrenceRowKey": "dr430|http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1051/187/1874584/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr430", - "identifier": "http://media.eol.org/content/2012/01/21/02/59741_orig.jpg", - "infoSourceName": "Encyclopedia of Life", - "documentId": "1874584" - }, - { - "infoSourceUid": "dr430", - "repoLocation": "http://bie.ala.org.au/repo/1051/187/1874583/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1051/187/1874583/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1051", - "infoSourceURL": "http://www.eol.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "c1744165-f0cd-4133-8c31-e1c48e48ab73", - "dcLocation": "http://bie.ala.org.au/repo/1051/187/1874583/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1051/187/1874583/thumbnail.jpg", - "occurrenceRowKey": "dr430|http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1051/187/1874583/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr430", - "identifier": "http://media.eol.org/content/2009/04/20/21/72689_orig.jpg", - "infoSourceName": "Encyclopedia of Life", - "documentId": "1874583" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230232/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230232/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "57acc4f7-0561-4b2e-a2d3-f845a04c36d6", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230232/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230232/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230232/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxaRCHS01_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230232" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230226/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230226/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "728a07ed-3f1b-4592-8163-33023c21b61f", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230226/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230226/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230226/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa15_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230226" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230220/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230220/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "d8209b4a-bc82-40cc-8814-bd7d43fc892c", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230220/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230220/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230220/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/301610241330/007_2.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230220" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230236/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230236/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "b9d26fb3-eb8b-45af-bb9b-1e5383bd6a51", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230236/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230236/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230236/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/WEEDS_1/igf-130_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230236" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230228/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230228/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "6cfba9c2-1b36-49f4-8bd9-0d8600228879", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230228/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230228/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230228/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa14_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230228" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230234/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230234/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "50786efe-acdc-4b12-b80d-7cfc28247e12", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230234/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230234/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230234/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/521_FAGG/DSC_2406_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230234" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230218/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230218/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "e6a4d1d7-a394-462e-8a56-069134ac36a9", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230218/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230218/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230218/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31230_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230218" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230224/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230224/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "dbba93b2-5f50-41cc-8cf9-d5341d9d517a", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230224/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230224/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230224/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa12_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230224" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230214/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230214/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "4d813920-15cb-488c-93d1-bec269e110db", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230214/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230214/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230214/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31228_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230214" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230230/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230230/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "c41720c0-c6ca-4221-979d-8e6336d91a02", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230230/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230230/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230230/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/RICHARDSON1/Acacia-paradoxa17_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230230" - }, - { - "infoSourceUid": "dr413", - "repoLocation": "http://bie.ala.org.au/repo/1034/123/1230216/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1034/123/1230216/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1034", - "infoSourceURL": "http://www.anbg.gov.au/anbg/photo-collection/index.html", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "ca8cbe7a-a05c-45d8-ae09-fe3e8caffc07", - "dcLocation": "http://bie.ala.org.au/repo/1034/123/1230216/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1034/123/1230216/thumbnail.jpg", - "occurrenceRowKey": "dr413|http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1034/123/1230216/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr413", - "identifier": "http://www.anbg.gov.au/images/photo_cd/MIMOS_2/A31229_3.jpg", - "infoSourceName": "Australian Plant Image Index", - "documentId": "1230216" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/167/1673398/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/167/1673398/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "e5c366d1-1d5b-459c-9255-e631817a958d", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/167/1673398/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/167/1673398/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6009735357/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/167/1673398/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/26599/e5c366d1-1d5b-459c-9255-e631817a958d/6009735357_c1b65b90cb.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009735357/", - "infoSourceName": "Flickr EOL", - "documentId": "1673398" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/167/1673395/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/167/1673395/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "90fc819d-46d0-4fe6-b3db-6459373744ed", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/167/1673395/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/167/1673395/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6009731837/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/167/1673395/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/28679/90fc819d-46d0-4fe6-b3db-6459373744ed/6009731837_ecffb83fcf.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009731837/", - "infoSourceName": "Flickr EOL", - "documentId": "1673395" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/167/1673397/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/167/1673397/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "03706829-ea23-4f5a-a654-628958dbc853", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/167/1673397/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/167/1673397/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6009729039/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/167/1673397/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/5693/03706829-ea23-4f5a-a654-628958dbc853/6009729039_8a4bba7df5.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6009729039/", - "infoSourceName": "Flickr EOL", - "documentId": "1673397" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/176/1760312/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/176/1760312/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "faa7e252-b2b3-4812-8379-d83c0ee16c80", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/176/1760312/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/176/1760312/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6067213053/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/176/1760312/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/12148/faa7e252-b2b3-4812-8379-d83c0ee16c80/6067213053_9e1ffb18bc.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067213053/", - "infoSourceName": "Flickr EOL", - "documentId": "1760312" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/176/1760318/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/176/1760318/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "e2d12ab6-be66-4170-9455-17b420c35164", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/176/1760318/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/176/1760318/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6067759520/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/176/1760318/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/28117/e2d12ab6-be66-4170-9455-17b420c35164/6067759520_9fa6d866e7.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067759520/", - "infoSourceName": "Flickr EOL", - "documentId": "1760318" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/176/1760313/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/176/1760313/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "f21d593a-a0b6-4f66-bc81-f06caaabd3a1", - "creator": "Arthur Chapman", - "dcLocation": "http://bie.ala.org.au/repo/1013/176/1760313/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/176/1760313/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/arthur_chapman/6067216899/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/176/1760313/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/17821/f21d593a-a0b6-4f66-bc81-f06caaabd3a1/6067216899_cf64c9bdd3.jpg", - "identifier": "http://www.flickr.com/photos/arthur_chapman/6067216899/", - "infoSourceName": "Flickr EOL", - "documentId": "1760313" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/176/1767070/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/176/1767070/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "d9c68d12-12d0-4bce-8f77-9d6b54a8b8de", - "creator": "John Tann", - "dcLocation": "http://bie.ala.org.au/repo/1013/176/1767070/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/176/1767070/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/31031835@N08/6257409296/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/176/1767070/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/1198/d9c68d12-12d0-4bce-8f77-9d6b54a8b8de/6257409296_dce851536a.jpg", - "identifier": "http://www.flickr.com/photos/31031835@N08/6257409296/", - "infoSourceName": "Flickr EOL", - "documentId": "1767070" - }, - { - "licence": "CC-BY", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/154/1541569/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/154/1541569/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "dd377a38-7786-4dcc-9330-9ac9962d5bfd", - "creator": "Donald Hobern", - "dcLocation": "http://bie.ala.org.au/repo/1013/154/1541569/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/154/1541569/thumbnail.jpg", - "occurrenceRowKey": "dr360|http://www.flickr.com/photos/dhobern/3004490043/", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/154/1541569/largeRaw.jpg", - "isPartOf": "http://biocache.ala.org.au/biocache-media/dr360/12794/dd377a38-7786-4dcc-9330-9ac9962d5bfd/3004490043_81ef9291f5.jpg", - "identifier": "http://www.flickr.com/photos/dhobern/3004490043/", - "infoSourceName": "Flickr EOL", - "documentId": "1541569" - }, - { - "licence": "http://creativecommons.org/licenses/by-nc/2.0/", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/153/1539338/raw.jpg", - "rights": "Attribution-NonCommercial License", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/153/1539338/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "creator": "Tony Dudley", - "dcLocation": "http://bie.ala.org.au/repo/1013/153/1539338/dc", - "title": "KANGAROO THORN WATTLE Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/153/1539338/thumbnail.jpg", - "description": "KANGAROO THORN WATTLE; typical bush", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/153/1539338/largeRaw.jpg", - "locality": "Port Lincoln", - "isPartOf": "http://www.flickr.com/photos/61169890@N05/5647457267/", - "identifier": "http://www.flickr.com/photos/61169890@N05/5647457267/", - "infoSourceName": "Flickr EOL", - "documentId": "1539338" - }, - { - "licence": "http://creativecommons.org/licenses/by-nc/2.0/", - "infoSourceUid": "dr360", - "repoLocation": "http://bie.ala.org.au/repo/1013/153/1539337/raw.jpg", - "rights": "Attribution-NonCommercial License", - "smallImageUrl": "http://bie.ala.org.au/repo/1013/153/1539337/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1013", - "infoSourceURL": "http://www.flickr.com/groups/encyclopedia_of_life/", - "contentType": "image/jpeg", - "preferred": false, - "creator": "Tony Dudley", - "dcLocation": "http://bie.ala.org.au/repo/1013/153/1539337/dc", - "title": "KANGAROO THORN WATTLE Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1013/153/1539337/thumbnail.jpg", - "description": "KANGAROO THORN WATTLE; legumes", - "largeImageUrl": "http://bie.ala.org.au/repo/1013/153/1539337/largeRaw.jpg", - "locality": "Port Lincoln", - "isPartOf": "http://www.flickr.com/photos/61169890@N05/5648022560/", - "identifier": "http://www.flickr.com/photos/61169890@N05/5648022560/", - "infoSourceName": "Flickr EOL", - "documentId": "1539337" - }, - { - "infoSourceUid": "dr415", - "repoLocation": "http://bie.ala.org.au/repo/1036/14/149726/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1036/14/149726/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1036", - "infoSourceURL": "http://en.wikipedia.org/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "d66e9c6f-093a-46e5-baa0-50e5cdecc4ca", - "dcLocation": "http://bie.ala.org.au/repo/1036/14/149726/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1036/14/149726/thumbnail.jpg", - "occurrenceRowKey": "dr415|http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1036/14/149726/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr415", - "identifier": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Acacia_armata_C.jpg", - "infoSourceName": "Wikipedia", - "documentId": "149726" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2025163/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2025163/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "4f2d3275-6a38-4e9c-8da5-f5cfb484a83a", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2025163/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2025163/thumbnail.jpg", - "occurrenceRowKey": "dr635|6767_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2025163/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/6767/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26545/4f2d3275-6a38-4e9c-8da5-f5cfb484a83a/134692685128.jpg", - "infoSourceName": "NatureShare", - "documentId": "2025163" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2025884/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2025884/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "74685117-099f-4ebe-ac5f-e6bbea2aae6b", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2025884/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2025884/thumbnail.jpg", - "occurrenceRowKey": "dr635|7283_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2025884/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/7283/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/22856/74685117-099f-4ebe-ac5f-e6bbea2aae6b/134874045028.jpg", - "infoSourceName": "NatureShare", - "documentId": "2025884" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029242/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029242/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "65f71e7f-19b4-4a0c-975c-d5acacae1e18", - "creator": "Chris Lindorff", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029242/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029242/thumbnail.jpg", - "occurrenceRowKey": "dr635|3882_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029242/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3882/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660479504.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029242" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029241/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029241/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "65f71e7f-19b4-4a0c-975c-d5acacae1e18", - "creator": "Chris Lindorff", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029241/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029241/thumbnail.jpg", - "occurrenceRowKey": "dr635|3882_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029241/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3882/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/2463/65f71e7f-19b4-4a0c-975c-d5acacae1e18/131660345478.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029241" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2025384/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2025384/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "26b5fddc-b01f-4f6c-b5d2-af4690a79c11", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2025384/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2025384/thumbnail.jpg", - "occurrenceRowKey": "dr635|6926_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2025384/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/6926/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/9715/26b5fddc-b01f-4f6c-b5d2-af4690a79c11/134785477524.jpg", - "infoSourceName": "NatureShare", - "documentId": "2025384" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2025860/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2025860/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "06b80160-a96b-472b-8cd9-3c17f3e33e50", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2025860/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2025860/thumbnail.jpg", - "occurrenceRowKey": "dr635|7265_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2025860/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/7265/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/3644/06b80160-a96b-472b-8cd9-3c17f3e33e50/134856237611.jpg", - "infoSourceName": "NatureShare", - "documentId": "2025860" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2024952/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2024952/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "2aab8651-ea5b-4169-854d-66fce083a9be", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2024952/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2024952/thumbnail.jpg", - "occurrenceRowKey": "dr635|6611_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2024952/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/6611/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8370/2aab8651-ea5b-4169-854d-66fce083a9be/134596790876.jpg", - "infoSourceName": "NatureShare", - "documentId": "2024952" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029516/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029516/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "a49222ee-83e0-4446-a868-bc1646937f16", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029516/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029516/thumbnail.jpg", - "occurrenceRowKey": "dr635|4142_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029516/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/4142/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/131789437062.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029516" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2025259/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2025259/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "bd397e9f-d19c-4b51-877d-c02170ea035d", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2025259/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2025259/thumbnail.jpg", - "occurrenceRowKey": "dr635|6835_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2025259/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/6835/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/12285/bd397e9f-d19c-4b51-877d-c02170ea035d/134727156794.jpg", - "infoSourceName": "NatureShare", - "documentId": "2025259" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029517/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029517/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "a49222ee-83e0-4446-a868-bc1646937f16", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029517/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029517/thumbnail.jpg", - "occurrenceRowKey": "dr635|4142_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029517/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/4142/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/11493/a49222ee-83e0-4446-a868-bc1646937f16/13178944168.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029517" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029086/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029086/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "5934855c-85d2-4056-b212-35c0c5395262", - "creator": "Bill Strong", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029086/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029086/thumbnail.jpg", - "occurrenceRowKey": "dr635|3759_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029086/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3759/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641397736.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029086" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029649/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029649/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "dc95a71a-1bd1-435f-8380-c16fc471c033", - "creator": "Bill Strong", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029649/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029649/thumbnail.jpg", - "occurrenceRowKey": "dr635|4267_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029649/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/4267/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/4810/dc95a71a-1bd1-435f-8380-c16fc471c033/131874695735.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029649" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029087/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029087/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "5934855c-85d2-4056-b212-35c0c5395262", - "creator": "Bill Strong", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029087/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029087/thumbnail.jpg", - "occurrenceRowKey": "dr635|3759_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029087/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3759/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/27791/5934855c-85d2-4056-b212-35c0c5395262/131641493229.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029087" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2028678/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2028678/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "20b14d93-5ed7-41ae-9234-c77e271d33fe", - "creator": "James Booth", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2028678/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2028678/thumbnail.jpg", - "occurrenceRowKey": "dr635|3403_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2028678/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3403/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/10548/20b14d93-5ed7-41ae-9234-c77e271d33fe/131384019006.jpg", - "infoSourceName": "NatureShare", - "documentId": "2028678" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029044/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029044/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "bf8380bb-c3e2-4a01-a241-2b9843ffeb4b", - "creator": "Bill Strong", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029044/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029044/thumbnail.jpg", - "occurrenceRowKey": "dr635|3725_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029044/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3725/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/26259/bf8380bb-c3e2-4a01-a241-2b9843ffeb4b/131625257883.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029044" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/202/2029137/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/202/2029137/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "4fa802a1-576a-4b4b-9a4c-f26b15046c1d", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/202/2029137/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/202/2029137/thumbnail.jpg", - "occurrenceRowKey": "dr635|3807_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/202/2029137/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/3807/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8723/4fa802a1-576a-4b4b-9a4c-f26b15046c1d/131647916827.jpg", - "infoSourceName": "NatureShare", - "documentId": "2029137" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2030614/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2030614/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "bd4ef589-494c-4ba1-960f-0350f3af0762", - "creator": "John Edwards", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2030614/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2030614/thumbnail.jpg", - "occurrenceRowKey": "dr635|4990_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2030614/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/4990/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13875/bd4ef589-494c-4ba1-960f-0350f3af0762/132342196065.jpg", - "infoSourceName": "NatureShare", - "documentId": "2030614" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2032490/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2032490/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "e7caaa9f-fe9c-4986-903a-064fb3ba24ee", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2032490/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2032490/thumbnail.jpg", - "occurrenceRowKey": "dr635|180_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2032490/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/180/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/8828/e7caaa9f-fe9c-4986-903a-064fb3ba24ee/127305389869.jpg", - "infoSourceName": "NatureShare", - "documentId": "2032490" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2032468/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2032468/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "437c4edb-9ddc-4ab5-a0dc-37136bec96a7", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2032468/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2032468/thumbnail.jpg", - "occurrenceRowKey": "dr635|177_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2032468/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/177/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/6747/437c4edb-9ddc-4ab5-a0dc-37136bec96a7/12729796479.jpg", - "infoSourceName": "NatureShare", - "documentId": "2032468" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2032096/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2032096/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "307a12ee-e892-41cf-a5d8-ffff6f837f5b", - "creator": "Russell Best", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2032096/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2032096/thumbnail.jpg", - "occurrenceRowKey": "dr635|144_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2032096/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/144/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/13957/307a12ee-e892-41cf-a5d8-ffff6f837f5b/127220241635.jpg", - "infoSourceName": "NatureShare", - "documentId": "2032096" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2031696/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2031696/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "f5f37674-d218-4035-90e1-0aa3025bfef8", - "creator": "Nathan Fell", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2031696/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2031696/thumbnail.jpg", - "occurrenceRowKey": "dr635|1142_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2031696/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/1142/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393048494.jpg", - "infoSourceName": "NatureShare", - "documentId": "2031696" - }, - { - "licence": "CC BY 2.5 AU", - "infoSourceUid": "dr635", - "repoLocation": "http://bie.ala.org.au/repo/1107/203/2031697/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1107/203/2031697/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1107", - "infoSourceURL": "http://natureshare.org.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "f5f37674-d218-4035-90e1-0aa3025bfef8", - "creator": "Nathan Fell", - "dcLocation": "http://bie.ala.org.au/repo/1107/203/2031697/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1107/203/2031697/thumbnail.jpg", - "occurrenceRowKey": "dr635|1142_Acacia_paradoxa", - "largeImageUrl": "http://bie.ala.org.au/repo/1107/203/2031697/largeRaw.jpg", - "isPartOf": "http://natureshare.org.au/observation/1142/", - "identifier": "http://biocache.ala.org.au/biocache-media/dr635/23871/f5f37674-d218-4035-90e1-0aa3025bfef8/128393062378.jpg", - "infoSourceName": "NatureShare", - "documentId": "2031697" - }, - { - "infoSourceUid": "dr394", - "repoLocation": "http://bie.ala.org.au/repo/1014/113/1130914/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1014/113/1130914/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1014", - "infoSourceURL": "http://florabase.dec.wa.gov.au/", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "227f1307-55fa-45cc-8b8d-8fe904a1350c", - "dcLocation": "http://bie.ala.org.au/repo/1014/113/1130914/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1014/113/1130914/thumbnail.jpg", - "occurrenceRowKey": "dr394|http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "largeImageUrl": "http://bie.ala.org.au/repo/1014/113/1130914/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr394", - "identifier": "http://florabase.dec.wa.gov.au/science/timage/3482ic1.jpg", - "infoSourceName": "FloraBase - the Western Australian Flora", - "documentId": "1130914" - }, - { - "infoSourceUid": "dr689", - "repoLocation": "http://bie.ala.org.au/repo/1120/207/2077087/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1120/207/2077087/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "7370399f-ead5-4d39-9334-006acf6b9f5b", - "creator": "Don & Betty Wood", - "dcLocation": "http://bie.ala.org.au/repo/1120/207/2077087/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1120/207/2077087/thumbnail.jpg", - "occurrenceRowKey": "dr689|1998-08-11|Acacia paradoxa |-35? 43' 14.9\"S|150? 11' 28.1\"E|S35 43 14.9 E150 11 28.1||", - "largeImageUrl": "http://bie.ala.org.au/repo/1120/207/2077087/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/12138/7370399f-ead5-4d39-9334-006acf6b9f5b/Acacia_paradoxa_C235_2-070.jpg", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood", - "documentId": "2077087" - }, - { - "infoSourceUid": "dr689", - "repoLocation": "http://bie.ala.org.au/repo/1120/207/2075592/raw.jpg", - "smallImageUrl": "http://bie.ala.org.au/repo/1120/207/2075592/smallRaw.jpg", - "isBlackListed": false, - "infoSourceId": "1120", - "infoSourceURL": "http://collections.ala.org.au/public/show/dr689", - "contentType": "image/jpeg", - "preferred": false, - "occurrenceUid": "2212733c-6711-459f-aa8e-859952eebaca", - "creator": "Don & Betty Wood", - "dcLocation": "http://bie.ala.org.au/repo/1120/207/2075592/dc", - "title": "Acacia paradoxa", - "thumbnail": "http://bie.ala.org.au/repo/1120/207/2075592/thumbnail.jpg", - "occurrenceRowKey": "dr689|1998-08-11|Acacia paradoxa |35? 43' 14.9\"S|150? 11' 28.1\"E|S35 43 14.9 E150 11 28.1||", - "largeImageUrl": "http://bie.ala.org.au/repo/1120/207/2075592/largeRaw.jpg", - "isPartOf": "http://collections.ala.org.au/public/showDataResource/dr689", - "identifier": "http://biocache.ala.org.au/biocache-media/dr689/24676/2212733c-6711-459f-aa8e-859952eebaca/Acacia_paradoxa_C235_2-070.jpg", - "infoSourceName": "Plants of the NSW South Coast & ACT - Don and Betty Wood", - "documentId": "2075592" - } - ], - "childConcepts": [], - "screenshotImages": [], - "identificationKeys": [], - "categories": [], - "distributionImages": [ - { - "licence": "DPA - CC-BY-SA", - "infoSourceUid": "dr395", - "repoLocation": "http://bie.ala.org.au/repo/1015/155/1559354/raw.gif", - "smallImageUrl": "http://bie.ala.org.au/repo/1015/155/1559354/smallRaw.gif", - "isBlackListed": false, - "infoSourceId": "1015", - "infoSourceURL": "http://plantnet.rbgsyd.nsw.gov.au/floraonline.htm", - "contentType": "image/gif", - "preferred": false, - "creator": "Botanic Gardens Trust([current date in day month year]). PlantNET - The Plant Information Network System of Botanic Gardens Trust, Sydney, Australia (version [number]). http://plantnet.rbgsyd.nsw.gov.au", - "dcLocation": "http://bie.ala.org.au/repo/1015/155/1559354/dc", - "thumbnail": "http://bie.ala.org.au/repo/1015/155/1559354/thumbnail.gif", - "largeImageUrl": "http://bie.ala.org.au/repo/1015/155/1559354/largeRaw.gif", - "isPartOf": "http://plantnet.rbgsyd.nsw.gov.au/cgi-bin/NSWfl.pl?page=nswfl&lvl=sp&name=Acacia~paradoxa", - "identifier": "http://plantnet.rbgsyd.nsw.gov.au/avh/tmp/NSWsubmap23319125564.gif", - "infoSourceName": "Plant NET Flora Online", - "documentId": "1559354" - } - ], - "pestStatuses": [], - "sameAsConcepts": [ - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255282", - "referencedIn": "Maslin, B.R., et al. 2001, Flora of Australia 11A", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178645", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:255636", - "referencedIn": "Maslin, B.R. 2001, Wattle - Acacias of Australia", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:178565", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:276680", - "referencedIn": "Lazarides, M., Cowley, K. & Hohnen, P. 1997, CSIRO Handbook of Australian Weeds", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:180159", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:463049", - "referencedIn": "Morrison, D.A. & Davies, S.J. 1991, Acacia. Flora of New South Wales 2 327-392", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:189431", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:499434", - "referencedIn": "Entwisle, T.J., Maslin, B.R., Cowan, R.S. & Court, A.B. 1996, Mimosaceae. Flora of Victoria 3 585-656", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:182146", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:528419", - "referencedIn": "Jacobs, S.W.L. & Pickard, J. 1981, Plants of New South Wales", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:50442", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:549294", - "referencedIn": "Kodela, P.G. & Harden, G.J. 2002, Acacia. Flora of New South Wales Revised Edition 2 381-476", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:180878", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:571167", - "referencedIn": "Cunningham, G.M., Mulham, W.E., Milthorpe, P.L. & Leigh, J.H. 1981, Plants of Western New South Wales", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:181684", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:603372", - "referencedIn": "Wheeler, J.R. 1987, Mimosaceae. Flora of the Perth Region 1 211-234", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:191408", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:621448", - "referencedIn": "Pedley, L. 1984, Mimosaceae. Flora of South-eastern Queensland 1 332-386", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:191270", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:655656", - "referencedIn": "Wheeler, J.R., Marchant, N.G. & Lewington, M. 2002, Dicotyledons. Flora of the South West 2 471-972", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:183190", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:75220", - "referencedIn": "Candolle, A.P. de 1813, Catalogus Plantarum Horti Botanici Monspeliensis", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:74661", - "isProtologue": true - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:75221", - "referencedIn": "Pedley, L. 1979, A revision of Acacia Mill. in Queensland. Austrobaileya 1(3) 235-337", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:53820", - "isProtologue": false - }, - { - "id": -1, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:754811", - "referencedIn": "Williams, K.A.W. 1999, Native Plants of Queensland 4", - "isPreferred": false, - "author": "DC.", - "isDraft": false, - "isExcluded": false, - "nameGuid": "urn:lsid:biodiversity.org.au:apni.name:13708", - "nameString": "Acacia paradoxa", - "referencedInGuid": "urn:lsid:biodiversity.org.au:apni.reference:180187", - "isProtologue": false - } - ] - }, - "lastUpdated": "2015-07-01T07:14:01Z", - "links": [ - { - "id": null, - "edition": null, - "title": "ALA occurrence", - "publisherName": null, - "description": "ALA occurrence", - "fullTitle": null, - "class": "au.org.ala.profile.Link", - "uuid": "3b22c095-3946-4ea1-b36a-bbae09086369", - "doi": null, - "url": "http://biocache.ala.org.au/occurrences/3942d802-12e7-4a31-8a7c-9c602b2d861a" - } - ], - "privateMode": false, - "primaryImage": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "specimenIds": [], - "createdBy": null, - "lastUpdatedBy": null, - "classification": [ - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:661518", - "rank": "kingdom", - "name": "Plantae", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:412162", - "rank": "phylum", - "name": "Charophyta", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:406945", - "rank": "class", - "name": "Equisetopsida", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:417544", - "rank": "subclass", - "name": "Magnoliidae", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:418427", - "rank": "order", - "name": "Fabales", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:397778", - "rank": "family", - "name": "Fabaceae", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:295861", - "rank": "genus", - "name": "Acacia", - "class": "au.org.ala.profile.Classification" - }, - { - "id": null, - "guid": "urn:lsid:biodiversity.org.au:apni.taxon:298640", - "rank": "species", - "name": "Acacia paradoxa", - "class": "au.org.ala.profile.Classification" - } - ], - "attributes": [ - { - "creators": "P.G. Kodela", - "title": "Common Name", - "text": "kangaroo thorn, hedge wattle", - "order": -1, - "source": null, - "original": null, - "uuid": "4da4bb3a-95c0-4107-be92-9fe98b83f9d4", - "editors": "", - "required": false, - "plainText": "kangaroo thorn, hedge wattle", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Description", - "images": [ - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=a4d2b5bb-4798-42ce-aa31-a24ef5c322f1", - "occurrenceId": "d8209b4a-bc82-40cc-8814-bd7d43fc892c", - "imageNumber": 2, - "staged": false, - "metadata": null, - "licenceIcon": "https://licensebuttons.net/l/by-nc/3.0/80x15.png" - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "dfc0883d-1fab-4689-a922-b6f30ab93236", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=dfc0883d-1fab-4689-a922-b6f30ab93236", - "occurrenceId": "50786efe-acdc-4b12-b80d-7cfc28247e12", - "imageNumber": 1, - "staged": false, - "metadata": { - "title": "image title" - }, - "licenceIcon": "https://licensebuttons.net/l/by-nc/3.0/80x15.png" - } - }, - { - "rightImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "f87468e0-7157-4cee-a18c-4f5735d9935d", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=f87468e0-7157-4cee-a18c-4f5735d9935d", - "occurrenceId": "ca8cbe7a-a05c-45d8-ae09-fe3e8caffc07", - "imageNumber": 4, - "staged": false, - "metadata": null - }, - "leftImage": { - "imageDetailsUrl": "http://images.ala.org.au/image/details?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "dataResourceName": "Australian Plant Image Index", - "scientificName": "Acacia paradoxa", - "imageId": "79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "excluded": false, - "primary": false, - "thumbnailUrl": "http://images.ala.org.au/image/proxyImageThumbnail?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "largeImageUrl": "http://images.ala.org.au/image/proxyImageThumbnailLarge?imageId=79895e9f-3ed8-4ce8-bff3-9a7036945e64", - "occurrenceId": "4d813920-15cb-488c-93d1-bec269e110db", - "imageNumber": 3, - "staged": false, - "metadata": null - } - } - ], - "text": "Erect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm longErect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm long", - "order": -1, - "source": null, - "original": null, - "uuid": "5ab0527b-acb6-4ef8-8302-51e1635c7886", - "editors": "", - "required": false, - "plainText": "Erect or spreading shrub 1–4 m high; bark finely fissured, brownish grey; branchlets ± terete with low ridges, ± hairy. Stipules spinescent, slender, mostly 5–15 mm long.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Flowering", - "text": "July–November.", - "order": -1, - "source": null, - "original": null, - "uuid": "106ccd42-87bb-4ca9-ad54-8c8f6334e927", - "editors": "", - "required": false, - "plainText": "July–November.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Flowers", - "text": "Inflorescences simple, 1 or rarely 2 in axil of phyllodes; peduncles 6–20 mm long, usually glabrous; heads globose, 20–45-flowered, 5–10 mm diam., yellow to bright yellow.", - "order": -1, - "source": null, - "original": null, - "uuid": "93b83895-fc27-4c36-86f8-fafe94dc4684", - "editors": "", - "required": false, - "plainText": "Inflorescences simple, 1 or rarely 2 in axil of phyllodes; peduncles 6–20 mm long, usually glabrous; heads globose, 20–45-flowered, 5–10 mm diam., yellow to bright yellow.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Fruit", - "text": "Pods ± straight, raised over seeds, ± straight-sided or irregularly ± constricted between seeds, 2–7 cm long, 3–5 mm wide, densely hairy; seeds longitudinal; funicle filiform or expanded towards seed.", - "order": -1, - "source": null, - "original": null, - "uuid": "8db3880d-faad-499e-a3f0-37586c0db557", - "editors": "", - "required": false, - "plainText": "Pods ± straight, raised over seeds, ± straight-sided or irregularly ± constricted between seeds, 2–7 cm long, 3–5 mm wide, densely hairy; seeds longitudinal; funicle filiform or expanded towards seed.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Leaves", - "text": "Phyllodes lanceolate to narrowly elliptic, straight or slightly curved, 0.8–3 cm long, 2.5–7 mm wide, glabrous to hairy, midvein and marginal veins prominent, lateral veins conspicuous or faint, margins often ± undulate, apex pungent-pointed or acute with a mucro; 1 small gland near base; pulvinus to 0.5 mm long.", - "order": -1, - "source": null, - "original": null, - "uuid": "fe77daf4-c202-497e-aa5b-3a5ac739d058", - "editors": "", - "required": false, - "plainText": "Phyllodes lanceolate to narrowly elliptic, straight or slightly curved, 0.8–3 cm long, 2.5–7 mm wide, glabrous to hairy, midvein and marginal veins prominent, lateral veins conspicuous or faint, margins often ± undulate, apex pungent-pointed or acute with a mucro; 1 small gland near base; pulvinus to 0.5 mm long.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Notes", - "text": "Frequently hybridises with a number of other acacias, particularly those of the Acacia verniciflua group and may be most closely related to this group. The name is from the Greek paradoxos, meaning strange, contrary to expectation, which may refer to this thorny, rather unattractive shrub being a showy plant when in full bloom (N. Hall & L.A.S. Johnson, The Names of Acacias of New South Wales, 1993).", - "order": -1, - "source": null, - "original": null, - "uuid": "17594f42-999c-46b6-9d2c-55966062b500", - "editors": "", - "required": false, - "plainText": "Frequently hybridises with a number of other acacias, particularly those of the Acacia verniciflua group and may be most closely related to this group. The name is from the Greek paradoxos, meaning strange, contrary to expectation, which may refer to this thorny, rather unattractive shrub being a showy plant when in full bloom (N. Hall & L.A.S. Johnson, The Names of Acacias of New South Wales, 1993).", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Supplied Taxonomy", - "text": "Fabaceae - Mimosoideae\nAcacia\nparadoxa", - "order": -1, - "source": null, - "original": null, - "uuid": "4329c90e-a596-45ea-93e6-7113dce9d4e4", - "editors": "", - "required": false, - "plainText": "Fabaceae - Mimosoideae\nAcacia\nparadoxa", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Synonyms", - "text": "Acacia armata R.Br.; Acacia microcantha A.Dietr.; Acacia ornithophora Sweet; Acacia tristis Graham; Mimosa armata (R.Br.) Poir.", - "order": -1, - "source": null, - "original": null, - "uuid": "bbfa6e32-a43b-43cb-a1fc-ab1b7f45219b", - "editors": "", - "required": false, - "plainText": "Acacia armata R.Br.; Acacia microcantha A.Dietr.; Acacia ornithophora Sweet; Acacia tristis Graham; Mimosa armata (R.Br.) Poir.", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - }, - { - "creators": "P.G. Kodela", - "title": "Taxon Concept", - "text": "P.G. Kodela & G.J. Harden, Flora of NSW Vol. 2 (2002)", - "order": -1, - "source": null, - "original": null, - "uuid": "452aef95-e534-4888-a4bc-2f202f6cbbcf", - "editors": "", - "required": false, - "plainText": "P.G. Kodela & G.J. Harden, Flora of NSW Vol. 2 (2002)", - "profile": { - "scientificName": "Acacia paradoxa", - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "opus": { - "title": "NSW flora", - "uuid": "39295895-f9cd-4189-bc19-64bd46cd689b", - "shortName": null - } - } - } - ], - "uuid": "bee218e6-e0a4-4b99-8c5e-e63a6e1b93aa", - "fullName": "Acacia paradoxa DC.", - "dataResourceUid": "dr2172", - "opusId": "39295895-f9cd-4189-bc19-64bd46cd689b" - } - } - ] -} diff --git a/grails-app/conf/reports/profiles/PROFILES.jrxml b/grails-app/conf/reports/profiles/PROFILES.jrxml deleted file mode 100644 index 27485af1..00000000 --- a/grails-app/conf/reports/profiles/PROFILES.jrxml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_backcover.jrxml b/grails-app/conf/reports/profiles/PROFILES_backcover.jrxml deleted file mode 100644 index b9b1aee7..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_backcover.jrxml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - <band height="841" splitType="Stretch"> - <rectangle> - <reportElement style="BackCover" x="0" y="230" width="595" height="611" uuid="a0eeb945-c461-469c-9539-05d63cee5db1"/> - </rectangle> - <image vAlign="Middle" onErrorType="Blank"> - <reportElement mode="Opaque" x="170" y="710" width="249" height="75" backcolor="#C9C8C5" uuid="ef222e70-2523-4f64-a03c-3f5b6102585f"/> - <graphicElement fill="Solid"/> - <imageExpression><![CDATA["/reports/profiles/img/ALA-logo-inline.png"]]></imageExpression> - </image> - <image scaleImage="FillFrame"> - <reportElement style="BackCover" x="0" y="0" width="595" height="230" uuid="b2d7a29f-c2a7-4d55-9d1e-9a091896c1a5"/> - <box> - <pen lineStyle="Solid"/> - </box> - <imageExpression><![CDATA[$P{BACK_COVER_IMAGE} ?: "/reports/profiles/img/Gahnia.png"]]></imageExpression> - </image> - </band> - - diff --git a/grails-app/conf/reports/profiles/PROFILES_colophon.jrxml b/grails-app/conf/reports/profiles/PROFILES_colophon.jrxml deleted file mode 100644 index 0b7f667a..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_colophon.jrxml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <band height="750" splitType="Stretch"> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement key="" mode="Opaque" x="0" y="40" width="515" height="150" uuid="f4cfa347-d77c-4dcd-94c8-66b74ac4d3a1"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{colophon.genericCopyright}]]></textFieldExpression> - </textField> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement key="" mode="Opaque" x="0" y="211" width="515" height="93" uuid="f4cfa347-d77c-4dcd-94c8-66b74ac4d3a1"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{colophon.pdfLicense}]]></textFieldExpression> - </textField> - <staticText> - <reportElement positionType="Float" x="0" y="429" width="515" height="17" uuid="66e9b388-5782-4395-a92c-262186e63ecf"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <text><![CDATA[Profile permalink:]]></text> - </staticText> - <textField isStretchWithOverflow="true" isBlankWhenNull="true" hyperlinkType="Reference"> - <reportElement positionType="Float" x="10" y="450" width="505" height="21" isRemoveLineWhenBlank="true" forecolor="#267ED1" uuid="93e4cfc8-24bb-4237-9cc9-ddb50de5f3bc"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font isUnderline="true"/> - </textElement> - <textFieldExpression><![CDATA[$F{colophon.profileLink}]]></textFieldExpression> - </textField> - <image scaleImage="RealSize" hAlign="Center" vAlign="Middle" isLazy="true" onErrorType="Blank"> - <reportElement positionType="Float" x="190" y="520" width="150" height="150" uuid="2acfcb11-90d7-4a7b-9299-d5c0d1af7111"> - <property name="com.jaspersoft.studio.unit.y" value="pixel"/> - <printWhenExpression><![CDATA[$P{QR_CODE} != null]]></printWhenExpression> - </reportElement> - <imageExpression><![CDATA[((java.io.InputStream)$P{QR_CODE})]]></imageExpression> - </image> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="0" y="382" width="515" height="30" isRemoveLineWhenBlank="true" uuid="2d9eb2ae-b2db-4524-bb2f-51d75a13e1a1"> - <property name="com.jaspersoft.studio.unit.x" value="pixel"/> - <printWhenExpression><![CDATA[Boolean.valueOf($F{colophon.citation}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{colophon.citation}]]></textFieldExpression> - </textField> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="0" y="332" width="505" height="17" isRemoveLineWhenBlank="true" uuid="a9b50e6e-b078-4235-9f2f-ff062ef4a118"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <printWhenExpression><![CDATA[Boolean.valueOf($F{colophon.lastUpdated}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA["<b>Profile Updated: " + DATEFORMAT($F{colophon.lastUpdated}, "E MMM d, yyyy h:mm a z") + "</b>"]]></textFieldExpression> - </textField> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="0" y="349" width="505" height="17" isRemoveLineWhenBlank="true" uuid="dd4a853d-73ed-47fb-a9f6-0d6c9ed92a88"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <printWhenExpression><![CDATA[Boolean.valueOf($F{colophon.version}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA["<b>Version: " + $F{colophon.version} + "</b>"]]></textFieldExpression> - </textField> - <staticText> - <reportElement x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="1e288b17-31e4-4f1f-9dcd-8c78f5ce45a9"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <printWhenExpression><![CDATA[new Boolean($F{colophon.citation}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement> - <font isBold="true"/> - </textElement> - <text><![CDATA[Copyright]]></text> - </staticText> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="0" y="20" width="515" height="20" isRemoveLineWhenBlank="true" uuid="b58067a9-a8a2-4a35-8dd9-0851ae398616"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{colophon.collectionCopyright}]]></textFieldExpression> - </textField> - <staticText> - <reportElement x="2" y="190" width="515" height="17" isRemoveLineWhenBlank="true" uuid="93aa7cba-a1a3-4fb8-a3de-3582f9a87469"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <printWhenExpression><![CDATA[new Boolean($F{colophon.pdfLicense}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement> - <font isBold="true"/> - </textElement> - <text><![CDATA[License]]></text> - </staticText> - <textField> - <reportElement x="0" y="308" width="517" height="18" uuid="cdc80800-0511-458e-8dd9-37affb5a760a"> - <property name="com.jaspersoft.studio.unit.y" value="pixel"/> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <printWhenExpression><![CDATA[new Boolean($F{colophon.issn}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA["<b>ISSN:</b> " + $F{colophon.issn}]]></textFieldExpression> - </textField> - </band> - - diff --git a/grails-app/conf/reports/profiles/PROFILES_cover.jrxml b/grails-app/conf/reports/profiles/PROFILES_cover.jrxml deleted file mode 100644 index 917d1597..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_cover.jrxml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <band height="719" splitType="Stretch"> - <textField> - <reportElement style="Detail" x="23" y="277" width="537" height="45" uuid="7f58d454-cae0-4ebb-9ccd-c885124eb525"/> - <box leftPadding="20" rightPadding="20"/> - <textElement textAlignment="Left" markup="html"> - <font fontName="Roboto" size="24" isBold="true"/> - </textElement> - <textFieldExpression><![CDATA[$F{cover.subtitle}]]></textFieldExpression> - </textField> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="45" y="439" width="515" height="160" isRemoveLineWhenBlank="true" uuid="2d9eb2ae-b2db-4524-bb2f-51d75a13e1a1"> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <printWhenExpression><![CDATA[Boolean.valueOf($F{cover.citation}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"> - <font fontName="Roboto" size="10"/> - </textElement> - <textFieldExpression><![CDATA[$F{cover.citation}]]></textFieldExpression> - </textField> - <textField> - <reportElement x="45" y="624" width="420" height="30" uuid="38fc9afd-edcb-42f3-b6bc-cd258f6507b3"/> - <textElement textAlignment="Left"> - <font fontName="Roboto" size="10"/> - </textElement> - <textFieldExpression><![CDATA["Generated on " + DATEFORMAT(TODAY( ),"E MMM d, yyyy")]]></textFieldExpression> - </textField> - <textField> - <reportElement x="45" y="328" width="515" height="62" uuid="acb92de7-c403-438f-8ec7-fda711101499"/> - <textElement> - <font fontName="Roboto" size="12" isBold="false"/> - </textElement> - <textFieldExpression><![CDATA["Author: " + $F{cover.authorship}]]></textFieldExpression> - </textField> - <image scaleImage="FillFrame"> - <reportElement x="0" y="0" width="595" height="240" uuid="1c0d107b-419b-48e8-b6c7-b5badc10efb6"/> - <graphicElement fill="Solid"/> - <imageExpression><![CDATA[$P{COVER_IMAGE} ?: "/reports/profiles/img/gahnia2.png"]]></imageExpression> - </image> - <image scaleImage="FillFrame"> - <reportElement key="" style="DetailBox" x="0" y="55" width="595" height="185" uuid="081626e1-4b11-4060-bd86-786399ebeae2"/> - <box> - <topPen lineWidth="5.0"/> - </box> - <imageExpression><![CDATA[$P{GRADIENT} ?: "/reports/profiles/img/gradient.svg"]]></imageExpression> - </image> - <textField pattern=""> - <reportElement mode="Transparent" x="54" y="113" width="487" height="82" uuid="0d3a8d10-05d2-4ec4-a48a-8104d58bda12"> - <property name="com.jaspersoft.studio.unit.x" value="pixel"/> - <property name="com.jaspersoft.studio.unit.y" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - </reportElement> - <textElement markup="html"> - <font fontName="Raleway" size="31"/> - </textElement> - <textFieldExpression><![CDATA[$F{cover.headerTitleHtml}]]></textFieldExpression> - </textField> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail.jrxml deleted file mode 100644 index 77fed9c1..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail.jrxml +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <band splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_acknowledgements.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_acknowledgements.jrxml deleted file mode 100644 index b5bf51ec..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_acknowledgements.jrxml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="1163d00c-253c-49bc-8a56-6cdbbf6c8e34"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Acknowledgements]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_attributes.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_attributes.jrxml deleted file mode 100644 index 5f683ffc..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_attributes.jrxml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <band splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_bhl.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_bhl.jrxml deleted file mode 100644 index a00661b6..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_bhl.jrxml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Biodiversity Heritage Library References]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_bibliography.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_bibliography.jrxml deleted file mode 100644 index 576f38e2..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_bibliography.jrxml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Bibliography]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_conservation.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_conservation.jrxml deleted file mode 100644 index 32520506..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_conservation.jrxml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="483cae47-6eb0-4dc2-b87e-feb02b8a1075"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Conservation Status]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_images.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_images.jrxml deleted file mode 100644 index c873b6a5..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_images.jrxml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - <printWhenExpression><![CDATA[$P{showTitle}]]></printWhenExpression> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Images]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fig. ${$F{leftImage.imageNumber}}" + ($F{leftImage.metadata.title} ? ": '${$F{leftImage.metadata.title}}'" : "") + ($F{leftImage.metadata.title} ? new String($F{leftImage.metadata.creator}.asBoolean() ? " by ${$F{leftImage.metadata.creator}}" : "") : "") + ($F{leftImage.metadata.rightsHolder} ? new String($F{leftImage.metadata.rightsHolder}.asBoolean() ? " (© ${$F{leftImage.metadata.rightsHolder}})" : "") : "")]]> - - - - - - - - - - - - - - - - - - - - - - - - - Fig. ${$F{rightImage.imageNumber}}" + ($F{rightImage.metadata.title} ? ": '${$F{rightImage.metadata.title}}'" : "") + ($F{rightImage.metadata.title} ? new String($F{rightImage.metadata.creator}.asBoolean() ? " by ${$F{rightImage.metadata.creator}}" : "") : "") + ($F{rightImage.metadata.rightsHolder} ? new String($F{rightImage.metadata.rightsHolder}.asBoolean() ? " (© ${$F{rightImage.metadata.rightsHolder}})" : "") : "")]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_key.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_key.jrxml deleted file mode 100644 index 16ccaa46..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_key.jrxml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - <band height="42" splitType="Stretch"> - <textField> - <reportElement positionType="Float" x="0" y="1" width="515" height="20" uuid="57682c8f-eff1-4b9e-801d-390735cda233"/> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <textFieldExpression><![CDATA[$F{projectName} + " " + $F{keyName} + " key"]]></textFieldExpression> - </textField> - <textField isStretchWithOverflow="true"> - <reportElement x="10" y="21" width="505" height="17" isRemoveLineWhenBlank="true" uuid="691e9582-8174-4840-a971-cf425767ae66"/> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{source}]]></textFieldExpression> - </textField> - </band> - - - - - - - - )$P{REPORT_TEMPLATES}]]> - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_key_item.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_key_item.jrxml deleted file mode 100644 index d118fdb8..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_key_item.jrxml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_links.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_links.jrxml deleted file mode 100644 index 5df6fe61..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_links.jrxml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Links]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_map.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_map.jrxml deleted file mode 100644 index e7855cca..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_map.jrxml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - <band height="223" splitType="Stretch"> - <image scaleImage="RetainShape" hAlign="Center" vAlign="Middle" isLazy="true" hyperlinkType="Reference" hyperlinkTarget="Blank"> - <reportElement positionType="Float" x="270" y="4" width="257" height="216" isRemoveLineWhenBlank="true" uuid="8efb1cc8-2e61-4252-ab35-1112479234f8"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <box padding="2"> - <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#ABABAB"/> - <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#ABABAB"/> - <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#ABABAB"/> - <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#ABABAB"/> - </box> - <imageExpression><![CDATA[$F{mapImageUrl}]]></imageExpression> - <hyperlinkReferenceExpression><![CDATA[$F{occurrencesUrl}]]></hyperlinkReferenceExpression> - <hyperlinkWhenExpression><![CDATA[$F{occurrencesUrl} != null && $F{occurrencesUrl}.trim() != ""]]></hyperlinkWhenExpression> - </image> - <textField> - <reportElement x="1" y="3" width="259" height="217" uuid="c7a46b37-80ab-4587-b542-4ef5e57a6511"> - <printWhenExpression><![CDATA[Boolean.valueOf($F{text}.asBoolean())]]></printWhenExpression> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$F{text}]]></textFieldExpression> - </textField> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_nomenclature.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_nomenclature.jrxml deleted file mode 100644 index 5f9b57b2..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_nomenclature.jrxml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - <band height="37" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" uuid="90d40018-95a7-46ee-93a5-bb7e408dd432"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Nomenclature]]></text> - </staticText> - <textField isStretchWithOverflow="true" isBlankWhenNull="true"> - <reportElement x="10" y="21" width="480" height="15" isRemoveLineWhenBlank="true" uuid="35826d20-582f-425f-8519-e2bfd340140d"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement markup="html"/> - <textFieldExpression><![CDATA[$P{formattedName}]]></textFieldExpression> - </textField> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_specimens.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_specimens.jrxml deleted file mode 100644 index 71babf35..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_specimens.jrxml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Specimens]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_status.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_status.jrxml deleted file mode 100644 index 8e5354ea..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_status.jrxml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - <band splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - </band> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_detail_taxonomy.jrxml b/grails-app/conf/reports/profiles/PROFILES_detail_taxonomy.jrxml deleted file mode 100644 index 641892e7..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_detail_taxonomy.jrxml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - <band height="17" splitType="Stretch"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <staticText> - <reportElement positionType="Float" x="0" y="0" width="515" height="17" isRemoveLineWhenBlank="true" uuid="d5c74560-6485-46d6-a0cc-4b08cd53546f"> - <property name="com.jaspersoft.studio.unit.height" value="pixel"/> - <property name="com.jaspersoft.studio.unit.width" value="pixel"/> - </reportElement> - <textElement> - <font size="14" isBold="true"/> - </textElement> - <text><![CDATA[Taxonomy]]></text> - </staticText> - </band> - - - - - - - - - - - - - - - - - - - - - ${$F{rank}.toUpperCase()}: ${$F{scientificName}}"]]> - - - - - - - - - - - - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_styles.jrtx b/grails-app/conf/reports/profiles/PROFILES_styles.jrtx deleted file mode 100644 index 70a3b43c..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_styles.jrtx +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - diff --git a/grails-app/conf/reports/profiles/PROFILES_toc.jrxml b/grails-app/conf/reports/profiles/PROFILES_toc.jrxml deleted file mode 100644 index 4f99a0ff..00000000 --- a/grails-app/conf/reports/profiles/PROFILES_toc.jrxml +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-
-
- - - -
-
-
-

${record.profile.scientificName} ${record.profile.nameAuthor}

-
- -
- ${record.profile.authorship?.find { it.category == 'Author' }?.text ?: ""} -
- - - -
-

${attribute.title}

-
-

${raw(attribute.text)}

- - - Contributed by - - ${attribute.creators.join(', ')} - - - - - Edited by - - ${attribute.editors.join(', ')} - - - - -
-
-
-
- - -

Occurrences

- -
- - -

Conservation Status

-
    - -
  • ${status.regionAbbrev ?: 'IUCN'} ${status.rawStatus} -
  • -
    -
-
- - -
-

Taxonomy

-
    - -
  • ${classification.rank.capitalize()}: ${classification.scientificName}
  • -
    -
-
-
- - -

Nomenclature

- ${raw(record.profile.nomenclatureHtml)} -
- - -

Links

- -
- - -

Biodiversity Heritage Library References

- -

- Title: ${link.title}
- Description: ${link.description}
- BHL Title: ${link.fullTitle}
- Edition: ${link.edition}
- Publisher: ${link.publisher}
- DOI: ${link.doi}
-

-
-
- - -

Specimens

- -

- Institution Name: ${spec.institutionName}
- Collection: ${spec.collectionName}
- Catalog Number: ${spec.catalogNumber}
-

-
-
- - -

Images

-
- - - - - - - -
-
- - -

Bibliography

-
    - -
  • ${raw(bib.text)}
  • -
    -
-
- - -
-

${authorship.category}

- -

${authorship.text}

-
-
-
- -
- - - - - \ No newline at end of file diff --git a/grails-app/views/profile/_optionsMenu.gsp b/grails-app/views/profile/_optionsMenu.gsp index 1467d280..e4131b35 100644 --- a/grails-app/views/profile/_optionsMenu.gsp +++ b/grails-app/views/profile/_optionsMenu.gsp @@ -30,13 +30,6 @@ -
  • -   Export as PDF - -
  • diff --git a/grails-app/views/profile/_publications.gsp b/grails-app/views/profile/_publications.gsp index 4e2d4f94..c1b4d080 100644 --- a/grails-app/views/profile/_publications.gsp +++ b/grails-app/views/profile/_publications.gsp @@ -25,18 +25,4 @@ - - diff --git a/src/main/groovy/au/org/ala/profile/hub/reports/BackCoverImageRenderer.groovy b/src/main/groovy/au/org/ala/profile/hub/reports/BackCoverImageRenderer.groovy deleted file mode 100644 index 26e6b3ab..00000000 --- a/src/main/groovy/au/org/ala/profile/hub/reports/BackCoverImageRenderer.groovy +++ /dev/null @@ -1,195 +0,0 @@ -package au.org.ala.profile.hub.reports - - -import groovy.util.logging.Slf4j -import groovyx.gpars.dataflow.Dataflows -import net.sf.jasperreports.engine.JRException -import net.sf.jasperreports.engine.JasperReportsContext -import net.sf.jasperreports.renderers.AbstractRenderToImageDataRenderer - -import java.awt.* -import java.awt.geom.Dimension2D -import java.awt.geom.Rectangle2D -import java.awt.image.BufferedImage -import java.awt.image.ImageObserver - -import static java.lang.Math.round - -/** - * Renderer for the report back cover image. - * - * First it synchronously loads the image from the URL and at the same time, scales it to required width - * and height, preserving aspect ratio by centre cropping. - * - * At render time it will also desaturate each pixel and then apply a wash using the washColour. WashColour - * should have an alpha value at most 0.8. Wash colours alpha will then transition to 1.0 from gradientThreshold of - * the height to 1.0 of the height, so that the colour fades into the main background colour. - */ -@Slf4j -class BackCoverImageRenderer extends AbstractRenderToImageDataRenderer { - - private final BufferedImage bufferedImage - private final Color washColor - private final double gradientThreshold - private final int width - private final int height - - BackCoverImageRenderer(URL url, Color washColor, double gradientThreshold = 0.7, int width = 595, int height = 230) { - this.gradientThreshold = gradientThreshold - this.washColor = washColor - this.bufferedImage = create(url, new Dimension(width, height)) - this.width = width - this.height = height - } - - @Override - Dimension2D getDimension(JasperReportsContext jasperReportsContext) throws JRException { - return new Dimension(width, height) - } - - /** - * Takes the scaled image bytes and applies the desaturation, wash and gradient before painting the new image - * into the graphics context - * @param jasperReportsContext - * @param grx - * @param rectangle - * @throws JRException - */ - @Override - void render(JasperReportsContext jasperReportsContext, Graphics2D grx, Rectangle2D rectangle) throws JRException { - log.debug("BackCoverImageRenderer.render()") - def gradThresh = round(bufferedImage.height.toDouble() * gradientThreshold).toInteger() - def gradThreshD = gradThresh.toDouble() - def gradientHeight = (bufferedImage.height - gradThresh).toDouble() - def alphaRemaining = 255 - washColor.alpha - def alphaRemainingDouble = alphaRemaining.toDouble() - - for (int i = 0; i < bufferedImage.width; ++i) { - for (int j = 0; j < bufferedImage.height; ++j) { - def colour = bufferedImage.getRGB(i, j) - def c = new Color(colour, true) - def fgd - if (j > gradThresh) { - def alphaDelta = alphaRemainingDouble * ((j.toDouble() - gradThreshD) / gradientHeight) - def newAlpha = ColourUtils.clamp(washColor.alpha + round(alphaDelta).toInteger()) - - fgd = ColourUtils.withAlpha(washColor, newAlpha) - } else { - fgd = washColor - } - def c2 = ColourUtils.blend(fgd, ColourUtils.asLuminosity(c)) - bufferedImage.setRGB(i,j, c2.getRGB()) - } - } - - grx.paint = new TexturePaint(bufferedImage, new Rectangle(bufferedImage.width, bufferedImage.height)) -// g2d.paint = TexturePaint(image, Rectangle(image.width, image.height)) - grx.fillRect(0, 0, width, height) - } - - /** - * Load and scale the image to the required size using the method from - * https://javagraphics.blogspot.com.au/2011/05/images-scaling-jpegs-and-pngs.html - * - * @param url - * @param maxSize - * @return - * @throws Throwable - */ - BufferedImage create(URL url, Dimension maxSize) throws Throwable { - Image image = Toolkit.getDefaultToolkit().createImage(url) - - // Could also do this with Java 8 CompletableFutures - final def df = new Dataflows() -// CompletableFuture widthFuture = new CompletableFuture<>() - - def initWidth = image.getWidth(new ImageObserver() { - @Override - boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { - - def error = (infoflags & ERROR) != 0 - def abort = (infoflags & ABORT) != 0 - - if (error || abort) { -// widthFuture.completeExceptionally(new IOException()) - df.width = -1 - return false - } - - def finished = (infoflags & WIDTH) != 0 -// widthFuture.complete(width) - df.width = width - return !finished - } - }) - - if (initWidth != -1) { - df.width = initWidth -// widthFuture.complete(initWidth) - } - -// CompletableFuture heightFuture = new CompletableFuture<>() - def initHeight = image.getHeight(new ImageObserver() { - @Override - boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { - - def error = (infoflags & ERROR) != 0 - def abort = (infoflags & ABORT) != 0 - - if (error || abort) { -// heightFuture.completeExceptionally(new IOException()) - df.height = -1 - return false - } - - def finished = (infoflags & HEIGHT) != 0 -// heightFuture.complete(height) - df.height = height - return !finished - } - }) - - if (initHeight != -1) { -// heightFuture.complete(initHeight) - df.height = initHeight - } - -// def imageWidth = widthFuture.join() -// def imageHeight = heightFuture.join() - int imageWidth = df.width - int imageHeight = df.height - if (imageWidth == -1 || imageHeight == -1) { - throw new IOException("Couldn't read width ($imageWidth) or height ($imageHeight) from $url") - } - def maxWidth = maxSize.width.toInteger() - def maxHeight = maxSize.height.toInteger() - - BufferedImage thumbnail = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB) - Graphics2D g = thumbnail.createGraphics() - if (imageWidth != maxWidth || imageHeight != maxHeight) { - def widthPct = maxWidth.toDouble() / imageWidth.toDouble() - def heightPct = maxHeight.toDouble() / imageHeight.toDouble() - - def scalePct = Math.max(widthPct, heightPct) - g.scale(scalePct, scalePct) - - def scaledWidth = imageWidth * scalePct - def scaledHeight = imageHeight * scalePct - - // centre scaled image - def startX = round((scaledWidth - maxWidth) / 2).toInteger() - def startY = round((scaledHeight - maxHeight) / 2).toInteger() - g.translate(-startX, -startY) - } - - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) - while (!g.drawImage(image, 0, 0, null)); - g.dispose() - - image.flush() - - return thumbnail - } - -} diff --git a/src/main/groovy/au/org/ala/profile/hub/reports/GradientRenderer.groovy b/src/main/groovy/au/org/ala/profile/hub/reports/GradientRenderer.groovy deleted file mode 100644 index 7405fc27..00000000 --- a/src/main/groovy/au/org/ala/profile/hub/reports/GradientRenderer.groovy +++ /dev/null @@ -1,59 +0,0 @@ -package au.org.ala.profile.hub.reports - - -import groovy.util.logging.Slf4j -import net.sf.jasperreports.engine.JRException -import net.sf.jasperreports.engine.JasperReportsContext -import net.sf.jasperreports.renderers.AbstractRenderToImageDataRenderer - -import java.awt.* -import java.awt.geom.Dimension2D -import java.awt.geom.Rectangle2D - -import static java.awt.MultipleGradientPaint.CycleMethod.NO_CYCLE - -/** - * Renders a gradient from a start colour to transparent like so: - * COLOUR --33%--> COLOUR --100%--> COLOUR_WITH_ALPHA_0 - */ -@Slf4j -class GradientRenderer extends AbstractRenderToImageDataRenderer { - - private static final Color TRANSPARENT = new Color(0,0,0,0) - - private static final int DEFAULT_WIDTH = 595 - private static final int DEFAULT_HEIGHT = 185 - - private final int width - private final int height - - GradientRenderer(Color startColor, int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT) { - this.startColor = startColor - this.width = width - this.height = height - } - - GradientRenderer(String startColor, int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT) { - this(new ColourParser().decodeColorWithDefault(startColor, Color.WHITE), width, height) - } - - Color startColor - - @Override - Dimension2D getDimension(JasperReportsContext jasperReportsContext) throws JRException { - return new Dimension(width, height) - } - - @Override - void render(JasperReportsContext jasperReportsContext, Graphics2D g2d, Rectangle2D rect) throws JRException { - log.debug("GradientRenderer.render() from $startColor") - g2d.background = TRANSPARENT - def transparentStartColor = new Color(startColor.red, startColor.green, startColor.blue, 0) - log.debug("GradientRenderer.render() to $transparentStartColor") - final float[] fractions = [ 0f, 0.33f, 1.0f ] - final Color[] colors = [ startColor, startColor, transparentStartColor] - g2d.paint = new LinearGradientPaint(0f, 0f, rect.width.toFloat(), 0f, fractions, colors, NO_CYCLE) - - g2d.fillRect(0, 0, rect.width.toInteger(), rect.height.toInteger()) - } -} diff --git a/src/main/groovy/au/org/ala/profile/hub/reports/JasperExportFormat.groovy b/src/main/groovy/au/org/ala/profile/hub/reports/JasperExportFormat.groovy deleted file mode 100644 index 87989ecf..00000000 --- a/src/main/groovy/au/org/ala/profile/hub/reports/JasperExportFormat.groovy +++ /dev/null @@ -1,123 +0,0 @@ -package au.org.ala.profile.hub.reports - -import net.sf.jasperreports.engine.JRExporter -import net.sf.jasperreports.engine.export.JRCsvExporter -import net.sf.jasperreports.engine.export.JRCsvExporterParameter -import net.sf.jasperreports.engine.export.JRHtmlExporter -import net.sf.jasperreports.engine.export.JRHtmlExporterParameter -import net.sf.jasperreports.engine.export.JRPdfExporter -import net.sf.jasperreports.engine.export.JRPdfExporterParameter -import net.sf.jasperreports.engine.export.JRRtfExporter -import net.sf.jasperreports.engine.export.JRTextExporter -import net.sf.jasperreports.engine.export.JRTextExporterParameter -import net.sf.jasperreports.engine.export.JRXlsExporter -import net.sf.jasperreports.engine.export.JRXlsExporterParameter -import net.sf.jasperreports.engine.export.JRXmlExporter -import net.sf.jasperreports.engine.export.JRXmlExporterParameter -import net.sf.jasperreports.engine.export.oasis.JROdsExporter -import net.sf.jasperreports.engine.export.oasis.JROdtExporter -import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter -import net.sf.jasperreports.engine.export.ooxml.JRDocxExporterParameter -import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter -import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter - -import java.lang.reflect.Field - -/** - * The supported file formats with their mimetype and file extension. - * - * This is directly imported from the old Jasper plugin - * - * TODO Replace all deprecated code - * - * @author Sebastian Hohns - */ -enum JasperExportFormat implements Serializable { - PDF_FORMAT("application/pdf", "pdf", false), - HTML_FORMAT("text/html", "html", true), - XML_FORMAT("text/xml", "xml", false), - CSV_FORMAT("text/csv", "csv", false), - XLS_FORMAT("application/vnd.ms-excel", "xls", false), - RTF_FORMAT("text/rtf", "rtf", false), - TEXT_FORMAT("text/plain", "txt", true), - ODT_FORMAT("application/vnd.oasis.opendocument.text", "odt", false), - ODS_FORMAT("application/vnd.oasis.opendocument.spreadsheetl", "ods", false), - DOCX_FORMAT("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx", false), - XLSX_FORMAT("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx", false), - PPTX_FORMAT("application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx", false) - - String mimeTyp - String extension - boolean inline - - private JasperExportFormat(String mimeTyp, String extension, boolean inline) { - this.mimeTyp = mimeTyp - this.extension = extension - this.inline = inline - } - - /** - * Return the JasperExportFormat for a given format string. - * @param format as String - * @return JasperExportFormat - */ - static JasperExportFormat determineFileFormat(String format) { - switch (format) { - case "PDF": return JasperExportFormat.PDF_FORMAT - case "HTML": return JasperExportFormat.HTML_FORMAT - case "XML": return JasperExportFormat.XML_FORMAT - case "CSV": return JasperExportFormat.CSV_FORMAT - case "XLS": return JasperExportFormat.XLS_FORMAT - case "RTF": return JasperExportFormat.RTF_FORMAT - case "TEXT": return JasperExportFormat.TEXT_FORMAT - case "ODT": return JasperExportFormat.ODT_FORMAT - case "ODS": return JasperExportFormat.ODS_FORMAT - case "DOCX": return JasperExportFormat.DOCX_FORMAT - case "XLSX": return JasperExportFormat.XLSX_FORMAT - case "PPTX": return JasperExportFormat.PPTX_FORMAT - default: throw new Exception(message(code: "jasper.controller.invalidFormat", args: [format])) - } - } - - /** - * Return the suitable Exporter for a given file format. - * @param format - * @return exporter - */ - static JRExporter getExporter(JasperExportFormat format) { - switch (format) { - case PDF_FORMAT: return new JRPdfExporter() - case HTML_FORMAT: return new JRHtmlExporter() - case XML_FORMAT: return new JRXmlExporter() - case CSV_FORMAT: return new JRCsvExporter() - case XLS_FORMAT: return new JRXlsExporter() - case RTF_FORMAT: return new JRRtfExporter() - case TEXT_FORMAT: return new JRTextExporter() - case ODT_FORMAT: return new JROdtExporter() - case ODS_FORMAT: return new JROdsExporter() - case DOCX_FORMAT: return new JRDocxExporter() - case XLSX_FORMAT: return new JRXlsxExporter() - case PPTX_FORMAT: return new JRPptxExporter() - default: throw new Exception(message(code: "jasper.controller.invalidFormat", args: [format])) - } - } - - /** - * Return the available Fields for a given JasperExportFormat. - * @param format - * @return Field[] , null if no fields are available for the format - */ - static Field[] getExporterFields(JasperExportFormat format) { - switch (format) { - case PDF_FORMAT: return JRPdfExporterParameter.getFields() - case HTML_FORMAT: return JRHtmlExporterParameter.getFields() - case XML_FORMAT: return JRXmlExporterParameter.getFields() - case CSV_FORMAT: return JRCsvExporterParameter.getFields() - case XLS_FORMAT: return JRXlsExporterParameter.getFields() - case XLSX_FORMAT: return JRXlsExporterParameter.getFields() - case RTF_FORMAT: return JRTextExporterParameter.getFields() - case DOCX_FORMAT: return JRDocxExporterParameter.getFields() - default: return null - } - } -} \ No newline at end of file diff --git a/src/main/groovy/au/org/ala/profile/hub/reports/JasperReportDef.groovy b/src/main/groovy/au/org/ala/profile/hub/reports/JasperReportDef.groovy deleted file mode 100644 index 86ca67c7..00000000 --- a/src/main/groovy/au/org/ala/profile/hub/reports/JasperReportDef.groovy +++ /dev/null @@ -1,140 +0,0 @@ -package au.org.ala.profile.hub.reports - -import net.sf.jasperreports.engine.JRDataSource -import net.sf.jasperreports.engine.JasperPrint - -import org.apache.commons.io.FilenameUtils -import grails.util.Holders -import org.springframework.core.io.FileSystemResource -import org.springframework.core.io.Resource - -/** - * An abstract representation of a Jasper report. - *

    - * It contains the location of the report design file (name and folder) and - * data(reportData and/or parameters) needed to fill the report. - * - * This is directly imported from the old Jasper plugin - * - * TODO Replace all deprecated code - * - * @author Sebastian Hohns 2010 - */ -class JasperReportDef implements Serializable { - - /** - * The name of the report file without extension. - *

    - * The file can be in jrxml- or jasper-format. - */ - String name - - /** - * The parent folder of the report file. - *

    - * This can be an absolute path or an relative path based on class path. - */ - String folder - - /** - * The data source used to fill the report. - *

    - * This is a list of java beans. - */ - Collection reportData - - /** - * The actual data source used to fill the report. - *

    - * This is an implementation of {@link JRDataSource}. - */ - JRDataSource dataSource - - /** - * The target file format. - */ - JasperExportFormat fileFormat = JasperExportFormat.PDF_FORMAT - - /** - * The generated report as OutputStream. - */ - ByteArrayOutputStream contentStream - - /** - * Additional parameters. - */ - Map parameters = [:] - - /** - * Locale setting. - */ - Locale locale - - JasperPrint jasperPrinter - - private getApplicationContext() { - return Holders.grailsApplication.mainContext - } - - /** - * Looks for the report file in the filesystem. The file extension can either be .jasper - * or .jrxml. if japser.compile.files is set to true the report will be compiled and stored - * in the same folder as the jrxml file. - * @return the report as Resource - * @throws Exception , report file not found - */ - Resource getReport() { - String path = getFilePath() - - Resource result = getApplicationContext().getResource(path + ".jasper") - if (result.exists()) { - return result - } - - result = new FileSystemResource(path + ".jasper") - if (result.exists()) { - return result - } - - result = getApplicationContext().getResource(path + ".jrxml") - if (result.exists()) { - return result - } - - result = new FileSystemResource(path + ".jrxml") - if (result.exists()) { - return result - } - - throw new Exception("No such report spec: ${path} (jasper or .jrxml)") - } - - /** - * Return the file path. The filepath can be set per file (highest priority) or based on - * the jasper.dir.reports setting. Defaults to /report. - * @return full path to the report, without extension - */ - String getFilePath() { - if (folder) { - return folder + File.separator + FilenameUtils.getPath(name) + FilenameUtils.getBaseName(name) - } - if (Holders.config.jasper.dir.reports) { - return Holders.config.jasper.dir.reports + File.separator + FilenameUtils.getPath(name) + FilenameUtils.getBaseName(name) - } - return "/reports" + File.separator + FilenameUtils.getPath(name) + FilenameUtils.getBaseName(name) - } - - void setFilePath(String path) { - folder = FilenameUtils.getPath(path) - name = FilenameUtils.getName(path) - } - - /** - * Add a parameter to the parameter map. - * @param key , the key - * @param value , the value - */ - void addParameter(key, value) { - parameters.put(key, value) - } -} diff --git a/src/test/groovy/au/org/ala/profile/filter/AccessControlInterceptorSpec.groovy b/src/test/groovy/au/org/ala/profile/filter/AccessControlInterceptorSpec.groovy index 1ca0a589..11c7d1f5 100644 --- a/src/test/groovy/au/org/ala/profile/filter/AccessControlInterceptorSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/filter/AccessControlInterceptorSpec.groovy @@ -412,13 +412,11 @@ class AccessControlInterceptorSpec extends Specification implements InterceptorU // unless we manually add the dummy controller class used in this test grailsApplication.addArtefact("Controller", ProfileController) ProfileService pService = Mock(ProfileService) - ExportService eService = Mock(ExportService) ImageService iService = Mock(ImageService) MapService mService = Mock(MapService) defineBeans { authService(MockAuthService) profileService(InstanceFactoryBean, pService, ProfileService) - exportService(InstanceFactoryBean, eService, ExportService) mapService(InstanceFactoryBean, mService, MapService) imageService(InstanceFactoryBean, iService, ImageService) delegateService(MockDelegateService) @@ -437,7 +435,6 @@ class AccessControlInterceptorSpec extends Specification implements InterceptorU pService.createProfile(*_) >> wsResponse pService.archiveProfile(*_) >> wsResponse pService.toggleDraftMode(*_) >> wsResponse - pService.savePublication(*_) >> wsResponse pService.updateAttribute(*_) >> wsResponse pService.renameProfile(*_) >> wsResponse pService.deleteAttribute(*_) >> wsResponse @@ -453,7 +450,6 @@ class AccessControlInterceptorSpec extends Specification implements InterceptorU mService.getSnapshotImageUrlWithUUIDs(*_) >> wsResponse mService.createMapSnapshot(*_) >> null mService.deleteMapSnapshot(*_) >> null - eService.createPdf(*_) >> null controller = new ProfileController() controller.profileService = pService @@ -694,14 +690,6 @@ class AccessControlInterceptorSpec extends Specification implements InterceptorU "publishDraft" | "AUTHOR" | 403 "publishDraft" | "ADMIN" | 200 "publishDraft" | "ALA_ADMIN" | 200 - // create profile snapshot - "savePublication" | "NOT_LOGGED_IN_USER" | 403 - "savePublication" | "LOGGED_IN_USER" | 403 - "savePublication" | "REVIEWER" | 403 - "savePublication" | "EDITOR" | 403 - "savePublication" | "AUTHOR" | 403 - "savePublication" | "ADMIN" | 200 - "savePublication" | "ALA_ADMIN" | 200 } void "check to ensure users with correct privilege can comment on a profile"() { diff --git a/src/test/groovy/au/org/ala/profile/hub/ExportServiceSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/ExportServiceSpec.groovy deleted file mode 100644 index f1180a54..00000000 --- a/src/test/groovy/au/org/ala/profile/hub/ExportServiceSpec.groovy +++ /dev/null @@ -1,64 +0,0 @@ -package au.org.ala.profile.hub - - -import grails.testing.services.ServiceUnitTest -import spock.lang.Specification -import spock.lang.Unroll -/** - * See the API for {@link grails.testing.services.ServiceUnitTest} for usage instructions - */ -class ExportServiceSpec extends Specification implements ServiceUnitTest { - - def setup() { - } - - def cleanup() { - } - - @Unroll - def "test html text clean up"() { - expect: - service.stripTextFromNonFormattingHtmlTags(html) == cleanHtml - - where: - html | cleanHtml - "nomenclatural synonym: Mimosa paradoxa (DC.) Poir." | "nomenclatural synonym: Mimosa paradoxa (DC.) Poir." - "taxonomic synonym: Racosperma undulata (Willd. ex H.L.Wendl.) Mart." | "taxonomic synonym: Racosperma undulata (Willd. ex H.L.Wendl.) Mart." - "doubtful taxonomic synonym: Acacia undulata var. longispina Hort. ex Vis." | "doubtful taxonomic synonym: Acacia undulata var. longispina Hort. ex Vis." - } - - @Unroll - def "test status text formatting"() { - expect: - service.formatStatusText(before) == after - - where: - before | after - "Inflorescence_arrangement" | "Inflorescence arrangement" - "pca1" | "Pca1" - "precip_seasonality" | "Precip seasonality" - } - - @Unroll - def "test attribute text formatting"() { - expect: - service.formatAttributeText(text, title) == formattedText - - where: - text | title | formattedText - "kangaroo thorn, hedge wattle" | "Common Name" | "Common Name: kangaroo thorn, hedge wattle" - "

    kangaroo thorn, hedge wattle

    " | "Common Name" | "

    Common Name: kangaroo thorn, hedge wattle

    " - "
    1. July–November.
    " | "Flowering" | "

    Flowering:

    1. July–November.
    " - } - - @Unroll - def "test Jasper element conversion"() { - expect: - ExportService.convertTagsForJasper(text) == formattedText - - where: - text | formattedText - '

    Common Name:

    strong em text em

    something

    ' | '

    Common Name:

    strong em text em

    something

    ' - } - -} diff --git a/src/test/js/specs/controllers/ReportControllerSpec.js b/src/test/js/specs/controllers/ReportControllerSpec.js deleted file mode 100644 index d5c52baa..00000000 --- a/src/test/js/specs/controllers/ReportControllerSpec.js +++ /dev/null @@ -1,118 +0,0 @@ -describe("ReportController tests", function () { - var controller; - var scope; - var messageService; - var profileService; - var util = { - getQueryParameter: function (param) { - }, - confirm: function (msg) { - }, - getEntityId: function (entity) { - return "1234" - } - }; - var config; - var loadReportDefer; - - var getReportResponse = '{"recordCount":10961,"records":[{"editor":"Unknown","scientificName":"Acetosa","profileId":"32a56222-596d-4da3-b299-d9e423f36d51","lastUpdated":"2015-07-03T04:03:04Z"},{"editor":null,"scientificName":"Abelia x grandiflora","profileId":"f9388454-1b1a-4acb-b0f0-c8e25d722ec5","lastUpdated":"2015-07-03T03:51:30Z"}]}'; - - beforeAll(function () { - console.log("****** Report Controller Tests ******"); - }); - afterAll(function () { - console.log("----------------------------"); - }); - - beforeEach(module('profileEditor')); - - beforeEach(inject(function ($controller, $rootScope, _profileService_, $q, _messageService_) { - scope = $rootScope.$new(); - profileService = _profileService_; - messageService = jasmine.createSpyObj('_messageService_', ["success", "info", "alert", "pop"]); - - loadReportDefer = $q.defer(); - - spyOn(profileService, "loadReport").and.returnValue(loadReportDefer.promise); - - controller = $controller("ReportController as reportCtrl", { - $scope: scope, - profileService: profileService, - util: util, - config: {}, - messageService: messageService - }); - - controller.selectedReport = scope.reportCtrl.reports[2]; - })); - - it("when dates are reset", function () { - scope.reportCtrl.dates.to = new Date(); - scope.reportCtrl.dates.from = new Date(); - - scope.reportCtrl.clearDates(); - - expect(scope.reportCtrl.dates.to).toBeUndefined(); - expect(scope.reportCtrl.dates.from).toBeUndefined(); - }); - - it("should load recent updates report", function () { - var reportId = scope.reportCtrl.reports[2].id; - - loadReportDefer.resolve(JSON.parse(getReportResponse)) - scope.reportCtrl.loadReport(reportId, 0); - // this is a must to have applied the above result - scope.$apply() - - expect(profileService.loadReport).toHaveBeenCalled(); - expect(scope.reportCtrl.reportData).toBeDefined(); - expect(scope.reportCtrl.reportData['recordCount']).toBe(10961); - }); - - it("when period is today, last30Days or last7Days - should call loadReport", function () { - var periods = scope.reportCtrl.periods; - scope.reportCtrl.selectedReport = scope.reportCtrl.reports[2]; - spyOn(scope.reportCtrl, "loadReport"); - - loadReportDefer.resolve(JSON.parse(getReportResponse)); - scope.reportCtrl.setPeriod(periods[0]); - // this is a must to have applied the above result - scope.$apply(); - expect(scope.reportCtrl.loadReport).toHaveBeenCalled(); - - // last7Days - scope.reportCtrl.loadReport.calls.reset(); - loadReportDefer.resolve(JSON.parse(getReportResponse)); - scope.reportCtrl.setPeriod(periods[1]); - // this is a must to have applied the above result - scope.$apply(); - expect(scope.reportCtrl.loadReport).toHaveBeenCalled(); - - // last30Days - scope.reportCtrl.loadReport.calls.reset(); - loadReportDefer.resolve(JSON.parse(getReportResponse)); - scope.reportCtrl.setPeriod(periods[2]); - // this is a must to have applied the above result - scope.$apply(); - expect(scope.reportCtrl.loadReport).toHaveBeenCalled(); - }); - - it("when period is custom - should only call loadReport when customLoadReport is called", function () { - var periods = scope.reportCtrl.periods; - spyOn(scope.reportCtrl, "loadReport"); - - loadReportDefer.resolve(JSON.parse(getReportResponse)); - scope.reportCtrl.setPeriod(periods[3]); - // this is a must to have applied the above result - scope.$apply(); - expect(scope.reportCtrl.loadReport.calls.count()).toBe(0); - - // now call customLoadReport - scope.reportCtrl.dates.to = new Date(); - scope.reportCtrl.dates.from = new Date(); - scope.reportCtrl.loadCustomDateReport(); - // this is a must to have applied the above result - scope.$apply(); - expect(scope.reportCtrl.loadReport).toHaveBeenCalled(); - }); -}); \ No newline at end of file From ace1bb7f9da4e1ec08f41fd3086f4ac424bd61cf Mon Sep 17 00:00:00 2001 From: steven choi Date: Fri, 13 Oct 2023 16:45:04 +1100 Subject: [PATCH 46/62] #657 Error when deleting comments on first go, ok after that --- .../controllers/CommentController.js | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js index f1fd17ab..6a7c15b1 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js @@ -5,6 +5,7 @@ profileEditor.controller('CommentController', function (profileService, util, co var self = this; self.comments = []; + self.savedComments = []; self.currentComment = null; self.opusId = util.getEntityId("opus"); self.profileId = util.getEntityId("profile"); @@ -19,6 +20,7 @@ profileEditor.controller('CommentController', function (profileService, util, co var promise = profileService.getComments(self.opusId, self.profileId); promise.then(function(data) { self.comments = orderBy(data, 'dateCreated'); + self.savedComments = orderBy(data, 'dateCreated'); }) }; @@ -78,8 +80,10 @@ profileEditor.controller('CommentController', function (profileService, util, co } else { if (!Array.isArray(self.comments)) { self.comments = []; + self.savedComments = [] } self.comments.push(data); + self.savedComments.push(data); } self.currentComment = null; @@ -89,9 +93,13 @@ profileEditor.controller('CommentController', function (profileService, util, co }; function find(path) { - var array = self.comments; + // var array = self.comments; + var array = self.savedComments; var comment = null; angular.forEach(path, function(index) { + if (index > array.length-1) { + index = array.length-1 + } comment = array[index]; if (comment.children) { array = orderBy(comment.children, 'dateCreated'); @@ -117,7 +125,16 @@ profileEditor.controller('CommentController', function (profileService, util, co comment.children.splice(lastIndex, 1); } else { - self.comments.splice(path[0], 1); + let selectedComment = self.savedComments[path[0]] + let filterdComments = self.comments.filter(i => i !== selectedComment) + self.comments = filterdComments; + // if (self.comments.length === 1) { + // self.comments.splice(0,1); + // } else if (self.comments.length < path[0]){ + // self.comments.splice(path[0]-1, 1); + // } else { + // self.comments.splice(path[0], 1); + // } } } }); From 65c49c68a9039362eae176d4a90ca543fbc18d1e Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 16 Oct 2023 09:36:39 +1100 Subject: [PATCH 47/62] #657 changed logic --- .../profileEditor/controllers/CommentController.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js index 6a7c15b1..709b0638 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/CommentController.js @@ -20,7 +20,7 @@ profileEditor.controller('CommentController', function (profileService, util, co var promise = profileService.getComments(self.opusId, self.profileId); promise.then(function(data) { self.comments = orderBy(data, 'dateCreated'); - self.savedComments = orderBy(data, 'dateCreated'); + self.savedComments = self.comments; }) }; @@ -93,7 +93,6 @@ profileEditor.controller('CommentController', function (profileService, util, co }; function find(path) { - // var array = self.comments; var array = self.savedComments; var comment = null; angular.forEach(path, function(index) { @@ -128,13 +127,10 @@ profileEditor.controller('CommentController', function (profileService, util, co let selectedComment = self.savedComments[path[0]] let filterdComments = self.comments.filter(i => i !== selectedComment) self.comments = filterdComments; - // if (self.comments.length === 1) { - // self.comments.splice(0,1); - // } else if (self.comments.length < path[0]){ - // self.comments.splice(path[0]-1, 1); - // } else { - // self.comments.splice(path[0], 1); - // } + + if (self.comments.length === 0) { + self.savedComments = []; + } } } }); From 9a30cc04b3c3fb7912f112f245bc9d2ca2bd0010 Mon Sep 17 00:00:00 2001 From: steven choi Date: Mon, 16 Oct 2023 11:51:01 +1100 Subject: [PATCH 48/62] #657 fix test cases --- src/test/js/specs/controllers/CommentControllerSpec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/js/specs/controllers/CommentControllerSpec.js b/src/test/js/specs/controllers/CommentControllerSpec.js index 96e5e0f3..acf11330 100644 --- a/src/test/js/specs/controllers/CommentControllerSpec.js +++ b/src/test/js/specs/controllers/CommentControllerSpec.js @@ -86,6 +86,7 @@ describe("CommentController tests", function () { scope.ctrl.comments = [{text: "Text1", uuid: "comment1", dateCreated: new Date(2013, 1, 1)}, comment2, {text: "Text3", uuid: "comment3", dateCreated: new Date(2015, 1, 1)}]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.editComment([1]); @@ -114,6 +115,7 @@ describe("CommentController tests", function () { {text: "Text3", uuid: "comment3", dateCreated: new Date(2015, 1, 1)}]; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; + scope.ctrl.savedComments = scope.ctrl.comments; confirmDefer.resolve({}); deleteDefer.resolve({}); @@ -134,6 +136,7 @@ describe("CommentController tests", function () { {text: "level2, first", uuid: "comment3", dateCreated: new Date(2015, 1, 1)}, {text: "level2, second", uuid: "comment4", dateCreated: new Date(2015, 1, 1)}]} ]}]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; @@ -151,6 +154,7 @@ describe("CommentController tests", function () { scope.ctrl.comments = [{text: "Text1", uuid: "comment1", dateCreated: new Date(2013, 1, 1)}, {text: "Text2", uuid: "comment2", dateCreated: new Date(2014, 1, 1)}, {text: "Text3", uuid: "comment3", dateCreated: new Date(2015, 1, 1)}]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; @@ -165,6 +169,7 @@ describe("CommentController tests", function () { scope.ctrl.comments = [{text: "Text1", uuid: "comment1", dateCreated: new Date(2013, 1, 1)}, {text: "Text2", uuid: "comment2", dateCreated: new Date(2014, 1, 1)}, {text: "Text3", uuid: "comment3", dateCreated: new Date(2015, 1, 1)}]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; @@ -196,6 +201,7 @@ describe("CommentController tests", function () { it("should invoke the updateComment service and modify the existing comment in the list when saveComment is called for an edited comment", function() { scope.ctrl.comments = [{text: "Text1", uuid: "comment1", dateCreated: new Date(2013, 1, 1)}]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; @@ -216,6 +222,7 @@ describe("CommentController tests", function () { {text: "Child1", uuid: "child1", dateCreated: new Date(2013, 1, 1)}, {text: "Child2", uuid: "child2", dateCreated: new Date(2013, 1, 1)}] }]; + scope.ctrl.savedComments = scope.ctrl.comments; scope.ctrl.profileId = "profileId"; scope.ctrl.opusId = "opusId"; From 906a6804520abca6770dfabb63168f593b44d64a Mon Sep 17 00:00:00 2001 From: steven choi Date: Tue, 17 Oct 2023 17:16:24 +1100 Subject: [PATCH 49/62] #728 code changes and fix test case --- .../controllers/AdminController.js | 2 +- .../ala/profile/hub/AdminController.groovy | 47 ++++++++++++++++--- .../profile/hub/AdminControllerSpec.groovy | 17 +++++-- 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js index 9239bcd0..23760c92 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AdminController.js @@ -248,7 +248,7 @@ profileEditor.controller('ALAAdminController', function ($http, util, messageSer messageService.success(response.data.resp); } }, function() { - messageService.alert(response.data.error); + messageService.alert("Failed to clear cache the job"); }); } }); diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index 49c63f9b..884070a8 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -3,6 +3,8 @@ package au.org.ala.profile.hub import au.org.ala.profile.security.Role import au.org.ala.profile.security.Secured import au.org.ala.ws.service.WebService +import net.sf.ehcache.Cache +import net.sf.ehcache.CacheManager import org.apache.http.HttpStatus import org.apache.http.entity.ContentType @@ -14,7 +16,11 @@ class AdminController extends BaseController { WebService webService ProfileService profileService GrailsCacheManager grailsCacheManager - + static long ONE_DAY_SECONDS = 86400 + static String USER_DETAILS_CACHE = "userDetailsCache" + static String USER_DETAILS_BY_ID_CACHE = "userDetailsByIdCache" + static String USER_LIST_CACHE = "userListCache" + static String VOCAB_LIST_CACHE = "vocabListCache" @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def index() { render view: "admin.gsp" @@ -122,22 +128,51 @@ class AdminController extends BaseController { @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def cacheManagement() { - def cacheNames = grailsCacheManager.getCacheNames() + def cacheNames + if (grailsCacheManager == null) { + cacheNames = getCacheManager().getCacheNames() + } else { + cacheNames = grailsCacheManager.getCacheNames() + } success cacheNames } + private static CacheManager getCacheManager() { + CacheManager manager = CacheManager.create() + Cache userDetailCache = new Cache(USER_DETAILS_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) + if (!manager.ehcaches.get(USER_DETAILS_CACHE)) { + manager.addCache(userDetailCache) + } + Cache userDetailsByIdCache = new Cache(USER_DETAILS_BY_ID_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) + if (!manager.getEhcache(USER_DETAILS_BY_ID_CACHE)) { + manager.addCache(userDetailsByIdCache) + } + Cache userListCache = new Cache(USER_LIST_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) + if (!manager.getEhcache(USER_LIST_CACHE)) { + manager.addCache(userListCache) + } + Cache vocabListCache = new Cache(VOCAB_LIST_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) + if (!manager.getEhcache(VOCAB_LIST_CACHE)) { + manager.addCache(vocabListCache) + } + return manager + } + @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def clearCache() { Map result = [:] if (params.id) { - grailsCacheManager.getCache(params.id).clear() + if (grailsCacheManager == null) { + getCacheManager().getCache(params.id).remove(params.id) + } else { + grailsCacheManager.getCache(params.id).clear() + } result.resp = "Successfully cleared cache - " + params.id result.statusCode = HttpStatus.SC_OK success result } else { - result.error = "Failed to clear cache the job" - result.statusCode = HttpStatus.SC_INTERNAL_SERVER_ERROR - sendError result + var message = "Failed to clear cache the job" + sendError(HttpStatus.SC_BAD_REQUEST, message ?:""); } } } diff --git a/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy index c23f9592..7c034429 100644 --- a/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy @@ -6,15 +6,15 @@ import spock.lang.Specification class AdminControllerSpec extends Specification implements ControllerUnitTest { - AdminController mockAdminController + AdminController controller def setup() { - mockAdminController = Mock(AdminController) + controller = new AdminController() } def "cache management should display to the admin controller when admin mode"() { when: - mockAdminController.cacheManagement() + controller.cacheManagement() then: assert response.status == HttpStatus.SC_OK @@ -23,9 +23,18 @@ class AdminControllerSpec extends Specification implements ControllerUnitTest Date: Wed, 18 Oct 2023 16:37:57 +1100 Subject: [PATCH 50/62] #728 code changes and fix test case --- .../ala/profile/hub/AdminController.groovy | 43 ++----------------- .../profile/hub/AdminControllerSpec.groovy | 17 ++++++-- 2 files changed, 17 insertions(+), 43 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy index 884070a8..fa164a04 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/AdminController.groovy @@ -3,10 +3,9 @@ package au.org.ala.profile.hub import au.org.ala.profile.security.Role import au.org.ala.profile.security.Secured import au.org.ala.ws.service.WebService -import net.sf.ehcache.Cache -import net.sf.ehcache.CacheManager import org.apache.http.HttpStatus import org.apache.http.entity.ContentType +import org.springframework.cache.Cache import javax.validation.constraints.NotNull import static groovy.io.FileType.DIRECTORIES @@ -16,11 +15,6 @@ class AdminController extends BaseController { WebService webService ProfileService profileService GrailsCacheManager grailsCacheManager - static long ONE_DAY_SECONDS = 86400 - static String USER_DETAILS_CACHE = "userDetailsCache" - static String USER_DETAILS_BY_ID_CACHE = "userDetailsByIdCache" - static String USER_LIST_CACHE = "userListCache" - static String VOCAB_LIST_CACHE = "vocabListCache" @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def index() { render view: "admin.gsp" @@ -128,45 +122,16 @@ class AdminController extends BaseController { @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def cacheManagement() { - def cacheNames - if (grailsCacheManager == null) { - cacheNames = getCacheManager().getCacheNames() - } else { - cacheNames = grailsCacheManager.getCacheNames() - } + def cacheNames = grailsCacheManager.getCacheNames() success cacheNames } - private static CacheManager getCacheManager() { - CacheManager manager = CacheManager.create() - Cache userDetailCache = new Cache(USER_DETAILS_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) - if (!manager.ehcaches.get(USER_DETAILS_CACHE)) { - manager.addCache(userDetailCache) - } - Cache userDetailsByIdCache = new Cache(USER_DETAILS_BY_ID_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) - if (!manager.getEhcache(USER_DETAILS_BY_ID_CACHE)) { - manager.addCache(userDetailsByIdCache) - } - Cache userListCache = new Cache(USER_LIST_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) - if (!manager.getEhcache(USER_LIST_CACHE)) { - manager.addCache(userListCache) - } - Cache vocabListCache = new Cache(VOCAB_LIST_CACHE, 2000, true, false, ONE_DAY_SECONDS, 2) - if (!manager.getEhcache(VOCAB_LIST_CACHE)) { - manager.addCache(vocabListCache) - } - return manager - } - @Secured(role = Role.ROLE_ADMIN, opusSpecific = false) def clearCache() { Map result = [:] if (params.id) { - if (grailsCacheManager == null) { - getCacheManager().getCache(params.id).remove(params.id) - } else { - grailsCacheManager.getCache(params.id).clear() - } + Cache cache = grailsCacheManager.getCache(params.id) + cache.clear() result.resp = "Successfully cleared cache - " + params.id result.statusCode = HttpStatus.SC_OK success result diff --git a/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy index 7c034429..cb62b0ac 100644 --- a/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/hub/AdminControllerSpec.groovy @@ -2,31 +2,39 @@ package au.org.ala.profile.hub import grails.testing.web.controllers.ControllerUnitTest import org.apache.http.HttpStatus +import org.grails.plugin.cache.GrailsCacheManager +import org.springframework.cache.Cache import spock.lang.Specification class AdminControllerSpec extends Specification implements ControllerUnitTest { - AdminController controller - def setup() { - controller = new AdminController() + controller.grailsCacheManager = Mock(GrailsCacheManager) } def "cache management should display to the admin controller when admin mode"() { when: + controller.grailsCacheManager.getCacheNames() >> ["Cache1","Cache2"] controller.cacheManagement() then: - assert response.status == HttpStatus.SC_OK + def cacheNames = '["Cache1","Cache2"]' + + assert response.getContentAsString() == cacheNames } def "clearCache() should return a 200 (OK_REQUEST) if id has been provided"() { when: params.id = "userDetailsCache" + + Cache cache = Mock(Cache.class); + controller.grailsCacheManager.getCache(params.id) >> cache controller.clearCache() then: response.status == HttpStatus.SC_OK + def successMessage = '{"resp":"Successfully cleared cache - userDetailsCache","statusCode":200}' + assert response.getContentAsString() == successMessage } def "clearCache() should return a 400 (BAD_REQUEST) if id has not been provided"() { @@ -36,5 +44,6 @@ class AdminControllerSpec extends Specification implements ControllerUnitTest Date: Thu, 19 Oct 2023 13:00:05 +1100 Subject: [PATCH 51/62] #735 "My Profile" menu item displays error (page not found) --- grails-app/views/layouts/_login.gsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/views/layouts/_login.gsp b/grails-app/views/layouts/_login.gsp index 84124d35..5c934694 100644 --- a/grails-app/views/layouts/_login.gsp +++ b/grails-app/views/layouts/_login.gsp @@ -32,7 +32,7 @@

  •   My Profile + href="${grailsApplication.config.security.cas.casServerName}/userdetails/myprofile">  My Profile
  • From 551697ced2bf5408eeea1c5974c7189db884b1a8 Mon Sep 17 00:00:00 2001 From: steven choi Date: Thu, 19 Oct 2023 17:07:28 +1100 Subject: [PATCH 52/62] #797 upgrade ALA security plugin --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 249f4d49..4571591c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ -profileHubVersion=4.2-SNAPSHOT +profileHubVersion=4.2-cognito-SNAPSHOT grailsVersion=5.2.4 grailsGradlePluginVersion=5.2.3 groovyVersion=3.0.11 -alaSecurityLibsVersion=6.0.0 +alaSecurityLibsVersion=6.2.0 org.gradle.daemon=true org.gradle.parallel=true org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx2g From c3c6319e731e0bb263ea0dc57fd95de10c945698 Mon Sep 17 00:00:00 2001 From: steven choi Date: Tue, 31 Oct 2023 11:40:26 +1100 Subject: [PATCH 53/62] #800 Add new categories to attachments --- .../profileEditor/controllers/AttachmentController.js | 6 ++++++ .../javascripts/profileEditor/services/ProfileService.js | 5 +++++ .../profileEditor/templates/attachmentUpload.tpl.htm | 5 ++--- .../au/org/ala/profile/hub/OpusController.groovy | 5 +++++ .../controllers/au/org/ala/profile/hub/UrlMappings.groovy | 1 + .../services/au/org/ala/profile/hub/ProfileService.groovy | 4 ++++ 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js index 61795fec..71c55894 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js @@ -91,6 +91,12 @@ profileEditor.controller("AttachmentUploadController", function (profileService, var pdfType = {key: "PDF", title: "PDF Document"}; self.types = [pdfType, urlType]; + if (self.categories == null) { + profileService.getCategories().then(function (data) { + self.categories = data; + }); + } + self.metadata = angular.isDefined(attachment) ? _.clone(attachment) : {}; self.files = null; self.error = null; diff --git a/grails-app/assets/javascripts/profileEditor/services/ProfileService.js b/grails-app/assets/javascripts/profileEditor/services/ProfileService.js index a90a57ac..3e5dd931 100644 --- a/grails-app/assets/javascripts/profileEditor/services/ProfileService.js +++ b/grails-app/assets/javascripts/profileEditor/services/ProfileService.js @@ -1094,6 +1094,11 @@ profileEditor.service('profileService', function ($http, util, $cacheFactory, co return util.toStandardPromise(future); }, + getCategories: function () { + var future = $http.get(util.contextRoot() + "/attachment/categories", {cache: true}); + return util.toStandardPromise(future); + }, + getLicences: function () { var future = $http.get(util.contextRoot() + "/licences", {cache: true}); return util.toStandardPromise(future); diff --git a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm index 6fd1d553..6eaf22e1 100644 --- a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm +++ b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm @@ -82,10 +82,9 @@
    - - -
    diff --git a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy index c5119a20..2dd9fda9 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy @@ -359,6 +359,11 @@ class OpusController extends OpusBaseController { } } + def getCategories() { + def result = profileService.getCategories() + handle result + } + @Secured(role = ROLE_PROFILE_ADMIN) def saveAttachment() { if (!params.opusId || !(request instanceof MultipartHttpServletRequest) || !request.getParameter("data")) { diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index c3f0986a..aa65e764 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -112,6 +112,7 @@ class UrlMappings { "/opus/$opusId/attachment/$attachmentId" controller: "opus", action: [GET: "getAttachmentMetadata", DELETE: "deleteAttachment"] "/opus/$opusId/attachment/$attachmentId/download" controller: "opus", action: [GET: "proxyAttachmentDownload"] "/opus/$opusId/attachment/" controller: "opus", action: [GET: "getAttachmentMetadata", POST: "saveAttachment"] + "/attachment/categories/" controller: "opus", action: [GET: "getCategories"] "/opus/$opusId/florulaList" controller: "opus", action: [POST: "updateFlorulaList"] "/opus/$opusId/users/update" controller: "opus", action: [POST: "updateUsers"] diff --git a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy index 05af8a67..0cfa02c5 100644 --- a/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy +++ b/grails-app/services/au/org/ala/profile/hub/ProfileService.groovy @@ -220,6 +220,10 @@ class ProfileService { } } + def getCategories() { + webServiceWrapperService.get("${grailsApplication.config.profile.service.url}/attachment/categories", [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId()) + } + def deleteAttachment(String opusId, String profileId, String attachmentId) { if (profileId) { webService.delete("${grailsApplication.config.profile.service.url}/opus/${encPath(opusId)}/profile/${encPath(profileId)}/attachment/${encPath(attachmentId)}?latest=true", [:], ContentType.APPLICATION_JSON, true, false, getCustomHeaderWithUserId()) From 01475b09e86b7d7dc81ae6e3c99fcf5493358de6 Mon Sep 17 00:00:00 2001 From: steven choi Date: Tue, 31 Oct 2023 14:41:32 +1100 Subject: [PATCH 54/62] #800 add test case --- .../controllers/AttachmentController.js | 2 +- .../au/org/ala/profile/hub/OpusController.groovy | 2 +- .../org/ala/profile/api/ApiControllerSpec.groovy | 5 +++-- .../org/ala/profile/hub/OpusControllerSpec.groovy | 14 ++++++++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js index 71c55894..5ab2a83a 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js @@ -93,7 +93,7 @@ profileEditor.controller("AttachmentUploadController", function (profileService, if (self.categories == null) { profileService.getCategories().then(function (data) { - self.categories = data; + self.categories = data.resp; }); } diff --git a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy index 2dd9fda9..025b35a0 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/OpusController.groovy @@ -361,7 +361,7 @@ class OpusController extends OpusBaseController { def getCategories() { def result = profileService.getCategories() - handle result + render result as JSON } @Secured(role = ROLE_PROFILE_ADMIN) diff --git a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy index 86d17a98..13784a1a 100644 --- a/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/profile/api/ApiControllerSpec.groovy @@ -179,7 +179,8 @@ class ApiControllerSpec extends Specification implements ControllerUnitTest> [[key: 'key1', title: 'title1'],[key: 'key2', title: 'title2'],[key: 'key3', title: 'title3']] + + when: + controller.getCategories() + + then: + assert response.json.size() == 3 + assert response.json.toString().contains("key1") + assert response.json.toString().contains("key2") + assert response.json.toString().contains("key3") + } } From 796356c14d13fafe2cef89614f1cae0da55e0c8f Mon Sep 17 00:00:00 2001 From: steven choi Date: Wed, 1 Nov 2023 11:19:35 +1100 Subject: [PATCH 55/62] #800 change value name --- .../profileEditor/templates/attachmentUpload.tpl.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm index 6eaf22e1..2bda87b4 100644 --- a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm +++ b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm @@ -83,7 +83,7 @@
    From 114dee4358f0c4ce94d693e8260816b517ccfb0b Mon Sep 17 00:00:00 2001 From: steven choi Date: Tue, 14 Nov 2023 10:14:48 +1100 Subject: [PATCH 56/62] #800 replace imageId to fileName --- .../au/org/ala/profile/api/ApiController.groovy | 16 ++++++++-------- .../org/ala/profile/hub/ProfileController.groovy | 8 ++++---- .../au/org/ala/profile/hub/UrlMappings.groovy | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index b464416d..a7361628 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -549,10 +549,10 @@ class ApiController extends BaseController { } } - @Path("/api/opus/{opusId}/profile/{profileId}/image/{imageId}") + @Path("/api/opus/{opusId}/profile/{profileId}/image/{fileName}") @Operation( summary = "Get image associated with a profile", - operationId = "/api/opus/{opusId}/profile/{profileId}/image/{imageId}", + operationId = "/api/opus/{opusId}/profile/{profileId}/image/{fileName}", method = "GET", responses = [ @ApiResponse( @@ -587,10 +587,10 @@ class ApiController extends BaseController { in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), - @Parameter(name = "imageId", + @Parameter(name = "fileName", in = ParameterIn.PATH, required = true, - description = "Image id - UUID"), + description = "fileName"), @Parameter(name = "type", in = ParameterIn.QUERY, required = true, @@ -623,10 +623,10 @@ class ApiController extends BaseController { forward controller: "profile", action: "getLocalImage" } - @Path("/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{imageId}") + @Path("/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{fileName}") @Operation( summary = "Get thumbnail image associated with a profile", - operationId = "/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{imageId}", + operationId = "/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{fileName}", method = "GET", responses = [ @ApiResponse( @@ -661,10 +661,10 @@ class ApiController extends BaseController { in = ParameterIn.PATH, required = true, description = "Profile id - UUID or Scientific name"), - @Parameter(name = "imageId", + @Parameter(name = "fileName", in = ParameterIn.PATH, required = true, - description = "Image id - UUID"), + description = "fileName"), @Parameter(name = "type", in = ParameterIn.QUERY, required = true, diff --git a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy index 0168c43f..60708900 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy @@ -409,9 +409,9 @@ class ProfileController extends BaseController { ImageType type = params.type as ImageType //NB this imageId param already has the file extension on it, really the file name on disk if (type == ImageType.STAGED) { - displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.imageId, true) + displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.fileName, true) } else if (type == ImageType.PRIVATE) { - displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, true) + displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.fileName, true) } } catch (IllegalArgumentException e) { log.warn(e) @@ -428,9 +428,9 @@ class ProfileController extends BaseController { ImageType type = params.type as ImageType //NB this imageId param already has the file extension on it, really the file name on disk if (type == ImageType.STAGED) { - displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.imageId, false) + displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.fileName, false) } else if (type == ImageType.PRIVATE) { - displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, false) + displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.fileName, false) } } catch (IllegalArgumentException e) { log.warn(e) diff --git a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy index aa65e764..fab17344 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/UrlMappings.groovy @@ -264,8 +264,8 @@ class UrlMappings { get "/opus/$opusId/profile" (version: "1.0", controller: "api", action: "getProfiles", namespace: "v1") get "/opus/$opusId/profile/$profileId" (version: "1.0", controller: "api", action: "get", namespace: "v1") get "/opus/$opusId/profile/$profileId/image" (version: "1.0", controller: "api", action: "getImages", namespace: "v1") - get "/opus/$opusId/profile/$profileId/image/$imageId" (version: "1.0", controller: "api", action: "getLocalImage", namespace: "v1") - get "/opus/$opusId/profile/$profileId/image/thumbnail/$imageId" (version: "1.0", controller: "api", action: "retrieveLocalThumbnailImage", namespace: "v1") + get "/opus/$opusId/profile/$profileId/image/$fileName" (version: "1.0", controller: "api", action: "getLocalImage", namespace: "v1") + get "/opus/$opusId/profile/$profileId/image/thumbnail/$fileName" (version: "1.0", controller: "api", action: "retrieveLocalThumbnailImage", namespace: "v1") get "/opus/$opusId/profile/$profileId/attribute/$attributeId" (version: "1.0", controller: "api", action: "getAttributes", namespace: "v1") get "/opus/$opusId/profile/$profileId/draft" (version: "1.0", controller: "api", action: "getDraftProfile", namespace: "v1") get "/opus" (version: "1.0", controller: "api", action: "getListCollections", namespace: "v1") From 415134c5b6a9d8718efd8a765ee679c8cfa8e101 Mon Sep 17 00:00:00 2001 From: steven choi Date: Tue, 14 Nov 2023 12:00:50 +1100 Subject: [PATCH 57/62] #785_2 fix --- .../au/org/ala/profile/api/ApiController.groovy | 2 ++ .../au/org/ala/profile/hub/ProfileController.groovy | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index a7361628..d958a192 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -620,6 +620,7 @@ class ApiController extends BaseController { ) def getLocalImage() { + params.imageId = params.fileName forward controller: "profile", action: "getLocalImage" } @@ -694,6 +695,7 @@ class ApiController extends BaseController { ) def retrieveLocalThumbnailImage () { + params.imageId = params.fileName forward controller: "profile", action: "retrieveLocalThumbnailImage" } diff --git a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy index 60708900..0168c43f 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy @@ -409,9 +409,9 @@ class ProfileController extends BaseController { ImageType type = params.type as ImageType //NB this imageId param already has the file extension on it, really the file name on disk if (type == ImageType.STAGED) { - displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.fileName, true) + displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.imageId, true) } else if (type == ImageType.PRIVATE) { - displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.fileName, true) + displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, true) } } catch (IllegalArgumentException e) { log.warn(e) @@ -428,9 +428,9 @@ class ProfileController extends BaseController { ImageType type = params.type as ImageType //NB this imageId param already has the file extension on it, really the file name on disk if (type == ImageType.STAGED) { - displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.fileName, false) + displayLocalImage("${grailsApplication.config.image.staging.dir}/", params.opusId, params.profileId, params.imageId, false) } else if (type == ImageType.PRIVATE) { - displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.fileName, false) + displayLocalImage("${grailsApplication.config.image.private.dir}/", params.opusId, params.profileId, params.imageId, false) } } catch (IllegalArgumentException e) { log.warn(e) From c659f1ccb5e3b55150d04b2e0484b435cb2d8c54 Mon Sep 17 00:00:00 2001 From: steven choi Date: Thu, 16 Nov 2023 13:50:40 +1100 Subject: [PATCH 58/62] #785_3 fix content-type --- src/main/groovy/au/org/ala/profile/hub/Utils.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/groovy/au/org/ala/profile/hub/Utils.groovy b/src/main/groovy/au/org/ala/profile/hub/Utils.groovy index fe52d6ad..cfead251 100644 --- a/src/main/groovy/au/org/ala/profile/hub/Utils.groovy +++ b/src/main/groovy/au/org/ala/profile/hub/Utils.groovy @@ -63,6 +63,7 @@ class Utils { result = 'application/octet-stream' } } + return result } static String getExtension(String fileName) { From 5a99814edfa51eed44dae55c6db0852d70fd49b9 Mon Sep 17 00:00:00 2001 From: temi Date: Wed, 22 Nov 2023 09:54:15 +1100 Subject: [PATCH 59/62] version update 4.2-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4571591c..5dc5d471 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -profileHubVersion=4.2-cognito-SNAPSHOT +profileHubVersion=4.2-SNAPSHOT grailsVersion=5.2.4 grailsGradlePluginVersion=5.2.3 groovyVersion=3.0.11 From 136a451bf3a92d6e59f4074d22a3f6754959537e Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 28 Nov 2023 16:35:00 +1100 Subject: [PATCH 60/62] - updated api docs --- .../au/org/ala/profile/api/ApiController.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy index d958a192..7ec5bb71 100644 --- a/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy +++ b/grails-app/controllers/au/org/ala/profile/api/ApiController.groovy @@ -551,7 +551,7 @@ class ApiController extends BaseController { @Path("/api/opus/{opusId}/profile/{profileId}/image/{fileName}") @Operation( - summary = "Get image associated with a profile", + summary = "Get private image associated with a profile", operationId = "/api/opus/{opusId}/profile/{profileId}/image/{fileName}", method = "GET", responses = [ @@ -582,11 +582,11 @@ class ApiController extends BaseController { @Parameter(name = "opusId", in = ParameterIn.PATH, required = true, - description = "Collection id - UUID or short name"), + description = "Collection id - ONLY UUID accepted"), @Parameter(name = "profileId", in = ParameterIn.PATH, required = true, - description = "Profile id - UUID or Scientific name"), + description = "Profile id - ONLY UUID accepted"), @Parameter(name = "fileName", in = ParameterIn.PATH, required = true, @@ -626,7 +626,7 @@ class ApiController extends BaseController { @Path("/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{fileName}") @Operation( - summary = "Get thumbnail image associated with a profile", + summary = "Get thumbnail of private image associated with a profile", operationId = "/api/opus/{opusId}/profile/{profileId}/image/thumbnail/{fileName}", method = "GET", responses = [ @@ -657,11 +657,11 @@ class ApiController extends BaseController { @Parameter(name = "opusId", in = ParameterIn.PATH, required = true, - description = "Collection id - UUID or short name"), + description = "Collection id - ONLY UUID accepted"), @Parameter(name = "profileId", in = ParameterIn.PATH, required = true, - description = "Profile id - UUID or Scientific name"), + description = "Profile id - ONLY UUID accepted"), @Parameter(name = "fileName", in = ParameterIn.PATH, required = true, From 40076085cf8b6c2f95982619097df49549d0446d Mon Sep 17 00:00:00 2001 From: steven choi Date: Wed, 29 Nov 2023 10:53:09 +1100 Subject: [PATCH 61/62] #781 fix to publication is not showing in edit mode --- .../au/org/ala/profile/hub/ProfileController.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy index 0168c43f..ac5921b6 100644 --- a/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy +++ b/grails-app/controllers/au/org/ala/profile/hub/ProfileController.groovy @@ -709,6 +709,10 @@ class ProfileController extends BaseController { render template: "lists" } + def publicationsPanel = { + render template: "publications" + } + def bibliographyPanel = { render template: "bibliography" } From a5bf33d266adaf5d7c49a0bd7c5328d23f2b5b13 Mon Sep 17 00:00:00 2001 From: steven choi Date: Thu, 30 Nov 2023 15:57:12 +1100 Subject: [PATCH 62/62] #800_1 : fix category option issue --- .../profileEditor/controllers/AttachmentController.js | 6 +++++- .../profileEditor/templates/attachmentUpload.tpl.htm | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js index 5ab2a83a..df1e99a2 100644 --- a/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js +++ b/grails-app/assets/javascripts/profileEditor/controllers/AttachmentController.js @@ -91,13 +91,17 @@ profileEditor.controller("AttachmentUploadController", function (profileService, var pdfType = {key: "PDF", title: "PDF Document"}; self.types = [pdfType, urlType]; + self.metadata = angular.isDefined(attachment) ? _.clone(attachment) : {}; + if (self.categories == null) { profileService.getCategories().then(function (data) { self.categories = data.resp; + if (self.metadata.category == null) { + self.metadata.category = self.categories[0].value; + } }); } - self.metadata = angular.isDefined(attachment) ? _.clone(attachment) : {}; self.files = null; self.error = null; self.type = angular.isDefined(attachment.url) && attachment.url ? urlType.key : pdfType.key; diff --git a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm index 2bda87b4..c07dcea5 100644 --- a/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm +++ b/grails-app/assets/javascripts/profileEditor/templates/attachmentUpload.tpl.htm @@ -82,9 +82,10 @@
    - +
  • Cache NameCache Clear
    Cache NameActions