Compare commits

...

82 Commits

Author SHA1 Message Date
Tim Donohue
3917c341f6 [maven-release-plugin] prepare release dspace-4.3 2015-02-24 16:46:02 -06:00
Tim Donohue
d4c494f3ef Backport upgrade to m-release-plugin and oss-parent 2015-02-24 16:30:10 -06:00
Tim Donohue
d47b37bcec Merge pull request #871 from tdonohue/dspace-4_x
Backport Travis CI enhancements to 4.x branch
2015-02-24 11:03:46 -06:00
Tim Donohue
8ec62aa6a1 Backport redirect test output to file option. 2015-02-24 15:29:43 +00:00
Tim Donohue
9fd39f23a1 Backport fix to MetadataSchemaTest to support running tests in any order. Travis is failing on this test in dspace-4_x branch 2015-02-23 21:56:59 +00:00
Tim Donohue
6909d7e11e Backport Travis CI settings (and necessary build configs) from master to dspace-4_x.Fix build issues on 'master'. 2015-02-23 21:08:43 +00:00
Tim Donohue
f76481a521 Merge pull request #868 from lap82/DS-2044-v4
[DS-2044] HTML not stripped from Discovery search form in JSPUI (backport to 4.x)
2015-02-23 14:30:34 -06:00
Tim Donohue
5e7aabec8a DS-2448 - Fix for JSPUI path traversal issue from Pascal-Nicolas Becker 2015-02-20 22:39:22 +00:00
Luigi Andrea Pascarelli
d81e5d7078 [DS-2044] fix cross-site scripting vulnerability and other minor fix related (verbose error output, avoid NPE on JSP during an attack) 2015-02-20 22:46:48 +01:00
Tim Donohue
440cd3868d Add in missing imports from previous commit 2015-02-20 20:22:37 +00:00
Luigi Andrea Pascarelli
7172f86038 DS-1702 add code to prevent XSS attach on recent submission 2015-02-20 20:22:21 +00:00
Tim Donohue
a15980b085 XMLUI path bug fixes and security fixes for DS-2445 DS-2130 DS-1896 2015-02-20 17:35:03 +00:00
bill
05d92f593a DS-2355 uncaught NPE resulting in loss of statistic 2014-12-11 15:17:26 +01:00
Terry Brady
431b13d65d DS-2027 Update bitstream-ordering.js
https://jira.duraspace.org/browse/DS-2027

There is a bad JQuery selector in the following code. This causes a submit to take place each time an up or down arrow is clicked. It is difficult to see the error in the javascript console because the submit takes place immediately.

Due to the page refresh delay, this is confusing to users when a large number of bitstreams are present.

Note that "$^=" is not a valid selector.

http://api.jquery.com/category/selectors/
2014-10-31 15:43:07 +01:00
Roeland Dillen
c023cf3cc9 DS-2229 Log user agent if no location can be determined (ie always) 2014-10-29 14:14:00 +01:00
aroman
1640ce1505 DS-2193 Correct browsing for exact metadata 2014-10-21 13:22:48 +02:00
Tim Donohue
d48fd500f4 Fix DS-2068 Tell Travis CI to retry a failed build 2014-07-18 19:21:40 +00:00
Robin Taylor
352f0d1bae [maven-release-plugin] prepare for next development iteration 2014-07-18 15:34:32 +01:00
Robin Taylor
2f75666273 [maven-release-plugin] prepare release dspace-4.2 2014-07-18 15:34:29 +01:00
Robin Taylor
69bdbac430 Increase memory allocation for javadoc plugin 2014-07-18 15:19:20 +01:00
Tim Donohue
b55ad8a53d Merge pull request #574 from tdonohue/DS-1928
Backporting fix for DS-1928 in PR#493 to DSpace 4.x
2014-07-17 16:32:31 -05:00
Tim Donohue
8fd038334e Backporting fix for DS-1928 in PR#493 to DSpace 4.x 2014-07-17 17:01:56 +00:00
Mark H. Wood
f23efa460d [DS-1718] Add config parameter webui.submit.upload.ajax to dspace.cfg?
Just document it in dspace.cfg, with commented example.
2014-07-17 09:54:01 -04:00
Bram Luyten
e7f6316bc6 Merge pull request #573 from bram-atmire/dspace-4_x
[DS-1958] Discovery OutOfMemoryError when indexing Large Bitstreams
2014-07-17 08:56:25 +02:00
KevinVdV
3ad061dbf4 [DS-1958] Discovery OutOfMemoryError when indexing Large Bitstreams 2014-07-17 08:32:10 +02:00
Thomas Misilo
83cd5a19a7 DS-1947: Remove reference to missing file
The missing file, seems to be an Institution specific file.

The missing file in question m-tweaks.js
2014-07-16 18:19:11 +00:00
Antoine Snyers
c8209642c0 [DS-2035] fixes: dim crosswalk is missing values for metadatafields with more than one value for the same language 2014-07-16 18:01:09 +00:00
Tim Donohue
1f25e46714 Merge pull request #567 from peterdietz/rest4x
(For 4.x branch) DS-1986 REST to use new context for each request
2014-07-16 09:27:17 -05:00
Bram Luyten
55ec14a0c7 Merge pull request #569 from bram-atmire/dspace-4_x
[DS-2060] Extended SOLR commit duration due to SpellCheckComponent ("Did you mean")
2014-07-13 16:57:18 +02:00
KevinVdV
a7f453b55a [DS-2060] Extended SOLR commit duration due to SpellCheckComponent ("Did you mean") 2014-07-13 16:55:37 +02:00
Peter Dietz
3b869eb465 DS-1986 Get new context each time, close in finally, for all REST methods 2014-07-10 14:22:35 -04:00
Peter Dietz
9eba21e188 Close context at end of REST request to community
- Following advice from Richard Rodgers at OR14
2014-07-10 14:22:24 -04:00
Peter Dietz
36d272ce75 remove html output from rest 2014-07-10 14:22:13 -04:00
Bram Luyten
c7dacc226f Merge pull request #565 from bram-atmire/dspace-4_x
DS-2038 Oracle DB Script minor error
2014-07-09 22:25:46 +02:00
Bram Luyten
aa48136add DS-2038 Oracle DB Script minor error 2014-07-09 22:14:21 +02:00
Mark H. Wood
92c2e5e304 Fix a few typo.s. 2014-07-09 16:01:11 -04:00
Tim Donohue
62a8ee96a6 Merge pull request #501 from helix84/DS-1919-jspui-empty-filterquery-dspace-4_x
DS-1919 Solr Search Empty FilterQuery bug (dspace-4_x backport)
2014-07-09 14:38:18 -05:00
rradillen
5bf9584a65 DS-1957 xml workflow script incorrect for oracle 2014-07-09 10:56:31 -04:00
Pascal-Nicolas Becker
bd11bd6aa7 Reconvert shibboleth attribute only if it is neither null nor empty. 2014-07-03 14:57:21 -05:00
Pascal-Nicolas Becker
ab45683d7a DS-1906: Adds configurable option to reconvert shibboleth attributes. 2014-07-03 14:57:01 -05:00
Denis Fdz
e324c2745a DS-2013 implement ItemDAOOracle to fix thumbnails in browse 2014-06-05 14:00:11 -04:00
Panagiotis Koutsourakis
d8d3367483 Updated bte dependence to v0.9.2.4
See the relevant discussion here: https://jira.duraspace.org/browse/DS-1971
2014-06-03 22:09:55 +00:00
Mark H. Wood
c71594f53e [DS-1961] Use HTTPS with oss.sonatype.org repository 2014-05-29 16:26:31 -04:00
Mark H. Wood
7433eda1fc Language Selection _ Turkish Option 2014-05-29 15:26:07 -04:00
Mini
2ca1828348 DS-1958 Fix SolrLogger Memory Error 2014-05-22 20:54:00 +02:00
Ivan Masár
83819fb986 DS-1998 fix the "dspace classpath" CLI command 2014-05-21 16:28:52 -04:00
keithgee
b2f1a98504 Update clean-database to drop additional tables
Updates clean-database.sql file to drop tables recently added to the
DSpace project:

-  webapp, webapp_seq
- requestitem, requestitem_seq;
2014-05-19 18:17:50 +02:00
Antoine Snyers
61ceee3990 [DS-1584] Fixes the broken the browse by "jump links" after changing browse index 2014-04-23 14:50:01 -05:00
rradillen
ef1cb4ee0f DS-1970 to many open files exception
when update lucene index
2014-04-15 17:54:27 +00:00
Mark H. Wood
0cd0882c7c Merge pull request #465 from mwoodiupui/DS-1411
[DS-1411] uncaught NPE in stats-log-converter -m
2014-03-26 16:50:43 -04:00
Hardy Pottinger
a821384f82 [DS-1944] remove extra close paren
Duplicate of SHA ca8b693, made manually via the GitHub edit screen.
2014-03-12 15:41:48 -05:00
Mark H. Wood
99adcad460 [DS-1946] Solr floods catalina.out with unwanted messages
https://jira.duraspace.org/browse/DS-1946
2014-03-12 16:34:58 -04:00
Tim Donohue
64823636dd Fix for DS-1940. Windows doesn't like the "/*" in an Ant target name. 2014-03-10 18:44:47 +01:00
Denis Fdz
093f0c77df DS-1919 Solr Search Empty FilterQuery bug (dspace-4_x backport) 2014-03-07 00:25:27 +01:00
Mark H. Wood
76913611ec [maven-release-plugin] prepare for next development iteration 2014-03-03 09:33:43 -05:00
Mark H. Wood
6d9fd03748 [maven-release-plugin] prepare release dspace-4.1 2014-03-03 09:33:40 -05:00
Mark H. Wood
d721abbadd Merge pull request #491 from mwoodiupui/dspace-4_x
[DS-1750] Remove DSpace manual PDF from the source kit.
2014-02-28 16:05:54 -05:00
Mark H. Wood
448853bc90 Don't assemble docs directory that no longer exists 2014-02-26 16:35:33 -05:00
Mark H. Wood
f89cd7f85d [DS-1750] README refers to defunct PDF 2014-02-26 16:30:17 -05:00
Mark H. Wood
52cb291405 [DS-1750] Remove DSpace manual PDF from the source kit. 2014-02-26 16:12:12 -05:00
Mark H. Wood
004a8d8ffc Merge pull request #490 from mwoodiupui/dspace-4_x
[DS-1795] When run command dspace "dspace stat-initial"
2014-02-26 14:22:09 -05:00
Mark H. Wood
bb6f4fccb8 Constrain the subquery to 'dc' fields 2014-02-26 14:18:30 -05:00
Andrea Schweer
be9af85d41 DS-1907 Hit highlighting not working, no abstracts for search results 2014-02-21 17:06:28 +01:00
Ivan Masár
413561ee34 [maven-release-plugin] prepare for next development iteration
Doing the forgotten release step manually.
2014-02-21 17:05:56 +01:00
João Melo
7737b8b7db Solr Timezone Issue fixed 2014-02-21 14:21:45 +01:00
Kim Shepherd
f8f0468f86 [DS-1779] - Pagination link error in JSPUI discovery search 2014-02-21 10:40:02 +13:00
Ivan Masár
05657285a2 DS-1863 JSPUI eperson and group selection should use the new theme 2014-02-20 12:19:10 +01:00
Luigi Andrea Pascarelli
bf071dd936 Merge pull request #479 from lap82/dspace-4_x-DS-1918
[DS-1918] added size for URL column
2014-02-18 23:29:02 +01:00
Pascarelli Luigi Andrea
ae53e55150 DS-1918 added size for URL column 2014-02-18 22:55:55 +01:00
Ivan Masár
7832842e35 DS-1916 Error in update-sequence script in 4.0 2014-02-18 15:18:34 +01:00
KevinVdV
de2e782553 [DS-1848] OAI harvest issues when starting from control panel/command line 2014-02-18 10:19:02 +01:00
KevinVdV
6871833bf3 [DS-1834] Collection content source harvesting test does not check sets properly 2014-02-18 10:18:56 +01:00
KevinVdV
b91bff4fbd [DS-1834] Collection content source harvesting test does not check sets properly 2014-02-17 15:23:42 +01:00
Marsa Haoua
b13bc58c47 Fixes DS-1860 to show all collections and communities in community list. 2014-02-17 14:59:08 +01:00
KevinVdV
61255bfd24 [DS-1898] OAI not always closing contexts 2014-02-14 10:18:27 +01:00
Ivan Masár
d1c5df9699 DS-1821 Internationalize the bitstream access icon alt text 2014-02-07 09:45:06 +01:00
Mark H. Wood
7dcfdc39b6 Remove all traces of metadataStorageInfo.
The field is never set in SolrLogger, so getMetadataStorageInfo always
returns null.  Attempts to dereference the Map supposedly returned
should thus always terminate abruptly.
2014-02-05 16:55:59 -05:00
Mark H. Wood
5dc4f40321 Tidy up some warnings and hints 2014-02-05 16:55:59 -05:00
Àlex Magaz Graça
e26c2e49e6 DS-1536 having a DOT in handle prefix causes identifier.uri to be cut off when being created. 2014-02-05 16:40:23 -05:00
Mark H. Wood
c2bd2f03a0 [DS-1411] Handle multiple-file patterns (-m) in the current directory.
If there is not at least a relative path (dir/patt.ern) then
File.getParentFile() returns null.
2014-02-04 11:17:56 -05:00
Tim Donohue
b6f0d0006b Minor fixes for Checksum Checker Daily Report Emailer. Ensure it only sends an email if there's a possible issue. Also include DSpace hostname in email subject. 2014-01-31 22:01:28 +00:00
Panagiotis Koutsourakis
046d96c44a Change BTE version to 0.9.2.3 2014-01-31 16:22:45 +01:00
92 changed files with 1299 additions and 804 deletions

View File

@@ -1,2 +1,24 @@
language: java
script: "mvn clean package license:check -Dmaven.test.skip=false"
env:
# Give Maven 1GB of memory to work with
- MAVEN_OPTS=-Xmx1024M
# Skip install stage, as we'll do it below
install: "echo 'Skipping install stage, dependencies will be downloaded during build and test stages.'"
# Two stage Build and Test
# 1. Install & Unit Test APIs
# 2. Assemble DSpace
script:
# 1. [Install & Unit Test] Check source code licenses and run source code Unit Tests
# (This explicitly skips building the 'dspace' assembly module, since we only want to do that ONCE.)
# license:check => Validate all source code license headers
# -Dmaven.test.skip=false => Enable DSpace Unit Tests
# -P !dspace => SKIP full DSpace assembly (will do below)
# -B => Maven batch/non-interactive mode (recommended for CI)
# -V => Display Maven version info before build
- "mvn clean install license:check -Dmaven.test.skip=false -P !dspace -B -V"
# 2. [Assemble DSpace] Ensure overlay & assembly process works (from [src]/dspace/)
# -P !assembly => SKIP the actual building of [src]/dspace/dspace-installer (as it can be memory intensive)
- "cd dspace && mvn package -P !assembly -B -V"

7
README
View File

@@ -1,6 +1,9 @@
Installation instructions are included in this release package under
Installation instructions may be found in DSpace-Manual.pdf, offered
with the source archives in the SourceForge project:
- dspace/docs/DSpace-Manual.pdf
http://sourceforge.net/projects/dspace/files/DSpace%20Stable/VERSION/
(Replace "VERSION" with the version you are installing, such as "4.0".)
DSpace version information can be viewed online at
- https://wiki.duraspace.org/display/DSDOC/

View File

@@ -12,7 +12,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>
@@ -436,12 +436,12 @@
<dependency>
<groupId>gr.ekt.bte</groupId>
<artifactId>bte-core</artifactId>
<version>0.9.3.3</version>
<version>0.9.2.4</version>
</dependency>
<dependency>
<groupId>gr.ekt.bte</groupId>
<artifactId>bte-io</artifactId>
<version>0.9.3.3</version>
<version>0.9.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
@@ -463,6 +463,21 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-cell</artifactId>
<version>${solr.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>

View File

@@ -7,6 +7,7 @@
*/
package org.dspace.app.statistics;
import org.dspace.content.MetadataSchema;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
@@ -153,10 +154,10 @@ public class LogAnalyser
private static Pattern logRegex = null;
/** pattern to match commented out lines from the config file */
private static Pattern comment = Pattern.compile("^#");
private static final Pattern comment = Pattern.compile("^#");
/** pattern to match genuine lines from the config file */
private static Pattern real = Pattern.compile("^(.+)=(.+)");
private static final Pattern real = Pattern.compile("^(.+)=(.+)");
/** pattern to match all search types */
private static Pattern typeRX = null;
@@ -1165,8 +1166,12 @@ public class LogAnalyser
"AND metadata_field_id = (" +
" SELECT metadata_field_id " +
" FROM metadatafieldregistry " +
" WHERE element = 'type' " +
" AND qualifier IS NULL) ";
" WHERE metadata_schema_id = (" +
" SELECT metadata_schema_id" +
" FROM MetadataSchemaRegistry" +
" WHERE short_id = '" + MetadataSchema.DC_SCHEMA + "')" +
" AND element = 'type' " +
" AND qualifier IS NULL) ";
}
// start the date constraint query buffer
@@ -1184,8 +1189,12 @@ public class LogAnalyser
"WHERE metadata_field_id = (" +
" SELECT metadata_field_id " +
" FROM metadatafieldregistry " +
" WHERE element = 'date' " +
" AND qualifier = 'accessioned') ");
" WHERE metadata_schema_id = (" +
" SELECT metadata_schema_id" +
" FROM MetadataSchemaRegistry" +
" WHERE short_id = '" + MetadataSchema.DC_SCHEMA + "')" +
" AND element = 'date' " +
" AND qualifier = 'accessioned') ");
// Verifies that the metadata contains a valid date, otherwise the
// postgres queries blow up when doing the ::timestamp cast.

View File

@@ -26,6 +26,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import javax.servlet.http.HttpServletResponse;
@@ -1094,6 +1095,22 @@ public class ShibAuthentication implements AuthenticationMethod
value = request.getHeader(name.toLowerCase());
if (StringUtils.isEmpty(value))
value = request.getHeader(name.toUpperCase());
boolean reconvertAttributes =
ConfigurationManager.getBooleanProperty(
"authentication-shibboleth",
"reconvert.attributes",
false);
if (!StringUtils.isEmpty(value) && reconvertAttributes)
{
try {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException ex) {
log.warn("Failed to reconvert shibboleth attribute ("
+ name + ").", ex);
}
}
return value;
}

View File

@@ -31,7 +31,8 @@ import org.dspace.utils.DSpace;
/**
*
* @author Andrea Bollini (CILEA)
*
* @author Adán Román Ruiz at arvo.es (bugfix)
*
*/
public class SolrBrowseDAO implements BrowseDAO
{
@@ -337,11 +338,11 @@ public class SolrBrowseDAO implements BrowseDAO
query.addFilterQueries("search.resourcetype:" + Constants.ITEM);
if (isAscending)
{
query.setQuery("bi_"+column + "_sort" + ": [* TO \"" + value + "\"]");
query.setQuery("bi_"+column + "_sort" + ": [* TO \"" + value + "\"}");
}
else
{
query.setQuery("bi_" + column + "_sort" + ": [\"" + value + "\" TO *]");
query.setQuery("bi_" + column + "_sort" + ": {\"" + value + "\" TO *]");
}
DiscoverResult resp = null;
try

View File

@@ -65,12 +65,16 @@ public class DailyReportEmailer
public void sendReport(File attachment, int numberOfBitstreams)
throws IOException, javax.mail.MessagingException
{
Email email = new Email();
email.setSubject("Checksum checker Report - " + numberOfBitstreams + " Bitstreams found with POSSIBLE issues");
email.setContent("report is attached ...");
email.addAttachment(attachment, "checksum_checker_report.txt");
email.addRecipient(ConfigurationManager.getProperty("mail.admin"));
email.send();
if(numberOfBitstreams > 0)
{
String hostname = ConfigurationManager.getProperty("dspace.hostname");
Email email = new Email();
email.setSubject("Checksum checker Report - " + numberOfBitstreams + " Bitstreams found with POSSIBLE issues on " + hostname);
email.setContent("report is attached ...");
email.addAttachment(attachment, "checksum_checker_report.txt");
email.addRecipient(ConfigurationManager.getProperty("mail.admin"));
email.send();
}
}
/**

View File

@@ -9,25 +9,107 @@ package org.dspace.content.dao;
import org.dspace.core.Context;
import org.dspace.content.Bitstream;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.storage.rdbms.TableRow;
import java.sql.SQLException;
public class ItemDAOOracle extends ItemDAO
{
{
private static final String selectPrimaryBitstreamID =
"SELECT bundle.primary_bitstream_id FROM item2bundle, bundle " +
"WHERE item2bundle.item_id=? AND item2bundle.bundle_id=bundle.bundle_id AND bundle.name=?";
private static final String selectFirstBitstreamID =
"SELECT bundle2bitstream.bitstream_id FROM item2bundle, bundle, bundle2bitstream " +
"WHERE item2bundle.item_id=? AND item2bundle.bundle_id=bundle.bundle_id AND bundle.name=? " +
"AND bundle.bundle_id=bundle2bitstream.bundle_id";
private static final String selectNamedBitstreamID =
"SELECT bitstream.bitstream_id FROM item2bundle, bundle, bundle2bitstream, bitstream " +
"WHERE item2bundle.item_id=? AND item2bundle.bundle_id=bundle.bundle_id AND bundle.name=? " +
"AND bundle.bundle_id=bundle2bitstream.bundle_id AND bundle2bitstream.bitstream_id=bitstream.bitstream_id " +
"AND bitstream.name=?";
ItemDAOOracle(Context ctx)
{
super(ctx);
}
public Bitstream getPrimaryBitstream(int itemId, String bundleName) throws SQLException {
return null; //To change body of implemented methods use File | Settings | File Templates.
public Bitstream getPrimaryBitstream(int itemId, String bundleName) throws SQLException
{
TableRowIterator tri = null;
try
{
tri = DatabaseManager.query(context, selectPrimaryBitstreamID, itemId, bundleName);
if (tri.hasNext())
{
TableRow row = tri.next();
int bid = row.getIntColumn("primary_bitstream_id");
return Bitstream.find(context, bid);
}
}
finally
{
if (tri != null)
{
tri.close();
}
}
return null;
}
public Bitstream getFirstBitstream(int itemId, String bundleName) throws SQLException {
return null; //To change body of implemented methods use File | Settings | File Templates.
public Bitstream getFirstBitstream(int itemId, String bundleName) throws SQLException
{
TableRowIterator tri = null;
try
{
tri = DatabaseManager.query(context, selectFirstBitstreamID, itemId, bundleName);
if (tri.hasNext())
{
TableRow row = tri.next();
int bid = row.getIntColumn("bitstream_id");
return Bitstream.find(context, bid);
}
}
finally
{
if (tri != null)
{
tri.close();
}
}
return null;
}
public Bitstream getNamedBitstream(int itemId, String bundleName, String fileName) throws SQLException {
return null; //To change body of implemented methods use File | Settings | File Templates.
public Bitstream getNamedBitstream(int itemId, String bundleName, String fileName) throws SQLException
{
TableRowIterator tri = null;
try
{
tri = DatabaseManager.query(context, selectNamedBitstreamID, itemId, bundleName, fileName);
if (tri.hasNext())
{
TableRow row = tri.next();
int bid = row.getIntColumn("bitstream_id");
return Bitstream.find(context, bid);
}
}
finally
{
if (tri != null)
{
tri.close();
}
}
return null;
}
}

View File

@@ -0,0 +1,73 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.discovery;
import org.apache.log4j.Logger;
import org.apache.solr.common.util.ContentStreamBase;
import org.dspace.content.Bitstream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
/**
* Construct a <code>ContentStream</code> from a <code>File</code>
*/
public class BitstreamContentStream extends ContentStreamBase
{
private static final Logger log = Logger.getLogger(BitstreamContentStream.class);
private final Bitstream file;
public BitstreamContentStream( Bitstream f ) {
file = f;
contentType = f.getFormat().getMIMEType();
name = file.getName();
size = file.getSize();
sourceInfo = file.getName();
}
@Override
public String getContentType() {
if(contentType==null) {
InputStream stream = null;
try {
stream = file.retrieve();
char first = (char)stream.read();
if(first == '<') {
return "application/xml";
}
if(first == '{') {
return "application/json";
}
} catch(Exception ex) {
log.error("Error determining content type for bitstream:" + file.getID(), ex);
} finally {
if (stream != null) try {
stream.close();
} catch (IOException ioe) {
log.error("Error closing stream:" + file.getID(), ioe);
}
}
}
return contentType;
}
@Override
public InputStream getStream() throws IOException {
try {
return file.retrieve();
} catch (Exception e) {
log.error(e.getMessage(),e);
return new ByteArrayInputStream(e.getMessage().getBytes(StandardCharsets.UTF_8));
}
}
}

View File

@@ -66,6 +66,10 @@ public class IndexClient {
"(re)build index, wiping out current one if it exists").create(
"b"));
options.addOption(OptionBuilder.isRequired(false).withDescription(
"Rebuild the spellchecker, can be combined with -b and -f.").create(
"s"));
options
.addOption(OptionBuilder
.isRequired(false)
@@ -111,15 +115,32 @@ public class IndexClient {
} else if (line.hasOption("b")) {
log.info("(Re)building index from scratch.");
indexer.createIndex(context);
checkRebuildSpellCheck(line, indexer);
} else if (line.hasOption("o")) {
log.info("Optimizing search core.");
indexer.optimize();
} else if(line.hasOption('s')) {
checkRebuildSpellCheck(line, indexer);
} else {
log.info("Updating and Cleaning Index");
indexer.cleanIndex(line.hasOption("f"));
indexer.updateIndex(context, line.hasOption("f"));
checkRebuildSpellCheck(line, indexer);
}
log.info("Done with indexing");
}
/**
* Check the command line options and rebuild the spell check if active.
* @param line the command line options
* @param indexer the solr indexer
* @throws SearchServiceException in case of a solr exception
*/
protected static void checkRebuildSpellCheck(CommandLine line, IndexingService indexer) throws SearchServiceException {
if (line.hasOption("s")) {
log.info("Rebuilding spell checker.");
indexer.buildSpellCheck();
}
}
}

View File

@@ -7,6 +7,7 @@
*/
package org.dspace.discovery;
import org.apache.solr.client.solrj.SolrServerException;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
@@ -58,4 +59,6 @@ public interface IndexingService {
void commit() throws SearchServiceException;
void optimize() throws SearchServiceException;
void buildSpellCheck() throws SearchServiceException;
}

View File

@@ -7,12 +7,7 @@
*/
package org.dspace.discovery;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.SQLException;
@@ -31,7 +26,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.Vector;
import org.apache.commons.collections.CollectionUtils;
@@ -39,7 +33,6 @@ import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
@@ -53,6 +46,8 @@ import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.util.ClientUtils;
@@ -61,6 +56,7 @@ import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.*;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.handler.extraction.ExtractingParams;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Collection;
@@ -148,7 +144,7 @@ public class SolrServiceImpl implements SearchService, IndexingService {
solr = new HttpSolrServer(solrService);
solr.setBaseURL(solrService);
solr.setUseMultiPartPost(true);
SolrQuery solrQuery = new SolrQuery()
.setQuery("search.resourcetype:2 AND search.resourceid:1");
@@ -504,11 +500,11 @@ public class SolrServiceImpl implements SearchService, IndexingService {
return;
}
long start = System.currentTimeMillis();
System.out.println("SOLR Search Optimize -- Process Started:"+start);
System.out.println("SOLR Search Optimize -- Process Started:" + start);
getSolr().optimize();
long finish = System.currentTimeMillis();
System.out.println("SOLR Search Optimize -- Process Finished:"+finish);
System.out.println("SOLR Search Optimize -- Total time taken:"+(finish-start) + " (ms).");
System.out.println("SOLR Search Optimize -- Process Finished:" + finish);
System.out.println("SOLR Search Optimize -- Total time taken:" + (finish - start) + " (ms).");
} catch (SolrServerException sse)
{
System.err.println(sse.getMessage());
@@ -518,6 +514,23 @@ public class SolrServiceImpl implements SearchService, IndexingService {
}
}
public void buildSpellCheck() throws SearchServiceException {
try {
if (getSolr() == null) {
return;
}
SolrQuery solrQuery = new SolrQuery();
solrQuery.set("spellcheck", true);
solrQuery.set(SpellingParams.SPELLCHECK_BUILD, true);
getSolr().query(solrQuery);
}catch (SolrServerException e)
{
//Make sure to also log the exception since this command is usually run from a crontab.
log.error(e, e);
throw new SearchServiceException(e);
}
}
// //////////////////////////////////
// Private
// //////////////////////////////////
@@ -666,15 +679,47 @@ public class SolrServiceImpl implements SearchService, IndexingService {
/**
* Write the document to the index under the appropriate handle.
*
* @param doc the solr document to be written to the server
* @param streams
* @throws IOException IO exception
*/
protected void writeDocument(SolrInputDocument doc) throws IOException {
protected void writeDocument(SolrInputDocument doc, List<BitstreamContentStream> streams) throws IOException {
try {
if(getSolr() != null)
{
getSolr().add(doc);
if(CollectionUtils.isNotEmpty(streams))
{
ContentStreamUpdateRequest req = new ContentStreamUpdateRequest("/update/extract");
for(BitstreamContentStream bce : streams)
{
req.addContentStream(bce);
}
ModifiableSolrParams params = new ModifiableSolrParams();
//req.setParam(ExtractingParams.EXTRACT_ONLY, "true");
for(String name : doc.getFieldNames())
{
for(Object val : doc.getFieldValues(name))
{
params.add(ExtractingParams.LITERALS_PREFIX + name,val.toString());
}
}
req.setParams(params);
req.setParam(ExtractingParams.UNKNOWN_FIELD_PREFIX, "attr_");
req.setParam(ExtractingParams.MAP_PREFIX + "content", "fulltext");
req.setParam(ExtractingParams.EXTRACT_FORMAT, "text");
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
req.process(getSolr());
}
else
{
getSolr().add(doc);
}
}
} catch (SolrServerException e)
{
@@ -727,7 +772,7 @@ public class SolrServiceImpl implements SearchService, IndexingService {
solrServiceIndexPlugin.additionalIndex(context, community, doc);
}
writeDocument(doc);
writeDocument(doc, null);
}
/**
@@ -783,7 +828,7 @@ public class SolrServiceImpl implements SearchService, IndexingService {
solrServiceIndexPlugin.additionalIndex(context, collection, doc);
}
writeDocument(doc);
writeDocument(doc, null);
}
/**
@@ -1300,7 +1345,8 @@ public class SolrServiceImpl implements SearchService, IndexingService {
log.debug(" Added Grouping");
Vector<InputStreamReader> readers = new Vector<InputStreamReader>();
List<BitstreamContentStream> streams = new ArrayList<BitstreamContentStream>();
try {
// now get full text of any bitstreams in the TEXT bundle
@@ -1318,18 +1364,8 @@ public class SolrServiceImpl implements SearchService, IndexingService {
for (Bitstream myBitstream : myBitstreams)
{
try {
InputStreamReader is = new InputStreamReader(
myBitstream.retrieve()); // get input
readers.add(is);
// Add each InputStream to the Indexed Document
String value = IOUtils.toString(is);
doc.addField("fulltext", value);
if(hitHighlightingFields.contains("*") || hitHighlightingFields.contains("fulltext"))
{
doc.addField("fulltext_hl", value);
}
streams.add(new BitstreamContentStream(myBitstream));
log.debug(" Added BitStream: "
+ myBitstream.getStoreNumber() + " "
@@ -1349,16 +1385,6 @@ public class SolrServiceImpl implements SearchService, IndexingService {
{
log.error(e.getMessage(), e);
}
finally {
Iterator<InputStreamReader> itr = readers.iterator();
while (itr.hasNext()) {
InputStreamReader reader = itr.next();
if (reader != null) {
reader.close();
}
}
log.debug("closed " + readers.size() + " readers");
}
//Do any additional indexing, depends on the plugins
List<SolrServiceIndexPlugin> solrServiceIndexPlugins = new DSpace().getServiceManager().getServicesByType(SolrServiceIndexPlugin.class);
@@ -1369,7 +1395,7 @@ public class SolrServiceImpl implements SearchService, IndexingService {
// write the index and close the inputstreamreaders
try {
writeDocument(doc);
writeDocument(doc, streams);
log.info("Wrote Item: " + handle + " to Index");
} catch (RuntimeException e)
{

View File

@@ -29,6 +29,7 @@ import java.util.TimeZone;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import ORG.oclc.oai.harvester2.verb.*;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
@@ -64,12 +65,6 @@ import org.jdom.input.DOMBuilder;
import org.jdom.output.XMLOutputter;
import org.xml.sax.SAXException;
import ORG.oclc.oai.harvester2.verb.GetRecord;
import ORG.oclc.oai.harvester2.verb.Identify;
import ORG.oclc.oai.harvester2.verb.ListMetadataFormats;
import ORG.oclc.oai.harvester2.verb.ListRecords;
import ORG.oclc.oai.harvester2.verb.ListSets;
/**
* This class handles OAI harvesting of externally located records into this repository.
@@ -369,7 +364,13 @@ public class OAIHarvester {
else {
listRecords = new ListRecords(oaiSource, resumptionToken);
}
targetCollection.update();
ourContext.turnOffAuthorisationSystem();
try {
targetCollection.update();
} finally {
//In case of an exception, make sure to restore our authentication state to the previous state
ourContext.restoreAuthSystemState();
}
ourContext.commit();
}
}
@@ -394,6 +395,7 @@ public class OAIHarvester {
}
finally {
harvestRow.update();
ourContext.turnOffAuthorisationSystem();
targetCollection.update();
ourContext.commit();
ourContext.restoreAuthSystemState();
@@ -954,29 +956,21 @@ public class OAIHarvester {
try {
//If we do not want to harvest from one set, then skip this.
if(!"all".equals(oaiSetId)){
ListSets ls = new ListSets(oaiSource);
ListIdentifiers ls = new ListIdentifiers(oaiSource, null, null, oaiSetId, DMDOAIPrefix);
// The only error we can really get here is "noSetHierarchy"
if (ls.getErrors() != null && ls.getErrors().getLength() > 0) {
for (int i=0; i<ls.getErrors().getLength(); i++) {
String errorCode = ls.getErrors().item(i).getAttributes().getNamedItem("code").getTextContent();
errorSet.add(errorCode);
errorSet.add(OAI_SET_ERROR + ": The OAI server does not have a set with the specified setSpec (" + errorCode + ")");
}
}
else {
// Drilling down to /OAI-PMH/ListSets/set
Document reply = db.build(ls.getDocument());
Element root = reply.getRootElement();
List<Element> sets= root.getChild("ListSets",OAI_NS).getChildren("set",OAI_NS);
for (Element set : sets)
{
String setSpec = set.getChildText("setSpec", OAI_NS);
if (setSpec.equals(oaiSetId)) {
foundSet = true;
break;
}
}
//Check if we can find items, if so this indicates that we have children and our sets exist
foundSet = 0 < root.getChild("ListIdentifiers",OAI_NS).getChildren().size();
if (!foundSet) {
errorSet.add(OAI_SET_ERROR + ": The OAI server does not have a set with the specified setSpec");

View File

@@ -545,7 +545,7 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider {
protected String getCanonical(Item item)
{
String canonical = item.getHandle();
if( canonical.lastIndexOf(DOT)!=-1)
if( canonical.matches(".*/.*\\.\\d+") && canonical.lastIndexOf(DOT)!=-1)
{
canonical = canonical.substring(0, canonical.lastIndexOf(DOT));
}
@@ -556,7 +556,7 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider {
protected String getCanonical(String identifier)
{
String canonical = identifier;
if( canonical.lastIndexOf(DOT)!=-1)
if( canonical.matches(".*/.*\\.\\d+") && canonical.lastIndexOf(DOT)!=-1)
{
canonical = canonical.substring(0, canonical.lastIndexOf(DOT));
}

View File

@@ -475,6 +475,9 @@ public class DSQuery
lastModified = reader.getVersion();
searcher = new IndexSearcher(reader);
} else {
reader.close();
searchDir.close();
}
return searcher;

View File

@@ -7,7 +7,6 @@
*/
package org.dspace.statistics;
import au.com.bytecode.opencsv.CSVParser;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
import com.maxmind.geoip.Location;
@@ -78,8 +77,6 @@ public class SolrLogger
private static final LookupService locationService;
private static Map<String, String> metadataStorageInfo;
private static final boolean useProxies;
private static List<String> statisticYearCores = new ArrayList<String>();
@@ -330,7 +327,10 @@ public class SolrLogger
log.error("Failed DNS Lookup for IP:" + ip);
log.debug(e.getMessage(),e);
}
if(request.getHeader("User-Agent") != null)
{
doc1.addField("userAgent", request.getHeader("User-Agent"));
}
// Save the location information if valid, save the event without
// location information if not valid
if(locationService != null)
@@ -356,10 +356,7 @@ public class SolrLogger
doc1.addField("longitude", location.longitude);
doc1.addField("isBot",isSpiderBot);
if(request.getHeader("User-Agent") != null)
{
doc1.addField("userAgent", request.getHeader("User-Agent"));
}
}
}
}
@@ -415,7 +412,10 @@ public class SolrLogger
log.error("Failed DNS Lookup for IP:" + ip);
log.debug(e.getMessage(),e);
}
if(userAgent != null)
{
doc1.addField("userAgent", userAgent);
}
// Save the location information if valid, save the event without
// location information if not valid
if(locationService != null)
@@ -441,10 +441,7 @@ public class SolrLogger
doc1.addField("longitude", location.longitude);
doc1.addField("isBot",isSpiderBot);
if(userAgent != null)
{
doc1.addField("userAgent", userAgent);
}
}
}
}
@@ -563,11 +560,6 @@ public class SolrLogger
}
public static Map<String, String> getMetadataStorageInfo()
{
return metadataStorageInfo;
}
/**
* Method just used to log the parents.
* <ul>
@@ -676,18 +668,6 @@ public class SolrLogger
// We have at least one document good
SolrDocument document = response.getResults().get(0);
for (Object storedField : metadataStorageInfo.keySet())
{
// For each of these fields that are stored we are to create a
// list of the values it holds now
java.util.Collection collection = document
.getFieldValues((String) storedField);
List<String> storedVals = new ArrayList<String>();
storedVals.addAll(collection);
// Now add it to our hashmap
currentValsStored.put((String) storedField, storedVals);
}
// System.out.println("HERE");
// Get the info we need
}

View File

@@ -37,6 +37,7 @@ public class StatisticsLoggingConsumer implements Consumer
private Set<String> toRemoveQueries = null;
@Override
public void initialize() throws Exception
{
@@ -45,6 +46,7 @@ public class StatisticsLoggingConsumer implements Consumer
// TODO: checkout whether moving of collections, communities and bitstreams works
// TODO: use async threaded consumer as this might require some processing time
// TODO: we might be able to improve the performance: changing the collection will trigger 4 update commands
@Override
public void consume(Context ctx, Event event) throws Exception
{
if (toRemoveQueries == null)
@@ -78,45 +80,9 @@ public class StatisticsLoggingConsumer implements Consumer
updateQuery, null, null);
// Get all the metadata
Map<String, String> metadataStorageInfo = SolrLogger.getMetadataStorageInfo();
List<String> storageFieldList = new ArrayList<String>();
List<List<Object>> storageValuesList = new ArrayList<List<Object>>();
for (Map.Entry<String, String> entry : metadataStorageInfo.entrySet())
{
String[] metadataFieldInfo = entry.getValue().split("\\.");
List<Object> values = new ArrayList<Object>();
List<Object> valuesLow = new ArrayList<Object>();
for (int i = 0; i < item.getMetadata(metadataFieldInfo[0],
metadataFieldInfo[1], metadataFieldInfo[2], Item.ANY).length; i++)
{
values.add(item.getMetadata(metadataFieldInfo[0],
metadataFieldInfo[1], metadataFieldInfo[2],
Item.ANY)[i].value);
valuesLow.add(item.getMetadata(metadataFieldInfo[0],
metadataFieldInfo[1], metadataFieldInfo[2],
Item.ANY)[i].value.toLowerCase());
}
List<String> indexedVals = indexedValues.get(entry.getKey());
boolean update = true;
if (values.size() == indexedVals.size() && values.containsAll(indexedVals))
{
update = false;
}
if (update)
{
storageFieldList.add(entry.getKey());
storageFieldList.add(entry.getKey() + "_search");
storageValuesList.add(values);
storageValuesList.add(valuesLow);
}
}
SolrLogger.update(updateQuery, "replace", storageFieldList,
storageValuesList);
@@ -202,6 +168,7 @@ public class StatisticsLoggingConsumer implements Consumer
findComms(comm.getParentCommunity(), parentComms);
}
@Override
public void end(Context ctx) throws Exception
{
if (toRemoveQueries != null)
@@ -215,6 +182,7 @@ public class StatisticsLoggingConsumer implements Consumer
toRemoveQueries = null;
}
@Override
public void finish(Context ctx) throws Exception
{
}

View File

@@ -33,10 +33,10 @@ import java.text.ParsePosition;
* @author Stuart Lewis
*/
public class ClassicDSpaceLogConverter {
private Logger log = Logger.getLogger(ClassicDSpaceLogConverter.class);
private final Logger log = Logger.getLogger(ClassicDSpaceLogConverter.class);
/** A DSpace context */
private Context context;
private final Context context;
/** Whether or not to provide verbose output */
private boolean verbose = false;
@@ -45,19 +45,19 @@ public class ClassicDSpaceLogConverter {
private boolean newEvents = false;
/** A regular expression for extracting the IP address from a log line */
private Pattern ipaddrPattern = Pattern.compile("ip_addr=(\\d*\\.\\d*\\.\\d*\\.\\d*):");
private final Pattern ipaddrPattern = Pattern.compile("ip_addr=(\\d*\\.\\d*\\.\\d*\\.\\d*):");
/** Date format (in) from the log line */
private SimpleDateFormat dateFormatIn = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private final SimpleDateFormat dateFormatIn = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/** Date format out (for solr) */
private SimpleDateFormat dateFormatOut = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
private final SimpleDateFormat dateFormatOut = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
/** Date format (in) from the log line for the UID */
private SimpleDateFormat dateFormatInUID = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
private final SimpleDateFormat dateFormatInUID = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
/** Date format out (for uid) */
private SimpleDateFormat dateFormatOutUID = new SimpleDateFormat("yyyyMMddHHmmssSSS");
private final SimpleDateFormat dateFormatOutUID = new SimpleDateFormat("yyyyMMddHHmmssSSS");
/**
@@ -349,24 +349,33 @@ public class ClassicDSpaceLogConverter {
{
// Convert all the files
final File sample = new File(line.getOptionValue('i'));
File dir = sample.getParentFile();
File dir = sample.getAbsoluteFile().getParentFile();
FilenameFilter filter = new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.startsWith(sample.getName());
}
};
String[] children = dir.list(filter);
for (String in : children)
if (null == children)
{
System.err.println(in);
String out = line.getOptionValue('o') +
(dir.getAbsolutePath() +
System.getProperty("file.separator") + in).substring(line.getOptionValue('i').length());
converter.convert(dir.getAbsolutePath() + System.getProperty("file.separator") + in, out);
System.err.println(sample + " could not be used to find a directory of log files.");
System.exit(1);
}
else if (children.length <= 0)
System.err.println(sample + " matched no files.");
else
for (String in : children)
{
System.err.println(in);
String out = line.getOptionValue('o') +
(dir.getAbsolutePath() +
System.getProperty("file.separator") + in).substring(line.getOptionValue('i').length());
converter.convert(dir.getAbsolutePath() + System.getProperty("file.separator") + in, out);
}
}
else
{

View File

@@ -205,7 +205,8 @@ public class SpiderDetector {
for (Pattern candidate : agents)
{
if (candidate.matcher(agent).find())
// prevent matcher() invocation from a null Pattern object
if (null != candidate && candidate.matcher(agent).find())
{
return true;
}
@@ -236,7 +237,8 @@ public class SpiderDetector {
for (Pattern candidate : domains)
{
if (candidate.matcher(hostname).find())
// prevent matcher() invocation from a null Pattern object
if (null != candidate && candidate.matcher(hostname).find())
{
return true;
}

View File

@@ -16,13 +16,10 @@ import org.dspace.core.Constants;
import org.dspace.core.ConfigurationManager;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Bitstream;
import org.dspace.content.DCValue;
import org.dspace.content.Item;
import org.dspace.eperson.EPerson;
import org.dspace.statistics.SolrLogger;
import java.util.Date;
import java.util.Map;
import java.text.SimpleDateFormat;
import com.maxmind.geoip.LookupService;
@@ -196,8 +193,6 @@ public class StatisticsDataGenerator {
solr.deleteByQuery("*:*");
solr.commit();
Map<String, String> metadataStorageInfo = SolrLogger.getMetadataStorageInfo();
String prevIp = null;
String dbfile = ConfigurationManager.getProperty("usage-statistics", "dbfile");
LookupService cl = new LookupService(dbfile,
@@ -366,24 +361,6 @@ public class StatisticsDataGenerator {
doc1.addField("dns", dns.toLowerCase());
}
if (dso instanceof Item) {
Item item = (Item) dso;
// Store the metadata
for (Map.Entry<String, String> entry : metadataStorageInfo.entrySet())
{
String dcField = entry.getValue();
DCValue[] vals = item.getMetadata(dcField.split("\\.")[0],
dcField.split("\\.")[1], dcField.split("\\.")[2],
Item.ANY);
for (DCValue val1 : vals) {
String val = val1.value;
doc1.addField(entry.getKey(), val);
doc1.addField(entry.getKey() + "_search", val.toLowerCase());
}
}
}
SolrLogger.storeParents(doc1, dso);
solr.add(doc1);

View File

@@ -29,7 +29,7 @@ import com.maxmind.geoip.LookupService;
import com.maxmind.geoip.Location;
/**
* Class to load intermediate statistics files (produced from log files by <code>ClassicDSpaceLogConverter</code>) into Solr
* Class to load intermediate statistics files (produced from log files by {@link ClassicDSpaceLogConverter}) into Solr.
*
* @see ClassicDSpaceLogConverter
*
@@ -40,7 +40,7 @@ public class StatisticsImporter
private static final Logger log = Logger.getLogger(StatisticsImporter.class);
/** Date format (for solr) */
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
/** Solr server connection */
private static HttpSolrServer solr;
@@ -48,9 +48,6 @@ public class StatisticsImporter
/** GEOIP lookup service */
private static LookupService geoipLookup;
/** Metadata storage information */
private static Map<String, String> metadataStorageInfo;
/** Whether to skip the DNS reverse lookup or not */
private static boolean skipReverseDNS = false;
@@ -67,7 +64,7 @@ public class StatisticsImporter
private List<Integer> localBitstreams;
/** Whether or not to replace item IDs with local values (for testing) */
private boolean useLocal;
private final boolean useLocal;
/**
* Constructor. Optionally loads local data to replace foreign data
@@ -339,24 +336,6 @@ public class StatisticsImporter
sid.addField("dns", dns.toLowerCase());
}
if (dso instanceof Item) {
Item item = (Item) dso;
// Store the metadata
for (String storedField : metadataStorageInfo.keySet()) {
String dcField = metadataStorageInfo.get(storedField);
DCValue[] vals = item.getMetadata(dcField.split("\\.")[0],
dcField.split("\\.")[1], dcField.split("\\.")[2],
Item.ANY);
for (DCValue val1 : vals) {
String val = val1.value;
sid.addField(String.valueOf(storedField), val);
sid.addField(String.valueOf(storedField + "_search"),
val.toLowerCase());
}
}
}
SolrLogger.storeParents(sid, dso);
solr.add(sid);
errors--;
@@ -471,7 +450,6 @@ public class StatisticsImporter
}
solr = new HttpSolrServer(sserver);
metadataStorageInfo = SolrLogger.getMetadataStorageInfo();
String dbfile = ConfigurationManager.getProperty("usage-statistics", "dbfile");
try
{
@@ -495,6 +473,7 @@ public class StatisticsImporter
File dir = sample.getParentFile();
FilenameFilter filter = new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.startsWith(sample.getName());
@@ -522,7 +501,7 @@ public class StatisticsImporter
*/
static class DNSCache<K,V> extends LinkedHashMap<K,V>
{
private int maxCapacity;
private final int maxCapacity;
public DNSCache(int initialCapacity, float loadFactor, int maxCapacity)
{

View File

@@ -112,11 +112,15 @@ public class MetadataSchemaTest extends AbstractUnitTest
@Test
public void testSetName()
{
String oldname = ms.getName();
String name = "new name";
ms.setName(name);
assertThat("testSetName 0",ms.getName(),notNullValue());
assertThat("testSetName 1",ms.getName(),not(equalTo("")));
assertThat("testSetName 2",ms.getName(),equalTo(name));
//we restore the old name to avoid issues in other tests
ms.setName(oldname);
}
/**
@@ -392,4 +396,4 @@ public class MetadataSchemaTest extends AbstractUnitTest
assertThat("testFind_Context_String 4",found, nullValue());
}
}
}

View File

@@ -13,7 +13,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -14,6 +14,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.webui.util.UIUtil;
import org.dspace.authorize.AuthorizeException;
@@ -30,6 +31,7 @@ import org.dspace.content.Community;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
import org.dspace.core.Utils;
/**
* Servlet for browsing through indices, as they are defined in
@@ -86,6 +88,25 @@ public abstract class AbstractBrowserServlet extends DSpaceServlet
String month = request.getParameter("month");
String year = request.getParameter("year");
String startsWith = request.getParameter("starts_with");
//validate input to avoid cross-site scripting
try {
if (StringUtils.isNotBlank(month) && !"-1".equals(month)) {
Integer.valueOf(month);
}
if (StringUtils.isNotBlank(year) && !"-1".equals(year)) {
Integer.valueOf(year);
}
if(StringUtils.isNotBlank(startsWith)) {
startsWith = Utils.addEntities(startsWith);
}
}
catch(Exception ex) {
log.warn("We were unable to parse the browse request: maybe a cross-site scripting attach?");
return null;
}
String valueFocus = request.getParameter("vfocus");
String valueFocusLang = request.getParameter("vfocus_lang");
String authority = request.getParameter("authority");
@@ -108,7 +129,7 @@ public abstract class AbstractBrowserServlet extends DSpaceServlet
// process the input, performing some inline validation
BrowseIndex bi = null;
if (type != null && !"".equals(type))
if (StringUtils.isNotEmpty(type))
{
bi = BrowseIndex.getBrowseIndex(type);
}

View File

@@ -65,7 +65,7 @@ public class BrowserServlet extends AbstractBrowserServlet
// all browse requests currently come to GET.
BrowserScope scope = getBrowserScopeForRequest(context, request, response);
if (scope.getBrowseIndex() == null)
if (scope == null || scope.getBrowseIndex() == null)
{
throw new ServletException("There is no browse index for the request");
}

View File

@@ -11,6 +11,7 @@ import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -33,46 +34,71 @@ import org.dspace.core.LogManager;
*/
public class CommunityListServlet extends DSpaceServlet
{
// This will map community IDs to arrays of collections
private Map<Integer, Collection[]> colMap;
// This will map communityIDs to arrays of sub-communities
private Map<Integer, Community[]> commMap;
private static final Object staticLock = new Object();
/** log4j category */
private static Logger log = Logger.getLogger(CommunityListServlet.class);
protected void doDSGet(Context context, HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException,
SQLException, AuthorizeException
{
log.info(LogManager.getHeader(context, "view_community_list", ""));
{
synchronized (staticLock)
{
colMap = new HashMap<Integer, Collection[]>();
commMap = new HashMap<Integer, Community[]>();
// This will map community IDs to arrays of collections
Map<Integer, Collection[]> colMap = new HashMap<Integer, Collection[]>();
log.info(LogManager.getHeader(context, "view_community_list", ""));
// This will map communityIDs to arrays of sub-communities
Map<Integer, Community[]> commMap = new HashMap<Integer, Community[]>();
Community[] communities = Community.findAllTop(context);
Community[] communities = Community.findAllTop(context);
for (int com = 0; com < communities.length; com++)
{
build(communities[com]);
}
for (int com = 0; com < communities.length; com++)
// can they admin communities?
if (AuthorizeManager.isAdmin(context))
{
// set a variable to create an edit button
request.setAttribute("admin_button", Boolean.TRUE);
}
request.setAttribute("communities", communities);
request.setAttribute("collections.map", colMap);
request.setAttribute("subcommunities.map", commMap);
JSPManager.showJSP(request, response, "/community-list.jsp");
}
}
/*
* Get all subcommunities and collections from a community
*/
private void build(Community c) throws SQLException {
Integer comID = Integer.valueOf(c.getID());
// Find collections in community
Collection[] colls = c.getCollections();
colMap.put(comID, colls);
// Find subcommunties in community
Community[] comms = c.getSubcommunities();
// Get all subcommunities for each communities if they have some
if (comms.length > 0)
{
Integer comID = Integer.valueOf(communities[com].getID());
// Find collections in community
Collection[] colls = communities[com].getCollections();
colMap.put(comID, colls);
// Find subcommunties in community
Community[] comms = communities[com].getSubcommunities();
commMap.put(comID, comms);
for (int sub = 0; sub < comms.length; sub++) {
build(comms[sub]);
}
}
// can they admin communities?
if (AuthorizeManager.isAdmin(context))
{
// set a variable to create an edit button
request.setAttribute("admin_button", Boolean.TRUE);
}
request.setAttribute("communities", communities);
request.setAttribute("collections.map", colMap);
request.setAttribute("subcommunities.map", commMap);
JSPManager.showJSP(request, response, "/community-list.jsp");
}
}

View File

@@ -19,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.util.GoogleMetadata;
import org.dspace.app.webui.util.Authenticate;
@@ -129,8 +130,7 @@ public class HandleServlet extends DSpaceServlet
if (dso == null)
{
log.info(LogManager
.getHeader(context, "invalid_id", "path=" + path));
log.info(LogManager.getHeader(context, "invalid_id", "path=" + path));
JSPManager.showInvalidIDError(request, response, StringEscapeUtils.escapeHtml(path), -1);
return;
@@ -152,8 +152,28 @@ public class HandleServlet extends DSpaceServlet
// and firing a usage event for the DSO we're reporting for
return;
} else if ("/display-statistics.jsp".equals(extraPathInfo))
{
request.getRequestDispatcher(extraPathInfo).forward(request, response);
// If we don't return here, we keep processing and end up
// throwing a NPE when checking community authorization
// and firing a usage event for the DSO we're reporting for
return;
} else if ("/browse".equals((extraPathInfo)) || StringUtils.startsWith(extraPathInfo, "/browse?")) {
request.getRequestDispatcher(extraPathInfo).forward(request, response);
// If we don't return here, we keep processing and end up
// throwing a NPE when checking community authorization
// and firing a usage event for the DSO we're reporting for
return;
} else if ("/simple-search".equals(extraPathInfo) || StringUtils.startsWith(extraPathInfo, "simple-search?")) {
request.getRequestDispatcher(extraPathInfo).forward(request, response);
// If we don't return here, we keep processing and end up
// throwing a NPE when checking community authorization
// and firing a usage event for the DSO we're reporting for
return;
}
// OK, we have a valid Handle. What is it?
if (dso.getType() == Constants.ITEM)
{
@@ -195,9 +215,9 @@ public class HandleServlet extends DSpaceServlet
}
else
{
// Forward to another servlet
request.getRequestDispatcher(extraPathInfo).forward(request,
response);
log.debug("Found Item with extraPathInfo => Error.");
JSPManager.showInvalidIDError(request, response, StringEscapeUtils.escapeHtml(path), -1);
return;
}
}
@@ -231,9 +251,9 @@ public class HandleServlet extends DSpaceServlet
}
else
{
// Forward to another servlet
request.getRequestDispatcher(extraPathInfo).forward(request,
response);
log.debug("Found Collection with extraPathInfo => Error.");
JSPManager.showInvalidIDError(request, response, StringEscapeUtils.escapeHtml(path), -1);
return;
}
}
else if (dso.getType() == Constants.COMMUNITY)
@@ -255,9 +275,9 @@ public class HandleServlet extends DSpaceServlet
}
else
{
// Forward to another servlet
request.getRequestDispatcher(extraPathInfo).forward(request,
response);
log.debug("Found Community with extraPathInfo => Error.");
JSPManager.showInvalidIDError(request, response, StringEscapeUtils.escapeHtml(path), -1);
return;
}
}
else

View File

@@ -38,6 +38,7 @@
<%@ page import="org.dspace.content.*"%>
<%@ page import="org.dspace.core.ConfigurationManager"%>
<%@ page import="org.dspace.core.Context" %>
<%@ page import="org.dspace.core.Utils" %>
<%@ page import="org.dspace.eperson.Group" %>
<%@ page import="javax.servlet.jsp.jstl.fmt.LocaleSupport" %>
<%@ page import="java.net.URLEncoder" %>
@@ -374,7 +375,7 @@
{
if (dcv.length > 0)
{
displayTitle = dcv[0].value;
displayTitle = Utils.addEntities(dcv[0].value);
}
}
%><p class="recentItem"><a href="<%= request.getContextPath() %>/handle/<%= items[i].getHandle() %>"><%= displayTitle %></a></p><%

View File

@@ -32,6 +32,7 @@
<%@ page import="org.dspace.browse.ItemCounter" %>
<%@ page import="org.dspace.content.*" %>
<%@ page import="org.dspace.core.ConfigurationManager" %>
<%@ page import="org.dspace.core.Utils" %>
<%@ page import="javax.servlet.jsp.jstl.fmt.LocaleSupport" %>
@@ -158,7 +159,7 @@
{
if (dcv.length > 0)
{
displayTitle = dcv[0].value;
displayTitle = Utils.addEntities(dcv[0].value);
}
}
%>
@@ -401,4 +402,4 @@
</div>
</dspace:sidebar>
<% } %>
</dspace:layout>
</dspace:layout>

View File

@@ -14,6 +14,7 @@
The add-on may be turn off in dspace.cfg
--%>
<%@page import="org.dspace.core.Utils"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="javax.servlet.jsp.jstl.fmt.LocaleSupport" %>
<%@ taglib uri="/WEB-INF/dspace-tags.tld" prefix="dspace" %>
@@ -52,7 +53,7 @@
<form name="filterVocabulary" method="post" action="<%= request.getContextPath() %>/subject-search">
<input style="border-width:1px;border-style:solid;"
name="filter" type="text" id="filter"
size="15" value="<%= filter %>"
size="15" value="<%= Utils.addEntities(filter) %>"
title="<%= LocaleSupport.getLocalizedMessage(pageContext, "jsp.controlledvocabulary.search.trimmessage") %>"/>
<input type="submit" name="submit" value="<%= LocaleSupport.getLocalizedMessage(pageContext, "jsp.controlledvocabulary.search.trimbutton") %>"/>
<input type="hidden" name="action" value="filter"/>

View File

@@ -15,6 +15,7 @@
- recent.submissions - RecetSubmissions
--%>
<%@page import="org.dspace.core.Utils"%>
<%@page import="org.dspace.content.Bitstream"%>
<%@ page contentType="text/html;charset=UTF-8" %>
@@ -133,13 +134,13 @@ if (submissions != null && submissions.count() > 0)
String displayTitle = "Untitled";
if (dcv != null & dcv.length > 0)
{
displayTitle = dcv[0].value;
displayTitle = Utils.addEntities(dcv[0].value);
}
dcv = item.getMetadata("dc", "description", "abstract", Item.ANY);
String displayAbstract = "";
if (dcv != null & dcv.length > 0)
{
displayAbstract = dcv[0].value;
displayAbstract = Utils.addEntities(dcv[0].value);
}
%>
<div style="padding-bottom: 50px; min-height: 200px;" class="item <%= first?"active":""%>">

View File

@@ -106,7 +106,7 @@
{
String key = "jsp.search.advanced.type." + index;
%>
<option value="<%= index %>" <%= field1.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<option value="<%= StringEscapeUtils.escapeHtml(index) %>" <%= field1.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<%
}
%>
@@ -136,7 +136,7 @@
{
String key = "jsp.search.advanced.type." + index;
%>
<option value="<%= index %>" <%= field2.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<option value="<%= StringEscapeUtils.escapeHtml(index) %>" <%= field2.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<%
}
%>
@@ -162,7 +162,7 @@
{
String key = "jsp.search.advanced.type." + index;
%>
<option value="<%= index %>" <%= field3.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<option value="<%= StringEscapeUtils.escapeHtml(index) %>" <%= field3.equals(index) ? "selected=\"selected\"" : "" %>><fmt:message key="<%= key %>"/></option>
<%
}
%>

View File

@@ -33,6 +33,7 @@
- admin_button - If the user is an admin
--%>
<%@page import="org.dspace.core.Utils"%>
<%@page import="org.dspace.discovery.configuration.DiscoverySearchFilterFacet"%>
<%@page import="org.dspace.app.webui.util.UIUtil"%>
<%@page import="java.util.HashMap"%>
@@ -55,7 +56,6 @@
prefix="c" %>
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
<%@ page import="org.apache.commons.lang.StringEscapeUtils" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="org.dspace.content.Community" %>
<%@ page import="org.dspace.content.Collection" %>
@@ -149,6 +149,9 @@
}
});
});
function validateFilters() {
return document.getElementById("filterquery").value.length > 0;
}
</script>
</c:set>
@@ -189,10 +192,10 @@
}
%> </select><br/>
<label for="query"><fmt:message key="jsp.search.results.searchfor"/></label>
<input type="text" size="50" id="query" name="query" value="<%= (query==null ? "" : StringEscapeUtils.escapeHtml(query)) %>"/>
<input type="text" size="50" id="query" name="query" value="<%= (query==null ? "" : Utils.addEntities(query)) %>"/>
<input type="submit" id="main-query-submit" class="btn btn-primary" value="<fmt:message key="jsp.general.go"/>" />
<% if (StringUtils.isNotBlank(spellCheckQuery)) {%>
<p class="lead"><fmt:message key="jsp.search.didyoumean"><fmt:param><a id="spellCheckQuery" data-spell="<%= StringEscapeUtils.escapeHtml(spellCheckQuery) %>" href="#"><%= spellCheckQuery %></a></fmt:param></fmt:message></p>
<p class="lead"><fmt:message key="jsp.search.didyoumean"><fmt:param><a id="spellCheckQuery" data-spell="<%= Utils.addEntities(spellCheckQuery) %>" href="#"><%= spellCheckQuery %></a></fmt:param></fmt:message></p>
<% } %>
<input type="hidden" value="<%= rpp %>" name="rpp" />
<input type="hidden" value="<%= sortedBy %>" name="sort_by" />
@@ -211,7 +214,7 @@
for (DiscoverySearchFilter searchFilter : availableFilters)
{
String fkey = "jsp.search.filter."+searchFilter.getIndexFieldName();
%><option value="<%= searchFilter.getIndexFieldName() %>"<%
%><option value="<%= Utils.addEntities(searchFilter.getIndexFieldName()) %>"<%
if (filter[0].equals(searchFilter.getIndexFieldName()))
{
%> selected="selected"<%
@@ -222,7 +225,7 @@
if (!found)
{
String fkey = "jsp.search.filter."+filter[0];
%><option value="<%= filter[0] %>" selected="selected"><fmt:message key="<%= fkey %>"/></option><%
%><option value="<%= Utils.addEntities(filter[0]) %>" selected="selected"><fmt:message key="<%= fkey %>"/></option><%
}
%>
</select>
@@ -231,11 +234,11 @@
for (String opt : options)
{
String fkey = "jsp.search.filter.op."+opt;
%><option value="<%= opt %>"<%= opt.equals(filter[1])?" selected=\"selected\"":"" %>><fmt:message key="<%= fkey %>"/></option><%
%><option value="<%= Utils.addEntities(opt) %>"<%= opt.equals(filter[1])?" selected=\"selected\"":"" %>><fmt:message key="<%= fkey %>"/></option><%
}
%>
</select>
<input type="text" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= StringEscapeUtils.escapeHtml(filter[2]) %>" size="45"/>
<input type="text" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= Utils.addEntities(filter[2]) %>" size="45"/>
<input class="btn btn-default" type="submit" id="submit_filter_remove_<%=idx %>" name="submit_filter_remove_<%=idx %>" value="X" />
<br/>
<%
@@ -252,17 +255,17 @@
<h5><fmt:message key="jsp.search.filter.heading" /></h5>
<p class="discovery-search-filters-hint"><fmt:message key="jsp.search.filter.hint" /></p>
<form action="simple-search" method="get">
<input type="hidden" value="<%= StringEscapeUtils.escapeHtml(searchScope) %>" name="location" />
<input type="hidden" value="<%= StringEscapeUtils.escapeHtml(query) %>" name="query" />
<input type="hidden" value="<%= Utils.addEntities(searchScope) %>" name="location" />
<input type="hidden" value="<%= Utils.addEntities(query) %>" name="query" />
<% if (appliedFilterQueries.size() > 0 ) {
int idx = 1;
for (String[] filter : appliedFilters)
{
boolean found = false;
%>
<input type="hidden" id="filter_field_<%=idx %>" name="filter_field_<%=idx %>" value="<%= filter[0] %>" />
<input type="hidden" id="filter_type_<%=idx %>" name="filter_type_<%=idx %>" value="<%= filter[1] %>" />
<input type="hidden" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= StringEscapeUtils.escapeHtml(filter[2]) %>" />
<input type="hidden" id="filter_field_<%=idx %>" name="filter_field_<%=idx %>" value="<%= Utils.addEntities(filter[0]) %>" />
<input type="hidden" id="filter_type_<%=idx %>" name="filter_type_<%=idx %>" value="<%= Utils.addEntities(filter[1]) %>" />
<input type="hidden" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= Utils.addEntities(filter[2]) %>" />
<%
idx++;
}
@@ -285,28 +288,28 @@
}
%>
</select>
<input type="text" id="filterquery" name="filterquery" size="45"/>
<input type="hidden" value="<%= rpp %>" name="rpp" />
<input type="hidden" value="<%= sortedBy %>" name="sort_by" />
<input type="hidden" value="<%= order %>" name="order" />
<input class="btn btn-default" type="submit" value="<fmt:message key="jsp.search.filter.add"/>" />
<input type="text" id="filterquery" name="filterquery" size="45" required="required" />
<input type="hidden" value="<%= rpp %>" name="rpp" />
<input type="hidden" value="<%= sortedBy %>" name="sort_by" />
<input type="hidden" value="<%= order %>" name="order" />
<input class="btn btn-default" type="submit" value="<fmt:message key="jsp.search.filter.add"/>" onclick="return validateFilters()" />
</form>
</div>
<% } %>
<%-- Include a component for modifying sort by, order, results per page, and et-al limit --%>
<div class="discovery-pagination-controls panel-footer">
<form action="simple-search" method="get">
<input type="hidden" value="<%= StringEscapeUtils.escapeHtml(searchScope) %>" name="location" />
<input type="hidden" value="<%= StringEscapeUtils.escapeHtml(query) %>" name="query" />
<input type="hidden" value="<%= Utils.addEntities(searchScope) %>" name="location" />
<input type="hidden" value="<%= Utils.addEntities(query) %>" name="query" />
<% if (appliedFilterQueries.size() > 0 ) {
int idx = 1;
for (String[] filter : appliedFilters)
{
boolean found = false;
%>
<input type="hidden" id="filter_field_<%=idx %>" name="filter_field_<%=idx %>" value="<%= filter[0] %>" />
<input type="hidden" id="filter_type_<%=idx %>" name="filter_type_<%=idx %>" value="<%= filter[1] %>" />
<input type="hidden" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= StringEscapeUtils.escapeHtml(filter[2]) %>" />
<input type="hidden" id="filter_field_<%=idx %>" name="filter_field_<%=idx %>" value="<%= Utils.addEntities(filter[0]) %>" />
<input type="hidden" id="filter_type_<%=idx %>" name="filter_type_<%=idx %>" value="<%= Utils.addEntities(filter[1]) %>" />
<input type="hidden" id="filter_value_<%=idx %>" name="filter_value_<%=idx %>" value="<%= Utils.addEntities(filter[2]) %>" />
<%
idx++;
}
@@ -432,7 +435,7 @@ else if( qResults != null)
// create the URLs accessing the previous and next search result pages
String baseURL = request.getContextPath()
+ searchScope
+ (searchScope != "" ? "/handle/" + searchScope : "")
+ "/simple-search?query="
+ URLEncoder.encode(query,"UTF-8")
+ httpFilters
@@ -628,28 +631,30 @@ else
for (DiscoverySearchFilterFacet facetConf : facetsConf)
{
String f = facetConf.getIndexFieldName();
List<FacetResult> facet = qResults.getFacetResult(f);
if (facet.size() == 0)
{
facet = qResults.getFacetResult(f+".year");
if(qResults!=null) {
String f = facetConf.getIndexFieldName();
List<FacetResult> facet = qResults.getFacetResult(f);
if (facet.size() == 0)
{
showFacets.put(f, false);
continue;
facet = qResults.getFacetResult(f+".year");
if (facet.size() == 0)
{
showFacets.put(f, false);
continue;
}
}
}
boolean showFacet = false;
for (FacetResult fvalue : facet)
{
if(!appliedFilterQueries.contains(f+"::"+fvalue.getFilterType()+"::"+fvalue.getAsFilterQuery()))
{
showFacet = true;
break;
boolean showFacet = false;
for (FacetResult fvalue : facet)
{
if(!appliedFilterQueries.contains(f+"::"+fvalue.getFilterType()+"::"+fvalue.getAsFilterQuery()))
{
showFacet = true;
break;
}
}
}
showFacets.put(f, showFacet);
brefine = brefine || showFacet;
showFacets.put(f, showFacet);
brefine = brefine || showFacet;
}
}
if (brefine) {
%>
@@ -743,5 +748,4 @@ else
</div>
<% } %>
</dspace:sidebar>
</dspace:layout>
</dspace:layout>

View File

@@ -396,7 +396,7 @@ if (pageTotal > pageCurrent)
</p>
<form id="dso-display" action="<%=request.getContextPath()%>/dso-display" method="post">
<input type="hidden" name="query" value="<%=query%>"/>
<input type="hidden" name="query" value="<%=StringEscapeUtils.escapeHtml(query)%>"/>
<input type="hidden" name="rpp" value="<%=rpp%>"/>
<input type="hidden" name="page" value="<%=pageCurrent%>"/>
<input type="hidden" name="sort_by" value="<%=(so != null ? so.getNumber() : 0)%>"/>

View File

@@ -130,7 +130,16 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="<%= request.getContextPath() %>/styles.css" type="text/css"/>
<link rel="shortcut icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/jquery-ui-1.10.3.custom/redmond/jquery-ui-1.10.3.custom.css" type="text/css" />
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/bootstrap-theme.min.css" type="text/css" />
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/dspace-theme.css" type="text/css" />
<script type='text/javascript' src="<%= request.getContextPath() %>/static/js/jquery/jquery-1.10.2.min.js"></script>
<script type='text/javascript' src='<%= request.getContextPath() %>/static/js/jquery/jquery-ui-1.10.3.custom.min.js'></script>
<script type='text/javascript' src='<%= request.getContextPath() %>/static/js/bootstrap/bootstrap.min.js'></script>
<script type='text/javascript' src='<%= request.getContextPath() %>/static/js/holder.js'></script>
<script type="text/javascript" src="<%= request.getContextPath() %>/utils.js"></script>
<script type="text/javascript">
<!-- Begin
@@ -169,73 +178,65 @@ function clearEPeople()
<p class="submitFormHelp"><fmt:message key="jsp.tools.eperson-list.info1"/></p>
<% } %>
<center>
<form method="get">
<input type="hidden" name="first" value="<%= first %>" />
<input type="hidden" name="sortby" value="<%= sortBy %>" />
<input type="hidden" name="multiple" value="<%= multiple %>" />
<label for="search"><fmt:message key="jsp.tools.eperson-list.search.query" /></label><input type="text" name="search" value="<%= search %>"/>
<input type="submit" value="<fmt:message key="jsp.tools.eperson-list.search.submit" />" />
<%
if (search != null && !search.equals(""))
{ %>
<br/>
<a href="<%= request.getContextPath() + "/tools/eperson-list?multiple=" + multiple + "&sortby=" + sortByParam + "&first="+first %>"><fmt:message key="jsp.tools.eperson-list.search.return-browse" /></a>
<%
}
%>
</form>
<form method="get">
<input type="hidden" name="first" value="<%= first %>" />
<input type="hidden" name="sortby" value="<%= sortBy %>" />
<input type="hidden" name="multiple" value="<%= multiple %>" />
<label for="search"><fmt:message key="jsp.tools.eperson-list.search.query"/></label>
<input class="form-control" style="width:200px;"type="text" name="search" value="<%= search %>"/>
<input class="btn btn-success" type="submit" value="<fmt:message key="jsp.tools.eperson-list.search.submit" />" />
<%
if (search != null && !search.equals("")){ %>
<a class="btn btn-warning" href="<%= request.getContextPath() + "/tools/eperson-list?multiple=" + multiple + "&sortby=" + sortByParam + "&first="+first %>"><fmt:message key="jsp.tools.eperson-list.search.return-browse" /></a>
<%}%>
</form>
</center>
<%-- Controls for jumping around list--%>
<table width="99%">
<tr>
<%-- <td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0">First</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>">&lt; 5 Pages</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>">&lt; 1 Page</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>">1 Page &gt;</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>">5 Pages &gt;</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>">Last</a></strong></small></td> --%>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.eperson-list.jump.first"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.eperson-list.jump.five-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.eperson-list.jump.one-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.eperson-list.jump.one-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.eperson-list.jump.five-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.eperson-list.jump.last"/></a></strong></small></td>
</tr>
</table>
<div class="span12" style="text-align:center">
<ul class="pagination">
<li><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.eperson-list.jump.first"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.eperson-list.jump.five-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.eperson-list.jump.one-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.eperson-list.jump.one-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.eperson-list.jump.five-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.eperson-list.jump.last"/></a></li>
</ul>
</div
<br/>
<form method="get" action=""> <%-- Will never actually be posted, it's just so buttons will appear --%>
<table class="miscTable" align="center" summary="Epeople list">
<table class="table table-striped" align="center" summary="Epeople list">
<% if (search != null && !search.equals(""))
{ %>
<tr>
<th class="oddRowOddCol">&nbsp;</th>
<th class="oddRowEvenCol"><fmt:message key="jsp.tools.eperson-list.th.id" /></th>
<th class="oddRowOddCol"><fmt:message key="jsp.tools.eperson-list.th.email" /></th>
<th class="oddRowEvenCol"><fmt:message key="jsp.tools.eperson-list.th.lastname" /></th>
<th class="oddRowOddCol"><fmt:message key="jsp.tools.eperson-list.th.lastname" /></th>
<th>&nbsp;</th>
<th><fmt:message key="jsp.tools.eperson-list.th.id" /></th>
<th><fmt:message key="jsp.tools.eperson-list.th.email" /></th>
<th><fmt:message key="jsp.tools.eperson-list.th.lastname" /></th>
<th><fmt:message key="jsp.tools.eperson-list.th.lastname" /></th>
</tr>
<% }
else
{ %>
<tr>
<th id="t1" class="oddRowOddCol">&nbsp;</th>
<th id="t2" class="oddRowEvenCol"><%
<th id="t1">&nbsp;</th>
<th id="t2"><%
if (sortBy == EPerson.ID)
{
%><strong><fmt:message key="jsp.tools.eperson-list.th.id.sortedby" /></strong><%
%><fmt:message key="jsp.tools.eperson-list.th.id"/><span class="glyphicon glyphicon-arrow-down"><%
}
else
{
%><a href="<%= sortLink %>id"><fmt:message key="jsp.tools.eperson-list.th.id" /></a><%
}
%></th>
<th id="t3" class="oddRowOddCol"><%
<th id="t3"><%
if (sortBy == EPerson.EMAIL)
{
%><strong><fmt:message key="jsp.tools.eperson-list.th.email.sortedby" /></strong><%
%><fmt:message key="jsp.tools.eperson-list.th.email"/><span class="glyphicon glyphicon-arrow-down"><%
}
else
{
@@ -243,10 +244,10 @@ function clearEPeople()
}
%></th>
<%-- <th class="oddRowEvenCol"><%= sortBy == EPerson.LASTNAME ? "<strong>Last Name &uarr;</strong>" : "<a href=\"" + sortLink + "lastname\">Last Name</a>" %></th> --%>
<th id="t4" class="oddRowEvenCol"><%
<th id="t4"><%
if (sortBy == EPerson.LASTNAME)
{
%><fmt:message key="jsp.tools.eperson-list.th.lastname.sortedby" /><%
%><fmt:message key="jsp.tools.eperson-list.th.lastname"/><span class="glyphicon glyphicon-arrow-down"><%
}
else
{
@@ -254,12 +255,12 @@ function clearEPeople()
}
%></th>
<th id="t5" class="oddRowOddCol"><fmt:message key="jsp.tools.eperson-list.th.firstname"/></th>
<th id="t5"><fmt:message key="jsp.tools.eperson-list.th.firstname"/></th>
<th id="t6" class="oddRowEvenCol"><%
<th id="t6"><%
if (sortBy == EPerson.LANGUAGE)
{
%><fmt:message key="jsp.tools.eperson-list.th.language.sortedby" /><%
%><fmt:message key="jsp.tools.eperson-list.th.language"/><span class="glyphicon glyphicon-arrow-down"></span><%
}
else
{
@@ -285,20 +286,20 @@ function clearEPeople()
String fullname = StringEscapeUtils.escapeXml(StringEscapeUtils.escapeJavaScript(e.getFullName()));
String email = StringEscapeUtils.escapeXml(StringEscapeUtils.escapeJavaScript(e.getEmail()));
%>
<tr>
<td headers="t1" class="<%= row %>RowOddCol">
<input type="button" value="<%
if (multiple) { %><fmt:message key="jsp.tools.general.add"/><% }
else { %><fmt:message key="jsp.tools.general.select"/><% } %>" onclick="javascript:<%= clearList %>addEPerson(<%= e.getID() %>, '<%= email %>', '<%= fullname %>');<%= closeWindow %>"/></td>
<td headers="t2" class="<%= row %>RowEvenCol"><%= e.getID() %></td>
<td headers="t3" class="<%= row %>RowOddCol"><%= (e.getEmail() == null ? "" : Utils.addEntities(e.getEmail())) %></td>
<td headers="t4" class="<%= row %>RowEvenCol">
<tr>
<td headers="t1">
<input class="btn btn-success" type="button" value="<%
if (multiple) { %><fmt:message key="jsp.tools.general.add"/><% }
else { %><fmt:message key="jsp.tools.general.select"/><% } %>" onclick="javascript:<%= clearList %>addEPerson(<%= e.getID() %>, '<%= email %>', '<%= fullname %>');<%= closeWindow %>"/></td>
<td headers="t2"><%= e.getID() %></td>
<td headers="t3"><%= (e.getEmail() == null ? "" : Utils.addEntities(e.getEmail())) %></td>
<td headers="t4">
<%= (e.getLastName() == null ? "" : Utils.addEntities(e.getLastName())) %>
</td>
<td headers="t5" class="<%= row %>RowOddCol">
<td headers="t5">
<%= (e.getFirstName() == null ? "" : Utils.addEntities(e.getFirstName())) %>
</td>
<td headers="t6" class="<%= row %>RowOddCol">
<td headers="t6">
<%= (e.getLanguage() == null ? "" : Utils.addEntities(e.getLanguage())) %>
</td>
</tr>
@@ -311,28 +312,21 @@ function clearEPeople()
<br/>
<%-- Controls for jumping around list--%>
<table width="99%">
<tr>
<%--
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0">First</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>">&lt; 5 Pages</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>">&lt; 1 Page</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>">1 Page &gt;</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>">5 Pages &gt;</a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>">Last</a></strong></small></td>
--%>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.eperson-list.jump.first"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.eperson-list.jump.five-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.eperson-list.jump.one-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.eperson-list.jump.one-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.eperson-list.jump.five-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.eperson-list.jump.last"/></a></strong></small></td>
</tr>
</table>
<div class="span12" style="text-align:center">
<ul class="pagination">
<li><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.eperson-list.jump.first"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.eperson-list.jump.five-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.eperson-list.jump.one-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.eperson-list.jump.one-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.eperson-list.jump.five-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.eperson-list.jump.last"/></a></li>
</ul>
</div>
<%-- <p align="center"><input type="button" value="Close" onClick="window.close();"/></p> --%>
<p align="center"><input type="button" value="<fmt:message key="jsp.tools.eperson-list.close.button"/>" onclick="window.close();"/></p>
<p align="center">
<input type="button" class="btn btn-danger" value="<fmt:message key="jsp.tools.eperson-list.close.button"/>" onclick="window.close();"/>
</p>
</form>

View File

@@ -75,7 +75,11 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="<%= request.getContextPath() %>/styles.css" type="text/css"/>
<link rel="shortcut icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/bootstrap-theme.min.css" type="text/css" />
<link rel="stylesheet" href="<%= request.getContextPath() %>/static/css/bootstrap/dspace-theme.css" type="text/css" />
<script type='text/javascript' src='<%= request.getContextPath() %>/static/js/bootstrap/bootstrap.min.js'></script>
<script type="text/javascript">
<!-- Begin
@@ -116,35 +120,27 @@ function clearGroups()
<% } %>
<%-- Controls for jumping around list--%>
<table width="99%">
<tr>
<%-- <td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0">First</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>">&lt; 5 Pages</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>">&lt; 1 Page</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>">1 Page &gt;</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>">5 Pages &gt;</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>">Last</A></strong></small></td>
--%>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.group-select-list.jump.first"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.group-select-list.jump.five-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.group-select-list.jump.one-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.group-select-list.jump.one-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.group-select-list.jump.five-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.group-select-list.jump.last"/></a></strong></small></td>
</tr>
</table>
<div class="span12" style="text-align:center">
<ul class="pagination">
<li><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.group-select-list.jump.first"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.group-select-list.jump.five-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.group-select-list.jump.one-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.group-select-list.jump.one-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.group-select-list.jump.five-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.group-select-list.jump.last"/></a></li>
</ul>
</div>
<br/>
<form method="get" action=""> <%-- Will never actually be posted, it's just so buttons will appear --%>
<table class="miscTable" align="center" summary="Group list">
<table class="table table-striped" align="center" summary="Group list">
<tr>
<th id="t1" class="oddRowOddCol">&nbsp;</th>
<th id="t2" class="oddRowEvenCol"><%
if (sortBy == Group.ID)
{
%><strong><fmt:message key="jsp.tools.group-select-list.th.id.sortedby" /></strong><%
%><fmt:message key="jsp.tools.group-select-list.th.id"/><span class="glyphicon glyphicon-arrow-down"><%
}
else
{
@@ -154,7 +150,7 @@ function clearGroups()
<th id="t3" class="oddRowOddCol"><%
if (sortBy == Group.NAME)
{
%><strong><fmt:message key="jsp.tools.group-select-list.th.name.sortedby" /></strong><%
%><fmt:message key="jsp.tools.group-select-list.th.name" /><span class="glyphicon glyphicon-arrow-down"><%
}
else
{
@@ -180,12 +176,12 @@ function clearGroups()
String fullname = g.getName().replace('\'', ' ');
%>
<tr>
<td headers="t1" class="<%= row %>RowOddCol">
<input type="button" value="<%
<td headers="t1" class="">
<input type="button" class="btn btn-success" value="<%
if (multiple) { %><fmt:message key="jsp.tools.general.add"/><% }
else { %><fmt:message key="jsp.tools.general.select"/><% } %>" onclick="javascript:<%= clearList %>addGroup('<%= g.getID() %>', '<%= Utils.addEntities(fullname) %>');<%= closeWindow %>"/></td>
<td headers="t2" class="<%= row %>RowEvenCol"><%= g.getID() %></td>
<td headers="t3" class="<%= row %>RowOddCol"> <%= g.getName()%></td>
<td headers="t2" class=""><%= g.getID() %></td>
<td headers="t3" class=""> <%= g.getName()%></td>
</tr>
<%
row = (row.equals("odd") ? "even" : "odd");
@@ -196,27 +192,19 @@ function clearGroups()
<br/>
<%-- Controls for jumping around list--%>
<table width="99%">
<tr>
<%-- <td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0">First</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>">&lt; 5 Pages</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>">&lt; 1 Page</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>">1 Page &gt;</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>">5 Pages &gt;</A></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>">Last</A></strong></small></td>
--%>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.group-select-list.jump.first"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.group-select-list.jump.five-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.group-select-list.jump.one-back"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.group-select-list.jump.one-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.group-select-list.jump.five-forward"/></a></strong></small></td>
<td width="17%" align="center"><small><strong><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.group-select-list.jump.last"/></a></strong></small></td>
</tr>
</table>
<div class="span12" style="text-align:center">
<ul class="pagination">
<li><a href="<%= jumpLink %>0"><fmt:message key="jsp.tools.group-select-list.jump.first"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveBack %>"><fmt:message key="jsp.tools.group-select-list.jump.five-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneBack %>"><fmt:message key="jsp.tools.group-select-list.jump.one-back"/></a></li>
<li><a href="<%= jumpLink %><%= jumpOneForward %>"><fmt:message key="jsp.tools.group-select-list.jump.one-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpFiveForward %>"><fmt:message key="jsp.tools.group-select-list.jump.five-forward"/></a></li>
<li><a href="<%= jumpLink %><%= jumpEnd %>"><fmt:message key="jsp.tools.group-select-list.jump.last"/></a></li>
</ul>
</div>
<%-- <p align="center"><input type="button" value="Close" onClick="window.close();"></p> --%>
<p align="center"><input type="button" value="<fmt:message key="jsp.tools.group-select-list.close.button"/>" onclick="window.close();"/></p>
<p align="center"><input type="button" class="btn btn-danger" value="<fmt:message key="jsp.tools.group-select-list.close.button"/>" onclick="window.close();"/></p>
</form>

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>../..</relativePath>
</parent>

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -8,7 +8,7 @@
<parent>
<artifactId>dspace-parent</artifactId>
<groupId>org.dspace</groupId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -158,6 +158,11 @@ public class DSpaceOAIDataProvider extends HttpServlet
"Requested OAI context \""
+ request.getPathInfo().replace("/", "")
+ "\" does not exist");
} finally {
if(context != null && context.isValid())
{
context.abort();
}
}
}

View File

@@ -7,13 +7,14 @@
*/
package org.dspace.xoai.util;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import java.util.TimeZone;
/**
*
@@ -33,8 +34,8 @@ public class DateUtils
// 2008-01-01T00:00:00Z
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.'000Z'");
if (!init) sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.'999Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String ret = sdf.format(date);
System.out.println(ret);
return ret;
}

View File

@@ -728,14 +728,20 @@
</td>
<td class="clear"></td>
</tr>
<tr class="info">
<td class="name">Description</td>
<td class="value">
<xsl:value-of
select="oai:OAI-PMH/oai:Identify/oai:description/node()/text()" />
</td>
<td class="clear"></td>
</tr>
<tr class="info">
<td class="name">Repository identifier</td>
<td class="value">
<xsl:value-of select="oai:OAI-PMH/oai:Identify/oai:description//*[local-name() = 'repositoryIdentifier']/text()" />
</td>
<td class="clear"></td>
</tr>
<tr class="info">
<td class="name">Sample identifier</td>
<td class="value">
<xsl:value-of select="oai:OAI-PMH/oai:Identify/oai:description//*[local-name() = 'sampleIdentifier']/text()" />
</td>
<td class="clear"></td>
</tr>
<tr>
<td class="separator"></td>
</tr>

View File

@@ -3,14 +3,14 @@
<groupId>org.dspace</groupId>
<artifactId>dspace-rest</artifactId>
<packaging>war</packaging>
<version>4.0</version>
<version>4.3</version>
<name>DSpace RESTful web services API</name>
<url>http://demo.dspace.org</url>
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -36,7 +36,6 @@ import java.sql.SQLException;
@Path("/bitstreams")
public class BitstreamResource {
Logger log = Logger.getLogger(BitstreamResource.class);
private static org.dspace.core.Context context;
private static final boolean writeStatistics;
@@ -50,12 +49,9 @@ public class BitstreamResource {
@Path("/{bitstream_id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Bitstream getBitstream(@PathParam("bitstream_id") Integer bitstream_id, @QueryParam("expand") String expand) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid()) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Bitstream bitstream = org.dspace.content.Bitstream.find(context, bitstream_id);
@@ -67,6 +63,14 @@ public class BitstreamResource {
} catch(SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
@@ -75,17 +79,14 @@ public class BitstreamResource {
public javax.ws.rs.core.Response getFile(@PathParam("bitstream_id") final Integer bitstream_id,
@QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("xforwarderfor") String xforwarderfor,
@Context HttpHeaders headers, @Context HttpServletRequest request) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Bitstream bitstream = org.dspace.content.Bitstream.find(context, bitstream_id);
if(AuthorizeManager.authorizeActionBoolean(context, bitstream, org.dspace.core.Constants.READ)) {
if(writeStatistics){
writeStats(bitstream_id, user_ip, user_agent, xforwarderfor, headers, request);
writeStats(context, bitstream_id, user_ip, user_agent, xforwarderfor, headers, request);
}
return Response.ok(bitstream.retrieve()).type(bitstream.getFormat().getMIMEType()).build();
@@ -102,10 +103,18 @@ public class BitstreamResource {
} catch (AuthorizeException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
private void writeStats(Integer bitstream_id, String user_ip, String user_agent,
private void writeStats(org.dspace.core.Context context, Integer bitstream_id, String user_ip, String user_agent,
String xforwarderfor, HttpHeaders headers,
HttpServletRequest request) {

View File

@@ -37,11 +37,8 @@ http://localhost:8080/<webapp>/collections
@Path("/collections")
public class CollectionsResource {
private static Logger log = Logger.getLogger(CollectionsResource.class);
@javax.ws.rs.core.Context ServletContext servletContext;
private static org.dspace.core.Context context;
private static final boolean writeStatistics;
@@ -49,46 +46,13 @@ public class CollectionsResource {
writeStatistics=ConfigurationManager.getBooleanProperty("rest","stats",false);
}
/*
The "GET" annotation indicates this method will respond to HTTP Get requests.
The "Produces" annotation indicates the MIME response the method will return.
*/
@GET
@Path("/")
@Produces(MediaType.TEXT_HTML)
public String listHTML() {
StringBuilder everything = new StringBuilder();
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
org.dspace.content.Collection[] collections = org.dspace.content.Collection.findAll(context);
for(org.dspace.content.Collection collection : collections) {
//TODO check auth...
everything.append("<li><a href='" + servletContext.getContextPath() + "/collections/" + collection.getID() + "'>" + collection.getID() + " - " + collection.getName() + "</a></li>\n");
}
return "<html><title>Hello!</title><body>Collections<br/><ul>" + everything.toString() + "</ul>.</body></html> ";
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
@GET
@Path("/")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public org.dspace.rest.common.Collection[] list(@QueryParam("expand") String expand, @QueryParam("limit") @DefaultValue("100") Integer limit, @QueryParam("offset") @DefaultValue("0") Integer offset) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Collection[] collections;
@@ -112,6 +76,14 @@ public class CollectionsResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
@@ -122,17 +94,14 @@ public class CollectionsResource {
@QueryParam("limit") @DefaultValue("100") Integer limit, @QueryParam("offset") @DefaultValue("0") Integer offset,
@QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("xforwarderfor") String xforwarderfor,
@Context HttpHeaders headers, @Context HttpServletRequest request) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Collection collection = org.dspace.content.Collection.find(context, collection_id);
if(AuthorizeManager.authorizeActionBoolean(context, collection, org.dspace.core.Constants.READ)) {
if(writeStatistics){
writeStats(collection_id, user_ip, user_agent, xforwarderfor, headers, request);
writeStats(context, collection_id, user_ip, user_agent, xforwarderfor, headers, request);
}
return new org.dspace.rest.common.Collection(collection, expand, context, limit, offset);
} else {
@@ -141,10 +110,18 @@ public class CollectionsResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
private void writeStats(Integer collection_id, String user_ip, String user_agent,
private void writeStats(org.dspace.core.Context context, Integer collection_id, String user_ip, String user_agent,
String xforwarderfor, HttpHeaders headers,
HttpServletRequest request) {

View File

@@ -36,52 +36,19 @@ http://localhost:8080/<webapp>/communities
public class CommunitiesResource {
private static Logger log = Logger.getLogger(CommunitiesResource.class);
private static org.dspace.core.Context context;
private static final boolean writeStatistics;
static{
writeStatistics=ConfigurationManager.getBooleanProperty("rest","stats",false);
}
/*
The "GET" annotation indicates this method will respond to HTTP Get requests.
The "Produces" annotation indicates the MIME response the method will return.
*/
@GET
@Produces(MediaType.TEXT_HTML)
public String list() {
StringBuilder everything = new StringBuilder();
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
org.dspace.content.Community[] communities = org.dspace.content.Community.findAllTop(context);
for(org.dspace.content.Community community : communities) {
everything.append(community.getName() + "<br/>\n");
}
return "<html><title>Hello!</title><body>Communities:<br/>" + everything.toString() + ".</body></html> ";
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
//TODO Respond to html for communities/:id
@GET
@Path("/")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public org.dspace.rest.common.Community[] list(@QueryParam("expand") String expand) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Community[] topCommunities = org.dspace.content.Community.findAllTop(context);
ArrayList<org.dspace.rest.common.Community> communityArrayList = new ArrayList<org.dspace.rest.common.Community>();
@@ -98,7 +65,15 @@ public class CommunitiesResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} //finally?
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
@GET
@@ -107,17 +82,14 @@ public class CommunitiesResource {
public org.dspace.rest.common.Community getCommunity(@PathParam("community_id") Integer community_id, @QueryParam("expand") String expand,
@QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("xforwarderfor") String xforwarderfor,
@Context HttpHeaders headers, @Context HttpServletRequest request) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Community community = org.dspace.content.Community.find(context, community_id);
if(AuthorizeManager.authorizeActionBoolean(context, community, org.dspace.core.Constants.READ)) {
if(writeStatistics){
writeStats(community_id, user_ip, user_agent, xforwarderfor, headers, request);
writeStats(context, community_id, user_ip, user_agent, xforwarderfor, headers, request);
}
return new org.dspace.rest.common.Community(community, expand, context);
} else {
@@ -126,10 +98,18 @@ public class CommunitiesResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} //finally?
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
private void writeStats(Integer community_id, String user_ip, String user_agent,
private void writeStats(org.dspace.core.Context context, Integer community_id, String user_ip, String user_agent,
String xforwarderfor, HttpHeaders headers,
HttpServletRequest request) {

View File

@@ -32,18 +32,14 @@ import java.sql.SQLException;
@Path("/handle")
public class HandleResource {
private static Logger log = Logger.getLogger(HandleResource.class);
private static org.dspace.core.Context context;
@GET
@Path("/{prefix}/{suffix}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public org.dspace.rest.common.DSpaceObject getObject(@PathParam("prefix") String prefix, @PathParam("suffix") String suffix, @QueryParam("expand") String expand) {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid() ) {
context = new Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.DSpaceObject dso = HandleManager.resolveToObject(context, prefix + "/" + suffix);
if(dso == null) {
@@ -68,6 +64,14 @@ public class HandleResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
}

View File

@@ -44,28 +44,22 @@ public class ItemsResource {
private static final Logger log = Logger.getLogger(ItemsResource.class);
//ItemList - Not Implemented
private static org.dspace.core.Context context;
@GET
@Path("/{item_id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public org.dspace.rest.common.Item getItem(@PathParam("item_id") Integer item_id, @QueryParam("expand") String expand,
@QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("xforwarderfor") String xforwarderfor,
@Context HttpHeaders headers, @Context HttpServletRequest request) throws WebApplicationException {
org.dspace.core.Context context = null;
try {
if(context == null || !context.isValid()) {
context = new org.dspace.core.Context();
//Failed SQL is ignored as a failed SQL statement, prevent: current transaction is aborted, commands ignored until end of transaction block
context.getDBConnection().setAutoCommit(true);
}
context = new org.dspace.core.Context();
org.dspace.content.Item item = org.dspace.content.Item.find(context, item_id);
if(AuthorizeManager.authorizeActionBoolean(context, item, org.dspace.core.Constants.READ)) {
if(writeStatistics){
writeStats(item_id, user_ip, user_agent, xforwarderfor, headers, request);
writeStats(context, item_id, user_ip, user_agent, xforwarderfor, headers, request);
}
return new org.dspace.rest.common.Item(item, expand, context);
} else {
@@ -75,11 +69,19 @@ public class ItemsResource {
} catch (SQLException e) {
log.error(e.getMessage());
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
} finally {
if(context != null) {
try {
context.complete();
} catch (SQLException e) {
log.error(e.getMessage() + " occurred while trying to close");
}
}
}
}
private void writeStats(Integer item_id, String user_ip, String user_agent,
private void writeStats(org.dspace.core.Context context, Integer item_id, String user_ip, String user_agent,
String xforwarderfor, HttpHeaders headers,
HttpServletRequest request) {

View File

@@ -9,7 +9,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
</parent>
<properties>

View File

@@ -20,7 +20,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>
@@ -126,6 +126,11 @@
<artifactId>solr-solrj</artifactId>
<version>${solr.version}</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-cell</artifactId>
<version>${solr.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>

View File

@@ -15,7 +15,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -13,7 +13,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -707,7 +707,7 @@ public class ConfigurableBrowse extends AbstractDSpaceTransformer implements
// This is so that we can then highlight the correct option in the navigation
SortOption bso = bi.getSortOption();
SortOption so = SortOption.getSortOption(sortBy);
if ( bso != null && bso.equals(so))
if ( bso != null && !bso.equals(so))
{
BrowseIndex newBi = BrowseIndex.getBrowseIndex(so);
if (newBi != null)

View File

@@ -12,6 +12,7 @@ import com.yahoo.platform.yui.compressor.JavaScriptCompressor;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.ResourceNotFoundException;
import org.apache.cocoon.environment.*;
import org.apache.cocoon.reading.ResourceReader;
import org.apache.excalibur.source.Source;
@@ -69,10 +70,19 @@ public class ConcatenationReader extends ResourceReader {
// setup list of sources, get relevant parts of path
this.inputSources = new ArrayList<Source>();
String path = src.substring(0, src.lastIndexOf('/'));
// Check for an empty path
String path = "";
if(src.contains("/"))
{
path = src.substring(0, src.lastIndexOf('/'));
}
String file = src.substring(src.lastIndexOf('/')+1);
// now build own list of inputsources
// Now build own list of inputsources
// Several files may be passed in at once, e.g.
// "themes/Mirage/lib/css/reset,base,helper,style,print.css"
// So, we need to build the fullPath to *each* file individually
String[] files = file.split(",");
for (String f : files) {
if (file.endsWith(".json") && !f.endsWith(".json")) {
@@ -85,8 +95,21 @@ public class ConcatenationReader extends ResourceReader {
f += ".css";
}
String fullPath = path + "/" + f;
this.inputSources.add(resolver.resolveURI(fullPath));
// Build full path to this individual file
String fullPath;
if(!path.isEmpty())
fullPath = path + "/" + f;
else
fullPath = f;
// Add to list of inputsources if this file exists
Source inSource = resolver.resolveURI(fullPath);
if(inSource.exists())
{
this.inputSources.add(inSource);
}
else // else throw a ResourceNotFound (which triggers a 404)
throw new ResourceNotFoundException("Resource not found (" + fullPath + ")");
}
// do super stuff

View File

@@ -0,0 +1,68 @@
package org.dspace.app.xmlui.cocoon;
import java.io.IOException;
import java.util.Map;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ResourceNotFoundException;
import org.apache.cocoon.reading.ResourceReader;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.caching.CacheableProcessingComponent;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.excalibur.source.Source;
import org.xml.sax.SAXException;
/**
* The SafeResourceReader blocks access to specific paths which we do NOT want
* to be readable on the web. By default, the Cocoon ResourceReader just loads
* whatever local file you request, which is not very secure and exposes XMLUI
* to possible directory traversal vulnerabilities (when encoded dots or slashes
* are passed on the URL).
*/
public class SafeResourceReader extends ResourceReader
implements CacheableProcessingComponent, Configurable {
/**
* Setup the reader.
* The resource is opened to get an <code>InputStream</code>,
* the length and the last modification date
*/
@Override
public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
throws ProcessingException, SAXException, IOException {
// If the requested path includes any of the following strings/characters
// then block access and return "Resource Not Found"
if(src != null && (
// %252e = double encoded dot (.)
src.toLowerCase().contains("%252e") ||
// %2e = encoded dot (.)
src.toLowerCase().contains("%2e") ||
// %2f = encoded slash (/)
src.toLowerCase().contains("%2f") ||
// block public access to all Cocoon Sitemaps (*.xmap)
src.toLowerCase().contains(".xmap") ||
// block public access to all Theme XSLs
src.toLowerCase().contains(".xsl")
))
{
// Block access by throwing a ResourceNotFound (triggers a 404)
throw new ResourceNotFoundException("Resource not found (" + src + ")");
}
// See if this resource actually exists by attempting to resolve it
// If not, throw a ResourceNotFound (triggers a 404)
Source resource = resolver.resolveURI(src);
if(!resource.exists())
{
throw new ResourceNotFoundException("Resource not found (" + src + ")");
}
// Otherwise, simply load the requested resource via ResourceReader
super.setup(resolver, objectModel, src, par);
}
}

View File

@@ -2120,6 +2120,7 @@
<message key="xmlui.dri2xhtml.METS-1.0.item-files-view">View</message>
<message key="xmlui.dri2xhtml.METS-1.0.item-files-description">Description</message>
<message key="xmlui.dri2xhtml.METS-1.0.item-files-viewOpen">View/<wbr/>Open</message>
<message key="xmlui.dri2xhtml.METS-1.0.item-files-access-rights">Read access available for</message>
<message key="xmlui.dri2xhtml.METS-1.0.item-no-files">There are no files associated with this item.</message>
<message key="xmlui.dri2xhtml.METS-1.0.size-bytes">bytes</message>

View File

@@ -184,7 +184,7 @@
<map:selector name="AuthenticatedSelector" src="org.dspace.app.xmlui.aspect.general.AuthenticatedSelector"/>
</map:selectors>
<map:readers default="resource">
<map:reader name="resource" src="org.apache.cocoon.reading.ResourceReader"
<map:reader name="resource" src="org.dspace.app.xmlui.cocoon.SafeResourceReader"
logger="sitemap.reader.resource" pool-max="32">
<expires>3600000</expires> <!-- 1000 * 60 * 60 = 3600000 = One hour -->
</map:reader>

View File

@@ -65,8 +65,8 @@
}
orderElement.val(newOrder);
var upArrow = row.find('input[name$^="submit_order_"][name$="_up"]');
var downArrow = row.find('input[name$^="submit_order_"][name$="_down"]');
var upArrow = row.find('input[name^="submit_order_"][name$="_up"]');
var downArrow = row.find('input[name^="submit_order_"][name$="_down"]');
//Check if we are the first row, if so hide the up arrow
if(isBundleRow(row.prev())){
@@ -93,7 +93,11 @@
*/
function isBundleRow(row){
// Checks if the identifier starts with the bundle head identifier
return row.attr("id").indexOf("aspect_administrative_item_EditItemBitstreamsForm_row_bundle_head_") == 0;
//DS-2027, found error condition in which attribute is not set when reordering original bitstreams
var id = row.attr("id");
if (id === undefined) return false;
return id.indexOf("aspect_administrative_item_EditItemBitstreamsForm_row_bundle_head_") == 0;
}

View File

@@ -539,11 +539,15 @@
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="alt-text"><i18n:text>xmlui.dri2xhtml.METS-1.0.item-files-access-rights</i18n:text> <xsl:value-of select="$users"/></xsl:variable>
<xsl:choose>
<xsl:when test="(not ($rights_context/@CONTEXTCLASS = 'GENERAL PUBLIC') and ($rights_context/rights:Permissions/@DISPLAY = 'true')) or not ($rights_context)">
<a href="{mets:FLocat[@LOCTYPE='URL']/@xlink:href}">
<img width="64" height="64" src="{concat($theme-path,'/images/Crystal_Clear_action_lock3_64px.png')}" title="Read access available for {$users}"/>
<img width="64" height="64" src="{concat($theme-path,'/images/Crystal_Clear_action_lock3_64px.png')}">
<xsl:attribute name="title"><xsl:value-of select="$alt-text"/></xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="$alt-text"/></xsl:attribute>
</img>
<!-- icon source: http://commons.wikimedia.org/wiki/File:Crystal_Clear_action_lock3.png -->
</a>
</xsl:when>

View File

@@ -222,11 +222,15 @@
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="alt-text"><i18n:text>xmlui.dri2xhtml.METS-1.0.item-files-access-rights</i18n:text> <xsl:value-of select="$users"/></xsl:variable>
<xsl:choose>
<xsl:when test="not ($rights_context/@CONTEXTCLASS = 'GENERAL PUBLIC') and ($rights_context/rights:Permissions/@DISPLAY = 'true')">
<a href="{mets:FLocat[@LOCTYPE='URL']/@xlink:href}">
<img width="64" height="64" src="{concat($theme-path,'/images/Crystal_Clear_action_lock3_64px.png')}" title="Read access available for {$users}"/>
<img width="64" height="64" src="{concat($theme-path,'/images/Crystal_Clear_action_lock3_64px.png')}">
<xsl:attribute name="title"><xsl:value-of select="$alt-text"/></xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="$alt-text"/></xsl:attribute>
</img>
<!-- icon source: http://commons.wikimedia.org/wiki/File:Crystal_Clear_action_lock3.png -->
</a>
</xsl:when>

View File

@@ -133,12 +133,6 @@
<xsl:attribute name="src">
<xsl:value-of select="$mobile-url"/>
<xsl:text>/themes/mobile/lib/cookies.js</xsl:text>
</xsl:attribute>&#160;</script>
<script>
<xsl:attribute name="src">
<xsl:value-of select="$mobile-url"/>
<xsl:text>/themes/mobile/lib/m-tweaks.js</xsl:text>
</xsl:attribute>&#160;</script>
<!-- Add the title in -->
@@ -694,7 +688,7 @@
</xsl:attribute>
<img alt="Thumbnail">
<xsl:attribute name="src">
<xsl:variable name="request-uri" select="/dri:document/dri:meta/dri:pageMeta/dri:metadata[@element='contextPath'])"/>
<xsl:variable name="request-uri" select="/dri:document/dri:meta/dri:pageMeta/dri:metadata[@element='contextPath']"/>
<xsl:text>/themes/mobile/lib/images/default-thumbnail.png</xsl:text>
</xsl:attribute>
</img>

View File

@@ -61,6 +61,12 @@ else
fi
# If the user only wants the CLASSPATH, just give it now.
if [ "$1" = "classpath" ]; then
echo $FULLPATH
exit 0
fi
#Allow user to specify java options through JAVA_OPTS variable

View File

@@ -1 +1,6 @@
<XOAIDescription xmlns="http://www.lyncode.com/XOAIConfiguration">XOAI: OAI-PMH Java Toolkit</XOAIDescription>
<oai-identifier xmlns="http://www.openarchives.org/OAI/2.0/oai-identifier" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai-identifier http://www.openarchives.org/OAI/2.0/oai-identifier.xsd">
<scheme>oai</scheme>
<repositoryIdentifier>${dspace.hostname}</repositoryIdentifier>
<delimiter>:</delimiter>
<sampleIdentifier>oai:${dspace.hostname}:${handle.prefix}/1234</sampleIdentifier>
</oai-identifier>

View File

@@ -9,78 +9,89 @@
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.lyncode.com/xoai" version="1.0">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes" />
xmlns:doc="http://www.lyncode.com/xoai"
xmlns:dim="http://www.dspace.org/xmlns/dspace/dim" version="1.0">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/>
<!-- An identity transformation to show the internal XOAI generated XML -->
<xsl:template match="/">
<dim:dim xmlns:dim="http://www.dspace.org/xmlns/dspace/dim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.dspace.org/xmlns/dspace/dim http://www.dspace.org/schema/dim.xsd">
<xsl:apply-templates select="//doc:field[@name='value']"/>
</dim:dim>
</xsl:template>
<xsl:template match="/doc:metadata/doc:element[@name='dc']/doc:element/doc:element/doc:field[@name='value']">
<xsl:call-template name="dimfield">
<xsl:with-param name="mdschema" select="../../../@name"/>
<xsl:with-param name="element" select="../../@name"/>
<xsl:with-param name="qualifier"/>
<xsl:with-param name="language" select="../@name"/>
<xsl:with-param name="authority" select="../doc:field[@name='authority']"/>
<xsl:with-param name="confidence" select="../doc:field[@name='confidence']"/>
<xsl:with-param name="value" select="text()"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="/doc:metadata/doc:element[@name='dc']/doc:element/doc:element/doc:element/doc:field[@name='value']">
<xsl:call-template name="dimfield">
<xsl:with-param name="mdschema" select="../../../../@name"/>
<xsl:with-param name="element" select="../../../@name"/>
<xsl:with-param name="qualifier" select="../../@name"/>
<xsl:with-param name="language" select="../@name" />
<xsl:with-param name="authority" select="../doc:field[@name='authority']"/>
<xsl:with-param name="confidence" select="../doc:field[@name='confidence']"/>
<xsl:with-param name="value" select="text()"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="dimfield">
<xsl:param name="mdschema"/>
<xsl:param name="element"/>
<xsl:param name="qualifier"/>
<xsl:param name="language"/>
<xsl:param name="authority"/>
<xsl:param name="confidence"/>
<xsl:param name="value"/>
<dim:field>
<xsl:attribute name="mdschema">
<xsl:value-of select="$mdschema"/>
</xsl:attribute>
<xsl:attribute name="element">
<xsl:value-of select="$element"/>
</xsl:attribute>
<xsl:if test="$qualifier">
<xsl:attribute name="qualifier">
<xsl:value-of select="$qualifier"/>
</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$language='none'"/>
<xsl:otherwise>
<xsl:attribute name="lang">
<xsl:value-of select="$language"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$authority">
<xsl:attribute name="authority">
<xsl:value-of select="$authority"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$confidence">
<xsl:attribute name="confidence">
<xsl:value-of select="$confidence"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="$value"/>
</dim:field>
</xsl:template>
<!-- An identity transformation to show the internal XOAI generated XML -->
<xsl:template match="/">
<dim:dim xmlns:dim="http://www.dspace.org/xmlns/dspace/dim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.dspace.org/xmlns/dspace/dim http://www.dspace.org/schema/dim.xsd">
<xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element/doc:element">
<xsl:choose>
<xsl:when test="doc:element">
<dim:field>
<xsl:attribute name="mdschema">
<xsl:value-of select="../../@name" />
</xsl:attribute>
<xsl:attribute name="element">
<xsl:value-of select="../@name" />
</xsl:attribute>
<xsl:attribute name="qualifier">
<xsl:value-of select="@name" />
</xsl:attribute>
<xsl:choose>
<xsl:when test="doc:element[@name='none']"></xsl:when>
<xsl:otherwise>
<xsl:attribute name="lang">
<xsl:value-of select="doc:element/@name" />
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="doc:element/doc:field[@name='authority']">
<xsl:attribute name="authority">
<xsl:value-of select="doc:element/doc:field[@name='authority']/text()" />
</xsl:attribute>
</xsl:if>
<xsl:if test="doc:element/doc:field[@name='confidence']">
<xsl:attribute name="confidence">
<xsl:value-of select="doc:element/doc:field[@name='confidence']/text()" />
</xsl:attribute>
</xsl:if>
<xsl:value-of select="doc:element/doc:field[@name='value']/text()"></xsl:value-of>
</dim:field>
</xsl:when>
<xsl:otherwise>
<dim:field>
<xsl:attribute name="mdschema">
<xsl:value-of select="../../@name" />
</xsl:attribute>
<xsl:attribute name="element">
<xsl:value-of select="../@name" />
</xsl:attribute>
<xsl:choose>
<xsl:when test="@name='none'"></xsl:when>
<xsl:otherwise>
<xsl:attribute name="lang">
<xsl:value-of select="@name" />
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="doc:field[@name='authority']">
<xsl:attribute name="authority">
<xsl:value-of select="doc:field[@name='authority']/text()" />
</xsl:attribute>
</xsl:if>
<xsl:if test="doc:field[@name='confidence']">
<xsl:attribute name="confidence">
<xsl:value-of select="doc:field[@name='confidence']/text()" />
</xsl:attribute>
</xsl:if>
<xsl:value-of select="doc:field[@name='value']/text()"></xsl:value-of>
</dim:field>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</dim:dim>
</xsl:template>
</xsl:stylesheet>

View File

@@ -830,6 +830,10 @@ webui.submit.blocktheses = false
# Defaults to true; If set to 'false', submitter has option to skip upload
#webui.submit.upload.required = true
# Whether to enable the AJAX-based upload progress meter. Defaults to
# 'true'.
#webui.submit.upload.ajax = true
# Whether or not to use the 'advanced' form of the access step.
# Defaults to false, ie the simple form is used.
#webui.submission.restrictstep.enableAdvancedForm = false

View File

@@ -391,12 +391,16 @@ it, please enter the types and the actual numbers or codes below.</hint>
<displayed-value>Chinese</displayed-value>
<stored-value>zh</stored-value>
</pair>
<pair>
<displayed-value>Turkish</displayed-value>
<stored-value>tr</stored-value>
</pair>
<pair>
<displayed-value>(Other)</displayed-value>
<stored-value>other</stored-value>
</pair>
</value-pairs>
</form-value-pairs>
</form-value-pairs>
</input-forms>

View File

@@ -1,6 +1,6 @@
# Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE
log4j.rootLogger=INFO, file
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

View File

@@ -137,6 +137,12 @@ lastname-header = SHIB-SURNAME
# If the eperson metadata field is not found, should it be automatically created?
eperson.metadata.autocreate = true;
# Shibboleth attributes are by default UTF-8 encoded. Some servlet container
# automatically converts the attributes from ISO-8859-1 (latin-1) to UTF-8.
# As the attributes already were UTF-8 encoded it may be necessary to reconvert
# them. If you detect problems with special characters in shibboleth attributes
# set this to true (default to false).
reconvert.attributes = false
##
## Role-based Groups:

View File

@@ -235,6 +235,32 @@
<property name="useAsHomePage" value="false"/>
</bean>
</property>
<property name="hitHighlightingConfiguration">
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightingConfiguration">
<property name="metadataFields">
<list>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.title"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.contributor.author"/>
<property name="snippets" value="5"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="dc.description.abstract"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
<bean class="org.dspace.discovery.configuration.DiscoveryHitHighlightFieldConfiguration">
<property name="field" value="fulltext"/>
<property name="maxSize" value="250"/>
<property name="snippets" value="2"/>
</bean>
</list>
</property>
</bean>
</property>
<!-- When true a "did you mean" example will be displayed, value can be true or false -->
<property name="spellCheckEnabled" value="true"/>
</bean>

Binary file not shown.

View File

@@ -80,6 +80,8 @@ DROP TABLE harvested_item;
DROP TABLE Group2GroupCache;
DROP TABLE Group2Group;
DROP TABLE FileExtension;
DROP TABLE webapp;
DROP TABLE requestitem;
-- Drop main object tables near end as many other tables have dependencies on them
DROP TABLE versionitem;
DROP TABLE versionhistory;
@@ -132,6 +134,8 @@ DROP SEQUENCE harvested_collection_seq;
DROP SEQUENCE harvested_item_seq;
DROP SEQUENCE versionhistory_seq;
DROP SEQUENCE versionitem_seq;
DROP SEQUENCE webapp_seq;
DROP SEQUENCE requestitem_seq;
-- Drop the getnextid() function
DROP FUNCTION getnextid;

View File

@@ -47,7 +47,7 @@ CREATE TABLE Webapp
(
webapp_id INTEGER NOT NULL PRIMARY KEY,
AppName VARCHAR2(32),
URL VARCHAR2,
URL VARCHAR2(1000),
Started TIMESTAMP,
isUI NUMBER(1)
);
@@ -62,7 +62,7 @@ CREATE TABLE requestitem
(
requestitem_id INTEGER NOT NULL,
token varchar(48),
item_id INDEX,
item_id INTEGER,
bitstream_id INTEGER,
allfiles NUMBER(1),
request_email VARCHAR2(64),
@@ -87,4 +87,4 @@ update workflowitem set multiple_titles=1, published_before=1, multiple_files=1;
-- DS-1811 Removing a collection fails if non-Solr DAO has been used before for item count
-------------------------------------------------------
delete from collection_item_count;
delete from community_item_count;
delete from community_item_count;

View File

@@ -121,7 +121,7 @@ DELETE FROM resourcepolicy
WHERE resource_type_id = 0 AND resource_id IN
(SELECT bundle2bitstream.bitstream_id FROM
((workflowitem INNER JOIN item2bundle ON workflowitem.item_id = item2bundle.item_id)
INNER JOIN bundle2bitstream ON item2bundle.bundle_id = bundle2bitstream.bundle_id);
INNER JOIN bundle2bitstream ON item2bundle.bundle_id = bundle2bitstream.bundle_id));
-- Create policies for claimtasks
-- public static final int BITSTREAM = 0;
-- public static final int BUNDLE = 1;
@@ -137,7 +137,7 @@ WHERE resource_type_id = 0 AND resource_id IN
-- Create a temporarty table with action ID's
CREATE TABLE temptable(
action_id INTEGER PRIMARY KEY
)
);
INSERT ALL
INTO temptable (action_id) VALUES (0)
INTO temptable (action_id) VALUES (1)
@@ -266,11 +266,11 @@ FROM (((cwf_workflowitem INNER JOIN item ON cwf_workflowitem.item_id = item.item
);
-- TODO: not tested yet
INSERT INTO cwf_in_progress_user (in_progress_user_id, workflowitem_id, step_id, user_id, finished)
INSERT INTO cwf_in_progress_user (in_progress_user_id, workflowitem_id, user_id, finished)
SELECT
cwf_in_progress_user_seq.nextval AS in_progress_user_id,
cwf_workflowitem.item_id AS workflowitem_id,
cwf_claimtask.owner_id AS user_id
cwf_workflowitem.workflowitem_id AS workflowitem_id,
cwf_claimtask.owner_id AS user_id,
0 as finished
FROM
(cwf_claimtask INNER JOIN cwf_workflowitem ON cwf_workflowitem.workflowitem_id = cwf_claimtask.workflowitem_id);

View File

@@ -5,58 +5,55 @@ CREATE SEQUENCE cwf_claimtask_seq;
CREATE SEQUENCE cwf_in_progress_user_seq;
CREATE SEQUENCE cwf_pooltask_seq;
CREATE TABLE cwf_workflowitem
(
workflowitem_id INTEGER PRIMARY KEY,
item_id INTEGER REFERENCES item(item_id) UNIQUE,
collection_id INTEGER REFERENCES collection(collection_id),
--
-- Answers to questions on first page of submit UI
multiple_titles NUMBER(1),
published_before NUMBER(1),
multiple_files NUMBER(1)
-- Note: stage reached not applicable here - people involved in workflow
-- can always jump around submission UI
);
-- TODO: it seems like this index is already created by the 'unique' constraint in the table creation
-- CREATE INDEX xmlwf_wf_item_fk_idx ON xmlwf_workflowitem(item_id);
CREATE INDEX xmlwf_wf_coll_fk_idx ON xmlwf_workflowitem(collection_id);
CREATE INDEX cwf_workflowitem_coll_fk_idx ON cwf_workflowitem(collection_id);
CREATE TABLE xmlwf_collectionrole (
CREATE TABLE cwf_collectionrole (
collectionrole_id INTEGER PRIMARY KEY,
role_id VARCHAR2(256),
collection_id integer REFERENCES collection(collection_id),
group_id integer REFERENCES epersongroup(eperson_group_id)
);
ALTER TABLE xmlwf_collectionrole ADD CONSTRAINT xmlwf_collectionrole_unique UNIQUE (role_id, collection_id, group_id);
ALTER TABLE cwf_collectionrole
ADD CONSTRAINT cwf_collectionrole_unique UNIQUE (role_id, collection_id, group_id);
CREATE INDEX xmlwf_cr_coll_role_fk_idx ON xmlwf_collectionrole(collection_id,role_id);
CREATE INDEX xmlwf_cr_coll_fk_idx ON xmlwf_collectionrole(collection_id);
CREATE INDEX cwf_cr_coll_role_fk_idx ON cwf_collectionrole(collection_id,role_id);
CREATE INDEX cwf_cr_coll_fk_idx ON cwf_collectionrole(collection_id);
CREATE TABLE xmlwf_workflowitemrole (
CREATE TABLE cwf_workflowitemrole (
workflowitemrole_id INTEGER PRIMARY KEY,
role_id VARCHAR2(256),
workflowitem_id integer REFERENCES xmlwf_workflowitem(workflowitem_id),
workflowitem_id integer REFERENCES cwf_workflowitem(workflowitem_id),
eperson_id integer REFERENCES eperson(eperson_id),
group_id integer REFERENCES epersongroup(eperson_group_id)
);
ALTER TABLE cwf_workflowitemrole
ADD CONSTRAINT cwf_workflowitemrole_unique UNIQUE (role_id, workflowitem_id, eperson_id, group_id);
ALTER TABLE xmlwf_workflowitemrole
ADD CONSTRAINT xmlwf_workflowitemrole_unique UNIQUE (role_id, workflowitem_id, eperson_id);
CREATE INDEX cwf_wfir_item_role_fk_idx ON cwf_workflowitemrole(workflowitem_id,role_id);
CREATE INDEX cwf_wfir_item_fk_idx ON cwf_workflowitemrole(workflowitem_id);
CREATE INDEX xmlwf_wfir_item_role_fk_idx ON xmlwf_workflowitemrole(workflowitem_id,role_id);
CREATE INDEX xmlwf_wfir_item_fk_idx ON xmlwf_workflowitemrole(workflowitem_id);
CREATE TABLE xmlwf_pooltask (
CREATE TABLE cwf_pooltask (
pooltask_id INTEGER PRIMARY KEY,
workflowitem_id INTEGER REFERENCES xmlwf_workflowitem(workflowitem_id),
workflowitem_id INTEGER REFERENCES cwf_workflowitem(workflowitem_id),
workflow_id VARCHAR2(256),
step_id VARCHAR2(256),
action_id VARCHAR2(256),
@@ -64,10 +61,11 @@ CREATE TABLE xmlwf_pooltask (
group_id INTEGER REFERENCES epersongroup(eperson_group_id)
);
CREATE INDEX cwf_pt_eperson_fk_idx ON cwf_pooltask(eperson_id);
CREATE INDEX cwf_pt_workflow_fk_idx ON cwf_pooltask(workflowitem_id);
CREATE INDEX cwf_pt_workflow_eperson_fk_idx ON cwf_pooltask(eperson_id,workflowitem_id);
CREATE INDEX cwf_pt_epers_fk_idx ON cwf_pooltask(eperson_id);
CREATE INDEX cwf_pt_wf_fk_idx ON cwf_pooltask(workflowitem_id);
CREATE INDEX cwf_pt_wf_epers_fk_idx ON cwf_pooltask(eperson_id,workflowitem_id);
CREATE TABLE cwf_claimtask (
claimtask_id INTEGER PRIMARY KEY,
@@ -81,27 +79,24 @@ CREATE TABLE cwf_claimtask (
ALTER TABLE cwf_claimtask
ADD CONSTRAINT cwf_claimtask_unique UNIQUE (step_id, workflowitem_id, workflow_id, owner_id, action_id);
CREATE INDEX cwf_ct_wf_fk_idx ON cwf_claimtask(workflowitem_id);
CREATE INDEX cwf_ct_wf_epers_fk_idx ON cwf_claimtask(workflowitem_id,owner_id);
CREATE INDEX cwf_ct_epers_fk_idx ON cwf_claimtask(owner_id);
CREATE INDEX cwf_ct_wf_step_fk_idx ON cwf_claimtask(workflowitem_id,step_id);
CREATE INDEX cwf_ct_wf_step_act_fk_idx ON cwf_claimtask(workflowitem_id,step_id,action_id);
CREATE INDEX cwf_ct_wf_st_ac_ep_fk_idx ON cwf_claimtask(workflowitem_id,step_id,action_id,owner_id);
CREATE INDEX cwf_ct_workflow_fk_idx ON cwf_claimtask(workflowitem_id);
CREATE INDEX cwf_ct_workflow_eperson_fk_idx ON cwf_claimtask(workflowitem_id,owner_id);
CREATE INDEX cwf_ct_eperson_fk_idx ON cwf_claimtask(owner_id);
CREATE INDEX cwf_ct_wfs_fk_idx ON cwf_claimtask(workflowitem_id,step_id);
CREATE INDEX cwf_ct_wfs_action_fk_idx ON cwf_claimtask(workflowitem_id,step_id,action_id);
CREATE INDEX cwf_ct_wfs_action_e_fk_idx ON cwf_claimtask(workflowitem_id,step_id,action_id,owner_id);
CREATE TABLE cwf_in_progress_user (
in_progress_user_id INTEGER PRIMARY KEY,
workflowitem_id integer REFERENCES cwf_workflowitem(workflowitem_id),
user_id integer REFERENCES eperson(eperson_id),
finished NUMBER(1)
finished NUMBER(1) DEFAULT 0
);
ALTER TABLE cwf_in_progress_user
ADD CONSTRAINT cwf_in_progress_user_unique UNIQUE (workflowitem_id, user_id);
CREATE INDEX cwf_ipu_wf_fk_idx ON cwf_in_progress_user(workflowitem_id);
CREATE INDEX cwf_ipu_epers_fk_idx ON cwf_in_progress_user(user_id);
-- TODO: it seems like this index is already created by the 'unique' constraint in the table creation
-- CREATE INDEX xmlwf_ipu_wf_epers_fk_idx ON xmlwf_in_progress_user(workflowitem_id,user_id);
CREATE INDEX cwf_ipu_workflow_fk_idx ON cwf_in_progress_user(workflowitem_id);
CREATE INDEX cwf_ipu_eperson_fk_idx ON cwf_in_progress_user(user_id);

View File

@@ -84,7 +84,7 @@ SELECT setval('metadatavalue_seq', max(metadata_value_id)) FROM metadatavalue;
SELECT setval('metadataschemaregistry_seq', max(metadata_schema_id)) FROM metadataschemaregistry;
SELECT setval('harvested_collection_seq', max(id)) FROM harvested_collection;
SELECT setval('harvested_item_seq', max(id)) FROM harvested_item;
SELECT setval('webapp_seq', max(id)) FROM webapp;
SELECT setval('webapp_seq', max(webapp_id)) FROM webapp;
SELECT setval('requestitem_seq', max(requestitem_id)) FROM requestitem;
-- Handle Sequence is a special case. Since Handles minted by DSpace use the 'handle_seq',

View File

@@ -17,7 +17,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -12,7 +12,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -13,7 +13,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -12,7 +12,7 @@
<parent>
<artifactId>modules</artifactId>
<groupId>org.dspace</groupId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -9,7 +9,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>../../pom.xml</relativePath>
</parent>

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>
@@ -94,7 +94,7 @@
<groupId>org.dspace</groupId>
<artifactId>dspace-rest</artifactId>
<type>war</type>
<version>4.0</version>
<version>4.3</version>
</dependency>
<dependency>

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.dspace.modules</groupId>
<artifactId>solr</artifactId>
<version>4.0</version>
<version>4.3</version>
<packaging>war</packaging>
<name>DSpace SOLR :: Local Customizations</name>
<description>
@@ -13,7 +13,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>
@@ -58,7 +58,7 @@
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-solr</artifactId>
<version>4.0</version>
<version>4.3</version>
<classifier>skinny</classifier>
<type>war</type>
</dependency>
@@ -66,7 +66,7 @@
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-solr</artifactId>
<version>4.0</version>
<version>4.3</version>
<classifier>classes</classifier>
<type>jar</type>
</dependency>

View File

@@ -16,7 +16,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -16,7 +16,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -12,7 +12,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>modules</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -15,7 +15,7 @@
<parent>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<version>4.0</version>
<version>4.3</version>
<relativePath>..</relativePath>
</parent>
@@ -58,23 +58,88 @@
<profiles>
<!-- Default Profile. This builds all Overlay modules for DSpace -->
<!-- Build Profile. This builds all Overlay modules for DSpace -->
<profile>
<id>default</id>
<id>build</id>
<activation>
<activeByDefault>true</activeByDefault>
<!-- Enabled as long as we are NOT creating a zip/tarball distribution -->
<property>
<name>!distributions</name>
</property>
</activation>
<!--
Builds Overlay Modules for DSpace
-->
<modules>
<module>modules</module>
</modules>
</modules>
</profile>
<!--
DSpace Assembly profile. By default this is enabled.
This profile actually builds all submodules and then assembles
the 'dspace-installer' from the resulting JARs/WARs.
See 'assembly.xml' for more info.
This profile can be optionally deactivated by passing '-P!assembly'.
-->
<profile>
<id>assembly</id>
<activation>
<!-- Enabled as long as we are NOT creating a zip/tarball distribution -->
<property>
<name>!distributions</name>
</property>
</activation>
<build>
<plugins>
<!-- Assemble 'target/dspace-installer' using 'assembly.xml' -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<inherited>false</inherited>
<configuration>
<!-- Don't "attach" the assembly results to this project. As
this assembly builds a directory, setting this to "true"
(default value) will just result in a WARNING message.-->
<attach>false</attach>
<finalName>${project.artifactId}</finalName>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- This profile simply determines whether we are creating
zip / tarball distributions to upload to SourceFore or similar.
By running "mvn package -Ddistributions=true" you'll
SKIP normal build & assembly (see above profiles) and
INSTEAD just run the "distributions" profile below. -->
<profile>
<id>build-and-assembly</id>
<activation>
<!-- This profile should be active at all times, unless the user
specifies a different value for "distributions" -->
<property>
<name>!distributions</name>
</property>
</activation>
<properties>
<distributions>false</distributions>
</properties>
</profile>
<!--
Run this profile (e.g. 'mvn package -Pdistributions') to create
Run this profile (e.g. 'mvn package -Ddistributions=true') to create
zip / tarball distributions to upload to SourceForge or similar.
When this profile is run, DSpace is NOT compiled as normal.
Instead, a zip/tarball is generated from the parent [dspace-src] directory.
@@ -82,7 +147,11 @@
<profile>
<id>distributions</id>
<activation>
<activeByDefault>false</activeByDefault>
<!-- Only enabled if "distributions=true" was passed on commandline -->
<property>
<name>distributions</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>

View File

@@ -544,6 +544,7 @@
<field name="a_spell" type="textSpell" />
<copyField source="fulltext" dest="a_spell" />
<copyField source="fulltext" dest="fulltext_hl" />
<!-- used by the DSpace Discovery Solr Indexer to track the last time a document was indexed -->
<field name="SolrIndexer.lastIndexed" type="date" indexed="true" stored="true" default="NOW" multiValued="false" omitNorms="true" />

View File

@@ -1042,13 +1042,13 @@
startup="lazy"
class="solr.extraction.ExtractingRequestHandler" >
<lst name="defaults">
<str name="lowernames">true</str>
<!--<str name="lowernames">true</str>-->
<str name="uprefix">ignored_</str>
<!-- capture link hrefs but ignore div attributes -->
<str name="captureAttr">true</str>
<str name="fmap.a">links</str>
<str name="fmap.div">ignored_</str>
<str name="captureAttr">false</str>
<!--<str name="fmap.a">links</str>-->
<!--<str name="fmap.div">ignored_</str>-->
</lst>
</requestHandler>
@@ -1244,7 +1244,7 @@
<str name="name">default</str>
<str name="field">a_spell</str>
<str name="spellcheckIndexDir">./spellchecker</str>
<str name="buildOnCommit">true</str>
<str name="buildOnOptimize">true</str>
<str name="spellcheck.onlyMorePopular">false</str>
</lst>

View File

@@ -48,7 +48,6 @@
<includes>
<include>bin/**</include>
<include>config/**</include>
<include>docs/**</include>
<include>etc/**</include>
<include>solr/**</include>
</includes>
@@ -82,11 +81,16 @@
<outputDirectory>config</outputDirectory>
<filtered>true</filtered>
</file>
<file>
<source>config/crosswalks/oai/description.xml</source>
<outputDirectory>config</outputDirectory>
<filtered>true</filtered>
</file>
</files>
<!--
Still allow anyone to put a JAR dependency into
[src]/dspace/pom.xml and have it go into 'lib' directory
Copy ALL JAR dependencies specified in [src]/dspace/pom.xml
into the DSpace 'lib' directory.
-->
<dependencySets>
<dependencySet>
@@ -100,30 +104,30 @@
<moduleSets>
<!--
Take all jar modules in [src]/dspace/modules/ dir
and add them into 'lib' directory
Take all JAR modules (and their dependencies) under
[src]/dspace/modules/ dir and add them into 'lib' directory
-->
<moduleSet>
<includes>
<include>*:jar:*</include>
<include>org.dspace.modules:*:jar:*</include>
</includes>
<binaries>
<includeDependencies>true</includeDependencies>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
<!-- Include any dependency JARs as well -->
<dependencySets>
<dependencySet>
<includes>
<include>*:jar:*</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
<!--
Take all war modules (in [src]/dspace/modules/) and explode them into
Take all WAR modules (in [src]/dspace/modules/) and unpack them into
'webapps' directory
-->
<moduleSet>

56
pom.xml
View File

@@ -4,7 +4,7 @@
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<packaging>pom</packaging>
<version>4.0</version>
<version>4.3</version>
<name>DSpace Parent Project</name>
<description>
DSpace open source software is a turnkey institutional repository application.
@@ -20,7 +20,7 @@
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
<version>9</version>
<relativePath />
</parent>
@@ -41,6 +41,14 @@
(NOTE: individual POMs can override specific settings). -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<minmemory>128m</minmemory>
<maxmemory>1g</maxmemory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
@@ -89,6 +97,8 @@
<excludes>
<exclude>**/Abstract*</exclude>
</excludes>
<!-- Detailed logs in reportsDirectory/testName-output.txt instead of stdout -->
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<!--
Enable to debug Maven Surefire tests in remote proces
<debugForkedProcess>true</debugForkedProcess>
@@ -121,7 +131,7 @@
<id>native2ascii-utf8</id>
<phase>generate-resources</phase>
<configuration>
<target name="Encode any UTF-8 chars in [src]/*.properties">
<target name="Encode any UTF-8 chars in properties">
<!-- Run 'native2ascii' to encode UTF-8 characters in properties files. Place the resulting file(s) in /target -->
<native2ascii encoding="UTF8" src="${root.basedir}" dest="${root.basedir}/target" includes="*.properties" />
</target>
@@ -146,7 +156,7 @@
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
<version>2.5</version>
<configuration>
<!-- During release:perform, enable the "release" profile (see below) -->
<releaseProfiles>release</releaseProfiles>
@@ -543,102 +553,102 @@
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-api</artifactId>
<version>4.0</version>
<version>4.3</version>
</dependency>
<dependency>
<groupId>org.dspace.modules</groupId>
<artifactId>additions</artifactId>
<version>4.0</version>
<version>4.3</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-sword</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-sword</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-swordv2</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-swordv2</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-jspui</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-jspui</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-oai</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-oai</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni-client</artifactId>
<version>4.0</version>
<version>4.3</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-xmlui</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-xmlui</artifactId>
<version>4.0</version>
<version>4.3</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-services</artifactId>
<version>4.0</version>
<version>4.3</version>
</dependency>
<!-- DSpace Localization Packages -->
<dependency>
@@ -1309,7 +1319,7 @@
<connection>scm:git:git@github.com:DSpace/DSpace.git</connection>
<developerConnection>scm:git:git@github.com:DSpace/DSpace.git</developerConnection>
<url>git@github.com:DSpace/DSpace.git</url>
<tag>dspace-4.0</tag>
<tag>dspace-4.3</tag>
</scm>
<!--
@@ -1326,8 +1336,8 @@
<repository>
<id>sonatype-releases</id>
<name>Sonatype Releases Repository</name>
<url>http://oss.sonatype.org/content/repositories/releases/</url>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
</repositories>
</project>

View File

@@ -21,43 +21,57 @@
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<!-- First, copy the following from our 'dspace' subfolder assembly project into the
same subdirectory in the final ZIP file. NOTE: We do this in a <fileSet> INSTEAD
of a <moduleSet> so that we don't have to first build the "dspace" module. -->
<fileSets>
<fileSet>
<!-- Copy necessary DSpace subdirectories into Test environment -->
<includes>
<include>dspace/bin/**</include>
<include>dspace/config/**</include>
<include>dspace/etc/**</include>
<include>dspace/solr/**</include>
</includes>
<!-- But, exclude specific configs (which require filtering) -->
<excludes>
<exclude>dspace/config/dspace.cfg</exclude>
<exclude>dspace/config/log4j.properties</exclude>
<exclude>dspace/config/modules/**</exclude>
</excludes>
</fileSet>
<fileSet>
<!-- Copy specific configs (filtering their content) also into Test environment -->
<includes>
<include>dspace/config/modules/**</include>
<include>dspace/config/dspace.cfg</include>
<include>dspace/config/log4j.properties</include>
</includes>
<filtered>true</filtered>
</fileSet>
</fileSets>
<moduleSets>
<!-- Next, search for a 'src/test/data/dspaceFolder' data directory in
ANY of our modules. If found, copy its contents into the same "dspace"
subdirectory in the final ZIP file, as this is data to be used in testing.
NOTE: This *might* overwrite/overlay default files copied from above. -->
<moduleSet>
<includes>
<include>org.dspace:*</include>
</includes>
<sources>
<outputDirectoryMapping>dspace</outputDirectoryMapping>
<fileSets>
<fileSet> <!-- installable DSpace files -->
<directory />
<outputDirectory />
<!-- Copy necessary DSpace subdirectories into Test environment -->
<includes>
<include>bin/**</include>
<include>config/**</include>
<include>etc/**</include>
<include>solr/**</include>
</includes>
<!-- Exclude specific configs (which require filtering) -->
<excludes>
<exclude>config/dspace.cfg</exclude>
<exclude>config/log4j.properties</exclude>
<exclude>config/modules/**</exclude>
</excludes>
</fileSet>
<fileSet> <!-- Copy specific configs (filtering their content) also into Test environment -->
<includes>
<include>config/modules/**</include>
<include>config/dspace.cfg</include>
<include>config/log4j.properties</include>
</includes>
<filtered>true</filtered>
</fileSet>
<fileSet> <!-- test data -->
<fileSet>
<directory>src/test/data/dspaceFolder</directory>
<outputDirectory />
</fileSet>
</fileSets>
</sources>
</moduleSet>
<!-- Finally, copy the 'dspace.cfg.more' from the 'dspace-api' into
the root directory of the ZIP. This config will be merged/weaved
into the default dspace.cfg (see fileweaver maven plugin) -->
<moduleSet>
<includes>
<include>org.dspace:dspace-api</include>