From 3b44dc2a387c06ebf5fa1b78b29ea2ee99fe23ca Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 10:39:41 -0400 Subject: [PATCH 01/19] file descriptions were not searchable #3745 --- src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java index 778bae848df..c57a7070548 100644 --- a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java @@ -714,6 +714,7 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { datafileSolrInputDocument.addField(SearchFields.FILE_TYPE, FileUtil.getFacetFileType(fileMetadata.getDataFile())); datafileSolrInputDocument.addField(SearchFields.FILE_TYPE_SEARCHABLE, FileUtil.getFacetFileType(fileMetadata.getDataFile())); datafileSolrInputDocument.addField(SearchFields.DESCRIPTION, fileMetadata.getDescription()); + datafileSolrInputDocument.addField(SearchFields.FILE_DESCRIPTION, fileMetadata.getDescription()); datafileSolrInputDocument.addField(SearchFields.SUBTREE, dataversePaths); // datafileSolrInputDocument.addField(SearchFields.HOST_DATAVERSE, dataFile.getOwner().getOwner().getName()); // datafileSolrInputDocument.addField(SearchFields.PARENT_NAME, dataFile.getDataset().getTitle()); From 8ba43d1f478f22e3a70fa99b2eee847c9b6741bf Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 10:55:03 -0400 Subject: [PATCH 02/19] text_en and copyField for variable name and label #3945 --- conf/solr/4.6.0/schema.xml | 4 ++++ scripts/search/data/tabular/50by1000.dta | Bin 0 -> 58216 bytes .../harvard/iq/dataverse/IndexServiceBean.java | 5 ++--- .../harvard/iq/dataverse/api/SearchFields.java | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 scripts/search/data/tabular/50by1000.dta diff --git a/conf/solr/4.6.0/schema.xml b/conf/solr/4.6.0/schema.xml index 2577c3b27f4..4d91168c0ae 100644 --- a/conf/solr/4.6.0/schema.xml +++ b/conf/solr/4.6.0/schema.xml @@ -269,6 +269,10 @@ + + + + diff --git a/scripts/search/data/tabular/50by1000.dta b/scripts/search/data/tabular/50by1000.dta new file mode 100644 index 0000000000000000000000000000000000000000..2cbadda3f6d3314e66b195d9c76d1cc3dd491f0d GIT binary patch literal 58216 zcmeI#&5B%Q5XSM&_XoHVm&$D1%H(uM6E_;cI}mi6Kr}-9ilV!$TnKJms~6?rUS1>U5v!Hb{^XyZ=lbtOcn|-659j!Z z`bT*K-hemY4R{0120nQ7>DNd5f4+J2@aXaV2M-?~ef-6fqr=~_HW%v8#r|{hpPuIr zJo9(BocHh0KQP66<)#R5~lV4d)eswkZwbkU;SCijZO@1>ir&Xoe-`RX_ zZ}a*4?)QBDzE9uo%=PbdHT8S$_ne=B`THG7zvq6>`5Ey4!{v83Rn@n5f5-2&CgSa# zpKPoNo0D|Td*5oRqTJ7|BdMa?+dNIFs#NrS}{*H|`5t8$hjWuC& zlFoVWTTNAz`?+-_Rg`<1rzusHYJbPZnh44H$;O(nIZ5Zd_pPQX%Kh9rk}Ar*&C`^s zO0~aZV@-tQ{A6QI*qo$u-uqTl73F?z9Z41C-sWjaRi)bBv9TsXa(=S0CTvd9Iq!X| zsfuzxw~nNWa&PlArK(cx@7P!qAvr(USQ9oU>74hz)l@~fpIb*#MY*?mno?D%_IGTo ziIAM1Y^({JlXT8|-)gF&+|R8esiNH5JWZ*pRQo$N)B&DQSRr~ zkyKIcZJwr7RjU0R8*3sY=O-I$!saBM^WL|bswnq!>qx37_cl*csw&m~j*T@DlJk>| zHDPm-&Ux=!O;wcpxpgE}lzW?}DOHtff5*m}2+8@$#+tA>N$0%xt)?o<{oFc|D$2dh z)0C=8wZCIyO@!q9WMfU(oTPK!`&LsG<$i7*NfqVZ=4nb*rP|-Iu_i)tezLJ9Y);ZS z?|rMOigG``#Uz)L`cq0Hr9mANjm4fZ#7j> z?&sE#R8j72o~Be)s{I`sYa%4)CmU6HH^E9QZQtj{9SQ8;RKiOClHYe$v_rBFsMY*3_M^Z((w|SaU zRjKxOY^;fpoS$s037eC2&U@c#s-oP_ts|+T+}k`&sj5`_J2uutNX}0-)`ZPTI_JG_ zHC0jW=hl%_QSNP?rc_m`{T&-?A|&T08*9SmB%Sl#x051LBvq7qo2MyNm1=*-#+nGp`N_tbusKQRy!Wl9D$4!b zI+7~Nz0K2!!W-?6bKLUMkx zu_kOz(mC&atEq}|KevvgigIuBG^MIi?eExF6CpW2*;o@cC+VE`zSUGkxu07{QboD9 zd74sHsrGkltcj4EpKPoNo0D|Td*5oRqTJ7|BdMa?+dNIFs#NrS} z{*H|`5t8$hjWuC&lFoVWTTNAz`?+-_Rg`<1rzusHYJbPZnh44H$;O(nIZ5Zd_pPQX z%Kh9rk}Ar*&C`^sO0~aZV@-tQ{A6QI*qo$u-uqTl73F?z9Z41C-sWjaRi)bBv9TsX za(=S0CTvd9Iq!X|sfuzxw~nNWa&PlArK(cx@7P!qAvr(USQ9oU>74hz)l@~fpIb*# zMY*?mno?D%_IGToiIAM1Y^({JlXT8|-)gF&+|R8esiNH5JWZ*pRQo$N)B&DQSRr~kyKIcZJwr7RjU0R8*3sY=O-I$!saBM^WL|bswnq!>qx37_cl*c zsw&m~j*T@DlJk>|HDPm-&Ux=!O;wcpxpgE}lzW?}DOHtff5*m}2+8@$#+tA>N$0%x zt)?o<{oFc|D$2dh)0C=8wZCIyO@!q9WMfU(oTPK!`&LsG<$i7*NfqVZ=4nb*rP|-I Qu_i)tezLJ9{=epb0dUCEy#N3J literal 0 HcmV?d00001 diff --git a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java index c57a7070548..34e2898271d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java @@ -732,7 +732,6 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { String variableLabelsToIndex = null; for (DataVariable var : variables) { // Hard-coded search fields, for now: - // TODO: immediately: define these as constants in SearchFields; // TODO: eventually: review, decide how datavariables should // be handled for indexing purposes. (should it be a fixed // setup, defined in the code? should it be flexible? unlikely @@ -758,11 +757,11 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { } if (variableNamesToIndex != null) { logger.info("indexing " + variableNamesToIndex.length() + " bytes"); - datafileSolrInputDocument.addField("varname_s", variableNamesToIndex); + datafileSolrInputDocument.addField(SearchFields.VARIABLE_NAME, variableNamesToIndex); } if (variableLabelsToIndex != null) { logger.info("indexing " + variableLabelsToIndex.length() + " bytes"); - datafileSolrInputDocument.addField("varlabel_s", variableLabelsToIndex); + datafileSolrInputDocument.addField(SearchFields.VARIABLE_LABEL, variableLabelsToIndex); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java b/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java index bd92490caa7..de5164b381e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java @@ -102,4 +102,7 @@ public class SearchFields { public static final String DATASET_DESCRIPTION = "dsDescription"; public static final String DATASET_VERSION_ID = "dataset_version_id_l"; + public static final String VARIABLE_NAME = "variable_name_en"; + public static final String VARIABLE_LABEL = "variable_lable_en"; + } From f9d8cdc0023d77c41c310c8094b147ede20e9dc2 Mon Sep 17 00:00:00 2001 From: sekmiller Date: Thu, 8 May 2014 11:39:39 -0400 Subject: [PATCH 03/19] Update "Add Data" Button permissions for user page display Add data on user page if user has add create dataverse or create dataset permission on root dataverse. --- src/main/webapp/dataverseuser.xhtml | 1 + src/main/webapp/search-include-fragment.xhtml | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/dataverseuser.xhtml b/src/main/webapp/dataverseuser.xhtml index 3be776300a9..815533d5a1c 100644 --- a/src/main/webapp/dataverseuser.xhtml +++ b/src/main/webapp/dataverseuser.xhtml @@ -100,6 +100,7 @@ --> + From 3b0cc338c6f3ee06742b852607f256b7f5a4d307 Mon Sep 17 00:00:00 2001 From: posixeleni Date: Thu, 8 May 2014 11:54:54 -0400 Subject: [PATCH 04/19] Update appendix.rst --- doc/Sphinx/source/User/appendix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Sphinx/source/User/appendix.rst b/doc/Sphinx/source/User/appendix.rst index 7e62c4745e8..8c16e9bcd2f 100644 --- a/doc/Sphinx/source/User/appendix.rst +++ b/doc/Sphinx/source/User/appendix.rst @@ -16,7 +16,7 @@ currently proposed metadata fields for 4.0 (per metadata block): - `Citation Metadata `__ (compliant with `DDI 2.5 `__ and `DataCite 3.0 `__) - `Social Science & Humanities Metadata (DDI 2.5 compliant) `__ - `Astronomy and Astrophysics Metadata `__ - (based on `Virtual Observatory (VO) Discovery and Provenance Metadata `__) + : These metadata elements can be mapped/exported to the International Virtual Observatory Alliance’s (IVOA) Resource Metadata for the Virtual Observatory (VOResource Schema format) and based on `Virtual Observatory (VO) Discovery and Provenance Metadata `__) - `Biomedical Metadata `__ (based on `ISA-Tab `__ and `Stem Cell Commons `__) From 41a0a4d98dc461e9457f0276be8dd8e6db611806 Mon Sep 17 00:00:00 2001 From: sekmiller Date: Thu, 8 May 2014 11:59:21 -0400 Subject: [PATCH 05/19] Simplify the logic for Add Data button refer to search include dv for command permission --- src/main/webapp/dataverseuser.xhtml | 1 - src/main/webapp/search-include-fragment.xhtml | 12 ++++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/webapp/dataverseuser.xhtml b/src/main/webapp/dataverseuser.xhtml index 815533d5a1c..3be776300a9 100644 --- a/src/main/webapp/dataverseuser.xhtml +++ b/src/main/webapp/dataverseuser.xhtml @@ -100,7 +100,6 @@ --> - From 9b8cefbd71f2f73da5851637fb41b1b2fbe5e00e Mon Sep 17 00:00:00 2001 From: xyang02 Date: Thu, 8 May 2014 11:59:24 -0400 Subject: [PATCH 06/19] Modified confirmDialog message by removing "Unfortunately" from both Dataset and Dataverse page. --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 0e6ffa30c4c..af21eea549d 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -148,7 +148,7 @@ - +
From b09a52b8214ab8c44b548a42807f603b525369f1 Mon Sep 17 00:00:00 2001 From: xyang02 Date: Thu, 8 May 2014 11:59:44 -0400 Subject: [PATCH 07/19] Modified confirmDialog message by removing "Unfortunately" from both Dataset and Dataverse page. --- src/main/webapp/dataverse.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataverse.xhtml b/src/main/webapp/dataverse.xhtml index 59b10328cc7..6bfaa10d6f8 100644 --- a/src/main/webapp/dataverse.xhtml +++ b/src/main/webapp/dataverse.xhtml @@ -230,7 +230,7 @@
- + From 17a16cb79f44ca08390321b3c2dca1f7646ffc25 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Thu, 8 May 2014 13:14:09 -0400 Subject: [PATCH 08/19] A fix for CSV files not being recognized as tabular data when uploaded through some browsers. --- .../iq/dataverse/ingest/IngestServiceBean.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java index 8d13541fb8d..7f8d6395be8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java @@ -125,6 +125,7 @@ public class IngestServiceBean { private static final String MIME_TYPE_STATA = "application/x-stata"; private static final String MIME_TYPE_RDATA = "application/x-rlang-transport"; private static final String MIME_TYPE_CSV = "text/csv"; + private static final String MIME_TYPE_CSV_ALT = "text/comma-separated-values"; private static final String MIME_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; private static final String MIME_TYPE_SPSS_SAV = "application/x-spss-sav"; private static final String MIME_TYPE_SPSS_POR = "application/x-spss-por"; @@ -256,7 +257,12 @@ public boolean ingestAsTabular(String tempFileLocation, DataFile dataFile) throw Logger.getLogger(DatasetPage.class.getName()).log(Level.INFO, "Tab-delimited file produced: " + tabFile.getAbsolutePath()); - tabDataIngest.getDataTable().setOriginalFileFormat(dataFile.getContentType()); + if (MIME_TYPE_CSV_ALT.equals(dataFile.getContentType())) { + tabDataIngest.getDataTable().setOriginalFileFormat(MIME_TYPE_CSV); + } else { + tabDataIngest.getDataTable().setOriginalFileFormat(dataFile.getContentType()); + } + // and we want to save the original of the ingested file: try { @@ -319,7 +325,7 @@ public boolean ingestableAsTabular(DataFile dataFile) { return true; } else if (mimeType.equals(MIME_TYPE_RDATA)) { return true; - } else if (mimeType.equals(MIME_TYPE_CSV)) { + } else if (mimeType.equals(MIME_TYPE_CSV) || mimeType.equals(MIME_TYPE_CSV_ALT)) { return true; } else if (mimeType.equals(MIME_TYPE_XLSX)) { return true; @@ -351,7 +357,7 @@ private TabularDataFileReader getTabDataReaderByMimeType(DataFile dataFile) { ingestPlugin = new DTAFileReader(new DTAFileReaderSpi()); } else if (mimeType.equals(MIME_TYPE_RDATA)) { ingestPlugin = new RDATAFileReader(new RDATAFileReaderSpi()); - } else if (mimeType.equals(MIME_TYPE_CSV)) { + } else if (mimeType.equals(MIME_TYPE_CSV) || mimeType.equals(MIME_TYPE_CSV_ALT)) { ingestPlugin = new CSVFileReader(new CSVFileReaderSpi()); } else if (mimeType.equals(MIME_TYPE_XLSX)) { ingestPlugin = new XLSXFileReader(new XLSXFileReaderSpi()); From ff4cd454b5da55b83a996b45b83982fd3fb79ac3 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 14:26:22 -0400 Subject: [PATCH 09/19] added variable name and label to advanced search #3945 --- .../iq/dataverse/AdvancedSearchPage.java | 26 +++++++++++++++++++ .../iq/dataverse/IndexServiceBean.java | 22 ++-------------- .../iq/dataverse/SearchServiceBean.java | 2 ++ src/main/webapp/search-include-fragment.xhtml | 11 ++++++++ src/main/webapp/search/advanced.xhtml | 12 +++++++++ 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java b/src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java index 1c0a8296949..19382e5d246 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java @@ -35,6 +35,8 @@ public class AdvancedSearchPage { private String fileFieldName; private String fileFieldDescription; private String fileFieldFiletype; + private String fileFieldVariableName; + private String fileFieldVariableLabel; public void init() { /** @@ -115,6 +117,14 @@ private String constructFileQuery() { queryStrings.add(constructQuery(SearchFields.FILE_TYPE_SEARCHABLE, fileFieldFiletype)); } + if (!fileFieldVariableName.isEmpty()) { + queryStrings.add(constructQuery(SearchFields.VARIABLE_NAME, fileFieldVariableName)); + } + + if (!fileFieldVariableLabel.isEmpty()) { + queryStrings.add(constructQuery(SearchFields.VARIABLE_LABEL, fileFieldVariableLabel)); + } + return constructQuery(queryStrings, true); } @@ -256,4 +266,20 @@ public void setFileFieldFiletype(String fileFieldFiletype) { this.fileFieldFiletype = fileFieldFiletype; } + public String getFileFieldVariableName() { + return fileFieldVariableName; + } + + public void setFileFieldVariableName(String fileFieldVariableName) { + this.fileFieldVariableName = fileFieldVariableName; + } + + public String getFileFieldVariableLabel() { + return fileFieldVariableLabel; + } + + public void setFileFieldVariableLabel(String fileFieldVariableLabel) { + this.fileFieldVariableLabel = fileFieldVariableLabel; + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java index 34e2898271d..c4a5dcda0aa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/IndexServiceBean.java @@ -728,8 +728,6 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { if (fileMetadata.getDataFile().isTabularData()) { List variables = fileMetadata.getDataFile().getDataTable().getDataVariables(); - String variableNamesToIndex = null; - String variableLabelsToIndex = null; for (DataVariable var : variables) { // Hard-coded search fields, for now: // TODO: eventually: review, decide how datavariables should @@ -741,28 +739,12 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { // anyway -- needs to be reviewed. -- L.A. 4.0alpha1 if (var.getName() != null && !var.getName().equals("")) { - if (variableNamesToIndex == null) { - variableNamesToIndex = var.getName(); - } else { - variableNamesToIndex = variableNamesToIndex + " " + var.getName(); - } + datafileSolrInputDocument.addField(SearchFields.VARIABLE_NAME, var.getName()); } if (var.getLabel() != null && !var.getLabel().equals("")) { - if (variableLabelsToIndex == null) { - variableLabelsToIndex = var.getLabel(); - } else { - variableLabelsToIndex = variableLabelsToIndex + " " + var.getLabel(); - } + datafileSolrInputDocument.addField(SearchFields.VARIABLE_LABEL, var.getLabel()); } } - if (variableNamesToIndex != null) { - logger.info("indexing " + variableNamesToIndex.length() + " bytes"); - datafileSolrInputDocument.addField(SearchFields.VARIABLE_NAME, variableNamesToIndex); - } - if (variableLabelsToIndex != null) { - logger.info("indexing " + variableLabelsToIndex.length() + " bytes"); - datafileSolrInputDocument.addField(SearchFields.VARIABLE_LABEL, variableLabelsToIndex); - } } docs.add(datafileSolrInputDocument); diff --git a/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java index ee62bfd34f8..9cbfeb3e905 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java @@ -94,6 +94,8 @@ public SolrQueryResponse search(DataverseUser dataverseUser, Dataverse dataverse solrFieldsToHightlightOnMap.put(SearchFields.AFFILIATION, "Affiliation"); solrFieldsToHightlightOnMap.put(SearchFields.FILE_TYPE_MIME, "File Type"); solrFieldsToHightlightOnMap.put(SearchFields.DESCRIPTION, "Description"); + solrFieldsToHightlightOnMap.put(SearchFields.VARIABLE_NAME, "Variable Name"); + solrFieldsToHightlightOnMap.put(SearchFields.VARIABLE_LABEL, "Variable Label"); /** * @todo: show highlight on file card? * https://redmine.hmdc.harvard.edu/issues/3848 diff --git a/src/main/webapp/search-include-fragment.xhtml b/src/main/webapp/search-include-fragment.xhtml index c4c34217f18..c63082dd079 100644 --- a/src/main/webapp/search-include-fragment.xhtml +++ b/src/main/webapp/search-include-fragment.xhtml @@ -598,6 +598,17 @@ + +
+ + + + +
+
+
+
+
diff --git a/src/main/webapp/search/advanced.xhtml b/src/main/webapp/search/advanced.xhtml index dfd8cda1c04..22e8c7b1bdf 100644 --- a/src/main/webapp/search/advanced.xhtml +++ b/src/main/webapp/search/advanced.xhtml @@ -107,6 +107,18 @@ +
+ +
+ +
+
+
+ +
+ +
+
From 3981e65233216a01a0a95c6b26cc3856170c4828 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 14:42:23 -0400 Subject: [PATCH 10/19] added filetype_en to catchall #3745 --- conf/solr/4.6.0/schema.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/solr/4.6.0/schema.xml b/conf/solr/4.6.0/schema.xml index 4d91168c0ae..034e3f23994 100644 --- a/conf/solr/4.6.0/schema.xml +++ b/conf/solr/4.6.0/schema.xml @@ -416,7 +416,8 @@ - + + From 9fb572b0d9612074968ddecb6915900f1d1a6f74 Mon Sep 17 00:00:00 2001 From: Gustavo Durand Date: Thu, 8 May 2014 14:44:28 -0400 Subject: [PATCH 11/19] temporary: allow users to create in dataverse with aliases that end in "_open" --- .../iq/dataverse/PermissionServiceBean.java | 272 +++++++++--------- 1 file changed, 142 insertions(+), 130 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java index fe43848e96e..91cf95b5096 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java @@ -17,143 +17,155 @@ import static edu.harvard.iq.dataverse.engine.command.CommandHelper.CH; /** - * Your one-stop-shop for deciding which user can do what action on which objects (TM). - * Note that this bean accesses the permissions/user assignment on a read-only basis. - * Changing the permissions a user has is done via roles and groups, over at {@link DataverseRoleServiceBean}. + * Your one-stop-shop for deciding which user can do what action on which + * objects (TM). Note that this bean accesses the permissions/user assignment on + * a read-only basis. Changing the permissions a user has is done via roles and + * groups, over at {@link DataverseRoleServiceBean}. + * * @author michael */ @Stateless @Named public class PermissionServiceBean { - private static final Logger logger = Logger.getLogger(PermissionServiceBean.class.getName()); - - @EJB - DataverseUserServiceBean userService; - - @EJB - DataverseRoleServiceBean roleService; - - @PersistenceContext - EntityManager em; - - @Inject - DataverseSession session; - - public class PermissionQuery { - final DataverseUser user; - final DvObject subject; - - public PermissionQuery(DataverseUser user, DvObject subject) { - this.user = user; - this.subject = subject; - } - - public PermissionQuery user( DataverseUser anotherUser ) { - return new PermissionQuery(anotherUser, subject); - } - - public boolean canIssue( Class cmd ) { - return isUserAllowedOn(user, cmd, subject); - } - + + private static final Logger logger = Logger.getLogger(PermissionServiceBean.class.getName()); + + @EJB + DataverseUserServiceBean userService; + + @EJB + DataverseRoleServiceBean roleService; + + @PersistenceContext + EntityManager em; + + @Inject + DataverseSession session; + + public class PermissionQuery { + + final DataverseUser user; + final DvObject subject; + + public PermissionQuery(DataverseUser user, DvObject subject) { + this.user = user; + this.subject = subject; + } + + public PermissionQuery user(DataverseUser anotherUser) { + return new PermissionQuery(anotherUser, subject); + } + + public boolean canIssue(Class cmd) { + return isUserAllowedOn(user, cmd, subject); + } + /** - * "Fast and loose" query mechanism, allowing to pass the command class name. - * Command is assumed to live in {@code edu.harvard.iq.dataverse.engine.command.impl.} + * "Fast and loose" query mechanism, allowing to pass the command class + * name. Command is assumed to live in + * {@code edu.harvard.iq.dataverse.engine.command.impl.} + * * @param commandName - * @return {@code true} iff the user has the permissions required by the command on the - * object. - * @throws ClassNotFoundException + * @return {@code true} iff the user has the permissions required by the + * command on the object. + * @throws ClassNotFoundException */ - public boolean canIssueCommand( String commandName ) throws ClassNotFoundException { - return isUserAllowedOn(user, - (Class)Class.forName("edu.harvard.iq.dataverse.engine.command.impl." + commandName), subject); - } - - public Set get() { - return permissionsFor(user, subject); - } - - public boolean has( Permission p ) { - return get().contains(p); - } - public boolean has( String pName ) { - return get().contains( Permission.valueOf(pName) ); - } - - } - - public List assignmentsOn( DvObject d ) { - return em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class) - .setParameter("definitionPointId", d.getId()).getResultList(); - } - - public Set permissionsFor( DataverseUser u, DvObject d ) { - Set retVal = EnumSet.noneOf(Permission.class); - for ( RoleAssignment asmnt : roleService.assignmentsFor(u, d) ) { - retVal.addAll( asmnt.getRole().permissions() ); - } - - // special root case - All registered users can add to the root dv - if ( (d.getOwner() == null) && (!u.isGuest()) ) { - // TODO when groups arrive, this has to go. - retVal.add( Permission.UndoableEdit ); - retVal.add( Permission.AddDataset ); - retVal.add( Permission.AddDataverse ); - } - - return retVal; - } - - public Set assignmentsFor( DataverseUser u, DvObject d ) { - Set assignments = new HashSet<>(); - while ( d!=null ) { - assignments.addAll( roleService.directRoleAssignments(u, d) ); - if ( d instanceof Dataverse && ((Dataverse)d).isEffectivlyPermissionRoot() ) { - return assignments; - } else { - d = d.getOwner(); - } - } - - return assignments; - } - - /** - * For commands with no named dataverses, this allows a quick check whether - * a user can issue the command on the dataverse or not. - * @param u - * @param commandClass - * @param dvo - * @return - */ - public boolean isUserAllowedOn( DataverseUser u, Class commandClass, DvObject dvo ) { - Map> required = CH.permissionsRequired(commandClass); - if ( required.isEmpty() || required.get("")==null ) { + public boolean canIssueCommand(String commandName) throws ClassNotFoundException { + return isUserAllowedOn(user, + (Class) Class.forName("edu.harvard.iq.dataverse.engine.command.impl." + commandName), subject); + } + + public Set get() { + return permissionsFor(user, subject); + } + + public boolean has(Permission p) { + return get().contains(p); + } + + public boolean has(String pName) { + return get().contains(Permission.valueOf(pName)); + } + + } + + public List assignmentsOn(DvObject d) { + return em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class) + .setParameter("definitionPointId", d.getId()).getResultList(); + } + + public Set permissionsFor(DataverseUser u, DvObject d) { + Set retVal = EnumSet.noneOf(Permission.class); + for (RoleAssignment asmnt : roleService.assignmentsFor(u, d)) { + retVal.addAll(asmnt.getRole().permissions()); + } + + // special case - All registered users can add to the root dv (no owner) + // or if alias ends in "_open" + if (d instanceof Dataverse) { + Dataverse dv = (Dataverse) d; + if ((dv.getOwner() == null || dv.getAlias().endsWith("_open")) && (!u.isGuest())) { + // TODO when groups arrive, this has to go. + retVal.add(Permission.UndoableEdit); + retVal.add(Permission.AddDataset); + retVal.add(Permission.AddDataverse); + } + } + + return retVal; + } + + public Set assignmentsFor(DataverseUser u, DvObject d) { + Set assignments = new HashSet<>(); + while (d != null) { + assignments.addAll(roleService.directRoleAssignments(u, d)); + if (d instanceof Dataverse && ((Dataverse) d).isEffectivlyPermissionRoot()) { + return assignments; + } else { + d = d.getOwner(); + } + } + + return assignments; + } + + /** + * For commands with no named dataverses, this allows a quick check whether + * a user can issue the command on the dataverse or not. + * + * @param u + * @param commandClass + * @param dvo + * @return + */ + public boolean isUserAllowedOn(DataverseUser u, Class commandClass, DvObject dvo) { + Map> required = CH.permissionsRequired(commandClass); + if (required.isEmpty() || required.get("") == null) { logger.info("IsUserAllowedOn: empty-true"); - return true; - } else { - Set grantedUserPermissions = permissionsFor(u, dvo); - Set requiredPermissionSet = required.get(""); - return grantedUserPermissions.containsAll(requiredPermissionSet); - } - } - - public PermissionQuery userOn( DataverseUser u, DvObject d ) { - if ( u==null ) { - // get guest user for dataverse d - u = userService.findByUserName("GabbiGuest"); - } - return new PermissionQuery(u, d); - } - - public PermissionQuery on( DvObject d ) { - if ( d == null ) { - throw new IllegalArgumentException("Cannot query permissions on a null DvObject"); - } - if ( d.getId() == null ) { - throw new IllegalArgumentException("Cannot query permissions on a DvObject with a null id."); - } - return userOn( session.getUser(), d ); - } - + return true; + } else { + Set grantedUserPermissions = permissionsFor(u, dvo); + Set requiredPermissionSet = required.get(""); + return grantedUserPermissions.containsAll(requiredPermissionSet); + } + } + + public PermissionQuery userOn(DataverseUser u, DvObject d) { + if (u == null) { + // get guest user for dataverse d + u = userService.findByUserName("GabbiGuest"); + } + return new PermissionQuery(u, d); + } + + public PermissionQuery on(DvObject d) { + if (d == null) { + throw new IllegalArgumentException("Cannot query permissions on a null DvObject"); + } + if (d.getId() == null) { + throw new IllegalArgumentException("Cannot query permissions on a DvObject with a null id."); + } + return userOn(session.getUser(), d); + } + } From d21851814675792278d517dbb757ec50f6772978 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Thu, 8 May 2014 14:46:56 -0400 Subject: [PATCH 12/19] Change to the thumbnail converter - will enforce the size of the thumbnail on the *longest* size, not always on width. --- .../dataaccess/ImageThumbConverter.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java index 1896f82c647..1a3e2cc06d8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java @@ -147,15 +147,34 @@ public static String generateImageThumb(String fileLocation, int size) { return null; } - double scaleFactor = ((double) size) / (double) fullSizeImage.getWidth(null); - int thumbHeight = (int) (fullSizeImage.getHeight(null) * scaleFactor); + int width = fullSizeImage.getWidth(null); + int height = fullSizeImage.getHeight(null); + + logger.info("image dimensions: "+width+"x"+height); + + double scaleFactor = 0.0; + int thumbHeight = size; + int thumbWidth = size; + + if (width > height) { + scaleFactor = ((double) size) / (double) width; + thumbHeight = (int) (height * scaleFactor); + } else { + scaleFactor = ((double) size) / (double) height; + thumbWidth = (int) (width * scaleFactor); + } + + logger.info("scale factor: "+scaleFactor); + logger.info("thumbnail dimensions: "+thumbWidth+"x"+thumbHeight); + + // We are willing to spend a few extra CPU cycles to generate // better-looking thumbnails, hence the SCALE_SMOOTH flag. // SCALE_FAST would trade quality for speed. //logger.info("Start image rescaling ("+size+" pixels), SCALE_FAST used;"); - java.awt.Image thumbImage = fullSizeImage.getScaledInstance(size, thumbHeight, java.awt.Image.SCALE_FAST); + java.awt.Image thumbImage = fullSizeImage.getScaledInstance(thumbWidth, thumbHeight, java.awt.Image.SCALE_FAST); //logger.info("Finished image rescaling."); ImageWriter writer = null; @@ -166,7 +185,7 @@ public static String generateImageThumb(String fileLocation, int size) { return null; } - BufferedImage lowRes = new BufferedImage(size, thumbHeight, BufferedImage.TYPE_INT_RGB); + BufferedImage lowRes = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB); lowRes.getGraphics().drawImage(thumbImage, 0, 0, null); ImageOutputStream ios = ImageIO.createImageOutputStream(new File(thumbFileLocation)); From 3caa9c1ce2d8e4f0e89e2da580fe791b5d70e37c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 14:53:50 -0400 Subject: [PATCH 13/19] highlight on the file type #3745 --- src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java index 9cbfeb3e905..22622ffc569 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java @@ -96,6 +96,7 @@ public SolrQueryResponse search(DataverseUser dataverseUser, Dataverse dataverse solrFieldsToHightlightOnMap.put(SearchFields.DESCRIPTION, "Description"); solrFieldsToHightlightOnMap.put(SearchFields.VARIABLE_NAME, "Variable Name"); solrFieldsToHightlightOnMap.put(SearchFields.VARIABLE_LABEL, "Variable Label"); + solrFieldsToHightlightOnMap.put(SearchFields.FILE_TYPE_SEARCHABLE, "File Type"); /** * @todo: show highlight on file card? * https://redmine.hmdc.harvard.edu/issues/3848 From 187e7e9230fa58e6f74b97c821a288d3045b1e1d Mon Sep 17 00:00:00 2001 From: mheppler Date: Thu, 8 May 2014 14:59:13 -0400 Subject: [PATCH 14/19] Applied fixed width and height to popovers to fix layout issue in Chrome for the data file image previews. Adjusted alignment of the publish status labels in the header, dataset pg, results table. --- src/main/webapp/dataset.xhtml | 3 +-- src/main/webapp/dataverse_header.xhtml | 2 +- src/main/webapp/resources/css/structure.css | 6 ++++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 0e6ffa30c4c..6e734695802 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -281,12 +281,11 @@ - + - diff --git a/src/main/webapp/dataverse_header.xhtml b/src/main/webapp/dataverse_header.xhtml index 76a2480e2c1..927867d7413 100644 --- a/src/main/webapp/dataverse_header.xhtml +++ b/src/main/webapp/dataverse_header.xhtml @@ -129,7 +129,7 @@ diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index ef57a9c95c7..9a32ca6078a 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -52,6 +52,7 @@ button.btn.dropdown-toggle span.glyphicon {margin-right:.3em;} #dataverseHeader .dataverseHeaderCell {display:table-cell;} #dataverseHeader .dataverseHeaderLogo {text-align:center;} #dataverseHeader .dataverseHeaderName {padding:2em 1em;} +#dataverseHeader .dataverseHeaderName span.label.label-danger {vertical-align:text-top; line-height: normal; margin-left:1em;} #dataverseHeader .dataverseHeaderTagline {padding-left:2em; font-size:1.3em;} #dataverseHeader .dataverseHeaderLink {padding-left:2em;} @@ -108,7 +109,7 @@ table.ui-selectmanycheckbox.metadata-blocks-select label.ui-state-disabled {back span.search-term-match {font-weight: bold;} div[id$='resultsTable'] div.ui-datatable-tablewrapper table td > div {clear:left; margin-bottom: .5em;} -div[id$='resultsTable'] div.ui-datatable-tablewrapper table td > div > span.label {margin-left:.5em;} +div[id$='resultsTable'] div.ui-datatable-tablewrapper table td > div > span.label {vertical-align:text-top; line-height: normal; margin-left:.5em;} div[id$='resultsTable'] .resultDatasetCitationBlock {display:block;margin:4px 0 .5em 60px;background:#FCFCE2;padding:4px;} div[id$='resultsTable'] .resultDatasetCitationBlock span.search-term-match {font-weight: normal;} @@ -201,7 +202,8 @@ div.form-group .glyphicon.glyphicon-asterisk {font-size:.5em; vertical-align:tex .btn-sm.ui-button {padding: 5px 10px;} -#content div.popover {max-width: 600px;} +div.popover.fade.top.in {max-width: none;} +div.popover.fade.top.in div.popover-content {text-align:center; vertical-align: middle; display:table-cell; width:428px; height:418px;} div[id$="filesTable"] .ui-datatable-tablewrapper thead {display:none;} div[id$="versionsTable"] .ui-datatable-tablewrapper thead {display:none;} From b8f9d280f5c6f8faae8f00af1951f98753331231 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 8 May 2014 15:02:25 -0400 Subject: [PATCH 15/19] typo: s/variable_lable_en/variable_label_en/ --- src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java b/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java index de5164b381e..7069707b8cf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SearchFields.java @@ -103,6 +103,6 @@ public class SearchFields { public static final String DATASET_VERSION_ID = "dataset_version_id_l"; public static final String VARIABLE_NAME = "variable_name_en"; - public static final String VARIABLE_LABEL = "variable_lable_en"; + public static final String VARIABLE_LABEL = "variable_label_en"; } From a240dce41ea77d6d1d1c553eb05d44ba11048c31 Mon Sep 17 00:00:00 2001 From: Raman Prasad Date: Thu, 8 May 2014 15:14:43 -0400 Subject: [PATCH 16/19] Add javascript rebinding for file upload and then cancel. Bug #3942 --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 94411d6e04c..0b480d68345 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -253,7 +253,7 @@ + fileUploadListener="#{DatasetPage.handleFileUpload}" process="filesTable" update="filesTable" label="Select Files to Add" oncomplete="javascript:bind_bsui_components();"/>