Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Genesys Backend
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
45
Issues
45
List
Boards
Labels
Service Desk
Milestones
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Genesys PGR
Genesys Backend
Commits
c054dac5
Commit
c054dac5
authored
Dec 18, 2014
by
Matija Obreza
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MCPD XLSX
parent
c117b8ce
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
525 additions
and
34 deletions
+525
-34
pom.xml
pom.xml
+6
-1
src/main/java/org/genesys2/server/persistence/domain/GenesysLowlevelRepository.java
.../server/persistence/domain/GenesysLowlevelRepository.java
+3
-0
src/main/java/org/genesys2/server/persistence/domain/GenesysLowlevelRepositoryImpl.java
...ver/persistence/domain/GenesysLowlevelRepositoryImpl.java
+29
-0
src/main/java/org/genesys2/server/service/DownloadService.java
...ain/java/org/genesys2/server/service/DownloadService.java
+34
-0
src/main/java/org/genesys2/server/service/impl/DirectMysqlQuery.java
...va/org/genesys2/server/service/impl/DirectMysqlQuery.java
+29
-16
src/main/java/org/genesys2/server/service/impl/DownloadServiceImpl.java
...org/genesys2/server/service/impl/DownloadServiceImpl.java
+351
-0
src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java
...enesys2/server/servlet/controller/ExplorerController.java
+37
-13
src/main/java/org/genesys2/server/servlet/controller/SelectionController.java
...nesys2/server/servlet/controller/SelectionController.java
+27
-4
src/main/resources/content/language.properties
src/main/resources/content/language.properties
+1
-0
src/main/resources/template/download/.gitignore
src/main/resources/template/download/.gitignore
+1
-0
src/main/resources/template/download/MCPD.xlsx
src/main/resources/template/download/MCPD.xlsx
+0
-0
src/main/webapp/WEB-INF/jsp/accession/explore.jsp
src/main/webapp/WEB-INF/jsp/accession/explore.jsp
+7
-0
No files found.
pom.xml
View file @
c054dac5
...
...
@@ -522,7 +522,12 @@
<artifactId>
transifex-client
</artifactId>
<version>
0.2-SNAPSHOT
</version>
</dependency>
</dependencies>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml
</artifactId>
<version>
3.10.1
</version>
</dependency>
</dependencies>
<build>
<plugins>
...
...
src/main/java/org/genesys2/server/persistence/domain/GenesysLowlevelRepository.java
View file @
c054dac5
...
...
@@ -20,6 +20,7 @@ import org.genesys2.server.model.genesys.Method;
import
org.genesys2.server.model.impl.Country
;
import
org.genesys2.server.model.impl.FaoInstitute
;
import
org.genesys2.server.service.impl.FilterHandler.AppliedFilters
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.jdbc.core.RowCallbackHandler
;
public
interface
GenesysLowlevelRepository
{
...
...
@@ -53,4 +54,6 @@ public interface GenesysLowlevelRepository {
int
countAccessions
(
AppliedFilters
filter
);
void
listAccessionIds
(
AppliedFilters
filter
,
Sort
sort
,
RowCallbackHandler
rowCallbackHandler
);
}
src/main/java/org/genesys2/server/persistence/domain/GenesysLowlevelRepositoryImpl.java
View file @
c054dac5
...
...
@@ -32,6 +32,7 @@ import org.genesys2.server.service.impl.DirectMysqlQuery;
import
org.genesys2.server.service.impl.DirectMysqlQuery.MethodResolver
;
import
org.genesys2.server.service.impl.FilterHandler.AppliedFilters
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.jdbc.BadSqlGrammarException
;
import
org.springframework.jdbc.core.ArgumentPreparedStatementSetter
;
import
org.springframework.jdbc.core.JdbcTemplate
;
...
...
@@ -255,6 +256,34 @@ public class GenesysLowlevelRepositoryImpl implements GenesysLowlevelRepository
}
},
rowCallbackHandler
);
}
@Override
public
void
listAccessionIds
(
final
AppliedFilters
filter
,
final
Sort
sort
,
final
RowCallbackHandler
rowCallbackHandler
)
{
final
DirectMysqlQuery
directQuery
=
new
DirectMysqlQuery
(
"accession"
,
"a"
);
directQuery
.
jsonFilter
(
filter
,
new
MethodResolver
()
{
@Override
public
Method
getMethod
(
final
long
methodId
)
{
return
GenesysLowlevelRepositoryImpl
.
this
.
methodRepository
.
findOne
(
methodId
);
}
});
directQuery
.
sort
(
sort
);
this
.
jdbcTemplate
.
query
(
new
PreparedStatementCreator
()
{
@Override
public
PreparedStatement
createPreparedStatement
(
final
Connection
con
)
throws
SQLException
{
final
PreparedStatement
stmt
=
con
.
prepareStatement
(
directQuery
.
getQuery
(
"a.id"
));
final
ArgumentPreparedStatementSetter
apss
=
new
ArgumentPreparedStatementSetter
(
directQuery
.
getParameters
());
apss
.
setValues
(
stmt
);
// Set mysql JConnector to stream results
// stmt.setFetchSize(Integer.MIN_VALUE);
return
stmt
;
}
},
rowCallbackHandler
);
}
@Override
public
void
listAccessionsGeo
(
final
AppliedFilters
filter
,
final
RowCallbackHandler
rowCallbackHandler
)
{
...
...
src/main/java/org/genesys2/server/service/DownloadService.java
0 → 100644
View file @
c054dac5
/**
* Copyright 2014 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
package
org.genesys2.server.service
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
org.genesys2.server.service.impl.FilterHandler.AppliedFilters
;
/**
* Defines available downloads
*
* @author matijaobreza
*
*/
public
interface
DownloadService
{
void
writeXlsxMCPD
(
AppliedFilters
filters
,
OutputStream
outputStream
)
throws
IOException
;
}
src/main/java/org/genesys2/server/service/impl/DirectMysqlQuery.java
View file @
c054dac5
...
...
@@ -37,6 +37,7 @@ import org.genesys2.server.service.impl.FilterHandler.MinValueFilter;
import
org.genesys2.server.service.impl.FilterHandler.StartsWithFilter
;
import
org.genesys2.server.service.impl.FilterHandler.ValueRangeFilter
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.data.domain.Sort.Order
;
public
class
DirectMysqlQuery
{
...
...
@@ -85,7 +86,9 @@ public class DirectMysqlQuery {
if
(
StringUtils
.
isNotBlank
(
alias
))
{
sb
.
append
(
alias
).
append
(
StringUtils
.
SPACE
);
}
sb
.
append
(
"on "
).
append
(
onExpr
).
append
(
StringUtils
.
SPACE
);
if
(
StringUtils
.
isNotBlank
(
onExpr
))
{
sb
.
append
(
"on "
).
append
(
onExpr
).
append
(
StringUtils
.
SPACE
);
}
return
this
;
}
...
...
@@ -397,6 +400,30 @@ public class DirectMysqlQuery {
return
params
.
toArray
();
}
public
DirectMysqlQuery
sort
(
Sort
sort
)
{
if
(
sortBuffer
.
length
()
!=
0
)
{
throw
new
RuntimeException
(
"sortBuffer is not blank, invalid use of #pageable(Pageable)"
);
}
sortBuffer
.
append
(
"\n order by "
);
for
(
final
Order
o
:
sort
)
{
if
(
LOG
.
isDebugEnabled
())
{
LOG
.
debug
(
"Order: "
+
o
);
}
// ClassMetadata md =
// sessionFactory.getClassMetadata(Accession.class);
// md.
// EntityType<Accession> x =
// entityManager.getMetamodel().entity(Accession.class);
// System.err.println(x.getAttribute(o.getProperty()).getName());
// sb.append(x.getAttribute(o.getProperty()).getName());
sortBuffer
.
append
(
"a."
).
append
(
o
.
getProperty
());
sortBuffer
.
append
(
" "
).
append
(
o
.
getDirection
());
}
return
this
;
}
public
DirectMysqlQuery
pageable
(
Pageable
pageable
)
{
if
(
sortBuffer
.
length
()
!=
0
)
{
throw
new
RuntimeException
(
"sortBuffer is not blank, invalid use of #pageable(Pageable)"
);
...
...
@@ -407,21 +434,7 @@ public class DirectMysqlQuery {
}
if
(
pageable
.
getSort
()
!=
null
)
{
sortBuffer
.
append
(
"\n order by "
);
for
(
final
Order
o
:
pageable
.
getSort
())
{
if
(
LOG
.
isDebugEnabled
())
{
LOG
.
debug
(
"Order: "
+
o
);
}
// ClassMetadata md =
// sessionFactory.getClassMetadata(Accession.class);
// md.
// EntityType<Accession> x =
// entityManager.getMetamodel().entity(Accession.class);
// System.err.println(x.getAttribute(o.getProperty()).getName());
// sb.append(x.getAttribute(o.getProperty()).getName());
sortBuffer
.
append
(
"a."
).
append
(
o
.
getProperty
());
sortBuffer
.
append
(
" "
).
append
(
o
.
getDirection
());
}
sort
(
pageable
.
getSort
());
}
sortBuffer
.
append
(
" limit "
);
if
(
LOG
.
isDebugEnabled
())
{
...
...
src/main/java/org/genesys2/server/service/impl/DownloadServiceImpl.java
0 → 100644
View file @
c054dac5
This diff is collapsed.
Click to expand it.
src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java
View file @
c054dac5
...
...
@@ -38,6 +38,7 @@ import org.genesys2.server.model.genesys.Parameter;
import
org.genesys2.server.model.genesys.ParameterCategory
;
import
org.genesys2.server.model.impl.Crop
;
import
org.genesys2.server.service.CropService
;
import
org.genesys2.server.service.DownloadService
;
import
org.genesys2.server.service.ElasticService
;
import
org.genesys2.server.service.FilterConstants
;
import
org.genesys2.server.service.GenesysFilterService
;
...
...
@@ -57,6 +58,7 @@ import org.springframework.data.domain.Page;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.http.MediaType
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.ModelMap
;
import
org.springframework.web.bind.annotation.PathVariable
;
...
...
@@ -71,9 +73,11 @@ import com.jhlabs.image.MapColorsFilter;
@Controller
public
class
ExplorerController
extends
BaseController
{
private
static
final
int
DOWNLOAD_LIMIT
=
100000
;
@Autowired
private
GenesysFilterService
filterService
;
@Autowired
private
ElasticService
elasticService
;
...
...
@@ -98,6 +102,9 @@ public class ExplorerController extends BaseController {
@Autowired
private
FilterHandler
filterHandler
;
@Autowired
private
DownloadService
downloadService
;
private
final
ObjectMapper
mapper
=
new
ObjectMapper
();
/**
...
...
@@ -161,11 +168,9 @@ public class ExplorerController extends BaseController {
}
model
.
addAttribute
(
"crop"
,
crop
);
// JSP works with JsonObject
final
Map
<?,
?>
filters
=
mapper
.
readValue
(
appliedFilters
.
toString
(),
Map
.
class
);
model
.
addAttribute
(
"filters"
,
filters
);
selectedFilters
=
appliedFilters
.
getFilterNames
();
final
List
<
GenesysFilter
>
currentFilters
=
filterHandler
.
selectFilters
(
selectedFilters
);
...
...
@@ -187,7 +192,6 @@ public class ExplorerController extends BaseController {
return
"/accession/explore"
;
}
/**
* Browse all using Elasticsearch
*
...
...
@@ -195,7 +199,7 @@ public class ExplorerController extends BaseController {
* @param page
* @return
* @throws IOException
* @throws SearchException
* @throws SearchException
*/
@RequestMapping
(
"/explore-es"
)
public
String
viewElasticFiltered
(
ModelMap
model
,
@RequestParam
(
value
=
"page"
,
required
=
false
,
defaultValue
=
"1"
)
int
page
,
...
...
@@ -221,11 +225,9 @@ public class ExplorerController extends BaseController {
}
model
.
addAttribute
(
"crop"
,
crop
);
// JSP works with JsonObject // TODO Handle -filter.key!!
// JSP works with JsonObject // TODO Handle -filter.key!!
final
Map
<?,
?>
filters
=
mapper
.
readValue
(
appliedFilters
.
toString
(),
Map
.
class
);
model
.
addAttribute
(
"filters"
,
filters
);
selectedFilters
=
appliedFilters
.
getFilterNames
();
final
List
<
GenesysFilter
>
currentFilters
=
filterHandler
.
selectFilters
(
selectedFilters
);
...
...
@@ -247,7 +249,6 @@ public class ExplorerController extends BaseController {
return
"/accession/explore-es"
;
}
@RequestMapping
(
value
=
"/additional-filter"
,
method
=
RequestMethod
.
GET
)
public
String
getAdditionalFilters
(
ModelMap
model
,
@RequestParam
(
value
=
"filter"
,
required
=
true
,
defaultValue
=
""
)
String
[]
selectedFilters
)
throws
IOException
{
...
...
@@ -332,6 +333,29 @@ public class ExplorerController extends BaseController {
response
.
flushBuffer
();
}
@PreAuthorize
(
"isAuthenticated()"
)
@RequestMapping
(
value
=
"/explore/download/mcpd"
,
method
=
RequestMethod
.
POST
)
public
void
downloadXlsxMCPD
(
ModelMap
model
,
@RequestParam
(
value
=
"filter"
,
required
=
false
,
defaultValue
=
"{}"
)
String
jsonFilter
,
HttpServletResponse
response
)
throws
IOException
{
final
AppliedFilters
appliedFilters
=
updateFilterWithCrop
(
null
,
jsonFilter
);
final
int
countFiltered
=
genesysService
.
countAccessions
(
appliedFilters
);
_logger
.
info
(
"Attempting to download XLSX MCPD for "
+
countFiltered
+
" accessions"
);
if
(
countFiltered
>
DOWNLOAD_LIMIT
)
{
throw
new
RuntimeException
(
"Refusing to export more than "
+
DOWNLOAD_LIMIT
+
" entries"
);
}
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
addHeader
(
"Content-Disposition"
,
String
.
format
(
"attachment; filename=\"genesys-accessions-filtered.xlsx\""
));
// Write Darwin Core Archive to the stream.
final
OutputStream
outputStream
=
response
.
getOutputStream
();
downloadService
.
writeXlsxMCPD
(
appliedFilters
,
outputStream
);
response
.
flushBuffer
();
}
private
AppliedFilters
updateFilterWithCrop
(
String
cropName
,
String
jsonFilter
)
throws
IOException
{
AppliedFilters
appliedFilters
=
mapper
.
readValue
(
jsonFilter
,
AppliedFilters
.
class
);
...
...
@@ -385,11 +409,10 @@ public class ExplorerController extends BaseController {
public
void
tile
(
@PathVariable
(
"zoom"
)
int
zoom
,
@PathVariable
(
"x"
)
int
x
,
@PathVariable
(
"y"
)
int
y
,
@RequestParam
(
value
=
"filter"
,
required
=
true
)
String
jsonFilter
,
@RequestParam
(
value
=
"color"
,
required
=
false
)
String
color
,
HttpServletResponse
response
)
{
try
{
AppliedFilters
appliedFilters
=
mapper
.
readValue
(
jsonFilter
,
AppliedFilters
.
class
);
byte
[]
image
=
mappingService
.
getTile
(
appliedFilters
,
zoom
,
x
,
y
);
image
=
changeColor
(
color
,
image
);
response
.
getOutputStream
().
write
(
image
,
0
,
image
.
length
);
...
...
@@ -444,7 +467,8 @@ public class ExplorerController extends BaseController {
}
@RequestMapping
(
value
=
"/explore/overview"
)
public
String
overview
(
ModelMap
model
,
@RequestParam
(
value
=
"filter"
,
required
=
false
,
defaultValue
=
"{}"
)
String
jsonFilter
)
throws
IOException
,
SearchException
{
public
String
overview
(
ModelMap
model
,
@RequestParam
(
value
=
"filter"
,
required
=
false
,
defaultValue
=
"{}"
)
String
jsonFilter
)
throws
IOException
,
SearchException
{
AppliedFilters
appliedFilters
=
mapper
.
readValue
(
jsonFilter
,
AppliedFilters
.
class
);
String
[]
selectedFilters
=
appliedFilters
.
getFilterNames
();
...
...
src/main/java/org/genesys2/server/servlet/controller/SelectionController.java
View file @
c054dac5
...
...
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse;
import
org.genesys2.server.model.genesys.Accession
;
import
org.genesys2.server.model.genesys.AccessionGeo
;
import
org.genesys2.server.service.DownloadService
;
import
org.genesys2.server.service.FilterConstants
;
import
org.genesys2.server.service.GenesysService
;
import
org.genesys2.server.service.impl.FilterHandler
;
...
...
@@ -45,21 +46,20 @@ import org.springframework.web.bind.annotation.RequestMethod;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
@Controller
@Scope
(
"request"
)
@RequestMapping
(
"/sel"
)
public
class
SelectionController
extends
BaseController
{
private
final
ObjectMapper
mapper
=
new
ObjectMapper
();
@Autowired
private
SelectionBean
selectionBean
;
@Autowired
private
GenesysService
genesysService
;
@Autowired
private
DownloadService
downloadService
;
@RequestMapping
(
"/"
)
public
String
view
(
ModelMap
model
,
@RequestParam
(
value
=
"page"
,
required
=
false
,
defaultValue
=
"1"
)
int
page
)
{
...
...
@@ -151,6 +151,29 @@ public class SelectionController extends BaseController {
response
.
flushBuffer
();
}
@RequestMapping
(
value
=
"/download/mcpd"
,
method
=
RequestMethod
.
POST
)
public
void
downloadXlsxMCPD
(
ModelMap
model
,
HttpServletResponse
response
)
throws
IOException
{
// Create JSON filter
final
AppliedFilters
appliedFilters
=
new
AppliedFilters
();
AppliedFilter
arr
=
new
FilterHandler
.
AppliedFilter
().
setFilterName
(
FilterConstants
.
ID
);
for
(
final
long
id
:
selectionBean
.
copy
())
{
arr
.
addFilterValue
(
new
FilterHandler
.
LiteralValueFilter
(
id
));
}
appliedFilters
.
add
(
arr
);
final
int
countFiltered
=
genesysService
.
countAccessions
(
appliedFilters
);
_logger
.
info
(
"Attempting to download XLSX MCPD for "
+
countFiltered
+
" accessions"
);
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
addHeader
(
"Content-Disposition"
,
String
.
format
(
"attachment; filename=\"genesys-accessions-selected.xlsx\""
));
// Write Darwin Core Archive to the stream.
final
OutputStream
outputStream
=
response
.
getOutputStream
();
downloadService
.
writeXlsxMCPD
(
appliedFilters
,
outputStream
);
response
.
flushBuffer
();
}
// TODO REMOVE
@RequestMapping
(
value
=
"/json/count"
,
method
=
RequestMethod
.
GET
,
produces
=
{
MediaType
.
APPLICATION_JSON_VALUE
})
@ResponseBody
...
...
src/main/resources/content/language.properties
View file @
c054dac5
...
...
@@ -358,6 +358,7 @@ filter.available=Available for distribution
filter.donorCode
=
Donor institute
filter.duplSite
=
Site of safety duplication
filter.download-dwca
=
Download ZIP
filter.download-mcpd
=
Download MCPD
filter.add
=
Add filter
filter.additional
=
Additional filters
filter.apply
=
Apply
...
...
src/main/resources/template/download/.gitignore
0 → 100644
View file @
c054dac5
/~$*
src/main/resources/template/download/MCPD.xlsx
0 → 100644
View file @
c054dac5
File added
src/main/webapp/WEB-INF/jsp/accession/explore.jsp
View file @
c054dac5
...
...
@@ -37,6 +37,13 @@
<button
class=
"btn btn-default"
type=
"submit"
><spring:message
code=
"filter.download-dwca"
/></button>
</form>
</c:if>
<security:authorize
access=
"isAuthenticated()"
>
<form
style=
"display: inline-block"
method=
"post"
action=
"
<c:url
value=
"/explore/download/mcpd"
/>
"
>
<input
type=
"hidden"
name=
"${_csrf.parameterName}"
value=
"${_csrf.token}"
/>
<input
type=
"hidden"
name=
"filter"
value=
"
<c:out
value=
"
${
jsonFilter
}
"
/>
"
/>
<button
class=
"btn btn-default"
type=
"submit"
><spring:message
code=
"filter.download-mcpd"
/></button>
</form>
</security:authorize>
<a
class=
"btn btn-default"
href=
"
<c:url
value=
"/explore/overview"
><c:param
name=
"filter"
>
${jsonFilter}
</c:param></c:url>
"
><span
class=
"glyphicon glyphicon-eye-open"
></span><span
style=
"margin-left: 0.5em;"
><spring:message
code=
"data-overview.short"
/></span></a>
<a
class=
"btn btn-default"
href=
"
<c:url
value=
"/explore/map"
><c:param
name=
"filter"
>
${jsonFilter}
</c:param></c:url>
"
><span
class=
"glyphicon glyphicon-globe"
></span><span
style=
"margin-left: 0.5em;"
><spring:message
code=
"maps.view-map"
/></span></a>
</div>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment