Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • commul/docker/clarin-dspace
1 result
Show changes
Commits on Source (114)
Showing
with 391 additions and 7193 deletions
...@@ -10,3 +10,5 @@ kubernetes/test-postgres-deployment.yaml ...@@ -10,3 +10,5 @@ kubernetes/test-postgres-deployment.yaml
kubernetes/secrets* kubernetes/secrets*
clarin-dev_eurac_edu.key clarin-dev_eurac_edu.key
clarin_eurac_edu.key clarin_eurac_edu.key
**/.release
backup/
...@@ -6,11 +6,76 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ...@@ -6,11 +6,76 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
### Added
### Changed
- Bump DSPACE_APP_VERSION
### Removed
### Fixed
- [nginx] `easy_install supervisor` fails
## [1.4.0] - 2021-01
### Added ### Added
- Use dspace-app image from gitlab.inf.unibz.it:4567/commul/docker/clarin-dspace/dspace-app/
- Test set-up for #59
- Debug output for cron-hack in `entrypoint.sh`
- CephFS backend for clarin-dspace:{dspace,tomcat,shibboleth}:log
### Changed ### Changed
- DEPLOYMENT.md
- set `lr.reserve.pid.on.start = true` to show users the handle of the finished submission
- Use dsapce-app image 2020.02.1:1.1
- Rm apt cache after apt-get update+install
- Rebuild Postgres image with latest 9.6
- Avoid tomcat start/kill/restart-cycle at startup
### Removed ### Removed
- Use of https://github.com/ufal/lindat-aai-discovery
### Fixed ### Fixed
- #60
- Changed branch names during git clone/checkout
- [Open redirect vulnerability](https://wiki.shibboleth.net/confluence/display/SP3/Sessions)
## [1.3.5] - 2020-01-22
### Added
- org.label-schema LABELs for version, build-date, vcs-url in docker images
- explicit CATALINA_PID path
- build and install Apache Tomcat Native Library
### Changed
- bump tomcat to latest 8.0 (=8.0.53) version
- increase java memory settings for tomcat (just-in-case)
- use regular catalina.sh start/stop/run commands (which in turn considers setenv.sh)
- ContacPerson(s) in SP definition
### Removed
- own catalina.sh (use dist versions)
- tomcat8 init.d script (wasn't used)
### Fixed
- (automatic redirects to) https://clarin.eurac.edu:8443/... not working
## [1.3.4] - 2019-10-14
### Changed
- use kube-lego for TLS certs for clarin(-dev).eurac.edu
- disable k8s-internal secure TLS communication: getting rid of the necessity
to (re-)create valid/self-signed certs
Note: using HTTP over port 443 for internal communication (Shibboleth mishap)
- add IdP metadata from CLARIN server later in docker build build
- Some changes to the liveness probe / "cronjobs" (see #60)
### Fixed
- #62
## [1.3.3] - 2019-07-23 ## [1.3.3] - 2019-07-23
...@@ -18,6 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -18,6 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- adapted healthcheck "cronjob" to force exit in case it hangs for some reason (#60) - adapted healthcheck "cronjob" to force exit in case it hangs for some reason (#60)
## [1.3.2] - 2019-06-27 ## [1.3.2] - 2019-06-27
### Added ### Added
...@@ -38,6 +104,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -38,6 +104,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- fixed get URL for xerces - fixed get URL for xerces
- IdP metadata from CLARIN are now downloaded during Docker build and not only once the container is running - IdP metadata from CLARIN are now downloaded during Docker build and not only once the container is running
## [1.3] - 2018-09-05 ## [1.3] - 2018-09-05
### Added ### Added
...@@ -54,12 +121,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -54,12 +121,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Made sure that tomcat is stopped with `-force` in entrypoint script to ensure that only one instance is running - Made sure that tomcat is stopped with `-force` in entrypoint script to ensure that only one instance is running
## [1.2.2] - 2018-08-31 ## [1.2.2] - 2018-08-31
### Fixed ### Fixed
- Changed the DSpace config to use the production handle prefix and not the staging one - Changed the DSpace config to use the production handle prefix and not the staging one
## [1.2] - 2018-08-27 ## [1.2] - 2018-08-27
### Added ### Added
...@@ -84,6 +153,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -84,6 +153,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Shibboleth build script now uses fixed version numbers instead of latest - Shibboleth build script now uses fixed version numbers instead of latest
- Super short session timeout will no longer happen (#44) - Super short session timeout will no longer happen (#44)
## [1.1] - 2018-06-15 ## [1.1] - 2018-06-15
### Added ### Added
...@@ -105,7 +175,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -105,7 +175,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
This is the first release. It all starts here. This is the first release. It all starts here.
[Unreleased]:https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.3...HEAD [Unreleased]:https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.4.0...HEAD
[1.4.0]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.5...v1.4.0
[1.3.5]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.4...v1.3.5
[1.3.4]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.3...v1.3.4
[1.3.3]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.2...v1.3.3 [1.3.3]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.2...v1.3.3
[1.3.2]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.1...v1.3.2 [1.3.2]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3.1...v1.3.2
[1.3.1]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3...v1.3.1 [1.3.1]: https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/compare/v1.3...v1.3.1
......
# Step by Step deployment guide # Step by Step deployment guide
- [ ] Edit CHANGELOG.md and add a new section for the upcoming release - Development
- [ ] Commit to master to make sure that the master branch is clean and all commits are pushed to origin - Edit CHANGELOG.md
- [ ] `git checkout stable` - [ ] Rename [Unreleased] to [$VERSION]
- [ ] `git merge --no-ff master` - [ ] Reintroduce [Unreleased]
- [ ] (Optional) You can now deploy stable to dspace-dev (`./release.sh $VERSION_NUMBER-RC-$RCNUMBER`) - [ ] Fix [Unreleased] and add [$VERSION] named link at the end of CHANGELOG.md
- [ ] Make sure that the stable branch is clean and all commits are pushed to origin
- [ ] `git checkout production` - [ ] (Optional) Bump versions of
- [ ] `git checkout -b v$VERSION_NUMBER $HASHID -- .` - clarin-dspace-app: `DSPACE_APP_VERSION` in docker/clarin-dspace/dockerfiles/Earthfile
The $HASHID being the commit were the last merge from stable happened (before clarindev2clarin.sh changes were committed) - lindat-common: settings in docker/clarin-dspace/dockerfiles/commul-customization/variable.makefile
- [ ] `git merge --no-ff stable`
- [ ] resolve conflicts (though there shouldn't be any) and commit - Commit to master to make sure that the master branch is clean and all
- [ ] Change the version number and the registry branch of the images in all deployment yaml files commits are pushed to origin
- [ ] Run the clarindev2clarin.sh script - [ ] `git commit -m"Bump version to $VERSION"`
- [ ] `git commit -a ` - [ ] `git tag X.Y.Z-rcR`
- [ ] `git checkout production` - [ ] `./release.sh`
- [ ] `git merge v1.3-$VERSION_NUMBER` - [ ] # Use the `sed` command at the end to adapt the k8s files
- [ ] resolve conflicts and commit # ./start- ... ./stop- or kubectl edit
- [ ] `git tag -a $VERSION_NUMBER -s (-u $GPG_ID_HASH)` defaults to your default GPG key
- [ ] `git branch -d $VERSION_NUMBER` - Prepare a release
- [ ] `git push --all` - Make a copy of DEPLOYMENT.md
- [ ] `git push --tags` - [ ] cp DEPLOYMENT.md DEPLOYMENT-$VERSION.md
- [ ] `cd dockerfiles`
- [ ] `./release.sh $VERSION_NUMBER production` - [ ] Check versions are non-rc candidates:
- [ ] `cd ../kubernetes` - clarin-dspace-app: `DSPACE_APP_VERSION` in docker/clarin-dspace/dockerfiles/Earthfile
- [ ] `./stop_kube.sh` - lindat-common: settings in docker/clarin-dspace/dockerfiles/commul-customization/variable.makefile
- [ ] `./start_kube.sh`
- [ ] `git checkout master` - [ ] Check CHANGELOG.md has up-to-date edits
- Check that the master branch is clean and all commits are pushed to origin
- [ ] git status
- [ ] git push
- Merge changes into stable
- [ ] git checkout stable
- [ ] git merge --no-ff master
- [ ] (Optional) You can now deploy stable to dspace-dev
This depends on your workflow, for example, you man have already tested
from master. In any case, `./release.sh` picks up the tag from `git tag`,
i.e. *before* every `./release.sh` there should be a `git tag`.
During testing this `tag` should always be of type `X.Y.Z.-rcR`.
```
./release.sh
# Use the `sed` command at the end to adapt the k8s files
# ./start- ... ./stop- or kubectl edit
```
- Check that the stable branch is clean and all commits are pushed to origin
- [ ] git status
- [ ] git push
- Create a new version branch for this release
- [ ] git checkout -b ver-$VERSION
- Adapt clarin-dev and dspace-dev & commit changes, tag version, make a
release, and push changes
- [ ] ./clarindev2clarin.sh
- [ ] git commit -m"Add clarindev2clarin.sh changes"
- [ ] git tag -a $VERSION -s (-u $GPG_ID_HASH)
"
Tag version $VERSION
Copy&Paste relevant CHANGELOG.md
"
- [ ] Make sure to remove '#' for 'TITLE lines' from commit message
(otherwise, they will be ignored)
- [ ] ./release.sh
- [ ] # Use the `sed` command at the end to adapt the k8s files
- [ ] git commit -m"Bump version to $VERSION"
- [ ] git push origin ver-$VERSION
- Merge ver-$VERSION into production
- [ ] git checkout production
- [ ] git merge --strategy-option=theirs --squash ver-$VERSION
"
Squashing commits of branch 'v$VERSION' into production
Commits
...
"
- [ ] git push origin production
- [ ] git push --tags
- Deploy production to --namespace=dspace and go back to master
- [ ] cd ../kubernetes
- [ ] ./stop_kube.sh
- [ ] ./start_kube.sh
- [ ] git checkout master
#!/bin/bash #!/bin/bash
# outside the docker # config files
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/shibboleth2.xml perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/shibboleth2.xml
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/local.properties perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/local.properties
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/default-ssl perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/nginx.default.conf
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/Dockerfile
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/aai.js perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/aa-statistics.php
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/aai_config.js perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/clarin.eurac.edu.template.metadata.xml
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/aa-statistics.php perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/nginx/html/index.html
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/clarin.eurac.edu.template.metadata.xml
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/commul-customization/webpage/index.html
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/Dockerfile.nginx
# adapt URL and prefix for handle server # healthcheck id
sed -i 's/24a81cdc-2906-4faa-89b3-0d57541abef6/0e116e4c-39b4-46e8-a0f1-20bf952b4c7b/' dockerfiles/commul-customization/entrypoint.sh
# URL and prefix for handle server
perl -pi -e 's/20.500.12084/20.500.12124/g' dockerfiles/commul-customization/config.dct perl -pi -e 's/20.500.12084/20.500.12124/g' dockerfiles/commul-customization/config.dct
perl -pi -e 's/20.500.12084/20.500.12124/g' dockerfiles/commul-customization/local.properties perl -pi -e 's/20.500.12084/20.500.12124/g' dockerfiles/commul-customization/local.properties
# adapt shib SP ID # hostname in docker-compose
perl -pi -e 's/_5d15d5a81bc952da1d34986ebc7713c0d5c9ea61/_5d15d5a81bc952da1d34986ebc7713c0d5c9ea91/g' dockerfiles/commul-customization/clarin.eurac.edu.template.metadata.xml
# adapt hostname in docker-compose
perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/docker-compose.yml perl -pi -e 's/clarin-dev/clarin/g' dockerfiles/docker-compose.yml
echo "Modified all files to point to clarin.eurac.edu instead of clarin-dev.eurac.edu." echo "Modified all files to point to clarin.eurac.edu instead of clarin-dev.eurac.edu."
# adapt namespace in kubernetes yaml files # namespace in kubernetes yaml files
sed -i 's/dspace-dev/dspace/' kubernetes/*.yaml sed -i 's/dspace-dev/dspace/' kubernetes/*.yaml
perl -pi -e 's/clarin-dev/clarin/g' kubernetes/{dspace-ingress,dspace-deployment,nginx-deployment}.yaml perl -pi -e 's/clarin-dev/clarin/g' kubernetes/{dspace-ingress,dspace-deployment,nginx-deployment}.yaml
echo "Modified kubernetes/ to point to --ns=dsapce instead of --ns=dsapce-dev and clarin.eurac.edu instead of clarin-dev.eurac.edu."
Lindat Production workflow
nach Schritt './password_mod.sh'
./clarin-dev2clarin.sh
nach Schritt 'make new_deploy'
grep -rl clarin-dev /opt/lindat-common/public/ | xargs -i perl -pi -e 's/clarin-dev/clarin/g' {}
Dockerfile.*
release.sh
############################################################ ##############################################################################
# Dockerfile to build LINDAT Dspace container images # Dockerfile to build LINDAT Dspace container images
# Based on Ubuntu # Based on Ubuntu
############################################################ ##############################################################################
ARG DSPACE_APP_VERSION
ARG UBUNTU_VERSION=16.04
FROM ubuntu:16.04 FROM gitlab.inf.unibz.it:4567/commul/docker/clarin-dspace/dspace-app/2020.02.1:$DSPACE_APP_VERSION as dspace-app
LABEL maintainer="Alexander König <Alexander.Koenig@eurac.edu>"
# install cpanm and dependencies FROM ubuntu:$UBUNTU_VERSION
RUN apt-get update \ ARG UBUNTU_VERSION
&& apt-get -y upgrade \
&& apt-get -y install make gcc wget cpanminus LABEL author="Alexander König <Alexander.Koenig@eurac.edu>, \
Egon W. Stemle <egon.stemle@eurac.edu>"
LABEL maintainer="Egon W. Stemle <egon.stemle@eurac.edu>"
RUN cpanm -n File::Spec::Functions ENV TOMCAT_VERSION="8.0.53"
RUN cpanm Term::ReadLine ENV TOMCAT_SHA512="cd8a4e48a629a2f2bb4ce6b101ebcce41da52b506064396ec1b2915c0b0d8d82123091242f2929a649bcd8b65ecf6cd1ab9c7d90ac0e261821097ab6fbe22df9 *apache-tomcat-8.0.53.tar.gz"
# https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.tar.gz.sha512
ENV TERM linux
# APT(-GET) tweaks
# Set some sane defaults for apt inside docker
ENV DEBIAN_FRONTEND=noninteractive
COPY apt.local.conf /etc/apt/apt.conf.d/99local.conf
RUN apt-get update && \
apt-get upgrade && \
rm -rf /var/lib/apt/lists/*
# install cpanm and dependencies
# install jdk, ant, psql, mvn, make, libxml, xsltproc, zip, wget # install jdk, ant, psql, mvn, make, libxml, xsltproc, zip, wget
RUN apt-get update && apt-get -y install openjdk-8-jdk ant maven libxml2-utils xsltproc unzip curl git RUN apt-get update && apt-get install \
unzip curl wget git \
make gcc \
cpanminus \
openjdk-8-jdk ant maven libxml2-utils xsltproc \
libapr1-dev && \
rm -rf /var/lib/apt/lists/*
# install convenience apps for debug purposes (vim and jsbeautifier) RUN cpanm -n File::Spec::Functions && \
RUN apt-get update && apt-get -y install vim less python-pip cpanm Term::ReadLine
RUN pip install --upgrade pip
RUN pip install jsbeautifier
COPY commul-customization/__init__.py /usr/local/lib/python2.7/dist-packages/jsbeautifier/
# set up a proper locale # set up a proper locale
RUN apt-get -y install locales RUN apt-get update && apt-get install locales && rm -rf /var/lib/apt/lists/*
RUN locale-gen en_US.UTF-8 RUN locale-gen en_US.UTF-8
COPY commul-customization/default_locale /etc/default/locale COPY default_locale /etc/default/locale
RUN chmod 0755 /etc/default/locale RUN chmod 0755 /etc/default/locale
ENV LC_ALL=en_US.UTF-8 ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8 ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8 ENV LANGUAGE=en_US.UTF-8
# build tomcat 8.0.35, version recommended by LINDAT ### Install Tomcat
RUN wget -O /tmp/apache-tomcat-8.0.52.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz #
RUN mkdir /opt/tomcat8 # build tomcat $TOMCAT_VERSION (> 8.0.35), version recommended by LINDAT
RUN tar xvzf /tmp/apache-tomcat-8.0.52.tar.gz -C /opt/tomcat8/ --strip-components=1 RUN wget -O /tmp/apache-tomcat-$TOMCAT_VERSION.tar.gz \
RUN groupadd tomcat8 https://archive.apache.org/dist/tomcat/tomcat-8/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
RUN useradd -s /bin/false -g tomcat8 -d /opt/tomcat8/ tomcat8 WORKDIR /tmp
# change permissions # checksum check the download
RUN chown -R tomcat8:tomcat8 /opt/tomcat8 RUN echo "$TOMCAT_SHA512" > /tmp/apache-tomcat.sha512 && \
# copy config files etc. (init script,catalina.sh,setenv.sh,server.xml sha512sum --check apache-tomcat.sha512
COPY commul-customization/tomcat8 /etc/init.d/
RUN chmod a+x /etc/init.d/tomcat8 RUN mkdir /opt/tomcat8 && \
COPY commul-customization/catalina.sh /opt/tomcat8/bin/ tar xzf /tmp/apache-tomcat-$TOMCAT_VERSION.tar.gz \
COPY commul-customization/setenv.sh /opt/tomcat8/bin/ -C /opt/tomcat8/ \
--strip-components=1 && \
groupadd tomcat8 && \
useradd -s /bin/false -g tomcat8 -d /opt/tomcat8/ tomcat8 && \
chown -R tomcat8:tomcat8 /opt/tomcat8
# Install Apache Tomcat Native
# prerequisites: libopenssl, libapr1, jdk
RUN mkdir /opt/tomcat8/bin/tomcat-native && \
tar xzf /opt/tomcat8/bin/tomcat-native.tar.gz \
-C /opt/tomcat8/bin/tomcat-native \
--strip-components=1 && \
cd /opt/tomcat8/bin/tomcat-native/native && \
./configure \
--with-java-home=/usr/lib/jvm/java-8-openjdk-amd64/ \
--prefix=/usr/local/ && \
make && make install
# copy config files etc. (setenv.sh,server.xml)
COPY commul-customization/tomcat-setenv.sh /opt/tomcat8/bin/setenv.sh
COPY commul-customization/tomcat-server.xml /opt/tomcat8/conf/server.xml COPY commul-customization/tomcat-server.xml /opt/tomcat8/conf/server.xml
# install Dspace ### Install Dspace
# pre-fetch maven dependencies COPY --from=dspace-app /app /opt/repository/sources/dspace
RUN git clone https://github.com/commul/clarin-dspace.git -b commul-custom /opt/repository/sources/dspace
WORKDIR /opt/repository/sources/dspace
RUN mvn compile
#COPY commul-customization/dspace-pom.xml /tmp/pom.xml
#WORKDIR /tmp/
## RUN mvn dependency:resolve
#RUN mvn -B -T 4 dependency:copy-dependencies dependency:resolve-plugins dependency:go-offline clean
# all files could be copied into a /tmp folder within the container first (maybe that could be mounted?); see also dspace-entrypoint.sh
# this checks if there was a new commit since the last build
ADD https://api.github.com/repos/commul/clarin-dspace/git/refs/heads/commul-custom /tmp/version.json
RUN git pull
WORKDIR /opt/repository/sources/dspace/utilities/project_helpers WORKDIR /opt/repository/sources/dspace/utilities/project_helpers
RUN ./setup.sh /opt/repository/workspace RUN ./setup.sh /opt/repository/workspace
COPY commul-customization/variable.makefile /opt/repository/workspace/config/variable.makefile COPY commul-customization/variable.makefile /opt/repository/workspace/config/variable.makefile
# COPY commul-customization/dspace.cfg /opt/repository/sources/dspace/dspace/config/dspace.cfg
# install python modules: magic dateutil, lxml # install python modules: magic dateutil, lxml
RUN apt-get update && apt-get install -y python-magic python-dateutil python-lxml # install poppler-utils for dspace.cfg: filter.plugins = PDF Text Extractor
RUN apt-get update && apt-get install \
python-magic python-dateutil python-lxml poppler-utils && \
rm -rf /var/lib/apt/lists/*
# copy over configs and startup scripts # copy over configs and startup scripts
COPY commul-customization/start_stack.sh /opt/repository/workspace/scripts/ COPY commul-customization/start_stack.sh /opt/repository/workspace/scripts/
...@@ -86,9 +114,6 @@ RUN make new_deploy ...@@ -86,9 +114,6 @@ RUN make new_deploy
# DEBUG: to be able to access tomcat manager through browser # DEBUG: to be able to access tomcat manager through browser
# COPY commul-customization/tomcat-users.xml /opt/tomcat8/conf/ # COPY commul-customization/tomcat-users.xml /opt/tomcat8/conf/
# adapt some config files
RUN perl -pi -e 's/#useProxies = true/useProxies = true/' /opt/lindat-dspace/installation/config/dspace.cfg
RUN perl -pi -e 's# (?s).*org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe.*# (?s).*org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe.*,\\\n (?s).*user-agent=.kube-probe.*#' /opt/lindat-dspace/installation/config/modules/lr.cfg
# set up handle server # set up handle server
COPY commul-customization/hdl-setup.tmp /tmp/ COPY commul-customization/hdl-setup.tmp /tmp/
...@@ -99,6 +124,12 @@ RUN cp /opt/repository/workspace/config/etc/init.d/handle-server /etc/init.d/ ...@@ -99,6 +124,12 @@ RUN cp /opt/repository/workspace/config/etc/init.d/handle-server /etc/init.d/
RUN chmod +x /etc/init.d/handle-server RUN chmod +x /etc/init.d/handle-server
RUN perl -pi -e 's#DSPACE_INSTALLATION_DIRECTORY=#DSPACE_INSTALLATION_DIRECTORY=/opt/lindat-dspace/installation#' /etc/default/handle-server RUN perl -pi -e 's#DSPACE_INSTALLATION_DIRECTORY=#DSPACE_INSTALLATION_DIRECTORY=/opt/lindat-dspace/installation#' /etc/default/handle-server
# Install ping for livenessProbe
RUN apt-get update && apt-get install iputils-ping && rm -rf /var/lib/apt/lists/*
# Make directory to share shibboleth log files for analytics
RUN mkdir -p /opt/shibboleth-sp-fastcgi/var/log/shibboleth
# copy entrypoint script and start # copy entrypoint script and start
COPY commul-customization/entrypoint.sh /usr/bin/entrypoint.sh COPY commul-customization/entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod u+x /usr/bin/entrypoint.sh RUN chmod u+x /usr/bin/entrypoint.sh
......
############################################################
# Dockerfile to build a handle server
# Based on Ubuntu
############################################################
FROM ubuntu
LABEL maintainer="Alexander König <Alexander.Koenig@eurac.edu>"
ENV TERM linux
RUN apt-get update &&\
apt-get -y upgrade &&\
apt-get -y install openjdk-8-jdk unzip wget make cpanminus gcc
# convenience packages
RUN apt-get -y install less vim
RUN cpanm Term::ReadLine
RUN cpanm File::Spec::Functions
RUN mkdir -p /hs/svr_1
WORKDIR /hs
RUN wget http://www.handle.net/hnr-source/hsj-8.1.1.tar.gz
RUN tar -xzf /hs/hsj-8.1.1.tar.gz
RUN mv hsj-8.1.1 hsj-8
COPY commul-customization/hdl-setup.tmp /tmp/
WORKDIR /hs/hsj-8
RUN cat /tmp/hdl-setup.tmp | bin/hdl-setup-server /hs/svr_1/
RUN perl -pi -e 's/YOUR_PREFIX/20.500.12084/' /hs/svr_1/config.dct
RUN perl -pi -e 's/case_sensitive" = "no/case_sensitive" = "yes/' /hs/svr_1/config.dct
RUN perl -i -plne 'print " \"storage_type\" = \"CUSTOM\"\n\ \"storage_class\" = \"org.dspace.handle.HandlePlugin\"" if(/max_session/);' /hs/svr_1/config.dct
# ENTRYPOINT ["/bin/bash"]
CMD tail -f /hs/svr_1/config.dct
FROM postgres:9.6
LABEL maintainer="Alexander König <Alexander.Koenig@eurac.edu>"
# install git
RUN apt-get update && apt-get -y install git
# copy int db script
RUN mkdir -p /docker-entrypoint-initdb.d
COPY commul-customization/init-dspace-dbs.sh /docker-entrypoint-initdb.d/
RUN chmod +x /docker-entrypoint-initdb.d/*
# copy over modified config file
#COPY commul-customization/postgresql.conf /tmp/
#COPY commul-customization/updateConfig.sh /docker-entrypoint-initdb.d/_updateConfig.sh
# copy script generating utilities db
RUN mkdir /tmp/sql/
COPY adapt_utilities_sql.sh /tmp/sql/
RUN /tmp/sql/adapt_utilities_sql.sh
# Usage: earthly --push [--no-cache] +docker
ARG DSPACE_APP_VERSION=1.2-rc3
docker-from-docker:
FROM DOCKERFILE --build-arg DSPACE_APP_VERSION=$DSPACE_APP_VERSION .
ARG DOCKER_BASE_URL="gitlab.inf.unibz.it:4567"
ARG EARTHLY_GIT_PROJECT_NAME # https://docs.earthly.dev/earthfile/builtin-args
ARG GIT_PROJECT_NAME="commul/docker/clarin-dspace"
ARG COMMUL_REGISTRY_URL="https://gitlab.inf.unibz.it/commul/docker/clarin-dspace/container_registry/"
ARG LABEL_VCS_URL="https://gitlab.inf.unibz.it/commul/docker/clarin-dspace"
ARG AUTHOR="Egon W. Stemle <egon.stemle@eurac.edu>"
ARG MAINTAINER="Egon W. Stemle <egon.stemle@eurac.edu>"
LABEL author="$AUTHOR"
LABEL maintainer="$MAINTAINER"
# An updated VERSION ARG triggers an update of the texlive installation
ARG EARTHLY_TARGET_TAG
ARG VERSION=$EARTHLY_TARGET_TAG
ARG EARTHLY_GIT_HASH
ARG GIT_HASH=$EARTHLY_GIT_HASH
ARG EARTHLY_TARGET_TAG_DOCKER
ARG TARGET_TAG_DOCKER=$EARTHLY_TARGET_TAG_DOCKER
ARG DOCKER_URL="$DOCKER_BASE_URL/$GIT_PROJECT_NAME/dspace-bundle/dspace"
LABEL org.label-schema.schema-version="1.0" \ # http://label-schema.org/rc1/
org.label-schema.version="$VERSION" \
org.label-schema.vcs-url="$LABEL_VCS_URL" \
org.commul.git-hash="$GIT_HASH" \
org.commul.registry-url="$COMMUL_REGISTRY_URL" \
org.commul.docker-url="$DOCKER_URL"
RUN echo $VERSION > /tmp/release
SAVE ARTIFACT --keep-ts /tmp/release AS LOCAL ./.release
SAVE IMAGE dspace:latest
SAVE IMAGE --push "$DOCKER_URL:latest"
SAVE IMAGE --push "$DOCKER_URL:$VERSION"
docker:
BUILD ./nginx/+docker
BUILD --build-arg DSPACE_APP_VERSION=$DSPACE_APP_VERSION ./postgres/+docker
BUILD --build-arg DSPACE_APP_VERSION=$DSPACE_APP_VERSION +docker-from-docker
#!/bin/bash
git clone https://github.com/commul/clarin-dspace.git -b commul-custom /tmp/dspace
cp /tmp/dspace/utilities/utilities.sql /tmp/sql/
cp /tmp/dspace/utilities/license_definition.txt /tmp/sql/
chmod -R a+w /tmp/sql/
perl -pi -e "s#afile :utildir '/license_definition.txt'#afile '/tmp/sql/license_definition.txt'#;" /tmp/sql/utilities.sql
#perl -pi -e 's/\$DSPACE_USER/$ENV{DSPACE_USER}/g;' /tmp/sql/utilities.sql
rm -rf /tmp/dspace
# Set some sane defaults for docker
APT { GET { Assume-Yes "true"; }; };
APT { GET { Fix-Broken "true"; }; };
from __future__ import print_function
import sys
import os
import io
import getopt
import re
import string
import errno
import copy
import locale
from jsbeautifier.__version__ import __version__
#
# The MIT License (MIT)
# Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Originally written by Einar Lielmanis et al.,
# Conversion to python by Einar Lielmanis, einar@jsbeautifier.org,
# Parsing improvement for brace-less and semicolon-less statements
# by Liam Newman <bitwiseman@gmail.com>
# Python is not my native language, feel free to push things around.
#
# Use either from command line (script displays its usage when run
# without any parameters),
#
#
# or, alternatively, use it as a module:
#
# import jsbeautifier
# res = jsbeautifier.beautify('your javascript string')
# res = jsbeautifier.beautify_file('some_file.js')
#
# you may specify some options:
#
# opts = jsbeautifier.default_options()
# opts.indent_size = 2
# res = jsbeautifier.beautify('some javascript', opts)
#
#
# Here are the available options: (read source)
class BeautifierOptions:
def __init__(self):
self.indent_size = 4
self.indent_char = ' '
self.indent_with_tabs = False
self.eol = 'auto'
self.preserve_newlines = True
self.max_preserve_newlines = 10
self.space_in_paren = False
self.space_in_empty_paren = False
self.e4x = False
self.jslint_happy = False
self.space_after_anon_function = False
self.brace_style = 'collapse'
self.keep_array_indentation = False
self.keep_function_indentation = False
self.eval_code = False
self.unescape_strings = False
self.wrap_line_length = 0
self.break_chained_methods = False
self.end_with_newline = False
self.comma_first = False
self.operator_position = 'before-newline'
self.css = None
self.js = None
self.html = None
# For testing of beautify ignore:start directive
self.test_output_raw = False
self.editorconfig = False
def mergeOpts(self, targetType):
finalOpts = copy.copy(self)
local = getattr(finalOpts, targetType)
if (local):
delattr(finalOpts, targetType)
for key in local:
setattr(finalOpts, key, local[key])
return finalOpts
def __repr__(self):
return \
"""indent_size = %d
indent_char = [%s]
preserve_newlines = %s
max_preserve_newlines = %d
space_in_paren = %s
jslint_happy = %s
space_after_anon_function = %s
indent_with_tabs = %s
brace_style = %s
keep_array_indentation = %s
eval_code = %s
wrap_line_length = %s
unescape_strings = %s
""" % ( self.indent_size,
self.indent_char,
self.preserve_newlines,
self.max_preserve_newlines,
self.space_in_paren,
self.jslint_happy,
self.space_after_anon_function,
self.indent_with_tabs,
self.brace_style,
self.keep_array_indentation,
self.eval_code,
self.wrap_line_length,
self.unescape_strings,
)
class BeautifierFlags:
def __init__(self, mode):
self.mode = mode
self.parent = None
self.last_text = ''
self.last_word = ''
self.declaration_statement = False
self.declaration_assignment = False
self.multiline_frame = False
self.inline_frame = False
self.if_block = False
self.else_block = False
self.do_block = False
self.do_while = False
self.import_block = False
self.in_case = False
self.in_case_statement = False
self.case_body = False
self.indentation_level = 0
self.line_indent_level = 0
self.start_line_index = 0
self.ternary_depth = 0
def apply_base(self, flags_base, added_newline):
next_indent_level = flags_base.indentation_level
if not added_newline and \
flags_base.line_indent_level > next_indent_level:
next_indent_level = flags_base.line_indent_level
self.parent = flags_base
self.last_text = flags_base.last_text
self.last_word = flags_base.last_word
self.indentation_level = next_indent_level
class Acorn:
def __init__(self):
# This is not pretty, but given how we did the version import
# it is the only way to do this without having setup.py fail on a missing six dependency.
self.six = __import__("six")
# This section of code was translated to python from acorn (javascript).
#
# Acorn was written by Marijn Haverbeke and released under an MIT
# license. The Unicode regexps (for identifiers and whitespace) were
# taken from [Esprima](http://esprima.org) by Ariya Hidayat.
#
# Git repositories for Acorn are available at
#
# http://marijnhaverbeke.nl/git/acorn
# https://github.com/marijnh/acorn.git
# ## Character categories
# Big ugly regular expressions that match characters in the
# whitespace, identifier, and identifier-start categories. These
# are only applied when a character is found to actually have a
# code point above 128.
self.nonASCIIwhitespace = re.compile(self.six.u("[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]"))
self.nonASCIIidentifierStartChars = self.six.u("\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc")
self.nonASCIIidentifierChars = self.six.u("\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f")
self.nonASCIIidentifierStart = re.compile("[" + self.nonASCIIidentifierStartChars + "]")
self.nonASCIIidentifier = re.compile("[" + self.nonASCIIidentifierStartChars + self.nonASCIIidentifierChars + "]")
# Whether a single character denotes a newline.
self.newline = re.compile(self.six.u("[\n\r\u2028\u2029]"))
# Matches a whole line break (where CRLF is considered a single
# line break). Used to count lines.
# in javascript, these two differ
# in python they are the same, different methods are called on them
self.lineBreak = re.compile(self.six.u("\r\n|[\n\r\u2028\u2029]"))
self.allLineBreaks = self.lineBreak
# Test whether a given character code starts an identifier.
def isIdentifierStart(self, code):
if code < 65:
return code in [36, 64] # permit $ (36) and @ (64). @ is used in ES7 decorators.
if code < 91:
return True # 65 through 91 are uppercase letters
if code < 97:
return code == 95 # permit _ (95)
if code < 123:
return True # 97 through 123 are lowercase letters
return code >= 0xaa and self.nonASCIIidentifierStart.match(self.six.unichr(code)) != None
# Test whether a given character is part of an identifier.
def isIdentifierChar(self, code):
if code < 48:
return code == 36
if code < 58:
return True
if code < 65:
return False
if code < 91:
return True
if code < 97:
return code == 95
if code < 123:
return True
return code >= 0xaa and self.nonASCIIidentifier.match(self.six.unichr(code)) != None
class Token:
def __init__(self, type, text, newlines = 0, whitespace_before = '', mode = None, parent = None):
self.type = type
self.text = text
self.comments_before = []
self.newlines = newlines
self.wanted_newline = newlines > 0
self.whitespace_before = whitespace_before
self.parent = None
self.opened = None
self.directives = None
def default_options():
return BeautifierOptions()
def beautify(string, opts = default_options() ):
b = Beautifier()
return b.beautify(string, opts)
def set_file_editorconfig_opts(filename, js_options):
from editorconfig import get_properties, EditorConfigError
try:
_ecoptions = get_properties(os.path.abspath(filename))
if _ecoptions.get("indent_style") == "tab":
js_options.indent_with_tabs = True
elif _ecoptions.get("indent_style") == "space":
js_options.indent_with_tabs = False
if _ecoptions.get("indent_size"):
js_options.indent_size = int(_ecoptions["indent_size"])
if _ecoptions.get("max_line_length"):
if _ecoptions.get("max_line_length") == "off":
js_options.wrap_line_length = 0
else:
js_options.wrap_line_length = int(_ecoptions["max_line_length"])
if _ecoptions.get("insert_final_newline") == 'true':
js_options.end_with_newline = True
elif _ecoptions.get("insert_final_newline") == 'false':
js_options.end_with_newline = False
if _ecoptions.get("end_of_line"):
if _ecoptions["end_of_line"] == "cr":
js_options.eol = '\r'
elif _ecoptions["end_of_line"] == "lf":
js_options.eol = '\n'
elif _ecoptions["end_of_line"] == "crlf":
js_options.eol = '\r\n'
except EditorConfigError as ex:
# do not error on bad editor config
print("Error loading EditorConfig. Ignoring.", file=sys.stderr)
def beautify_file(file_name, opts = default_options() ):
input_string = ''
if file_name == '-': # stdin
try:
if sys.stdin.isatty():
raise Exception()
stream = sys.stdin
input_string = ''.join(stream.readlines())
except Exception as ex:
print("Must pipe input or define at least one file.", file=sys.stderr)
usage(sys.stderr)
raise Exception()
else:
stream = io.open(file_name, 'rt', newline='')
input_string = ''.join(stream.readlines())
return beautify(input_string, opts)
def usage(stream=sys.stdout):
print("jsbeautifier.py@" + __version__ + """
Javascript beautifier (http://jsbeautifier.org/)
Usage: jsbeautifier.py [options] <infile>
<infile> can be "-", which means stdin.
<outfile> defaults to stdout
Input options:
-i, --stdin Read input from stdin
Output options:
-s, --indent-size=NUMBER Indentation size. (default 4).
-c, --indent-char=CHAR Character to indent with. (default space).
-e, --eol=STRING Character(s) to use as line terminators.
(default first newline in file, otherwise "\\n")
-t, --indent-with-tabs Indent with tabs, overrides -s and -c
-d, --disable-preserve-newlines Do not preserve existing line breaks.
-P, --space-in-paren Add padding spaces within paren, ie. f( a, b )
-E, --space-in-empty-paren Add a single space inside empty paren, ie. f( )
-j, --jslint-happy More jslint-compatible output
-a, --space_after_anon_function Add a space before an anonymous function's parens, ie. function ()
-b, --brace-style=collapse Brace style (collapse, expand, end-expand, none)(,preserve-inline)
-k, --keep-array-indentation Keep array indentation.
-r, --replace Write output in-place, replacing input
-o, --outfile=FILE Specify a file to output to (default stdout)
-f, --keep-function-indentation Do not re-indent function bodies defined in var lines.
-x, --unescape-strings Decode printable chars encoded in \\xNN notation.
-X, --e4x Pass E4X xml literals through untouched
-w, --wrap-line-length Attempt to wrap line when it exceeds this length.
NOTE: Line continues until next wrap point is found.
-n, --end_with_newline End output with newline
--editorconfig Enable setting configuration from EditorConfig
Rarely needed options:
--eval-code evaluate code if a JS interpreter is
installed. May be useful with some obfuscated
script but poses a potential security issue.
-l, --indent-level=NUMBER Initial indentation level. (default 0).
-h, --help, --usage Prints this help statement.
-v, --version Show the version
""", file=stream)
if stream == sys.stderr:
return 1
else:
return 0
OPERATOR_POSITION = {
'before_newline': 'before-newline',
'after_newline': 'after-newline',
'preserve_newline': 'preserve-newline'
}
OPERATOR_POSITION_BEFORE_OR_PRESERVE = [OPERATOR_POSITION['before_newline'], OPERATOR_POSITION['preserve_newline']];
def sanitizeOperatorPosition(opPosition):
if not opPosition:
return OPERATOR_POSITION['before_newline']
elif opPosition not in OPERATOR_POSITION.values():
raise ValueError("Invalid Option Value: The option 'operator_position' must be one of the following values\n" +
str(OPERATOR_POSITION.values()) +
"\nYou passed in: '" + opPosition + "'")
return opPosition
class MODE:
BlockStatement, Statement, ObjectLiteral, ArrayLiteral, \
ForInitializer, Conditional, Expression = range(7)
class Beautifier:
def __init__(self, opts = default_options() ):
self.opts = copy.copy(opts)
self.acorn = Acorn()
self.blank_state()
def blank_state(self, js_source_text = None):
# internal flags
self.flags = None
self.previous_flags = None
self.flag_store = []
self.tokens = []
self.token_pos = 0
# force opts.space_after_anon_function to true if opts.jslint_happy
if self.opts.jslint_happy:
self.opts.space_after_anon_function = True
if self.opts.indent_with_tabs:
self.opts.indent_char = "\t"
self.opts.indent_size = 1
if self.opts.eol == 'auto':
self.opts.eol = '\n'
if self.acorn.lineBreak.search(js_source_text or ''):
self.opts.eol = self.acorn.lineBreak.search(js_source_text).group()
self.opts.eol = self.opts.eol.replace('\\r', '\r').replace('\\n', '\n')
self.indent_string = self.opts.indent_char * self.opts.indent_size
self.baseIndentString = ''
self.last_type = 'TK_START_BLOCK' # last token type
self.last_last_text = '' # pre-last token text
preindent_index = 0;
if not js_source_text == None and len(js_source_text) > 0:
while preindent_index < len(js_source_text) and \
js_source_text[preindent_index] in [' ', '\t'] :
self.baseIndentString += js_source_text[preindent_index]
preindent_index += 1
js_source_text = js_source_text[preindent_index:]
self.output = Output(self.indent_string, self.baseIndentString)
# If testing the ignore directive, start with output disable set to true
self.output.raw = self.opts.test_output_raw;
self.set_mode(MODE.BlockStatement)
return js_source_text
def beautify(self, s, opts = None ):
if opts != None:
opts = opts.mergeOpts('js')
self.opts = copy.copy(opts)
#Compat with old form
if self.opts.brace_style == 'collapse-preserve-inline':
self.opts.brace_style = 'collapse,preserve-inline'
split = re.compile("[^a-zA-Z0-9_\-]+").split(self.opts.brace_style)
self.opts.brace_style = split[0]
self.opts.brace_preserve_inline = (True if bool(split[1] == 'preserve-inline') else None) if len(split) > 1 else False
if self.opts.brace_style not in ['expand', 'collapse', 'end-expand', 'none']:
raise(Exception('opts.brace_style must be "expand", "collapse", "end-expand", or "none".'))
if self.opts.brace_preserve_inline == None:
raise(Exception('opts.brace_style second item must be "preserve-inline"'))
s = self.blank_state(s)
input = self.unpack(s, self.opts.eval_code)
self.handlers = {
'TK_START_EXPR': self.handle_start_expr,
'TK_END_EXPR': self.handle_end_expr,
'TK_START_BLOCK': self.handle_start_block,
'TK_END_BLOCK': self.handle_end_block,
'TK_WORD': self.handle_word,
'TK_RESERVED': self.handle_word,
'TK_SEMICOLON': self.handle_semicolon,
'TK_STRING': self.handle_string,
'TK_EQUALS': self.handle_equals,
'TK_OPERATOR': self.handle_operator,
'TK_COMMA': self.handle_comma,
'TK_BLOCK_COMMENT': self.handle_block_comment,
'TK_COMMENT': self.handle_comment,
'TK_DOT': self.handle_dot,
'TK_UNKNOWN': self.handle_unknown,
'TK_EOF': self.handle_eof
}
self.tokens = Tokenizer(input, self.opts, self.indent_string).tokenize()
self.token_pos = 0
current_token = self.get_token()
while current_token != None:
self.handlers[current_token.type](current_token)
self.last_last_text = self.flags.last_text
self.last_type = current_token.type
self.flags.last_text = current_token.text
self.token_pos += 1
current_token = self.get_token()
sweet_code = self.output.get_code()
if self.opts.end_with_newline:
sweet_code += '\n'
if not self.opts.eol == '\n':
sweet_code = sweet_code.replace('\n', self.opts.eol)
return sweet_code
def handle_whitespace_and_comments(self, local_token, preserve_statement_flags = False):
newlines = local_token.newlines
keep_whitespace = self.opts.keep_array_indentation and self.is_array(self.flags.mode)
for comment_token in local_token.comments_before:
# The cleanest handling of inline comments is to treat them as though they aren't there.
# Just continue formatting and the behavior should be logical.
# Also ignore unknown tokens. Again, this should result in better behavior.
self.handle_whitespace_and_comments(comment_token, preserve_statement_flags)
self.handlers[comment_token.type](comment_token, preserve_statement_flags)
if keep_whitespace:
for i in range(newlines):
self.print_newline(i > 0, preserve_statement_flags)
else: # not keep_whitespace
if self.opts.max_preserve_newlines != 0 and newlines > self.opts.max_preserve_newlines:
newlines = self.opts.max_preserve_newlines
if self.opts.preserve_newlines and newlines > 1:
self.print_newline(False, preserve_statement_flags)
for i in range(1, newlines):
self.print_newline(True, preserve_statement_flags)
def unpack(self, source, evalcode=False):
import jsbeautifier.unpackers as unpackers
try:
return unpackers.run(source, evalcode)
except unpackers.UnpackingError as error:
return source
def is_special_word(self, s):
return s in ['case', 'return', 'do', 'if', 'throw', 'else']
def is_array(self, mode):
return mode == MODE.ArrayLiteral
def is_expression(self, mode):
return mode in [MODE.Expression, MODE.ForInitializer, MODE.Conditional]
_newline_restricted_tokens = ['break','continue','return', 'throw']
def allow_wrap_or_preserved_newline(self, current_token, force_linewrap = False):
# never wrap the first token of a line.
if self.output.just_added_newline():
return
shouldPreserveOrForce = (self.opts.preserve_newlines and current_token.wanted_newline) or force_linewrap
operatorLogicApplies = self.flags.last_text in Tokenizer.positionable_operators or current_token.text in Tokenizer.positionable_operators
if operatorLogicApplies:
shouldPrintOperatorNewline = (self.flags.last_text in Tokenizer.positionable_operators and self.opts.operator_position in OPERATOR_POSITION_BEFORE_OR_PRESERVE) \
or current_token.text in Tokenizer.positionable_operators
shouldPreserveOrForce = shouldPreserveOrForce and shouldPrintOperatorNewline
if shouldPreserveOrForce:
self.print_newline(preserve_statement_flags = True)
elif self.opts.wrap_line_length > 0:
if self.last_type == 'TK_RESERVED' and self.flags.last_text in self._newline_restricted_tokens:
# These tokens should never have a newline inserted between
# them and the following expression.
return
proposed_line_length = self.output.current_line.get_character_count() + len(current_token.text)
if self.output.space_before_token:
proposed_line_length += 1
if proposed_line_length >= self.opts.wrap_line_length:
self.print_newline(preserve_statement_flags = True)
def print_newline(self, force_newline = False, preserve_statement_flags = False):
if not preserve_statement_flags:
if self.flags.last_text != ';' and self.flags.last_text != ',' and self.flags.last_text != '=' and self.last_type != 'TK_OPERATOR':
next_token = self.get_token(1)
while (self.flags.mode == MODE.Statement and
not (self.flags.if_block and next_token and next_token.type == 'TK_RESERVED' and next_token.text == 'else') and
not self.flags.do_block):
self.restore_mode()
if self.output.add_new_line(force_newline):
self.flags.multiline_frame = True
def print_token_line_indentation(self, current_token):
if self.output.just_added_newline():
line = self.output.current_line
if self.opts.keep_array_indentation and self.is_array(self.flags.mode) and current_token.wanted_newline:
line.push(current_token.whitespace_before)
self.output.space_before_token = False
elif self.output.set_indent(self.flags.indentation_level):
self.flags.line_indent_level = self.flags.indentation_level
def print_token(self, current_token, s=None):
if self.output.raw:
self.output.add_raw_token(current_token)
return
if self.opts.comma_first and self.last_type == 'TK_COMMA' and self.output.just_added_newline():
if self.output.previous_line.last() == ',':
# if the comma was already at the start of the line,
# pull back onto that line and reprint the indentation
popped = self.output.previous_line.pop()
if self.output.previous_line.is_empty():
self.output.previous_line.push(popped)
self.output.trim(True)
self.output.current_line.pop()
self.output.trim()
# add the comma in front of the next token
self.print_token_line_indentation(current_token)
self.output.add_token(',')
self.output.space_before_token = True
if s == None:
s = current_token.text
self.print_token_line_indentation(current_token)
self.output.add_token(s);
def indent(self):
self.flags.indentation_level += 1
def deindent(self):
allow_deindent = self.flags.indentation_level > 0 and ((self.flags.parent == None) or self.flags.indentation_level > self.flags.parent.indentation_level)
if allow_deindent:
self.flags.indentation_level -= 1
def set_mode(self, mode):
if self.flags:
self.flag_store.append(self.flags)
self.previous_flags = self.flags
else:
self.previous_flags = BeautifierFlags(mode)
self.flags = BeautifierFlags(mode)
self.flags.apply_base(self.previous_flags, self.output.just_added_newline())
self.flags.start_line_index = self.output.get_line_number();
def restore_mode(self):
if len(self.flag_store) > 0:
self.previous_flags = self.flags
self.flags = self.flag_store.pop()
if self.previous_flags.mode == MODE.Statement:
self.output.remove_redundant_indentation(self.previous_flags)
def start_of_object_property(self):
return self.flags.parent.mode == MODE.ObjectLiteral and self.flags.mode == MODE.Statement and \
((self.flags.last_text == ':' and self.flags.ternary_depth == 0) or (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['get', 'set']))
def start_of_statement(self, current_token):
if (
(self.last_type == 'TK_RESERVED' and self.flags.last_text in ['var', 'let', 'const'] and current_token.type == 'TK_WORD') \
or (self.last_type == 'TK_RESERVED' and self.flags.last_text== 'do') \
or (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['return', 'throw'] and not current_token.wanted_newline) \
or (self.last_type == 'TK_RESERVED' and self.flags.last_text == 'else' \
and not (current_token.type == 'TK_RESERVED' and current_token.text == 'if' and not len(current_token.comments_before))) \
or (self.last_type == 'TK_END_EXPR' and (self.previous_flags.mode == MODE.ForInitializer or self.previous_flags.mode == MODE.Conditional)) \
or (self.last_type == 'TK_WORD' and self.flags.mode == MODE.BlockStatement \
and not self.flags.in_case
and not (current_token.text == '--' or current_token.text == '++')
and self.last_last_text != 'function'
and current_token.type != 'TK_WORD' and current_token.type != 'TK_RESERVED') \
or (self.flags.mode == MODE.ObjectLiteral and \
((self.flags.last_text == ':' and self.flags.ternary_depth == 0) or (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['get', 'set'])))
):
self.set_mode(MODE.Statement)
self.indent()
self.handle_whitespace_and_comments(current_token, True);
# Issue #276:
# If starting a new statement with [if, for, while, do], push to a new line.
# if (a) if (b) if(c) d(); else e(); else f();
if not self.start_of_object_property():
self.allow_wrap_or_preserved_newline(current_token, current_token.type == 'TK_RESERVED' and current_token.text in ['do', 'for', 'if', 'while'])
return True
else:
return False
def get_token(self, offset = 0):
index = self.token_pos + offset
if index < 0 or index >= len(self.tokens):
return None
else:
return self.tokens[index]
def handle_start_expr(self, current_token):
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
pass
else:
self.handle_whitespace_and_comments(current_token)
next_mode = MODE.Expression
if current_token.text == '[':
if self.last_type == 'TK_WORD' or self.flags.last_text == ')':
if self.last_type == 'TK_RESERVED' and self.flags.last_text in Tokenizer.line_starters:
self.output.space_before_token = True
self.set_mode(next_mode)
self.print_token(current_token)
self.indent()
if self.opts.space_in_paren:
self.output.space_before_token = True
return
next_mode = MODE.ArrayLiteral
if self.is_array(self.flags.mode):
if self.flags.last_text == '[' or (
self.flags.last_text == ',' and (self.last_last_text == ']' or self.last_last_text == '}')):
# ], [ goes to a new line
# }, [ goes to a new line
if not self.opts.keep_array_indentation:
self.print_newline()
else:
if self.last_type == 'TK_RESERVED' and self.flags.last_text == 'for':
next_mode = MODE.ForInitializer
elif self.last_type == 'TK_RESERVED' and self.flags.last_text in ['if', 'while']:
next_mode = MODE.Conditional
else:
next_mode = MODE.Expression
if self.flags.last_text == ';' or self.last_type == 'TK_START_BLOCK':
self.print_newline()
elif self.last_type in ['TK_END_EXPR', 'TK_START_EXPR', 'TK_END_BLOCK'] or self.flags.last_text == '.':
# do nothing on (( and )( and ][ and ]( and .(
# TODO: Consider whether forcing this is required. Review failing tests when removed.
self.allow_wrap_or_preserved_newline(current_token, current_token.wanted_newline)
elif not (self.last_type == 'TK_RESERVED' and current_token.text == '(') and self.last_type not in ['TK_WORD', 'TK_OPERATOR']:
self.output.space_before_token = True
elif (self.last_type == 'TK_RESERVED' and (self.flags.last_word == 'function' or self.flags.last_word == 'typeof')) or \
(self.flags.last_text == '*' and (
self.last_last_text in ['function', 'yield'] or
(self.flags.mode == MODE.ObjectLiteral and self.last_last_text in ['{', ',']))):
# function() vs function (), typeof() vs typeof ()
# function*() vs function* (), yield*() vs yield* ()
if self.opts.space_after_anon_function:
self.output.space_before_token = True
elif self.last_type == 'TK_RESERVED' and (self.flags.last_text in Tokenizer.line_starters or self.flags.last_text == 'catch'):
# TODO: option space_before_conditional
self.output.space_before_token = True
elif current_token.text == '(' and self.last_type == 'TK_RESERVED' and self.flags.last_word == 'await':
self.output.space_before_token = True
# Support of this kind of newline preservation:
# a = (b &&
# (c || d));
if self.last_type in ['TK_EQUALS', 'TK_OPERATOR']:
if not self.start_of_object_property():
self.allow_wrap_or_preserved_newline(current_token)
# Support preserving wrapped arrow function expressions
# a.b('c',
# () => d.e
# )
if current_token.text == '(' and self.last_type not in ['TK_WORD', 'TK_RESERVED']:
self.allow_wrap_or_preserved_newline(current_token)
self.set_mode(next_mode)
self.print_token(current_token)
if self.opts.space_in_paren:
self.output.space_before_token = True
# In all cases, if we newline while inside an expression it should be indented.
self.indent()
def handle_end_expr(self, current_token):
# statements inside expressions are not valid syntax, but...
# statements must all be closed when their container closes
while self.flags.mode == MODE.Statement:
self.restore_mode()
self.handle_whitespace_and_comments(current_token)
if self.flags.multiline_frame:
self.allow_wrap_or_preserved_newline(current_token, current_token.text == ']' and self.is_array(self.flags.mode) and not self.opts.keep_array_indentation)
if self.opts.space_in_paren:
if self.last_type == 'TK_START_EXPR' and not self.opts.space_in_empty_paren:
# empty parens are always "()" and "[]", not "( )" or "[ ]"
self.output.space_before_token = False
self.output.trim()
else:
self.output.space_before_token = True
if current_token.text == ']' and self.opts.keep_array_indentation:
self.print_token(current_token)
self.restore_mode()
else:
self.restore_mode()
self.print_token(current_token)
self.output.remove_redundant_indentation(self.previous_flags)
# do {} while () // no statement required after
if self.flags.do_while and self.previous_flags.mode == MODE.Conditional:
self.previous_flags.mode = MODE.Expression
self.flags.do_block = False
self.flags.do_while = False
def handle_start_block(self, current_token):
self.handle_whitespace_and_comments(current_token)
# Check if this is a BlockStatement that should be treated as a ObjectLiteral
next_token = self.get_token(1)
second_token = self.get_token(2)
if second_token != None and \
((second_token.text in [':', ','] and next_token.type in ['TK_STRING', 'TK_WORD', 'TK_RESERVED']) \
or (next_token.text in ['get', 'set', '...'] and second_token.type in ['TK_WORD', 'TK_RESERVED'])):
# We don't support TypeScript,but we didn't break it for a very long time.
# We'll try to keep not breaking it.
if not self.last_last_text in ['class','interface']:
self.set_mode(MODE.ObjectLiteral)
else:
self.set_mode(MODE.BlockStatement)
elif self.last_type == 'TK_OPERATOR' and self.flags.last_text == '=>':
# arrow function: (param1, paramN) => { statements }
self.set_mode(MODE.BlockStatement)
elif self.last_type in ['TK_EQUALS', 'TK_START_EXPR', 'TK_COMMA', 'TK_OPERATOR'] or \
(self.last_type == 'TK_RESERVED' and self.flags.last_text in ['return', 'throw', 'import', 'default']):
# Detecting shorthand function syntax is difficult by scanning forward,
# so check the surrounding context.
# If the block is being returned, imported, export default, passed as arg,
# assigned with = or assigned in a nested object, treat as an ObjectLiteral.
self.set_mode(MODE.ObjectLiteral)
else:
self.set_mode(MODE.BlockStatement)
empty_braces = (not next_token == None) and len(next_token.comments_before) == 0 and next_token.text == '}'
empty_anonymous_function = empty_braces and self.flags.last_word == 'function' and \
self.last_type == 'TK_END_EXPR'
if self.opts.brace_preserve_inline: # check for inline, set inline_frame if so
# search forward for newline wanted inside this block
index = 0
check_token = None
self.flags.inline_frame = True
do_loop = True
while (do_loop):
index += 1
check_token = self.get_token(index)
if check_token.wanted_newline:
self.flags.inline_frame = False
do_loop = (check_token.type != 'TK_EOF' and
not (check_token.type == 'TK_END_BLOCK' and check_token.opened == current_token))
if (self.opts.brace_style == 'expand' or \
(self.opts.brace_style == 'none' and current_token.wanted_newline)) and \
not self.flags.inline_frame:
if self.last_type != 'TK_OPERATOR' and \
(empty_anonymous_function or
self.last_type == 'TK_EQUALS' or
(self.last_type == 'TK_RESERVED' and self.is_special_word(self.flags.last_text) and self.flags.last_text != 'else')):
self.output.space_before_token = True
else:
self.print_newline(preserve_statement_flags = True)
else: # collapse || inline_frame
if self.is_array(self.previous_flags.mode) and (self.last_type == 'TK_START_EXPR' or self.last_type == 'TK_COMMA'):
# if we're preserving inline,
# allow newline between comma and next brace.
if self.flags.inline_frame:
self.allow_wrap_or_preserved_newline(current_token)
self.flags.inline_frame = True
self.previous_flags.multiline_frame = self.previous_flags.multiline_frame or self.flags.multiline_frame
self.flags.multiline_frame = False
elif self.last_type == 'TK_COMMA':
self.output.space_before_token = True
elif self.last_type not in ['TK_OPERATOR', 'TK_START_EXPR']:
if self.last_type == 'TK_START_BLOCK' and not self.flags.inline_frame:
self.print_newline()
else:
self.output.space_before_token = True
self.print_token(current_token)
self.indent()
def handle_end_block(self, current_token):
# statements must all be closed when their container closes
self.handle_whitespace_and_comments(current_token)
while self.flags.mode == MODE.Statement:
self.restore_mode()
empty_braces = self.last_type == 'TK_START_BLOCK'
if self.flags.inline_frame and not empty_braces: # try inline_frame (only set if opt.braces-preserve-inline) first
self.output.space_before_token = True;
elif self.opts.brace_style == 'expand':
if not empty_braces:
self.print_newline()
else:
# skip {}
if not empty_braces:
if self.is_array(self.flags.mode) and self.opts.keep_array_indentation:
self.opts.keep_array_indentation = False
self.print_newline()
self.opts.keep_array_indentation = True
else:
self.print_newline()
self.restore_mode()
self.print_token(current_token)
def handle_word(self, current_token):
if current_token.type == 'TK_RESERVED':
if current_token.text in ['set', 'get'] and self.flags.mode != MODE.ObjectLiteral:
current_token.type = 'TK_WORD'
elif current_token.text in ['as', 'from'] and not self.flags.import_block:
current_token.type = 'TK_WORD'
elif self.flags.mode == MODE.ObjectLiteral:
next_token = self.get_token(1)
if next_token.text == ':':
current_token.type = 'TK_WORD'
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
if self.last_type == 'TK_RESERVED' and self.flags.last_text in ['var', 'let', 'const'] and current_token.type == 'TK_WORD':
self.flags.declaration_statement = True
elif current_token.wanted_newline and \
not self.is_expression(self.flags.mode) and \
(self.last_type != 'TK_OPERATOR' or (self.flags.last_text == '--' or self.flags.last_text == '++')) and \
self.last_type != 'TK_EQUALS' and \
(self.opts.preserve_newlines or not (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['var', 'let', 'const', 'set', 'get'])):
self.handle_whitespace_and_comments(current_token)
self.print_newline()
else:
self.handle_whitespace_and_comments(current_token)
if self.flags.do_block and not self.flags.do_while:
if current_token.type == 'TK_RESERVED' and current_token.text == 'while':
# do {} ## while ()
self.output.space_before_token = True
self.print_token(current_token)
self.output.space_before_token = True
self.flags.do_while = True
return
else:
# do {} should always have while as the next word.
# if we don't see the expected while, recover
self.print_newline()
self.flags.do_block = False
# if may be followed by else, or not
# Bare/inline ifs are tricky
# Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e();
if self.flags.if_block:
if (not self.flags.else_block) and (current_token.type == 'TK_RESERVED' and current_token.text == 'else'):
self.flags.else_block = True
else:
while self.flags.mode == MODE.Statement:
self.restore_mode()
self.flags.if_block = False
if current_token.type == 'TK_RESERVED' and (current_token.text == 'case' or (current_token.text == 'default' and self.flags.in_case_statement)):
self.print_newline()
if self.flags.case_body or self.opts.jslint_happy:
self.flags.case_body = False
self.deindent()
self.print_token(current_token)
self.flags.in_case = True
self.flags.in_case_statement = True
return
if self.last_type in ['TK_COMMA', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']:
if not self.start_of_object_property():
self.allow_wrap_or_preserved_newline(current_token)
if current_token.type == 'TK_RESERVED' and current_token.text == 'function':
if (self.flags.last_text in ['}', ';'] or
(self.output.just_added_newline() and not (self.flags.last_text in ['(', '[', '{', ':', '=', ','] or self.last_type == 'TK_OPERATOR'))):
# make sure there is a nice clean space of at least one blank line
# before a new function definition, except in arrays
if not self.output.just_added_blankline() and len(current_token.comments_before) == 0:
self.print_newline()
self.print_newline(True)
if self.last_type == 'TK_RESERVED' or self.last_type == 'TK_WORD':
if self.last_type == 'TK_RESERVED' and self.flags.last_text in ['get', 'set', 'new', 'return', 'export', 'async']:
self.output.space_before_token = True
elif self.last_type == 'TK_RESERVED' and self.flags.last_text == 'default' and self.last_last_text == 'export':
self.output.space_before_token = True
else:
self.print_newline()
elif self.last_type == 'TK_OPERATOR' or self.flags.last_text == '=':
# foo = function
self.output.space_before_token = True
elif not self.flags.multiline_frame and (self.is_expression(self.flags.mode) or self.is_array(self.flags.mode)):
# (function
pass
else:
self.print_newline()
self.print_token(current_token)
self.flags.last_word = current_token.text
return
prefix = 'NONE'
if self.last_type == 'TK_END_BLOCK':
if self.previous_flags.inline_frame:
prefix = 'SPACE'
elif not (current_token.type == 'TK_RESERVED' and current_token.text in ['else', 'catch', 'finally', 'from']):
prefix = 'NEWLINE'
else:
if self.opts.brace_style in ['expand', 'end-expand'] or \
(self.opts.brace_style == 'none' and current_token.wanted_newline):
prefix = 'NEWLINE'
else:
prefix = 'SPACE'
self.output.space_before_token = True
elif self.last_type == 'TK_SEMICOLON' and self.flags.mode == MODE.BlockStatement:
# TODO: Should this be for STATEMENT as well?
prefix = 'NEWLINE'
elif self.last_type == 'TK_SEMICOLON' and self.is_expression(self.flags.mode):
prefix = 'SPACE'
elif self.last_type == 'TK_STRING':
prefix = 'NEWLINE'
elif self.last_type == 'TK_RESERVED' or self.last_type == 'TK_WORD' or \
(self.flags.last_text == '*' and (
self.last_last_text in ['function', 'yield'] or
(self.flags.mode == MODE.ObjectLiteral and self.last_last_text in ['{', ',']))):
prefix = 'SPACE'
elif self.last_type == 'TK_START_BLOCK':
if self.flags.inline_frame:
prefix = 'SPACE'
else:
prefix = 'NEWLINE'
elif self.last_type == 'TK_END_EXPR':
self.output.space_before_token = True
prefix = 'NEWLINE'
if current_token.type == 'TK_RESERVED' and current_token.text in Tokenizer.line_starters and self.flags.last_text != ')':
if self.flags.inline_frame or self.flags.last_text == 'else ' or self.flags.last_text == 'export':
prefix = 'SPACE'
else:
prefix = 'NEWLINE'
if current_token.type == 'TK_RESERVED' and current_token.text in ['else', 'catch', 'finally']:
if ((not (self.last_type == 'TK_END_BLOCK' and self.previous_flags.mode == MODE.BlockStatement)) \
or self.opts.brace_style == 'expand' \
or self.opts.brace_style == 'end-expand' \
or (self.opts.brace_style == 'none' and current_token.wanted_newline)) \
and not self.flags.inline_frame:
self.print_newline()
else:
self.output.trim(True)
# If we trimmed and there's something other than a close block before us
# put a newline back in. Handles '} // comment' scenario.
if self.output.current_line.last() != '}':
self.print_newline()
self.output.space_before_token = True
elif prefix == 'NEWLINE':
if self.last_type == 'TK_RESERVED' and self.is_special_word(self.flags.last_text):
# no newline between return nnn
self.output.space_before_token = True
elif self.last_type != 'TK_END_EXPR':
if (self.last_type != 'TK_START_EXPR' or not (current_token.type == 'TK_RESERVED' and current_token.text in ['var', 'let', 'const'])) and self.flags.last_text != ':':
# no need to force newline on VAR -
# for (var x = 0...
if current_token.type == 'TK_RESERVED' and current_token.text == 'if' and self.flags.last_text == 'else':
self.output.space_before_token = True
else:
self.print_newline()
elif current_token.type == 'TK_RESERVED' and current_token.text in Tokenizer.line_starters and self.flags.last_text != ')':
self.print_newline()
elif self.flags.multiline_frame and self.is_array(self.flags.mode) and self.flags.last_text == ',' and self.last_last_text == '}':
self.print_newline() # }, in lists get a newline
elif prefix == 'SPACE':
self.output.space_before_token = True
self.print_token(current_token)
self.flags.last_word = current_token.text
if current_token.type == 'TK_RESERVED':
if current_token.text == 'do':
self.flags.do_block = True
elif current_token.text == 'if':
self.flags.if_block = True
elif current_token.text == 'import':
self.flags.import_block = True
elif current_token.text == 'from' and self.flags.import_block:
self.flags.import_block = False
def handle_semicolon(self, current_token):
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
# Semicolon can be the start (and end) of a statement
self.output.space_before_token = False
else:
self.handle_whitespace_and_comments(current_token)
next_token = self.get_token(1)
while (self.flags.mode == MODE.Statement and
not (self.flags.if_block and next_token and next_token.type == 'TK_RESERVED' and next_token.text == 'else') and
not self.flags.do_block):
self.restore_mode()
if self.flags.import_block:
self.flags.import_block = False
self.print_token(current_token)
def handle_string(self, current_token):
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
# One difference - strings want at least a space before
self.output.space_before_token = True
else:
self.handle_whitespace_and_comments(current_token)
if self.last_type == 'TK_RESERVED' or self.last_type == 'TK_WORD' or self.flags.inline_frame:
self.output.space_before_token = True
elif self.last_type in ['TK_COMMA', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']:
if not self.start_of_object_property():
self.allow_wrap_or_preserved_newline(current_token)
else:
self.print_newline()
self.print_token(current_token)
def handle_equals(self, current_token):
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
pass
else:
self.handle_whitespace_and_comments(current_token)
if self.flags.declaration_statement:
# just got an '=' in a var-line, different line breaking rules will apply
self.flags.declaration_assignment = True
self.output.space_before_token = True
self.print_token(current_token)
self.output.space_before_token = True
def handle_comma(self, current_token):
self.handle_whitespace_and_comments(current_token, True)
self.print_token(current_token)
self.output.space_before_token = True
if self.flags.declaration_statement:
if self.is_expression(self.flags.parent.mode):
# do not break on comma, for ( var a = 1, b = 2
self.flags.declaration_assignment = False
if self.flags.declaration_assignment:
self.flags.declaration_assignment = False
self.print_newline(preserve_statement_flags = True)
elif self.opts.comma_first:
# for comma-first, we want to allow a newline before the comma
# to turn into a newline after the comma, which we will fixup later
self.allow_wrap_or_preserved_newline(current_token)
elif self.flags.mode == MODE.ObjectLiteral \
or (self.flags.mode == MODE.Statement and self.flags.parent.mode == MODE.ObjectLiteral):
if self.flags.mode == MODE.Statement:
self.restore_mode()
if not self.flags.inline_frame:
self.print_newline()
elif self.opts.comma_first:
# EXPR or DO_BLOCK
# for comma-first, we want to allow a newline before the comma
# to turn into a newline after the comma, which we will fixup later
self.allow_wrap_or_preserved_newline(current_token)
def handle_operator(self, current_token):
isGeneratorAsterisk = current_token.text == '*' and \
((self.last_type == 'TK_RESERVED' and self.flags.last_text in ['function', 'yield']) or
(self.last_type in ['TK_START_BLOCK', 'TK_COMMA', 'TK_END_BLOCK', 'TK_SEMICOLON']))
isUnary = current_token.text in ['+', '-'] \
and (self.last_type in ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR'] \
or self.flags.last_text in Tokenizer.line_starters or self.flags.last_text == ',')
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
pass
else:
preserve_statement_flags = not isGeneratorAsterisk
self.handle_whitespace_and_comments(current_token, preserve_statement_flags)
if self.last_type == 'TK_RESERVED' and self.is_special_word(self.flags.last_text):
# return had a special handling in TK_WORD
self.output.space_before_token = True
self.print_token(current_token)
return
# hack for actionscript's import .*;
if current_token.text == '*' and self.last_type == 'TK_DOT':
self.print_token(current_token)
return
if current_token.text == '::':
# no spaces around the exotic namespacing syntax operator
self.print_token(current_token)
return
# Allow line wrapping between operators when operator_position is
# set to before or preserve
if self.last_type == 'TK_OPERATOR' and self.opts.operator_position in OPERATOR_POSITION_BEFORE_OR_PRESERVE:
self.allow_wrap_or_preserved_newline(current_token)
if current_token.text == ':' and self.flags.in_case:
self.flags.case_body = True
self.indent()
self.print_token(current_token)
self.print_newline()
self.flags.in_case = False
return
space_before = True
space_after = True
in_ternary = False
if current_token.text == ':':
if self.flags.ternary_depth == 0:
# Colon is invalid javascript outside of ternary and object, but do our best to guess what was meant.
space_before = False
else:
self.flags.ternary_depth -= 1
in_ternary = True
elif current_token.text == '?':
self.flags.ternary_depth += 1
# let's handle the operator_position option prior to any conflicting logic
if (not isUnary) and (not isGeneratorAsterisk) and \
self.opts.preserve_newlines and current_token.text in Tokenizer.positionable_operators:
isColon = current_token.text == ':'
isTernaryColon = isColon and in_ternary
isOtherColon = isColon and not in_ternary
if self.opts.operator_position == OPERATOR_POSITION['before_newline']:
# if the current token is : and it's not a ternary statement then we set space_before to false
self.output.space_before_token = not isOtherColon
self.print_token(current_token)
if (not isColon) or isTernaryColon:
self.allow_wrap_or_preserved_newline(current_token)
self.output.space_before_token = True
return
elif self.opts.operator_position == OPERATOR_POSITION['after_newline']:
# if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement,
# then print a newline.
self.output.space_before_token = True
if (not isColon) or isTernaryColon:
if self.get_token(1).wanted_newline:
self.print_newline(preserve_statement_flags = True)
else:
self.allow_wrap_or_preserved_newline(current_token)
else:
self.output.space_before_token = False
self.print_token(current_token)
self.output.space_before_token = True
return
elif self.opts.operator_position == OPERATOR_POSITION['preserve_newline']:
if not isOtherColon:
self.allow_wrap_or_preserved_newline(current_token)
# if we just added a newline, or the current token is : and it's not a ternary statement,
# then we set space_before to false
self.output.space_before_token = not (self.output.just_added_newline() or isOtherColon)
self.print_token(current_token)
self.output.space_before_token = True
return
if isGeneratorAsterisk:
self.allow_wrap_or_preserved_newline(current_token)
space_before = False
next_token = self.get_token(1)
space_after = next_token and next_token.type in ['TK_WORD','TK_RESERVED']
elif current_token.text == '...':
self.allow_wrap_or_preserved_newline(current_token)
space_before = self.last_type == 'TK_START_BLOCK'
space_after = False
elif current_token.text in ['--', '++', '!', '~'] or isUnary:
space_before = False
space_after = False
# http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1
# if there is a newline between -- or ++ and anything else we should preserve it.
if current_token.wanted_newline and (current_token.text == '--' or current_token.text == '++'):
self.print_newline(preserve_statement_flags = True)
if self.flags.last_text == ';' and self.is_expression(self.flags.mode):
# for (;; ++i)
# ^^
space_before = True
if self.last_type == 'TK_RESERVED':
space_before = True
elif self.last_type == 'TK_END_EXPR':
space_before = not (self.flags.last_text == ']' and current_token.text in ['--', '++'])
elif self.last_type == 'TK_OPERATOR':
# a++ + ++b
# a - -b
space_before = current_token.text in ['--', '-','++', '+'] and self.flags.last_text in ['--', '-','++', '+']
# + and - are not unary when preceeded by -- or ++ operator
# a-- + b
# a * +b
# a - -b
if current_token.text in ['-', '+'] and self.flags.last_text in ['--', '++']:
space_after = True
if (((self.flags.mode == MODE.BlockStatement and not self.flags.inline_frame) or self.flags.mode == MODE.Statement)
and self.flags.last_text in ['{', ';']):
# { foo: --i }
# foo(): --bar
self.print_newline()
if space_before:
self.output.space_before_token = True
self.print_token(current_token)
if space_after:
self.output.space_before_token = True
def handle_block_comment(self, current_token, preserve_statement_flags):
if self.output.raw:
self.output.add_raw_token(current_token)
if current_token.directives and current_token.directives.get('preserve') == 'end':
# If we're testing the raw output behavior, do not allow a directive to turn it off.
self.output.raw = self.opts.test_output_raw
return
if current_token.directives:
self.print_newline(preserve_statement_flags = preserve_statement_flags)
self.print_token(current_token)
if current_token.directives.get('preserve') == 'start':
self.output.raw = True
self.print_newline(preserve_statement_flags = True)
return
# inline block
if not self.acorn.newline.search(current_token.text) and not current_token.wanted_newline:
self.output.space_before_token = True
self.print_token(current_token)
self.output.space_before_token = True
return
lines = self.acorn.allLineBreaks.split(current_token.text)
javadoc = False
starless = False
last_indent = current_token.whitespace_before
last_indent_length = len(last_indent)
# block comment starts with a new line
self.print_newline(preserve_statement_flags = preserve_statement_flags)
if len(lines) > 1:
javadoc = not any(l for l in lines[1:] if ( l.strip() == '' or (l.lstrip())[0] != '*'))
starless = all(l.startswith(last_indent) or l.strip() == '' for l in lines[1:])
# first line always indented
self.print_token(current_token, lines[0])
for line in lines[1:]:
self.print_newline(preserve_statement_flags = True)
if javadoc:
# javadoc: reformat and re-indent
self.print_token(current_token, ' ' + line.lstrip())
elif starless and len(line) > last_indent_length:
# starless: re-indent non-empty content, avoiding trim
self.print_token(current_token, line[last_indent_length:])
else:
# normal comments output raw
self.output.add_token(line)
self.print_newline(preserve_statement_flags = preserve_statement_flags)
def handle_comment(self, current_token, preserve_statement_flags):
if current_token.wanted_newline:
self.print_newline(preserve_statement_flags = preserve_statement_flags)
if not current_token.wanted_newline:
self.output.trim(True)
self.output.space_before_token = True
self.print_token(current_token)
self.print_newline(preserve_statement_flags = preserve_statement_flags)
def handle_dot(self, current_token):
if self.start_of_statement(current_token):
# The conditional starts the statement if appropriate.
pass
else:
self.handle_whitespace_and_comments(current_token, True)
if self.last_type == 'TK_RESERVED' and self.is_special_word(self.flags.last_text):
self.output.space_before_token = True
else:
# allow preserved newlines before dots in general
# force newlines on dots after close paren when break_chained - for bar().baz()
self.allow_wrap_or_preserved_newline(current_token,
self.flags.last_text == ')' and self.opts.break_chained_methods)
self.print_token(current_token)
def handle_unknown(self, current_token, preserve_statement_flags):
self.print_token(current_token)
if current_token.text[-1] == '\n':
self.print_newline(preserve_statement_flags = preserve_statement_flags)
def handle_eof(self, current_token):
# Unwind any open statements
while self.flags.mode == MODE.Statement:
self.restore_mode()
self.handle_whitespace_and_comments(current_token)
def mkdir_p(path):
try:
if path:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise Exception()
# Using object instead of string to allow for later expansion of info about each line
class OutputLine:
def __init__(self, parent):
self.__parent = parent
self.__character_count = 0
self.__indent_count = -1
self.__items = []
self.__empty = True
def get_character_count(self):
return self.__character_count
def is_empty(self):
return self.__empty
def set_indent(self, level):
self.__character_count = self.__parent.baseIndentLength + level * self.__parent.indent_length
self.__indent_count = level;
def last(self):
if not self.is_empty():
return self.__items[-1]
else:
return None
def push(self, input):
self.__items.append(input)
self.__character_count += len(input)
self.__empty = False
def pop(self):
item = None
if not self.is_empty():
item = self.__items.pop()
self.__character_count -= len(item)
self.__empty = len(self.__items) == 0
return item
def remove_indent(self):
if self.__indent_count > 0:
self.__indent_count -= 1
self.__character_count -= self.__parent.indent_length
def trim(self):
while self.last() == ' ':
item = self._items.pop()
self.__character_count -= 1
self.__empty = len(self.__items) == 0
def toString(self):
result = ''
if not self.is_empty():
if self.__indent_count >= 0:
result = self.__parent.indent_cache[self.__indent_count]
result += ''.join(self.__items)
return result
class Output:
def __init__(self, indent_string, baseIndentString = ''):
self.indent_string = indent_string
self.baseIndentString = baseIndentString
self.indent_cache = [ baseIndentString ]
self.baseIndentLength = len(baseIndentString)
self.indent_length = len(indent_string)
self.raw = False
self.lines = []
self.previous_line = None
self.current_line = None
self.space_before_token = False
self.add_outputline()
def add_outputline(self):
self.previous_line = self.current_line
self.current_line = OutputLine(self)
self.lines.append(self.current_line)
def get_line_number(self):
return len(self.lines)
def add_new_line(self, force_newline):
if len(self.lines) == 1 and self.just_added_newline():
# no newline on start of file
return False
if force_newline or not self.just_added_newline():
if not self.raw:
self.add_outputline()
return True
return False
def get_code(self):
sweet_code = "\n".join(line.toString() for line in self.lines)
return re.sub('[\r\n\t ]+$', '', sweet_code)
def set_indent(self, level):
# Never indent your first output indent at the start of the file
if len(self.lines) > 1:
while level >= len(self.indent_cache):
self.indent_cache.append(self.indent_cache[-1] + self.indent_string)
self.current_line.set_indent(level)
return True
self.current_line.set_indent(0)
return False
def add_raw_token(self, token):
for _ in range(token.newlines):
self.add_outputline()
self.current_line.push(token.whitespace_before)
self.current_line.push(token.text)
self.space_before_token = False
def add_token(self, printable_token):
self.add_space_before_token()
self.current_line.push(printable_token)
def add_space_before_token(self):
if self.space_before_token and not self.just_added_newline():
self.current_line.push(' ')
self.space_before_token = False
def remove_redundant_indentation(self, frame):
# This implementation is effective but has some issues:
# - can cause line wrap to happen too soon due to indent removal
# after wrap points are calculated
# These issues are minor compared to ugly indentation.
if frame.multiline_frame or frame.mode == MODE.ForInitializer or frame.mode == MODE.Conditional:
return
# remove one indent from each line inside this section
index = frame.start_line_index
while index < len(self.lines):
self.lines[index].remove_indent()
index += 1
def trim(self, eat_newlines = False):
self.current_line.trim()
while eat_newlines and len(self.lines) > 1 and self.current_line.is_empty():
self.lines.pop()
self.current_line = self.lines[-1]
self.current_line.trim()
if len(self.lines) > 1:
self.previous_line = self.lines[-2]
else:
self.previous_line = None
def just_added_newline(self):
return self.current_line.is_empty()
def just_added_blankline(self):
if self.just_added_newline():
if len(self.lines) == 1:
return True
line = self.lines[-2]
return line.is_empty()
return False
class InputScanner:
def __init__(self, input):
self.__input = input
self.__input_length = len(self.__input)
self.__position = 0
def back(self):
self.__position -= 1
def hasNext(self):
return self.__position < self.__input_length
def next(self):
val = None
if self.hasNext():
val = self.__input[self.__position]
self.__position += 1
return val;
def peek(self, index = 0):
val = None
index += self.__position;
if index >= 0 and index < self.__input_length:
val = self.__input[index];
return val;
def peekCharCode(self, index = 0):
val = 0
index += self.__position;
if index >= 0 and index < self.__input_length:
val = ord(self.__input[index])
return val
def test(self, pattern, index = 0):
index += self.__position;
return index >= 0 and index < self.__input_length and pattern.match(self.__input, index)
def testChar(self, pattern, index = 0):
val = self.peek(index)
return val != None and pattern.match(val)
def match(self, pattern):
pattern_match = None
if self.hasNext():
pattern_match = pattern.match(self.__input, self.__position)
if pattern_match:
self.__position += len(pattern_match.group(0));
return pattern_match
class Tokenizer:
whitespace = ["\n", "\r", "\t", " "]
digit = re.compile('[0-9]')
digit_bin = re.compile('[01]')
digit_oct = re.compile('[01234567]')
digit_hex = re.compile('[0123456789abcdefABCDEF]')
positionable_operators = '!= !== % & && * ** + - / : < << <= == === > >= >> >>> ? ^ | ||'.split(' ')
punct = (positionable_operators +
# non-positionable operators - these do not follow operator position settings
'! %= &= *= **= ++ += , -- -= /= :: <<= = => >>= >>>= ^= |= ~ ...'.split(' '))
# Words which always should start on a new line
line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(',')
reserved_words = line_starters + ['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as']
def __init__ (self, input_string, opts, indent_string):
self.input = InputScanner(input_string)
self.opts = opts
self.indent_string = indent_string
self.acorn = Acorn()
# /* ... */ comment ends with nearest */ or end of file
self.block_comment_pattern = re.compile('([\s\S]*?)((?:\*\/)|$)')
# comment ends just before nearest linefeed or end of file
self.comment_pattern = re.compile(self.acorn.six.u('([^\n\r\u2028\u2029]*)'))
self.directives_block_pattern = re.compile('\/\* beautify( \w+[:]\w+)+ \*\/')
self.directive_pattern = re.compile(' (\w+)[:](\w+)')
self.directives_end_ignore_pattern = re.compile('([\s\S]*?)((?:\/\*\sbeautify\signore:end\s\*\/)|$)')
self.template_pattern = re.compile('((<\?php|<\?=)[\s\S]*?\?>)|(<%[\s\S]*?%>)')
def tokenize(self):
self.in_html_comment = False
self.tokens = []
next = None
last = None
open = None
open_stack = []
comments = []
while not (not last == None and last.type == 'TK_EOF'):
token_values = self.__tokenize_next()
next = Token(token_values[1], token_values[0], self.n_newlines, self.whitespace_before_token)
while next.type == 'TK_COMMENT' or next.type == 'TK_BLOCK_COMMENT' or next.type == 'TK_UNKNOWN':
if next.type == 'TK_BLOCK_COMMENT':
next.directives = token_values[2]
comments.append(next)
token_values = self.__tokenize_next()
next = Token(token_values[1], token_values[0], self.n_newlines, self.whitespace_before_token)
if len(comments) > 0:
next.comments_before = comments
comments = []
if next.type == 'TK_START_BLOCK' or next.type == 'TK_START_EXPR':
next.parent = last
open_stack.append(open)
open = next
elif (next.type == 'TK_END_BLOCK' or next.type == 'TK_END_EXPR') and \
(not open == None and ( \
(next.text == ']' and open.text == '[') or \
(next.text == ')' and open.text == '(') or \
(next.text == '}' and open.text == '{'))):
next.parent = open.parent
next.opened = open
open = open_stack.pop()
self.tokens.append(next)
last = next
return self.tokens
def get_directives (self, text):
if not self.directives_block_pattern.match(text):
return None
directives = {}
directive_match = self.directive_pattern.search(text)
while directive_match:
directives[directive_match.group(1)] = directive_match.group(2)
directive_match = self.directive_pattern.search(text, directive_match.end())
return directives
def __tokenize_next(self):
whitespace_on_this_line = []
self.n_newlines = 0
self.whitespace_before_token = ''
c = self.input.next()
if c == None:
return '', 'TK_EOF'
if len(self.tokens) > 0:
last_token = self.tokens[-1]
else:
# For the sake of tokenizing we can pretend that there was on open brace to start
last_token = Token('TK_START_BLOCK', '{')
while c in self.whitespace:
if self.acorn.newline.match(c):
# treat \r\n as one newline
if not (c == '\n' and self.input.peek(-2) == '\r'):
self.n_newlines += 1
whitespace_on_this_line = []
else:
whitespace_on_this_line.append(c)
c = self.input.next()
if c == None:
return '', 'TK_EOF'
if len(whitespace_on_this_line) != 0:
self.whitespace_before_token = ''.join(whitespace_on_this_line)
if self.digit.match(c) or (c == '.' and self.input.testChar(self.digit)):
allow_decimal = True
allow_e = True
local_digit = self.digit
if c == '0' and self.input.testChar(re.compile('[XxOoBb]')):
# switch to hex/oct/bin number, no decimal or e, just hex/oct/bin digits
allow_decimal = False
allow_e = False
if self.input.testChar(re.compile('[Bb]')):
local_digit = self.digit_bin
elif self.input.testChar(re.compile('[Oo]')):
local_digit = self.digit_oct
else:
local_digit = self.digit_hex
c += self.input.next()
elif c == '.':
# Already have a decimal for this literal, don't allow another
allow_decimal = False
else:
# we know this first loop will run. It keeps the logic simpler.
c = ''
self.input.back()
# Add the digits
while self.input.testChar(local_digit):
c += self.input.next()
if allow_decimal and self.input.peek() == '.':
c += self.input.next()
allow_decimal = False
# a = 1.e-7 is valid, so we test for . then e in one loop
if allow_e and self.input.testChar(re.compile('[Ee]')):
c += self.input.next()
if self.input.testChar(re.compile('[+-]')):
c += self.input.next()
allow_e = False
allow_decimal = False
return c, 'TK_WORD'
if self.acorn.isIdentifierStart(self.input.peekCharCode(-1)):
if self.input.hasNext():
while self.acorn.isIdentifierChar(self.input.peekCharCode()):
c += self.input.next()
if not self.input.hasNext():
break
if not (last_token.type == 'TK_DOT' \
or (last_token.type == 'TK_RESERVED' and last_token.text in ['set', 'get'])) \
and c in self.reserved_words:
if c == 'in' or c == 'of': # in and of are operators, need to hack
return c, 'TK_OPERATOR'
return c, 'TK_RESERVED'
return c, 'TK_WORD'
if c in '([':
return c, 'TK_START_EXPR'
if c in ')]':
return c, 'TK_END_EXPR'
if c == '{':
return c, 'TK_START_BLOCK'
if c == '}':
return c, 'TK_END_BLOCK'
if c == ';':
return c, 'TK_SEMICOLON'
if c == '/':
comment = ''
inline_comment = True
if self.input.peek() == '*': # peek /* .. */ comment
self.input.next()
comment_match = self.input.match(self.block_comment_pattern)
comment = '/*' + comment_match.group(0)
directives = self.get_directives(comment)
if directives and directives.get('ignore') == 'start':
comment_match = self.input.match(self.directives_end_ignore_pattern)
comment += comment_match.group(0)
comment = re.sub(self.acorn.allLineBreaks, '\n', comment)
return comment, 'TK_BLOCK_COMMENT', directives
if self.input.peek() == '/': # peek // comment
self.input.next()
comment_match = self.input.match(self.comment_pattern)
comment = '//' + comment_match.group(0)
return comment, 'TK_COMMENT'
startXmlRegExp = re.compile('<()([-a-zA-Z:0-9_.]+|{[\s\S]+?}|!\[CDATA\[[\s\S]*?\]\])(\s+{[\s\S]+?}|\s+[-a-zA-Z:0-9_.]+|\s+[-a-zA-Z:0-9_.]+\s*=\s*(\'[^\']*\'|"[^"]*"|{[\s\S]+?}))*\s*(/?)\s*>')
self.has_char_escapes = False
if c == '`' or c == "'" or c == '"' or \
( \
(c == '/') or \
(self.opts.e4x and c == "<" and self.input.test(startXmlRegExp, -1)) \
) and ( \
(last_token.type == 'TK_RESERVED' and last_token.text in ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield']) or \
(last_token.type == 'TK_END_EXPR' and last_token.text == ')' and \
last_token.parent and last_token.parent.type == 'TK_RESERVED' and last_token.parent.text in ['if', 'while', 'for']) or \
(last_token.type in ['TK_COMMENT', 'TK_START_EXPR', 'TK_START_BLOCK', 'TK_END_BLOCK', 'TK_OPERATOR', \
'TK_EQUALS', 'TK_EOF', 'TK_SEMICOLON', 'TK_COMMA'])):
sep = c
esc = False
esc1 = 0
esc2 = 0
resulting_string = c
in_char_class = False
if sep == '/':
# handle regexp
in_char_class = False
while self.input.hasNext() and \
(esc or in_char_class or self.input.peek()!= sep) and \
not self.input.testChar(self.acorn.newline):
resulting_string += self.input.peek()
if not esc:
esc = self.input.peek() == '\\'
if self.input.peek() == '[':
in_char_class = True
elif self.input.peek() == ']':
in_char_class = False
else:
esc = False
self.input.next()
elif self.opts.e4x and sep == '<':
# handle e4x xml literals
xmlRegExp = re.compile('[\s\S]*?<(\/?)([-a-zA-Z:0-9_.]+|{[\s\S]+?}|!\[CDATA\[[\s\S]*?\]\])(\s+{[\s\S]+?}|\s+[-a-zA-Z:0-9_.]+|\s+[-a-zA-Z:0-9_.]+\s*=\s*(\'[^\']*\'|"[^"]*"|{[\s\S]+?}))*\s*(/?)\s*>')
self.input.back()
xmlStr = ""
match = self.input.match(xmlRegExp)
if match:
rootTag = match.group(2)
rootTag = re.sub(r'^{\s+', '{', re.sub(r'\s+}$', '}', rootTag))
isCurlyRoot = rootTag.startswith('{')
depth = 0
while (match):
isEndTag = match.group(1)
tagName = match.group(2)
isSingletonTag = (match.groups()[-1] != "") or (match.group(2)[0:8] == "![CDATA[")
if not isSingletonTag and (
tagName == rootTag or (isCurlyRoot and re.sub(r'^{\s+', '{', re.sub(r'\s+}$', '}', tagName)))):
if isEndTag:
depth -= 1
else:
depth += 1
xmlStr += match.group(0)
if depth <= 0:
break
match = self.input.match(xmlRegExp)
# if we didn't close correctly, keep unformatted.
if not match:
xmlStr += self.input.match(re.compile('[\s\S]*')).group(0)
xmlStr = re.sub(self.acorn.allLineBreaks, '\n', xmlStr)
return xmlStr, 'TK_STRING'
else:
# handle string
def parse_string(self, resulting_string, delimiter, allow_unescaped_newlines = False, start_sub = None):
esc = False
while self.input.hasNext():
current_char = self.input.peek()
if not (esc or (current_char != delimiter and
(allow_unescaped_newlines or not self.acorn.newline.match(current_char)))):
break
# Handle \r\n linebreaks after escapes or in template strings
if (esc or allow_unescaped_newlines) and self.acorn.newline.match(current_char):
if current_char == '\r' and self.input.peek(1) == '\n':
self.input.next()
current_char = self.input.peek()
resulting_string += '\n'
else:
resulting_string += current_char
if esc:
if current_char == 'x' or current_char == 'u':
self.has_char_escapes = True
esc = False
else:
esc = current_char == '\\'
self.input.next()
if start_sub and resulting_string.endswith(start_sub):
if delimiter == '`':
resulting_string = parse_string(self, resulting_string, '}', allow_unescaped_newlines, '`')
else:
resulting_string = parse_string(self, resulting_string, '`', allow_unescaped_newlines, '${')
if self.input.hasNext():
resulting_string += self.input.next()
return resulting_string
if sep == '`':
resulting_string = parse_string(self, resulting_string, '`', True, '${')
else:
resulting_string = parse_string(self, resulting_string, sep)
if self.has_char_escapes and self.opts.unescape_strings:
resulting_string = self.unescape_string(resulting_string)
if self.input.peek() == sep:
resulting_string += self.input.next()
if sep == '/':
# regexps may have modifiers /regexp/MOD, so fetch those too
# Only [gim] are valid, but if the user puts in garbage, do what we can to take it.
while self.input.hasNext() and self.acorn.isIdentifierStart(self.input.peekCharCode()):
resulting_string += self.input.next()
resulting_string = re.sub(self.acorn.allLineBreaks, '\n', resulting_string)
return resulting_string, 'TK_STRING'
if c == '#':
# she-bang
if len(self.tokens) == 0 and self.input.peek() == '!':
resulting_string = c
while self.input.hasNext() and c != '\n':
c = self.input.next()
resulting_string += c
return resulting_string.strip() + '\n', 'TK_UNKNOWN'
# Spidermonkey-specific sharp variables for circular references
# https://developer.mozilla.org/En/Sharp_variables_in_JavaScript
# http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp around line 1935
sharp = '#'
if self.input.hasNext() and self.input.testChar(self.digit):
while True:
c = self.input.next()
sharp += c
if (not self.input.hasNext()) or c == '#' or c == '=':
break
if c == '#':
pass
elif self.input.peek() == '[' and self.input.peek(1) == ']':
sharp += '[]'
self.input.next()
self.input.next()
elif self.input.peek() == '{' and self.input.peek(1) == '}':
sharp += '{}'
self.input.next()
self.input.next()
return sharp, 'TK_WORD'
if c == '<' and self.input.peek() in ['?', '%']:
self.input.back()
template_match = self.input.match(self.template_pattern)
if template_match:
c = template_match.group(0)
c = re.sub(self.acorn.allLineBreaks, '\n', c)
return c, 'TK_STRING'
if c == '<' and self.input.match(re.compile('\!--')):
c = '<!--'
while self.input.hasNext() and not self.input.testChar(self.acorn.newline):
c += self.input.next()
self.in_html_comment = True
return c, 'TK_COMMENT'
if c == '-' and self.in_html_comment and self.input.match(re.compile('->')):
self.in_html_comment = False
return '-->', 'TK_COMMENT'
if c == '.':
if self.input.peek() == '.' and self.input.peek(1) == '.':
c += self.input.next() + self.input.next()
return c, 'TK_OPERATOR'
return c, 'TK_DOT'
if c in self.punct:
while self.input.hasNext() and c + self.input.peek() in self.punct:
c += self.input.next()
if not self.input.hasNext():
break
if c == ',':
return c, 'TK_COMMA'
if c == '=':
return c, 'TK_EQUALS'
return c, 'TK_OPERATOR'
return c, 'TK_UNKNOWN'
def unescape_string(self, s):
# You think that a regex would work for this
# return s.replace(/\\x([0-9a-f]{2})/gi, function(match, val) {
# return String.fromCharCode(parseInt(val, 16));
# })
# However, dealing with '\xff', '\\xff', '\\\xff' makes this more fun.
out = self.acorn.six.u('')
escaped = 0
input_scan = InputScanner(s)
matched = None
while input_scan.hasNext():
# Keep any whitespace, non-slash characters
# also keep slash pairs.
matched = input_scan.match(re.compile(r'([\s]|[^\\]|\\\\)+'))
if matched:
out += matched.group(0)
if input_scan.peek() != '\\':
continue
input_scan.next()
if input_scan.peek() == 'x':
matched = input_scan.match(re.compile('x([0-9A-Fa-f]{2})'))
elif input_scan.peek() == 'u':
matched = input_scan.match(re.compile('u([0-9A-Fa-f]{4})'));
else:
out += '\\'
if input_scan.hasNext():
out += input_scan.next()
continue
# If there's some error decoding, return the original string
if not matched:
return s
escaped = int(matched.group(1), 16)
if escaped > 0x7e and escaped <= 0xff and matched.group(0).startswith('x'):
# we bail out on \x7f..\xff,
# leaving whole string escaped,
# as it's probably completely binary
return s
elif escaped >= 0x00 and escaped < 0x20:
# leave 0x00...0x1f escaped
out += '\\' + matched.group(0)
continue
elif escaped == 0x22 or escaped == 0x27 or escaped == 0x5c:
# single-quote, apostrophe, backslash - escape these
out += ('\\' + chr(escaped))
else:
out += self.acorn.six.unichr(escaped)
return out
def isFileDifferent(filepath, expected):
try:
return (''.join(io.open(filepath, 'rt', newline='').readlines()) != expected)
except:
return True
def main():
argv = sys.argv[1:]
try:
opts, args = getopt.getopt(argv, "s:c:e:o:rdEPjabkil:xhtfvXnCO:w:",
['indent-size=','indent-char=','eol=''outfile=', 'replace', 'disable-preserve-newlines',
'space-in-paren', 'space-in-empty-paren', 'jslint-happy', 'space-after-anon-function',
'brace-style=', 'keep-array-indentation', 'indent-level=', 'unescape-strings',
'help', 'usage', 'stdin', 'eval-code', 'indent-with-tabs', 'keep-function-indentation', 'version',
'e4x', 'end-with-newline','comma-first','operator-position=','wrap-line-length','editorconfig'])
except getopt.GetoptError as ex:
print(ex, file=sys.stderr)
return usage(sys.stderr)
js_options = default_options()
file = None
outfile = 'stdout'
replace = False
if len(args) == 1:
file = args[0]
for opt, arg in opts:
if opt in ('--keep-array-indentation', '-k'):
js_options.keep_array_indentation = True
if opt in ('--keep-function-indentation','-f'):
js_options.keep_function_indentation = True
elif opt in ('--outfile', '-o'):
outfile = arg
elif opt in ('--replace', '-r'):
replace = True
elif opt in ('--indent-size', '-s'):
js_options.indent_size = int(arg)
elif opt in ('--indent-char', '-c'):
js_options.indent_char = arg
elif opt in ('--eol', '-e'):
js_options.eol = arg
elif opt in ('--indent-with-tabs', '-t'):
js_options.indent_with_tabs = True
elif opt in ('--disable-preserve-newlines', '-d'):
js_options.preserve_newlines = False
elif opt in ('--space-in-paren', '-P'):
js_options.space_in_paren = True
elif opt in ('--space-in-empty-paren', '-E'):
js_options.space_in_empty_paren = True
elif opt in ('--jslint-happy', '-j'):
js_options.jslint_happy = True
elif opt in ('--space_after_anon_function', '-a'):
js_options.space_after_anon_function = True
elif opt in ('--eval-code'):
js_options.eval_code = True
elif opt in ('--brace-style', '-b'):
js_options.brace_style = arg
elif opt in ('--unescape-strings', '-x'):
js_options.unescape_strings = True
elif opt in ('--e4x', '-X'):
js_options.e4x = True
elif opt in ('--end-with-newline', '-n'):
js_options.end_with_newline = True
elif opt in ('--comma-first', '-C'):
js_options.comma_first = True
elif opt in ('--operator-position', '-O'):
js_options.operator_position = sanitizeOperatorPosition(arg)
elif opt in ('--wrap-line-length ', '-w'):
js_options.wrap_line_length = int(arg)
elif opt in ('--stdin', '-i'):
file = '-'
elif opt in ('--editorconfig'):
js_options.editorconfig = True
elif opt in ('--version', '-v'):
return print(__version__)
elif opt in ('--help', '--usage', '-h'):
return usage()
if not file:
file = '-'
try:
if outfile == 'stdout' and replace and not file == '-':
outfile = file
# Editorconfig used only on files, not stdin
if getattr(js_options, 'editorconfig'):
editorconfig_filepath = file
if editorconfig_filepath == '-':
if outfile != 'stdout':
editorconfig_filepath = outfile
else:
fileType = 'js'
editorconfig_filepath = 'stdin.' + fileType
# debug("EditorConfig is enabled for ", editorconfig_filepath);
js_options = copy.copy(js_options)
set_file_editorconfig_opts(editorconfig_filepath, js_options)
pretty = beautify_file(file, js_options)
if outfile == 'stdout':
# python automatically converts newlines in text to "\r\n" when on windows
# switch to binary to prevent this
if sys.platform == "win32":
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
if sys.stdout.encoding is None:
# sys.stdout.encoding will be None if stdout is redirected (at
# least on Python 2), leading to encoding errors when stdout is
# redirected and the beautified content contains unicode
try:
sys.stdout.buffer.write(pretty.encode(locale.getpreferredencoding()))
except:
sys.stdout.write(pretty.encode(locale.getpreferredencoding()))
else:
sys.stdout.write(pretty)
else:
if isFileDifferent(outfile, pretty):
mkdir_p(os.path.dirname(outfile))
# python automatically converts newlines in text to "\r\n" when on windows
# set newline to empty to prevent this
with io.open(outfile, 'wt', newline='') as f:
print('writing ' + outfile, file=sys.stderr)
try:
f.write(pretty)
except TypeError:
# This is not pretty, but given how we did the version import
# it is the only way to do this without having setup.py fail on a missing six dependency.
six = __import__("six")
f.write(six.u(pretty))
except Exception as ex:
print(ex, file=sys.stderr)
return 1
# Success
return 0
'use strict';
(function(window){
function AAI() {
var host = 'https://' + window.location.hostname,
ourEntityID = host.match("clarin-dev.eurac.edu") ? "https://clarin-dev.eurac.edu" : host;
this.defaults = {
//host : 'https://ufal-point.mff.cuni.cz',
host : host, //better default (useful when testing on ufal-point-dev)
// do not add protocol because an error will appear in the DJ dialog
// if you see the error, your SP is not listed among djc trusted (edugain is enough to be trusted)
responseUrl: window.location.protocol + '//clarin-dev.eurac.edu/aai/discojuiceDiscoveryResponse.html',
ourEntityID: ourEntityID + '/Shibboleth.sso/Metadata',
serviceName: '',
metadataFeed: host + '/xmlui/discojuice/feeds',
selector: 'a.signon', // selector for login button
autoInitialize: true, // auto attach DiscoJuice to DOM
textHelpMore: "First check you are searching under the right country.\nIf your provider is not listed, please read <a href='https://clarin-dev.eurac.edu/how-do-i-sign-up' style='text-decoration: underline; font-weight: bold;'>these instructions</a> to obtain an account."
};
this.setup = function(options) {
var opts = jQuery.extend({}, this.defaults, options),
defaultCallback = function(e) {
window.location = opts.host + '/Shibboleth.sso/Login?SAMLDS=1&target=' + opts.target + '&entityID=' + window.encodeURIComponent(e.entityID);
};
//console.log(opts);
if(!opts.target){
throw 'You need to set the \'target\' parameter.';
}
// call disco juice setup
if (!opts.autoInitialize || $(opts.selector).length > 0) {
if(! window.DiscoJuice ){
throw 'Failed to find DiscoJuice. Did you include all that is necessary?';
}
var djc = DiscoJuice.Hosted.getConfig(
opts.serviceName,
opts.ourEntityID,
opts.responseUrl,
[ ],
opts.host + '/Shibboleth.sso/Login?SAMLDS=1&target='+opts.target+'&entityID=');
djc.metadata = [opts.metadataFeed];
djc.subtitle = "Login via Your home institution (e.g. university)";
djc.textHelp = opts.textHelp;
djc.textHelpMore = opts.textHelpMore;
djc.inlinemetadata = typeof opts.inlinemetadata === 'object' ? opts.inlinemetadata : [];
djc.inlinemetadata.push({
'country': '_all_',
'entityID': 'https://idm.clarin.eu',
'geo': {'lat': '51.833298', 'lon': '5.866699'},
'title': 'Clarin.eu website account',
'weight': -801
});
djc.inlinemetadata.push({
'country': 'IT',
'entityID': 'https://idp.eurac.edu/idp/shibboleth',
'geo': {'lat': '46.494281', 'lon': '11.346842'},
'title': 'Eurac Research',
'weight': -1000
});
if(opts.localauth) {
djc.inlinemetadata.push(
{
'entityID': 'local://',
'auth': 'local',
'title': 'Local authentication',
'country': '_all_',
'geo': null,
'weight': 1000
});
djc.callback = function(e){
var auth = e.auth || null;
switch(auth) {
case 'local':
DiscoJuice.UI.setScreen(opts.localauth);
jQuery('input#login').focus();
break;
//case 'saml':
default:
defaultCallback(e);
break;
}
};
}
if (opts.callback && typeof opts.callback === 'function') {
djc.callback = function(e) {
opts.callback(e, opts, defaultCallback);
};
}
if (opts.autoInitialize) {
jQuery(opts.selector).DiscoJuice( djc );
}
return djc;
} //if jQuery(selector)
};
}
if (!window.aai) {
window.aai = new AAI();
}
})(window);
/*global jQuery */
/*jshint globalstrict: true*/
'use strict';
jQuery(document).ready(
function () {
var opts = (function () {
var instance = {};
instance.autoInitialize = false;
//if ever port is needed (eg. testing other tomcat) it should be in responseUrl and target
instance.port = (window.location.port === "" ? "" : ":" + window.location.port);
instance.host = window.location.protocol + '//' +
window.location.hostname;
instance.repoPath = jQuery("a#repository_path").attr("href");
if (instance.repoPath.charAt(instance.repoPath.length - 1) !== '/') {
instance.repoPath = instance.repoPath + '/';
}
instance.target = instance.host + instance.port + instance.repoPath;
//In order to use the discojuice store (improve score of used IDPs)
//Works only with "verified" SPs - ie. ufal-point, displays error on ufal-point-dev
instance.responseUrl =
(window.location.hostname.search("clarin-dev") >= 0) ?
"" :
instance.host + instance.port + instance.repoPath +
"themes/UFAL/lib/html/disco-juice.html?";
instance.metadataFeed = instance.target + "discojuice/feeds";
instance.serviceName = "Eurac Research CLARIN Centre";
instance.localauth =
'<form method="post" action="' + instance.target + 'password-login"> ' +
'<p>Sign in using your local account obtained from the ERCC administrator.</p>' +
'<p style="margin: 5px; color: #888" ><input type="text" name="login_email" style="font-size: 160%; width: 100%" id="login" /> <label for="login">E-Mail Address</label></p>' +
'<p style="margin: 5px; color: #888" ><input type="password" name="login_password" style="font-size: 160%; width: 100%" id="pass" /> <label for="pass">Password</label></p>' +
'<p style="margin: 5px; color: #607890; text-decoration: underline;"><a href="' + instance.target + 'forgot">Forgot your password?</a></p>' +
'<p style="" ><input type="submit" style="margin: 20px 2px" name="submit" value="Sign in" /></p>' +
'</form>';
instance.target = instance.target + "shibboleth-login";
return instance;
})();
if (!("aai" in window)) {
throw "Failed to find UFAL AAI object. See https://redmine.ms.mff.cuni.cz/projects/lindat-aai for more details!";
}
window.aai.setup(opts);
}
); // ready
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------------
# Control Script for the CATALINA Server
#
# Environment Variable Prerequisites
#
# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
#
# CATALINA_HOME May point at your Catalina "build" directory.
#
# CATALINA_BASE (Optional) Base directory for resolving dynamic portions
# of a Catalina installation. If not present, resolves to
# the same directory that CATALINA_HOME points to.
#
# CATALINA_OUT (Optional) Full path to a file where stdout and stderr
# will be redirected.
# Default is $CATALINA_BASE/logs/catalina.out
#
# CATALINA_OPTS (Optional) Java runtime options used when the "start",
# "run" or "debug" command is executed.
# Include here and not in JAVA_OPTS all options, that should
# only be used by Tomcat itself, not by the stop process,
# the version command etc.
# Examples are heap size, GC logging, JMX ports etc.
#
# CATALINA_TMPDIR (Optional) Directory path location of temporary directory
# the JVM should use (java.io.tmpdir). Defaults to
# $CATALINA_BASE/temp.
#
# JAVA_HOME Must point at your Java Development Kit installation.
# Required to run the with the "debug" argument.
#
# JRE_HOME Must point at your Java Runtime installation.
# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
# are both set, JRE_HOME is used.
#
# JAVA_OPTS (Optional) Java runtime options used when any command
# is executed.
# Include here and not in CATALINA_OPTS all options, that
# should be used by Tomcat and also by the stop process,
# the version command etc.
# Most options should go into CATALINA_OPTS.
#
# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories
# containing some jars in order to allow replacement of APIs
# created outside of the JCP (i.e. DOM and SAX from W3C).
# It can also be used to update the XML parser implementation.
# Defaults to $CATALINA_HOME/endorsed.
#
# JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start"
# command is executed. The default is "dt_socket".
#
# JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start"
# command is executed. The default is localhost:8000.
#
# JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start"
# command is executed. Specifies whether JVM should suspend
# execution immediately after startup. Default is "n".
#
# JPDA_OPTS (Optional) Java runtime options used when the "jpda start"
# command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
# and JPDA_SUSPEND are ignored. Thus, all required jpda
# options MUST be specified. The default is:
#
# -agentlib:jdwp=transport=$JPDA_TRANSPORT,
# address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
#
# JSSE_OPTS (Optional) Java runtime options used to control the TLS
# implementation when JSSE is used. Default is:
# "-Djdk.tls.ephemeralDHKeySize=2048"
#
# CATALINA_PID (Optional) Path of the file which should contains the pid
# of the catalina startup java process, when start (fork) is
# used
#
# LOGGING_CONFIG (Optional) Override Tomcat's logging config file
# Example (all one line)
# LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
#
# LOGGING_MANAGER (Optional) Override Tomcat's logging manager
# Example (all one line)
# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
# -----------------------------------------------------------------------------
# OS specific support. $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
# Get standard environment variables
PRGDIR=`dirname "$PRG"`
# Only set CATALINA_HOME if not already set
[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
# Copy CATALINA_BASE from CATALINA_HOME if not already set
[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
. "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
. "$CATALINA_HOME/bin/setenv.sh"
fi
export CATALINA_PID="$CATALINA_HOME/catalina_pid.txt"
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
[ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
[ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
[ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon
# as this is used as the separator in the classpath and Java provides no
# mechanism for escaping if the same character appears in the path.
case $CATALINA_HOME in
*:*) echo "Using CATALINA_HOME: $CATALINA_HOME";
echo "Unable to start as CATALINA_HOME contains a colon (:) character";
exit 1;
esac
case $CATALINA_BASE in
*:*) echo "Using CATALINA_BASE: $CATALINA_BASE";
echo "Unable to start as CATALINA_BASE contains a colon (:) character";
exit 1;
esac
# For OS400
if $os400; then
# Set job priority to standard for interactive (interactive - 6) by using
# the interactive priority - 6, the helper threads that respond to requests
# will be running at the same priority as interactive jobs.
COMMAND='chgjob job('$JOBNAME') runpty(6)'
system $COMMAND
# Enable multi threading
export QIBM_MULTI_THREADED=Y
fi
# Get standard Java environment variables
if $os400; then
# -r will Only work on the os400 if the files are:
# 1. owned by the user
# 2. owned by the PRIMARY group of the user
# this will not work if the user belongs in secondary groups
. "$CATALINA_HOME"/bin/setclasspath.sh
else
if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
. "$CATALINA_HOME"/bin/setclasspath.sh
else
echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
echo "This file is needed to run this program"
exit 1
fi
fi
# Add on extra jar files to CLASSPATH
if [ ! -z "$CLASSPATH" ] ; then
CLASSPATH="$CLASSPATH":
fi
CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi
if [ -z "$CATALINA_TMPDIR" ] ; then
# Define the java.io.tmpdir to use for Catalina
CATALINA_TMPDIR="$CATALINA_BASE"/temp
fi
# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi
# Bugzilla 37848: When no TTY is available, don't output to console
have_tty=0
if [ "`tty`" != "not a tty" ]; then
have_tty=1
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
fi
if [ -z "$JSSE_OPTS" ] ; then
JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
fi
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
# Set juli LogManager config file if it is present and an override has not been issued
if [ -z "$LOGGING_CONFIG" ]; then
if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
else
# Bugzilla 45585
LOGGING_CONFIG="-Dnop"
fi
fi
if [ -z "$LOGGING_MANAGER" ]; then
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
fi
# Uncomment the following line to make the umask available when using the
# org.apache.catalina.security.SecurityListener
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
# ----- Execute The Requested Command -----------------------------------------
# Bugzilla 37848: only output this if we have a TTY
if [ $have_tty -eq 1 ]; then
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
if [ "$1" = "debug" ] ; then
echo "Using JAVA_HOME: $JAVA_HOME"
else
echo "Using JRE_HOME: $JRE_HOME"
fi
echo "Using CLASSPATH: $CLASSPATH"
if [ ! -z "$CATALINA_PID" ]; then
echo "Using CATALINA_PID: $CATALINA_PID"
fi
fi
if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="localhost:8000"
fi
if [ -z "$JPDA_SUSPEND" ]; then
JPDA_SUSPEND="n"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
fi
CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
shift
fi
if [ "$1" = "debug" ] ; then
if $os400; then
echo "Debug command not available on OS400"
exit 1
else
shift
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start
else
exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start
fi
fi
elif [ "$1" = "run" ]; then
shift
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start
else
eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start
fi
elif [ "$1" = "start" ] ; then
if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
if [ -s "$CATALINA_PID" ]; then
echo "Existing PID file found during start."
if [ -r "$CATALINA_PID" ]; then
PID=`cat "$CATALINA_PID"`
ps -p $PID >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "Tomcat appears to still be running with PID $PID. Start aborted."
echo "If the following process is not a Tomcat process, remove the PID file and try again:"
ps -f -p $PID
exit 1
else
echo "Removing/clearing stale PID file."
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ -w "$CATALINA_PID" ]; then
cat /dev/null > "$CATALINA_PID"
else
echo "Unable to remove or clear stale PID file. Start aborted."
exit 1
fi
fi
fi
else
echo "Unable to read PID file. Start aborted."
exit 1
fi
else
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ ! -w "$CATALINA_PID" ]; then
echo "Unable to remove or write to empty PID file. Start aborted."
exit 1
fi
fi
fi
fi
fi
shift
touch "$CATALINA_OUT"
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
else
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
fi
if [ ! -z "$CATALINA_PID" ]; then
echo $! > "$CATALINA_PID"
fi
echo "Tomcat started."
elif [ "$1" = "stop" ] ; then
shift
SLEEP=5
if [ ! -z "$1" ]; then
echo $1 | grep "[^0-9]" >/dev/null 2>&1
if [ $? -gt 0 ]; then
SLEEP=$1
shift
fi
fi
FORCE=0
if [ "$1" = "-force" ]; then
shift
FORCE=1
fi
if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
if [ -s "$CATALINA_PID" ]; then
kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
if [ $? -gt 0 ]; then
echo "PID file found but no matching process was found. Stop aborted."
exit 1
fi
else
echo "PID file is empty and has been ignored."
fi
else
echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."
exit 1
fi
fi
eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" stop
# stop failed. Shutdown port disabled? Try a normal kill.
if [ $? != 0 ]; then
if [ ! -z "$CATALINA_PID" ]; then
echo "The stop command failed. Attempting to signal the process to stop through OS signal."
kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1
fi
fi
if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
while [ $SLEEP -ge 0 ]; do
kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
if [ $? -gt 0 ]; then
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ -w "$CATALINA_PID" ]; then
cat /dev/null > "$CATALINA_PID"
# If Tomcat has stopped don't try and force a stop with an empty PID file
FORCE=0
else
echo "The PID file could not be removed or cleared."
fi
fi
echo "Tomcat stopped."
break
fi
if [ $SLEEP -gt 0 ]; then
sleep 1
fi
if [ $SLEEP -eq 0 ]; then
echo "Tomcat did not stop in time."
if [ $FORCE -eq 0 ]; then
echo "PID file was not removed."
fi
echo "To aid diagnostics a thread dump has been written to standard out."
kill -3 `cat "$CATALINA_PID"`
fi
SLEEP=`expr $SLEEP - 1 `
done
fi
fi
KILL_SLEEP_INTERVAL=5
if [ $FORCE -eq 1 ]; then
if [ -z "$CATALINA_PID" ]; then
echo "Kill failed: \$CATALINA_PID not set"
else
if [ -f "$CATALINA_PID" ]; then
PID=`cat "$CATALINA_PID"`
echo "Killing Tomcat with the PID: $PID"
kill -9 $PID
while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do
kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
if [ $? -gt 0 ]; then
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ -w "$CATALINA_PID" ]; then
cat /dev/null > "$CATALINA_PID"
else
echo "The PID file could not be removed."
fi
fi
echo "The Tomcat process has been killed."
break
fi
if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then
sleep 1
fi
KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `
done
if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then
echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."
fi
fi
fi
fi
elif [ "$1" = "configtest" ] ; then
eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap configtest
result=$?
if [ $result -ne 0 ]; then
echo "Configuration error detected!"
fi
exit $result
elif [ "$1" = "version" ] ; then
"$_RUNJAVA" \
-classpath "$CATALINA_HOME/lib/catalina.jar" \
org.apache.catalina.util.ServerInfo
else
echo "Usage: catalina.sh ( commands ... )"
echo "commands:"
if $os400; then
echo " debug Start Catalina in a debugger (not available on OS400)"
echo " debug -security Debug Catalina with a security manager (not available on OS400)"
else
echo " debug Start Catalina in a debugger"
echo " debug -security Debug Catalina with a security manager"
fi
echo " jpda start Start Catalina under JPDA debugger"
echo " run Start Catalina in the current window"
echo " run -security Start in the current window with security manager"
echo " start Start Catalina in a separate window"
echo " start -security Start in a separate window with security manager"
echo " stop Stop Catalina, waiting up to 5 seconds for the process to end"
echo " stop n Stop Catalina, waiting up to n seconds for the process to end"
echo " stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
echo " stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running"
echo " configtest Run a basic syntax check on server.xml - check exit code for result"
echo " version What version of tomcat are you running?"
echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined"
exit 1
fi
<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_5d15d5a81bc952da1d34986ebc7713c0d5c9ea61" entityID="https://clarin-dev.eurac.edu/Shibboleth.sso/Metadata">
<md:Extensions>
<mdattr:EntityAttributes xmlns:mdattr="urn:oasis:names:tc:SAML:metadata:attribute">
<saml:Attribute xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Name="http://macedir.org/entity-category" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml:AttributeValue>http://www.geant.net/uri/dataprotection-code-of-conduct/v1</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
Name="http://macedir.org/entity-category"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml:AttributeValue>http://refeds.org/category/research-and-scholarship</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Name="http://macedir.org/entity-category" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml:AttributeValue>http://clarin.eu/category/clarin-member</saml:AttributeValue>
</saml:Attribute>
</mdattr:EntityAttributes>
</md:Extensions>
<md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:1.0:protocol">
<md:Extensions xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
<mdui:UIInfo xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui">
<mdui:DisplayName xml:lang="en">Eurac Research CLARIN Centre</mdui:DisplayName>
<mdui:DisplayName xml:lang="de">Eurac Research CLARIN Centre</mdui:DisplayName>
<mdui:DisplayName xml:lang="it">Eurac Research CLARIN Centre</mdui:DisplayName>
<mdui:Description xml:lang="en">Eurac Research CLARIN Centre: Digital repository for language data</mdui:Description>
<mdui:Description xml:lang="de">Eurac Research CLARIN Centre: Digitales Repository für Sprachdaten</mdui:Description>
<mdui:Description xml:lang="it">Eurac Research CLARIN Centre: repository digitale di risorse linguistiche</mdui:Description>
<mdui:InformationURL xml:lang="en">https://clarin-dev.eurac.edu/repository/xmlui/page/about</mdui:InformationURL>
<mdui:InformationURL xml:lang="de">https://clarin-dev.eurac.edu/repository/xmlui/page/about</mdui:InformationURL>
<mdui:InformationURL xml:lang="it">https://clarin-dev.eurac.edu/repository/xmlui/page/about</mdui:InformationURL>
<mdui:Logo height="85" width="180">https://clarin-dev.eurac.edu/repository/xmlui/themes/UFAL/lib/lindat/public/img/eurac_research.svg</mdui:Logo>
<mdui:PrivacyStatementURL xml:lang="en">https://clarin-dev.eurac.edu/repository/xmlui/page/registration-privacypolicy</mdui:PrivacyStatementURL>
<mdui:PrivacyStatementURL xml:lang="de">https://clarin-dev.eurac.edu/repository/xmlui/page/registration-privacypolicy</mdui:PrivacyStatementURL>
<mdui:PrivacyStatementURL xml:lang="it">https://clarin-dev.eurac.edu/repository/xmlui/page/registration-privacypolicy</mdui:PrivacyStatementURL>
</mdui:UIInfo>
</md:Extensions>
<md:AttributeConsumingService index="1">
<md:ServiceName xml:lang="en">Digital Repository for the CLARIN Research Infrastructure provided by Eurac Research</md:ServiceName>
<md:ServiceName xml:lang="de">Digitales Repository für die CLARIN-Forschungs-Infrastruktur bereitgestellt durch Eurac Research</md:ServiceName>
<md:ServiceName xml:lang="it">Repository Digitale per la Infrastruttura di Ricerca CLARIN erogato da Eurac Research</md:ServiceName>
<md:ServiceDescription xml:lang="en">Digital Repository and services related to the CLARIN-IT consortium under the CLARIN Research Infrastructure; focused in the fields of terminology and multilingualism. The repository is based at Eurac Research in South Tyrol and managed by the Institute for Applied Linguistics.</md:ServiceDescription>
<md:ServiceDescription xml:lang="it">Digitales Repository und Services mit Bezug zum CLARIN-IT-Consortium im Rahmen der CLARIN Forschungsinfrastruktur; mit Fokus auf den Gebieten der Terminologie und Mehrsprachigkeit. Das Repository wird von Eurac Research gehostet und dort vom Institut für Angewandte Sprachforschung betreut.</md:ServiceDescription>
<md:ServiceDescription xml:lang="it">Repository Digitale e servizi relativi al consorzio CLARIN-IT sotto l'Infrastruttura di Ricerca CLARIN; focalizzato nel campo della teminologia e multilinguismo. Il repository è basato a Eurac Research in Alto Adige e gestito del Istituto di Linguistica Applicata.</md:ServiceDescription>
<md:RequestedAttribute FriendlyName="eduPersonPrincipalName" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
<md:RequestedAttribute FriendlyName="email" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
<md:RequestedAttribute FriendlyName="cn" Name="urn:oid:2.5.4.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
<md:RequestedAttribute FriendlyName="schacHomeOrganization" Name="urn:oid:1.3.6.1.4.1.25178.1.2.9" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
<md:RequestedAttribute FriendlyName="organizationName" Name="urn:oid:2.5.4.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
<md:RequestedAttribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
<md:RequestedAttribute FriendlyName="eduPersonEntitlement" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
<md:RequestedAttribute FriendlyName="eduPersonTargetedID" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
<md:RequestedAttribute FriendlyName="eduPersonScopedAffiliation" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
</md:AttributeConsumingService>
</md:SPSSODescriptor>
<md:Organization>
<md:OrganizationName xml:lang="en">Eurac Research</md:OrganizationName>
<md:OrganizationName xml:lang="de">Eurac Research</md:OrganizationName>
<md:OrganizationName xml:lang="it">Eurac Research</md:OrganizationName>
<md:OrganizationDisplayName xml:lang="en">Eurac Research</md:OrganizationDisplayName>
<md:OrganizationDisplayName xml:lang="de">Eurac Research</md:OrganizationDisplayName>
<md:OrganizationDisplayName xml:lang="it">Eurac Research</md:OrganizationDisplayName>
<md:OrganizationURL xml:lang="en">http://www.eurac.edu/en</md:OrganizationURL>
<md:OrganizationURL xml:lang="de">http://www.eurac.edu/de</md:OrganizationURL>
<md:OrganizationURL xml:lang="it">http://www.eurac.edu/it</md:OrganizationURL>
</md:Organization>
<md:ContactPerson contactType="technical">
<md:GivenName>Alexander</md:GivenName>
<md:SurName>König</md:SurName>
<md:EmailAddress>mailto:Alexander.Koenig@eurac.edu</md:EmailAddress>
</md:ContactPerson>
<md:ContactPerson contactType="support">
<md:GivenName>Alexander</md:GivenName>
<md:SurName>König</md:SurName>
<md:EmailAddress>mailto:Alexander.Koenig@eurac.edu</md:EmailAddress>
</md:ContactPerson>
<md:ContactPerson contactType="administrative">
<md:GivenName>Andrea</md:GivenName>
<md:SurName>Abel</md:SurName>
<md:EmailAddress>mailto:Andrea.Abel@eurac.edu</md:EmailAddress>
</md:ContactPerson>
</md:EntityDescriptor>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId>
<packaging>pom</packaging>
<version>5.9-SNAPSHOT</version>
<name>DSpace Parent Project</name>
<description>
DSpace open source software is a turnkey institutional repository application.
</description>
<url>https://github.com/dspace/DSpace</url>
<organization>
<name>DuraSpace</name>
<url>http://www.dspace.org</url>
</organization>
<!-- brings the sonatype snapshot repository and signing requirement on board -->
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>9</version>
<relativePath />
</parent>
<prerequisites>
<maven>3.0</maven>
</prerequisites>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
<lucene.version>4.10.2</lucene.version>
<solr.version>4.10.2</solr.version>
<jena.version>2.12.0</jena.version>
<slf4j.version>1.6.1</slf4j.version>
<!-- need at least 3.2.2 for spring-social-google (StreamUtils, MappingJackson2HttpMessageConverter) -->
<spring.version>3.2.5.RELEASE</spring.version>
<!-- 'root.basedir' is the path to the root [dspace-src] dir. It must be redefined by each child POM,
as it is used to reference the LICENSE_HEADER and *.properties file(s) in that directory. -->
<root.basedir>${basedir}</root.basedir>
</properties>
<build>
<!-- Define Maven Plugin Settings that should be inherited to ALL submodule POMs.
(NOTE: individual POMs can override specific settings). -->
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<!-- Allow for the ability to pass JVM memory flags for Unit Tests. Since
maven-surefire-plugin forks a new JVM, it ignores MAVEN_OPTS.-->
<argLine>${surefire.argLine}</argLine>
<!-- tests whose name starts by Abstract will be ignored -->
<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>
-->
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
<xmlOutput>true</xmlOutput>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</pluginManagement>
<!-- These plugin settings only apply to this single POM and are not inherited
to any submodules. -->
<plugins>
<!-- Ensure that any *.properties files have UTF-8 chars encoded (e.g. "\u00e9") *before* using them to filter dspace.cfg and other configs -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>native2ascii-utf8</id>
<phase>generate-resources</phase>
<configuration>
<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>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<!-- Required dependencies for native2ascii to function -->
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>${java.version}</version>
<scope>system</scope>
<!-- Path to tools.jar (containing native2ascii tool) is determined by a profile (see below) -->
<systemPath>${toolsjar}</systemPath>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5</version>
<configuration>
<!-- During release:perform, enable the "release" profile (see below) -->
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
<!-- Suggest tagging the release in SCM as "dspace-[version]" -->
<tagNameFormat>dspace-@{project.version}</tagNameFormat>
<!-- Auto-Version all modules the same as the parent module -->
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<configuration>
<!-- License header file (can be a URL, but that's less stable if external site is down on occasion) -->
<header>${root.basedir}/LICENSE_HEADER</header>
<!--Just check headers of everything in the /src directory -->
<includes>
<include>src/**</include>
</includes>
<!--Use all default exclusions for IDE files & Maven files, see:
http://code.google.com/p/maven-license-plugin/wiki/Configuration#Default_excludes -->
<useDefaultExcludes>true</useDefaultExcludes>
<!-- Add some default DSpace exclusions not covered by <useDefaultExcludes>
Individual Maven projects may choose to override these defaults. -->
<excludes>
<exclude>**/src/test/resources/**</exclude>
<exclude>**/src/test/data/**</exclude>
<exclude>**/src/main/license/**</exclude>
<exclude>**/testEnvironment.properties</exclude>
<exclude>**/META-INF/**</exclude>
<exclude>**/robots.txt</exclude>
<exclude>**/*.LICENSE</exclude>
<exclude>**/LICENSE*</exclude>
<exclude>**/README*</exclude>
<exclude>**/readme*</exclude>
<exclude>**/.gitignore</exclude>
<exclude>**/build.properties*</exclude>
</excludes>
<mapping>
<!-- Custom DSpace file extensions which are not recognized by maven-release-plugin:
*.xmap, *.xslt, *.wsdd, *.wsdl, *.ttl, *.LICENSE -->
<xmap>XML_STYLE</xmap>
<xslt>XML_STYLE</xslt>
<wsdd>XML_STYLE</wsdd>
<wsdl>XML_STYLE</wsdl>
<ttl>SCRIPT_STYLE</ttl>
<LICENSE>TEXT</LICENSE>
</mapping>
<encoding>UTF-8</encoding>
<!-- maven-license-plugin recommends a strict check (e.g. check spaces/tabs too) -->
<strictCheck>true</strictCheck>
</configuration>
<executions>
<execution>
<id>check-headers</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<!-- By default the main dspace.cfg file will be filtered during the build
using the "build.properties" file. This profile takes effect, unless
"-Denv" is passed in (see 'environment' profile below for more info). -->
<profile>
<id>default</id>
<activation>
<property>
<name>!env</name>
</property>
</activation>
<properties>
<!-- 'root.basedir' is the relative path to the [dspace-src] root folder -->
<!-- NOTE that we are using the copy in the target dir, which has any Unicode characters encoded (see native2ascii above) -->
<filters.file>${root.basedir}/target/build.properties</filters.file>
</properties>
</profile>
<!-- Users can pass in an environment flag "-Denv" to tell DSpace to use
a different properties file during its build process.
For example: "mvn package -Denv=test" would build DSpace using the
settings in "test.properties" instead of those in "build.properties" -->
<profile>
<id>environment</id>
<activation>
<property>
<name>env</name>
</property>
</activation>
<properties>
<!-- 'root.basedir' is the relative path to the [dspace-src] root folder -->
<!-- NOTE that we are using the copy in the target dir, which has any Unicode characters encoded (see native2ascii above) -->
<filters.file>${root.basedir}/target/${env}.properties</filters.file>
</properties>
</profile>
<!-- Skip Unit Tests by default, but allow override on command line
by setting property "-Dmaven.test.skip=false" -->
<profile>
<id>skiptests</id>
<activation>
<!-- This profile should be active at all times, unless the user
specifies a different value for "maven.test.skip" -->
<property>
<name>!maven.test.skip</name>
</property>
</activation>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>
<!-- Allow for passing extra memory to Unit tests (via maven-surefire-plugin).
By default this gives unit tests 512MB of memory (when tests are enabled),
unless tweaked on commandline (e.g. "-Dsurefire.argLine=-Xmx512m"). Since
m-surefire-p forks a new JVM for testing, it ignores MAVEN_OPTS. -->
<profile>
<id>surefire-argLine</id>
<activation>
<property>
<name>!surefire.argLine</name>
</property>
</activation>
<properties>
<surefire.argLine>-Xmx512m</surefire.argLine>
</properties>
</profile>
<!-- This profile ensures that we ONLY generate the Unit Test Environment,
if the testEnvironment.xml file is found AND we are not skipping Unit
Tests (see also skiptests profile). That way the Test Environment is
also NOT built when running a 'mvn package' on a "binary" release. -->
<profile>
<id>generate-test-env</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>maven.test.skip</name>
<value>false</value>
</property>
<file>
<exists>src/main/assembly/testEnvironment.xml</exists>
</file>
</activation>
<build>
<plugins>
<!-- This plugin builds the testEnvironment.zip package
based on the specifications in testEnvironment.xml.
TestEnvironment.zip is an entire DSpace installation
directory, which is installed by 'dspace-api' and
used to run our DSpace Unit/Integration tests. -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>generate-test-resources</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/testEnvironment.xml</descriptor>
</descriptors>
<filters>
<filter>local.properties</filter>
<filter>src/main/filters/testEnvironment.properties</filter>
</filters>
</configuration>
</execution>
</executions>
<inherited>false</inherited>
</plugin>
</plugins>
</build>
</profile>
<!--
Generate a list of all THIRD PARTY open source licenses for all DSpace dependencies.
This list is automatically written to the [src]/LICENSES_THIRD_PARTY file.
Third party tools whose licenses are unknown by Maven are maintained in
[src]/src/main/license/LICENSES_THIRD_PARTY.properties.
To update "LICENSES_THIRD_PARTY", just run:
mvn clean verify -Dthird.party.licenses=true
-->
<profile>
<id>third-party-licenses</id>
<activation>
<activeByDefault>false</activeByDefault>
<!-- This profile should ONLY be active when user specifies
-Dthird.party.licenses=true on command-line. -->
<property>
<name>third.party.licenses</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>license-maven-plugin</artifactId>
<version>1.8</version>
<!-- This plugin only needs to be run on the Parent POM
as it aggregates results from all child POMs. -->
<inherited>false</inherited>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>aggregate-add-third-party</goal>
</goals>
<configuration>
<outputDirectory>${root.basedir}</outputDirectory>
<thirdPartyFilename>LICENSES_THIRD_PARTY</thirdPartyFilename>
<excludedGroups>org\.dspace</excludedGroups>
<!-- Use the template which groups all dependencies by their License type (easier to read!). -->
<!-- SEE: https://fisheye.codehaus.org/browse/mojo/trunk/mojo/license-maven-plugin/src/main/resources/org/codehaus/mojo/license -->
<fileTemplate>src/main/license/third-party-file-groupByLicense.ftl</fileTemplate>
<!-- License names that should all be merged into the *first* listed name -->
<licenseMerges>
<licenseMerge>Apache Software License, Version 2.0|The Apache Software License, Version 2.0|Apache License Version 2.0|Apache License, Version 2.0|Apache Public License 2.0|Apache License 2.0|Apache Software License - Version 2.0|Apache 2.0 License|Apache 2.0 license|Apache License V2.0|Apache 2|Apache License|Apache|ASF 2.0</licenseMerge>
<!-- Ant-contrib is an Apache License -->
<licenseMerge>Apache Software License, Version 2.0|http://ant-contrib.sourceforge.net/tasks/LICENSE.txt</licenseMerge>
<licenseMerge>BSD License|The BSD License|BSD licence|BSD license|BSD|BSD-style license|New BSD License|New BSD license|Revised BSD License</licenseMerge>
<!-- DuraSpace uses a BSD License for DSpace -->
<licenseMerge>BSD License|DuraSpace BSD License|DuraSpace Sourcecode License</licenseMerge>
<!-- Coverity uses modified BSD: https://github.com/coverity/coverity-security-library -->
<licenseMerge>BSD License|BSD style modified by Coverity</licenseMerge>
<licenseMerge>Common Development and Distribution License (CDDL)|Common Development and Distribution License (CDDL) v1.0|COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0|CDDL, v1.0|CDDL 1.0 license|CDDL 1.0|CDDL 1.1</licenseMerge>
<!-- Jersey / Java Servlet API claims this license, but is actually CDDL 1.0: http://servlet-spec.java.net -->
<licenseMerge>Common Development and Distribution License (CDDL)|CDDL + GPLv2 with classpath exception</licenseMerge>
<!-- Jersey claims this license, but it is dual licensed with CDDL 1.0 being one: https://jersey.java.net/license.html -->
<licenseMerge>Common Development and Distribution License (CDDL)|GPL2 w/ CPE</licenseMerge>
<licenseMerge>Eclipse Public License|Eclipse Public License - Version 1.0|Eclipse Public License - v 1.0|EPL 1.0 license</licenseMerge>
<!-- JUnit claims this license but is actually Eclipse Public License: http://junit.org/license.html -->
<licenseMerge>Eclipse Public License|Common Public License Version 1.0</licenseMerge>
<licenseMerge>GNU Lesser General Public License (LGPL)|GNU Lesser General Public License (LGPL), Version 2.1|GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1|GNU Lesser General Public License|GNU Lesser Public License|GNU Lesser General Public License, Version 2.1|Lesser General Public License (LGPL) v 2.1|LGPL 2.1|LGPL 2.1 license|LGPL 3.0 license|LGPL, v2.1 or later|LGPL</licenseMerge>
<licenseMerge>MIT License|The MIT License|MIT LICENSE</licenseMerge>
<!-- BouncyCastle uses a modified MIT License: http://www.bouncycastle.org/license.html -->
<licenseMerge>MIT License|Bouncy Castle Licence</licenseMerge>
<licenseMerge>Mozilla Public License|Mozilla Public License version 1.1|Mozilla Public License 1.1 (MPL 1.1)|MPL 1.1</licenseMerge>
<!-- H2 Database claims this license, but for our purposes it's MPL: http://www.h2database.com -->
<licenseMerge>Mozilla Public License|MPL 2.0, and EPL 1.0</licenseMerge>
<!-- "concurrent.concurrent" claims this license, but is actually Public Domain: http://mvnrepository.com/artifact/concurrent/concurrent/ -->
<licenseMerge>Public Domain|Public domain, Sun Microsoystems</licenseMerge>
<!-- WTFPL is essentially Public Domain: http://www.wtfpl.net/ ;) -->
<licenseMerge>Public Domain|WTFPL</licenseMerge>
</licenseMerges>
<!-- For Licenses which are "Unknown" by Maven, load them from a properties file -->
<useMissingFile>true</useMissingFile>
<missingFile>src/main/license/LICENSES_THIRD_PARTY.properties</missingFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Determine path to Java Tools JAR. This JAR contains the 'native2ascii' tool (required above by maven-antrun-plugin)-->
<!-- In most platforms Unix/Windows it's named tools.jar. But, on Mac it's classes.jar (see next profile) -->
<profile>
<id>default-java-tools</id>
<activation>
<activeByDefault>true</activeByDefault>
<file>
<exists>${java.home}/../lib/tools.jar</exists>
</file>
</activation>
<properties>
<toolsjar>${java.home}/../lib/tools.jar</toolsjar>
</properties>
</profile>
<profile>
<id>mac-java-tools</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>${java.home}/../Classes/classes.jar</exists>
</file>
</activation>
<properties>
<toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
</properties>
</profile>
<!--
These profiles activate the inclusion of various modules into
the DSpace Build process. They activate automatically if the
source module is in the local file system, correctly located
relative to this file.
-->
<!--
Builds DSpace "Assembly & Configuration" project
-->
<profile>
<id>dspace</id>
<activation>
<file>
<exists>dspace/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace</module>
</modules>
</profile>
<!--
Builds central API for DSpace
-->
<profile>
<id>dspace-api</id>
<activation>
<file>
<exists>dspace-api/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-api</module>
<module>utilities</module>
</modules>
</profile>
<!--
Builds Services for DSpace
-->
<profile>
<id>dspace-services</id>
<activation>
<file>
<exists>dspace-services/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-services</module>
</modules>
</profile>
<!--
Builds XOAI Gateway WAR for DSpace
-->
<profile>
<id>dspace-oai</id>
<activation>
<file>
<exists>dspace-oai/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-oai</module>
</modules>
</profile>
<!--
Builds JSPUI WAR for DSpace
-->
<profile>
<id>dspace-jspui</id>
<activation>
<file>
<exists>dspace-jspui/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-jspui</module>
</modules>
</profile>
<!--
Builds UFAL Utilities
-->
<profile>
<id>utilities</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>utilities</module>
</modules>
</profile>
<!--
Builds lr-b2safe-dspace
-->
<profile>
<id>lr-b2safe-dspace</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>lr-b2safe-dspace</module>
</modules>
</profile>
<!--
Builds RDF API and Data Provider WAR for DSpace
-->
<profile>
<id>dspace-rdf</id>
<activation>
<file>
<exists>dspace-rdf/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-rdf</module>
</modules>
</profile>
<!-- REST Jersey -->
<profile>
<id>dspace-rest</id>
<activation>
<file>
<exists>dspace-rest/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-rest</module>
</modules>
</profile>
<!--
Builds SWORD WAR for DSpace
-->
<profile>
<id>dspace-sword</id>
<activation>
<file>
<exists>dspace-sword/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-sword</module>
</modules>
</profile>
<!--
Builds SOLR WAR for DSpace
-->
<profile>
<id>dspace-solr</id>
<activation>
<file>
<exists>dspace-solr/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-solr</module>
</modules>
</profile>
<!--
Builds SWORDv2 WAR for DSpace
-->
<profile>
<id>dspace-swordv2</id>
<activation>
<file>
<exists>dspace-swordv2/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-swordv2</module>
</modules>
</profile>
<!--
Builds MIRAGE2 WAR for DSpace
-->
<profile>
<id>dspace-xmlui-mirage2</id>
<activation>
<file>
<exists>dspace-xmlui-mirage2/pom.xml</exists>
</file>
</activation>
<modules>
<module>dspace-xmlui-mirage2</module>
</modules>
</profile>
<!--
Builds XMLUI WAR for DSpace
-->
<profile>
<id>dspace-xmlui</id>
<activation>
<file>
<exists>dspace-xmlui/pom.xml</exists>
</file>
</activation>
<modules>
<module>lr-b2safe-dspace</module>
<module>dspace-xmlui</module>
</modules>
</profile>
<!--
Builds LNI WAR & Client for DSpace
-->
<!-- Note:- The LNI module is not built by default and is considered deprecated.
To build it activate the profile with '-Pdspace-lni'. -->
<profile>
<id>dspace-lni</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<modules>
<module>dspace-lni</module>
<module>dspace-lni/dspace-lni-client</module>
</modules>
</profile>
<!--
The 'release' profile is used by the 'maven-release-plugin' (see above)
to actually perform a DSpace software release to Maven central.
-->
<profile>
<id>release</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<!-- Activate all modules *except* for the 'dspace' module,
as it does not include any Java source code to release. -->
<modules>
<module>dspace-api</module>
<module>dspace-jspui</module>
<module>dspace-lni</module>
<module>dspace-oai</module>
<module>dspace-rdf</module>
<module>dspace-rest</module>
<module>dspace-services</module>
<module>dspace-solr</module>
<module>dspace-sword</module>
<module>dspace-swordv2</module>
<module>dspace-xmlui-mirage2</module>
<module>dspace-xmlui</module>
<module>lr-b2safe-dspace</module>
</modules>
</profile>
</profiles>
<!--
Dependency management provides a means to control which
versions of dependency jars are used for compilation
and packaging into the distribution. Rather than placing
a version in your dependencies, look here first to see if
its already strongly defined in dspace-parent and dspace-api.
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cz.cuni.mff.ufal.lindat</groupId>
<artifactId>utilities</artifactId>
<version>5.9-SNAPSHOT</version>
</dependency>
<!-- DSpace core and endorsed Addons -->
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-api</artifactId>
<version>5.9-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.dspace.modules</groupId>
<artifactId>additions</artifactId>
<version>5.9-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-sword</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-sword</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-swordv2</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-swordv2</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-jspui</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-jspui</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-oai</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-oai</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni-client</artifactId>
<version>5.9-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-lni</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>cz.cuni.mff.ufal.dspace</groupId>
<artifactId>b2safe-dspace</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-xmlui</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-xmlui</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-services</artifactId>
<version>5.9-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-rdf</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-rest</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-rest</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-solr</artifactId>
<version>5.9-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-solr</artifactId>
<version>5.9-SNAPSHOT</version>
<type>war</type>
<classifier>skinny</classifier>
</dependency>
<!-- DSpace Localization Packages -->
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-api-lang</artifactId>
<version>[5.0.0,6.0.0)</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>dspace-xmlui-lang</artifactId>
<version>[5.0.0,6.0.0)</version>
<type>war</type>
</dependency>
<!-- DSpace third Party Dependencies -->
<dependency>
<groupId>org.swordapp</groupId>
<artifactId>sword-common</artifactId>
<version>1.1</version>
</dependency>
<!-- Explicitly Specify Latest Version of Spring -->
<dependency>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-context-support</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-tx</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-jdbc</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<artifactId>spring-webmvc</artifactId>
<groupId>org.springframework</groupId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>${jena.version}</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>handle</artifactId>
<version>6.2</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>jargon</artifactId>
<version>1.4.25</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>mets</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.dspace.dependencies</groupId>
<artifactId>dspace-tm-extractors</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
<!-- <version>3.1</version> xmlui - wing -->
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<!-- <version>2.1</version> in xmlui - wing -->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<artifactId>xom</artifactId>
<groupId>xom</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>oro</groupId>
<artifactId>oro</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.8.12</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>1.8.12</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jempbox</artifactId>
<version>1.8.12</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15</artifactId>
<version>1.44</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcmail-jdk15</artifactId>
<version>1.44</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>rome</groupId>
<artifactId>rome</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>rome</groupId>
<artifactId>opensearch</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
<!-- <version>2.8.0</version> in xmlui -->
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xmlParserAPIs</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-ant</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-saaj</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>51.1</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.0_01</version>
</dependency>
<dependency>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
<version>1.1.2_01</version>
</dependency>
<dependency>
<groupId>org.dspace</groupId>
<artifactId>oclc-harvester2</artifactId>
<version>0.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- JMockit, JUnit and Hamcrest are used for Unit/Integration tests -->
<dependency> <!-- Keep jmockit before junit -->
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<!-- H2 is an in-memory database used for Unit/Integration tests -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.180</version>
<scope>test</scope>
</dependency>
<!-- Contiperf is used for performance tests within our Unit/Integration tests -->
<dependency>
<groupId>org.databene</groupId>
<artifactId>contiperf</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.1</version>
<scope>compile</scope>
</dependency>
<!-- Google Analytics -->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-analytics</artifactId>
<version>v3-rev103-1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.19.0</version>
</dependency>
<!-- Findbugs annotations -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<licenses>
<license>
<name>DuraSpace BSD License</name>
<url>https://raw.github.com/DSpace/DSpace/master/LICENSE</url>
<distribution>repo</distribution>
<comments>
A BSD 3-Clause license for the DSpace codebase.
</comments>
</license>
</licenses>
<issueManagement>
<system>JIRA</system>
<url>https://jira.duraspace.org/browse/DS</url>
</issueManagement>
<mailingLists>
<mailingList>
<name>DSpace Technical Users List</name>
<subscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-tech
</subscribe>
<unsubscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-tech
</unsubscribe>
<post>dspace-tech AT lists.sourceforge.net</post>
<archive>
http://sourceforge.net/mailarchive/forum.php?forum_name=dspace-tech
</archive>
</mailingList>
<mailingList>
<name>DSpace Developers List</name>
<subscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-devel
</subscribe>
<unsubscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-devel
</unsubscribe>
<post>dspace-devel AT lists.sourceforge.net</post>
<archive>
http://sourceforge.net/mailarchive/forum.php?forum_name=dspace-devel
</archive>
</mailingList>
<mailingList>
<name>DSpace General Issues List</name>
<subscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-general
</subscribe>
<unsubscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-general
</unsubscribe>
<post>dspace-general AT lists.sourceforge.net</post>
<archive>
http://sourceforge.net/mailarchive/forum.php?forum_name=dspace-general
</archive>
</mailingList>
<mailingList>
<name>DSpace SCM Commit Change-Log</name>
<subscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-changelog
</subscribe>
<unsubscribe>
http://lists.sourceforge.net/lists/listinfo/dspace-changelog
</unsubscribe>
<post>noreply AT lists.sourceforge.net</post>
<archive>
http://sourceforge.net/mailarchive/forum.php?forum_name=dspace-changelog
</archive>
</mailingList>
</mailingLists>
<developers>
<developer>
<name>Pascal-Nicolas Becker</name>
<email>dspace at pascal-becker dot de</email>
<roles>
<role>commiter</role>
</roles>
<timezone>+1</timezone>
</developer>
<developer>
<name>Andrea Bollini</name>
<email>bollini at users.sourceforge.net</email>
<url>http://www.linkedin.com/in/andreabollini</url>
<organization>CILEA</organization>
<organizationUrl>http://www.cilea.it</organizationUrl>
<roles>
<role>commiter</role>
</roles>
<timezone>+1</timezone>
</developer>
<developer>
<name>Ben Bosman</name>
<email>benbosman at atmire.com</email>
<organization>@mire NV</organization>
<organizationUrl>http://www.atmire.com</organizationUrl>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Mark Diggory</name>
<email>mdiggory at atmire.com</email>
<url>http://purl.org/net/mdiggory/homepage</url>
<organization>@mire NV</organization>
<organizationUrl>http://www.atmire.com</organizationUrl>
<roles>
<role>commiter</role>
</roles>
<timezone>-8</timezone>
</developer>
<developer>
<name>Tim Donohue</name>
<email>tdonohue at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Jim Downing</name>
<email>jimdowning at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Richard Jones</name>
<email>richard-jones at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Claudia Juergen</name>
<email>cjuergen at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Stuart Lewis</name>
<email>stuart at stuartlewis.com</email>
<url>http://stuartlewis.com/</url>
<organization>University of Auckland Library</organization>
<organizationUrl>http://www.library.auckland.ac.nz/</organizationUrl>
<roles>
<role>commiter</role>
</roles>
<timezone>+12</timezone>
</developer>
<developer>
<name>Gabriela Mircea</name>
<email>mirceag at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Scott Phillips</name>
<email>scottphillips at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Richard Rodgers</name>
<email>rrodgers at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>James Rutherford</name>
<email>jrutherford at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Kim Shepherd</name>
<email>kims at waikato.ac.nz</email>
<organization>Library Consortium of New Zealand</organization>
<organizationUrl>http://www.lconz.ac.nz/</organizationUrl>
<roles>
<role>commiter</role>
</roles>
<timezone>+12</timezone>
</developer>
<developer>
<name>Larry Stone</name>
<email>lcs at mit.edu</email>
<organization>MIT Libraries</organization>
<organizationUrl>http://libraries.mit.edu</organizationUrl>
<roles>
<role>commiter</role>
</roles>
<timezone>-5</timezone>
</developer>
<developer>
<name>Robert Tansley</name>
<email>rtansley at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Graham Triggs</name>
<email>grahamtriggs at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Jeffrey Trimble</name>
<email />
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Mark H. Wood</name>
<email>mwoodiupui at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
<developer>
<name>Scott Yeadon</name>
<email>syeadon at users.sourceforge.net</email>
<roles>
<role>commiter</role>
</roles>
</developer>
</developers>
<contributors>
<contributor>
<name>Add Your Name Here and submit a patch!</name>
<email>contributor at myu.edu</email>
<url>http://www.myu.edu/me</url>
<organization>My University</organization>
<organizationUrl>http://www.myu.edu</organizationUrl>
<roles>
<role>developer</role>
</roles>
<timezone>0</timezone>
</contributor>
<contributor>
<name>Pere Villega</name>
<email>pere.villega@gmail.com</email>
<url>http://www.perevillega.com</url>
<organization />
<organizationUrl />
<roles>
<role>developer</role>
</roles>
<timezone>0</timezone>
</contributor>
<contributor>
<name>Sands Fish</name>
<email>sands at mit.edu</email>
<organization>MIT Libraries</organization>
<organizationUrl>http://libraries.mit.edu</organizationUrl>
<roles>
<role>developer</role>
</roles>
<timezone>-5</timezone>
</contributor>
<contributor>
<name>Steve Swinsburg</name>
<email>steve.swinsburg@anu.edu.au</email>
<organization>The Australian National University</organization>
<organizationUrl>http://www.anu.edu.au</organizationUrl>
<roles>
<role>developer</role>
</roles>
<timezone>+10</timezone>
</contributor>
</contributors>
<!--
The SCM repository location is used by Continuum to update against
when changes have occurred. This spawns a new build cycle and releases
snapshots into the snapshot repository below.
-->
<scm>
<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-5.1-SNAPSHOT</tag>
</scm>
<!--
Distribution Management is currently used by the Continuum
server to update snapshots it generates. This will also be used
on release to deploy release versions to the repository by the
release manager.
-->
<distributionManagement>
<!-- further distribution management is found upstream in the sonatype parent -->
</distributionManagement>
<repositories>
<repository>
<id>sonatype-releases</id>
<name>Sonatype Releases Repository</name>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
<!--Nor sonatype nor maven central appear to still contain org.restlet.jee:org.restlet.ext.servlet:jar:2.1.1 any more. No problem if it is in your local repo. Build fail if it isn't-->
<repository>
<id>restlet</id>
<name>restlet</name>
<url>http://maven.restlet.org</url>
</repository>
<repository>
<id>jitpack.io</id>
<name>jitpack</name>
<url>https://jitpack.io</url>
</repository>
</repositories>
</project>
#
# DSpace Configuration
#
# NOTE: The DSpace Configuration File is separated into several sections:
# * General Configurations
# * JSPUI & XMLUI Configurations
# * JSPUI Specific Configurations
# * XMLUI Specific Configurations
#
# Revision: $Revision$
#
# Date: $Date$
#
#------------------------------------------------------------------#
#------------------GENERAL CONFIGURATIONS--------------------------#
#------------------------------------------------------------------#
# These configs are used by underlying DSpace API, and are #
# therefore applicable to all interfaces #
# Local, simple configuration should be made in build.properties #
# Global or more complex configuration can be hardcoded here #
#------------------------------------------------------------------#
##### Basic information ######
# DSpace installation directory
dspace.dir = ${dspace.install.dir}
# DSpace host name - should match base URL. Do not include port number.
dspace.hostname = ${dspace.hostname}
# DSpace base host URL. Include port number etc.
dspace.baseUrl = ${dspace.baseUrl}
# DSpace base URL. Include port number etc., but NOT trailing slash
# Change to xmlui if you wish to use the xmlui as the default, or remove
# "/jspui" and set webapp of your choice as the "ROOT" webapp in
# the servlet engine.
dspace.url = ${dspace.url}
# Optional: DSpace URL for mobile access
# This
#dspace.mobileUrl = http://mobile.example.com
# Name of the site
dspace.name = ${dspace.name}
# Default language for metadata values
default.language = ${default.language}
##### Database settings #####
# URL for connecting to database
db.url = ${db.url}
# JDBC Driver
db.driver = ${db.driver}
# Database username and password
db.username = ${db.username}
db.password = ${db.password}
# Schema name - if your database contains multiple schemas, you can avoid
# problems with retrieving the definitions of duplicate object names by
# specifying the schema name that is used for DSpace.
# ORACLE USAGE NOTE: In Oracle, schema is equivalent to "username". This means
# specifying a "db.schema" is often unnecessary (i.e. you can leave it blank),
# UNLESS your Oracle DB Account (in db.username) has access to multiple schemas.
db.schema = ${db.schema}
## Connection pool parameters
# Maximum number of DB connections in pool
db.maxconnections = ${db.maxconnections}
# Maximum time to wait before giving up if all connections in pool are busy (milliseconds)
db.maxwait = ${db.maxwait}
# Maximum number of idle connections in pool (-1 = unlimited)
db.maxidle = ${db.maxidle}
# Determine if prepared statement should be cached. (default is true)
db.statementpool = ${db.statementpool}
# Specify a name for the connection pool (useful if you have multiple applications sharing Tomcat's dbcp)
# If not specified, defaults to 'dspacepool'
db.poolname = ${db.poolname}
# Specify a configured database connection pool to be fetched from a
# directory. This overrides the pool and driver settings above. If
# none can be found, then DSpace will use the above settings to create a
# pool.
#db.jndi = jdbc/dspace
##### Email settings ######
# SMTP mail server
mail.server = ${mail.server}
# SMTP mail server authentication username and password (if required)
mail.server.username = ${mail.server.username}
mail.server.password = ${mail.server.password}
# SMTP mail server alternate port (defaults to 25)
mail.server.port = ${mail.server.port}
# From address for mail
mail.from.address = ${mail.from.address}
# Name of a pre-configured Session object to be fetched from a directory.
# This overrides the Session settings above. If none can be found, then DSpace
# will use the above settings to create a Session.
#mail.session.name = Session
# Currently limited to one recipient!
feedback.recipient = ${mail.feedback.recipient}
# General site administration (Webmaster) e-mail
mail.admin = ${mail.admin}
# Recipient for server errors and alerts
alert.recipient = ${mail.alert.recipient}
# Recipient for new user registration emails
registration.notify = ${mail.registration.notify}
# Set the default mail character set. This may be overridden by providing a line
# inside the email template "charset: <encoding>", otherwise this default is used.
mail.charset = UTF-8
# A comma-separated list of hostnames that are allowed to refer browsers to email forms.
# Default behaviour is to accept referrals only from dspace.hostname
mail.allowed.referrers = ${dspace.hostname}
mail.extraproperties = ${mail.extraproperties}
# Pass extra settings to the Java mail library. Comma-separated, equals sign between
# the key and the value. For example:
#mail.extraproperties = mail.smtp.socketFactory.port=465, \
# mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory, \
# mail.smtp.socketFactory.fallback=false
# An option is added to disable the mailserver. By default, this property is set to false
# By setting mail.server.disabled = true, DSpace will not send out emails.
# It will instead log the subject of the email which should have been sent
# This is especially useful for development and test environments where production data is used when testing functionality.
mail.server.disabled = ${mail.server.disabled}
##### File Storage ######
# Asset (bitstream) store number 0 (zero)
assetstore.dir = ${dspace.dir}/assetstore
# Specify extra asset stores like this, counting from 1 upwards:
# assetstore.dir.1 = /second/assetstore
# assetstore.dir.2 = /third/assetstore
# Specify the number of the store to use for new bitstreams with this property
# The default is 0 (zero) which corresponds to the 'assetstore.dir' above
# assetstore.incoming = 1
##### SRB File Storage #####
# The same 'assetstore.incoming' property is used to support the use of SRB
# (Storage Resource Broker - see http://www.sdsc.edu/srb/) as an _optional_
# replacement of or supplement to conventional file storage. DSpace will work
# with or without SRB and full backward compatibility is maintained.
#
# The 'assetstore.incoming' property is an integer that references where _new_
# bitstreams will be stored. The default (say the starting reference) is zero.
# The value will be used to identify the storage where all new bitstreams will
# be stored until this number is changed. This number is stored in the
# Bitstream table (store_number column) in the DSpace database, so older
# bitstreams that may have been stored when 'asset.incoming' had a different
# value can be found.
#
# In the simple case in which DSpace uses local (or mounted) storage the
# number can refer to different directories (or partitions). This gives DSpace
# some level of scalability. The number links to another set of properties
# 'assetstore.dir', 'assetstore.dir.1' (remember zero is default),
# 'assetstore.dir.2', etc., where the values are directories.
#
# To support the use of SRB DSpace uses this same scheme but broadened to
# support:
# - using SRB instead of the local filesystem
# - using the local filesystem (native DSpace)
# - using a mix of SRB and local filesystem
#
# In this broadened use the 'asset.incoming' integer will refer one of the
# following storage locations
# - a local filesystem directory (native DSpace)
# - a set of SRB account parameters (host, port, zone, domain, username,
# password, home directory, and resource)
#
# Should there be any conflict, like '2' refering to a local directory and
# to a set of SRB parameters, the program will select the local directory.
#
# If SRB is chosen from the first install of DSpace, it is suggested that
# 'assetstore.dir' (no integer appended) be retained to reference a local
# directory (as above under File Storage) because build.xml uses this value
# to do a mkdir. In this case, 'assetstore.incoming' can be set to 1 (i.e.
# uncomment the line in File Storage above) and the 'assetstore.dir' will not
# be used.
#
# Here is an example set of SRB parameters:
# Assetstore 1 - SRB
#srb.host.1 = mysrbmcathost.myu.edu
#srb.port.1 = 5544
#srb.mcatzone.1 = mysrbzone
#srb.mdasdomainname.1 = mysrbdomain
#srb.defaultstorageresource.1 = mydefaultsrbresource
#srb.username.1 = mysrbuser
#srb.password.1 = mysrbpassword
#srb.homedirectory.1 = /mysrbzone/home/mysrbuser.mysrbdomain
#srb.parentdir.1 = mysrbdspaceassetstore
#
# Assetstore n, n+1, ...
# Follow same pattern as for assetstores above (local or SRB)
##### Logging configuration #####
# Override default log4j configuration
# You may provide your own configuration here, existing alternatives are:
# log.init.config = ${dspace.dir}/config/log4j.xml
# log.init.config = ${dspace.dir}/config/log4j-console.properties
log.init.config = ${dspace.dir}/config/log4j.properties
# Where to put the logs (used in configuration only)
log.dir = ${dspace.dir}/log
# If enabled, the logging and the Solr statistics system will look for
# an X-Forwarded-For header. If it finds it, it will use this for the user IP address
#useProxies = true
##### DOI registration agency credentials ######
# To mint DOIs you have to use a DOI registration agency like DataCite. Several
# DataCite members offers services as DOI registration agency, so f.e. EZID or
# TIB Hannover. To mint DOIs with DSpace you have to get an agreement with an
# DOI registration agency. You have to edit
# [dspace]/config/spring/api/identifier-service.xml and to configure the following
# properties.
# Credentials used to authenticate against the registration agency:
identifier.doi.user = username
identifier.doi.password = password
# DOI prefix used to mint DOIs. All DOIs minted by DSpace will use this prefix.
# The Prefix will be assigned by the registration agency.
identifier.doi.prefix = 10.5072
# If you want to, you can further separate your namespace. Should all the
# suffixes of all DOIs minted by DSpace start with a special string to separate
# it from other services also minting DOIs under your prefix?
identifier.doi.namespaceseparator = dspace/
##### Plugin management #####
# Where to look for third-party plugin packages. The value is a colon-separated
# list of filesystem directories and/or JAR files: a Java class path. Plugin
# classes not found in the usual places will be sought in these places last. If
# unset, only the standard places will be searched.
#plugin.classpath = ${dspace.dir}/plugins/aPlugin.jar
##### Search settings #####
# Where to put search index files
search.dir = ${dspace.dir}/search
# Higher values of search.max-clauses will enable prefix searches to work on
# large repositories
search.max-clauses = 2048
# Which Lucene Analyzer implementation to use. If this is omitted or
# commented out, the standard DSpace analyzer (designed for English)
# is used by default.
# Non-Stemming analyzer. Does not "stem" words/terms. When using this analyzer,
# a search for "wellness" will always return items matching "wellness" and not "well".
# However, similarly a search for "experiments" will only return objects matching
# "experiments" and not "experiment" or "experimenting".
# search.analyzer = org.dspace.search.DSNonStemmingAnalyzer
# Chinese analyzer
# search.analyzer = org.apache.lucene.analysis.cn.ChineseAnalyzer
search.analyzer = org.dspace.search.DSAnalyzer
# Boolean search operator to use, current supported values are OR and AND
# If this config item is missing or commented out, OR is used
# AND requires all search terms to be present
# OR requires one or more search terms to be present
search.operator = OR
# Maximum number of terms indexed for a single field in Lucene.
# Default is 10,000 words - often not enough for full-text indexing.
# If you change this, you'll need to re-index for the change
# to take effect on previously added items.
# -1 = unlimited (Integer.MAX_VALUE)
search.maxfieldlength = 10000
##### Fields to Index for Search #####
# DC metadata elements.qualifiers to be indexed for search
# format: - search.index.[number] = [search field]:element.qualifier
# - * used as wildcard
# - inputform -> In case we have different input-forms for different repository supported locales (e.g input-forms_el.xml, input-forms_pt.xml etc). In this case, the
# stored and the displayed value from all input-forms are indexed. If the stored value is not found in input-forms, it is indexed anyway.
# e.g.:search.index.12 = language:dc.language:inputform
#
### changing these will change your search results, ###
### but will NOT automatically change your search displays ###
search.index.1 = author:dc.contributor.*
search.index.2 = author:dc.creator.*
search.index.3 = title:dc.title.*
search.index.4 = keyword:dc.subject.*
search.index.5 = abstract:dc.description.abstract
search.index.6 = author:dc.description.statementofresponsibility
search.index.7 = series:dc.relation.ispartofseries
search.index.8 = abstract:dc.description.tableofcontents
search.index.9 = mime:dc.format.mimetype
search.index.10 = sponsor:dc.description.sponsorship
search.index.11 = identifier:dc.identifier.*
search.index.12 = language:dc.language.iso
search.index.13 = rights:dc.rights.label
##### Handle settings ######
# Canonical Handle URL prefix
#
# By default, DSpace is configured to use http://hdl.handle.net/
# as the canonical URL prefix when generating dc.identifier.uri
# during submission, and in the 'identifier' displayed in JSPUI
# item record pages.
#
# If you do not subscribe to CNRI's handle service, you can change this
# to match the persistent URL service you use, or you can force DSpace
# to use your site's URL, eg.
#handle.canonical.prefix = ${dspace.url}/handle/
#
# Note that this will not alter dc.identifer.uri metadata for existing
# items (only for subsequent submissions), but it will alter the URL
# in JSPUI's 'identifier' message on item record pages for existing items.
#
# If omitted, the canonical URL prefix will be http://hdl.handle.net/
handle.canonical.prefix = ${handle.canonical.prefix}
# CNRI Handle prefix
handle.prefix = ${handle.prefix}
# Directory for installing Handle server files
handle.dir = ${handle.dir}
# List any additional prefixes that need to be managed by this handle server
# (as for examle handle prefix coming from old dspace repository merged in
# that repository)
# handle.additional.prefixes = prefix1[, prefix2]
# By default we hide the list handles method in the JSON endpoint as it could
# produce heavy load for large repository
# handle.hide.listhandles = false
handle.caseSensitive = false
##### Authorization system configuration - Delegate ADMIN #####
# COMMUNITY ADMIN configuration
# subcommunities and collections
#core.authorization.community-admin.create-subelement = true
#core.authorization.community-admin.delete-subelement = true
# his community
#core.authorization.community-admin.policies = true
#core.authorization.community-admin.admin-group = true
# collections in his community
#core.authorization.community-admin.collection.policies = true
#core.authorization.community-admin.collection.template-item = true
#core.authorization.community-admin.collection.submitters = true
#core.authorization.community-admin.collection.workflows = true
#core.authorization.community-admin.collection.admin-group = true
# item owned by collections in his community
#core.authorization.community-admin.item.delete = true
#core.authorization.community-admin.item.withdraw = true
#core.authorization.community-admin.item.reinstatiate = true
#core.authorization.community-admin.item.policies = true
# also bundle...
#core.authorization.community-admin.item.create-bitstream = true
#core.authorization.community-admin.item.delete-bitstream = true
#core.authorization.community-admin.item-admin.cc-license = true
# COLLECTION ADMIN
#core.authorization.collection-admin.policies = true
#core.authorization.collection-admin.template-item = true
#core.authorization.collection-admin.submitters = true
#core.authorization.collection-admin.workflows = true
#core.authorization.collection-admin.admin-group = true
# item owned by his collection
#core.authorization.collection-admin.item.delete = true
#core.authorization.collection-admin.item.withdraw = true
#core.authorization.collection-admin.item.reinstatiate = true
#core.authorization.collection-admin.item.policies = true
# also bundle...
#core.authorization.collection-admin.item.create-bitstream = true
#core.authorization.collection-admin.item.delete-bitstream = true
#core.authorization.collection-admin.item-admin.cc-license = true
# ITEM ADMIN
#core.authorization.item-admin.policies = true
# also bundle...
#core.authorization.item-admin.create-bitstream = true
#core.authorization.item-admin.delete-bitstream = true
#core.authorization.item-admin.cc-license = true
#### Restricted item visibilty settings ###
# By default RSS feeds, OAI-PMH and subscription emails will include ALL items
# regardless of permissions set on them.
#
# If you wish to only expose items through these channels where the ANONYMOUS
# user is granted READ permission, then set the following options to false
#
# Warning: In large repositories, setting harvest.includerestricted.oai to false may cause
# performance problems as all items will need to have their authorization permissions checked,
# but because DSpace has not implemented resumption tokens in ListIdentifiers, ALL items will
# need checking whenever a ListIdentifers request is made.
#
#harvest.includerestricted.rss = true
#harvest.includerestricted.oai = true
#harvest.includerestricted.subscription = true
#### Proxy Settings ######
# uncomment and specify both properties if proxy server required
# proxy server for external http requests - use regular hostname without port number
http.proxy.host = ${http.proxy.host}
# port number of proxy server
http.proxy.port = ${http.proxy.port}
#### Media Filter / Format Filter plugins (through PluginManager) ####
# Media/Format Filters help to full-text index content or
# perform automated format conversions
#Names of the enabled MediaFilter or FormatFilter plugins
filter.plugins = PDF Text Extractor, HTML Text Extractor, \
PowerPoint Text Extractor, \
Word Text Extractor, JPEG Thumbnail
# [To enable Branded Preview]: uncomment and insert the following into the plugin list
# Branded Preview JPEG, \
# [To enable ImageMagick Thumbnail]:
# remove "JPEG Thumbnail" from the plugin list
# uncomment and insert the following line into the plugin list
# ImageMagick Image Thumbnail, ImageMagick PDF Thumbnail, \
#Assign 'human-understandable' names to each filter
plugin.named.org.dspace.app.mediafilter.FormatFilter = \
org.dspace.app.mediafilter.XPDF2Text = PDF Text Extractor, \
org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor, \
org.dspace.app.mediafilter.XPDF2Thumbnail = PDF Thumbnail, \
org.dspace.app.mediafilter.WordFilter = Word Text Extractor, \
org.dspace.app.mediafilter.PowerPointFilter = PowerPoint Text Extractor, \
org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \
org.dspace.app.mediafilter.BrandedPreviewJPEGFilter = Branded Preview JPEG, \
org.dspace.app.mediafilter.ImageMagickImageThumbnailFilter = ImageMagick Image Thumbnail, \
org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter = ImageMagick PDF Thumbnail
#Configure each filter's input format(s)
filter.org.dspace.app.mediafilter.XPDF2Thumbnail.inputFormats = Adobe PDF
filter.org.dspace.app.mediafilter.XPDF2Text.inputFormats = Adobe PDF
filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text
filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word
filter.org.dspace.app.mediafilter.PowerPointFilter.inputFormats = Microsoft Powerpoint, Microsoft Powerpoint XML
filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
filter.org.dspace.app.mediafilter.BrandedPreviewJPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
filter.org.dspace.app.mediafilter.ImageMagickImageThumbnailFilter.inputFormats = BMP, GIF, image/png, JPG, TIFF, JPEG, JPEG 2000
filter.org.dspace.app.mediafilter.ImageMagickPdfThumbnailFilter.inputFormats = Adobe PDF
#Publicly accessible thumbnails of restricted content.
#List the MediaFilter name's that would get publicly accessible permissions
#Any media filters not listed will instead inherit the permissions of the parent bitstream
#filter.org.dspace.app.mediafilter.publicPermission = JPEGFilter, XPDF2Thumbnail
#Custom settings for PDFFilter
# If true, all PDF extractions are written to temp files as they are indexed...this
# is slower, but helps ensure that PDFBox software DSpace uses doesn't eat up
# all your memory
#pdffilter.largepdfs = true
# If true, PDFs which still result in an Out of Memory error from PDFBox
# are skipped over...these problematic PDFs will never be indexed until
# memory usage can be decreased in the PDFBox software
#pdffilter.skiponmemoryexception = true
# Custom settigns for ImageMagick Thumbnail Filters
# ImageMagick and GhostScript must be installed on the server, set the path to ImageMagick and GhostScript executable
# http://www.imagemagick.org/
# http://www.ghostscript.com/
# Note: thumbnail.maxwidth and thumbnail.maxheight are used to set Thumbnail dimensions
# org.dspace.app.mediafilter.ImageMagickThumbnailFilter.ProcessStarter = /usr/bin
#
# bitstreams generated by this process will contain the following description and may be overwritten
# org.dspace.app.mediafilter.ImageMagickThumbnailFilter.bitstreamDescription = IM Thumbnail
#
# bitstream descriptions that do not conform to the following regular expression will not be overwritten
# org.dspace.app.mediafilter.ImageMagickThumbnailFilter.replaceRegex = ^Generated Thumbnail$
#
# While PDFs may contain transparent spaces, JPEG cannot. As DSpace use JPEG
# for the generated thumbnails, PDF containing transparent spaces may lead
# to problems. To solve this the exported PDF page is flatten before it is
# resized and stored as JPEG. You can switch this behavior off by setting the
# next property false, if necessary for any reasons.
# org.dspace.app.mediafilter.ImageMagickThumbnailFilter.flatten = true
#### Crosswalk and Packager Plugin Settings ####
# Crosswalks are used to translate external metadata formats into DSpace's internal format (DIM)
# Packagers are used to ingest/export 'packages' (both content files and metadata)
# Configure table-driven MODS dissemination crosswalk
# (add lower-case name for OAI-PMH)
crosswalk.mods.properties.MODS = crosswalks/mods.properties
crosswalk.mods.properties.mods = crosswalks/mods.properties
# Configure XSLT-driven submission crosswalk for MODS
crosswalk.submission.MODS.stylesheet= crosswalks/mods-submission.xsl
# Configure XSLT-driven submission crosswalk for EPDCX. Originally developed for use with SWORD.
crosswalk.submission.EPDCX.stylesheet = crosswalks/sword-swap-ingest.xsl
# Configure the QDCCrosswalk dissemination plugin for Qualified DC
# (add lower-case name for OAI-PMH)
crosswalk.qdc.namespace.QDC.dc = http://purl.org/dc/elements/1.1/
crosswalk.qdc.namespace.QDC.dcterms = http://purl.org/dc/terms/
crosswalk.qdc.schemaLocation.QDC = \
http://purl.org/dc/terms/ http://dublincore.org/schemas/xmls/qdc/2006/01/06/dcterms.xsd \
http://purl.org/dc/elements/1.1/ http://dublincore.org/schemas/xmls/qdc/2006/01/06/dc.xsd
crosswalk.qdc.properties.QDC = crosswalks/QDC.properties
crosswalk.qdc.namespace.qdc.dc = http://purl.org/dc/elements/1.1/
crosswalk.qdc.namespace.qdc.dcterms = http://purl.org/dc/terms/
crosswalk.qdc.schemaLocation.qdc = \
http://purl.org/dc/terms/ http://dublincore.org/schemas/xmls/qdc/2006/01/06/dcterms.xsd \
http://purl.org/dc/elements/1.1/ http://dublincore.org/schemas/xmls/qdc/2006/01/06/dc.xsd
crosswalk.qdc.properties.qdc = crosswalks/QDC.properties
#### XSLTDisseminationCrosswalks ####
# XSLTDisseminationCrosswalks uses the selfnamed plugin
# org.dspace.content.crosswalk.XSLTDisseminationCrosswalk configured above.
# If you remove all XSLTDisseminationCrosswalk you should disable this plugin
# to avoid an error log message every time you load DSpace!
##
## Configure XSLT-driven submission crosswalk for MARC21
##
crosswalk.dissemination.marc.stylesheet = crosswalks/DIM2MARC21slim.xsl
crosswalk.dissemination.marc.schemaLocation = \
http://www.loc.gov/MARC21/slim \
http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd
crosswalk.dissemination.marc.preferList = true
##
## Configure XSLT-driven submission crosswalk for DataCite
##
crosswalk.dissemination.DataCite.stylesheet = crosswalks/DIM2DataCite.xsl
## For DataCite via EZID, comment above and uncomment this:
#crosswalk.dissemination.DataCite.stylesheet = crosswalks/DIM2EZID.xsl
crosswalk.dissemination.DataCite.schemaLocation = \
http://datacite.org/schema/kernel-2.2 \
http://schema.datacite.org/meta/kernel-2.2/metadata.xsd
crosswalk.dissemination.DataCite.preferList = false
# Crosswalk Plugin Configuration:
# The purpose of Crosswalks is to translate an external metadata format to/from
# the DSpace Internal Metadata format (DIM) or the DSpace Database.
# Crosswalks are often used by one or more Packager plugins (see below).
plugin.named.org.dspace.content.crosswalk.IngestionCrosswalk = \
org.dspace.content.crosswalk.AIPDIMCrosswalk = DIM, \
org.dspace.content.crosswalk.AIPTechMDCrosswalk = AIP-TECHMD, \
org.dspace.content.crosswalk.PREMISCrosswalk = PREMIS, \
org.dspace.content.crosswalk.OREIngestionCrosswalkHttps = ore, \
org.dspace.content.crosswalk.NullIngestionCrosswalk = NIL, \
org.dspace.content.crosswalk.OAIDCIngestionCrosswalk = dc, \
org.dspace.content.crosswalk.DIMIngestionCrosswalk = dim, \
org.dspace.content.crosswalk.METSRightsCrosswalk = METSRIGHTS, \
org.dspace.content.crosswalk.RoleCrosswalk = DSPACE-ROLES, \
cz.cuni.mff.ufal.ORELicenseIngestionCrosswalk = ore_licenses
plugin.selfnamed.org.dspace.content.crosswalk.IngestionCrosswalk = \
org.dspace.content.crosswalk.XSLTIngestionCrosswalk, \
org.dspace.content.crosswalk.QDCCrosswalk
plugin.named.org.dspace.content.crosswalk.StreamIngestionCrosswalk = \
org.dspace.content.crosswalk.NullStreamIngestionCrosswalk = NULLSTREAM, \
org.dspace.content.crosswalk.CreativeCommonsRDFStreamIngestionCrosswalk = DSPACE_CCRDF, \
org.dspace.content.crosswalk.LicenseStreamIngestionCrosswalk = DSPACE_DEPLICENSE
plugin.named.org.dspace.content.crosswalk.DisseminationCrosswalk = \
org.dspace.content.crosswalk.AIPDIMCrosswalk = DIM, \
org.dspace.content.crosswalk.AIPTechMDCrosswalk = AIP-TECHMD, \
org.dspace.content.crosswalk.SimpleDCDisseminationCrosswalk = DC, \
org.dspace.content.crosswalk.SimpleDCDisseminationCrosswalk = dc, \
org.dspace.content.crosswalk.PREMISCrosswalk = PREMIS, \
org.dspace.content.crosswalk.METSDisseminationCrosswalk = METS, \
org.dspace.content.crosswalk.METSDisseminationCrosswalk = mets, \
org.dspace.content.crosswalk.METSRightsCrosswalk = METSRIGHTS, \
org.dspace.content.crosswalk.OREDisseminationCrosswalk = ore, \
org.dspace.content.crosswalk.DIMDisseminationCrosswalk = dim, \
org.dspace.content.crosswalk.RoleCrosswalk = DSPACE-ROLES, \
cz.cuni.mff.ufal.LicensesDisseminationCrosswalk = UFAL_LICENSES, \
# regarding the XSLTDisseminationCrosswalk see the section were it is
# configured to avoid error logs! Disable it if you remove its configuration.
plugin.selfnamed.org.dspace.content.crosswalk.DisseminationCrosswalk = \
org.dspace.content.crosswalk.MODSDisseminationCrosswalk , \
org.dspace.content.crosswalk.QDCCrosswalk, \
org.dspace.content.crosswalk.XHTMLHeadDisseminationCrosswalk, \
org.dspace.content.crosswalk.XSLTDisseminationCrosswalk
plugin.named.org.dspace.content.crosswalk.StreamDisseminationCrosswalk = \
org.dspace.content.crosswalk.CreativeCommonsRDFStreamDisseminationCrosswalk = DSPACE_CCRDF, \
org.dspace.content.crosswalk.CreativeCommonsTextStreamDisseminationCrosswalk = DSPACE_CCTEXT, \
org.dspace.content.crosswalk.LicenseStreamDisseminationCrosswalk = DSPACE_DEPLICENSE
# Packager Plugin Configuration:
# Configures the ingest and dissemination packages that DSpace supports.
# These Ingester and Disseminator classes support a specific package file format
# (e.g. METS) which DSpace understands how to import/export. Each Packager
# plugin often will use one (or more) Crosswalk plugins to translate metadata (see above).
plugin.named.org.dspace.content.packager.PackageDisseminator = \
org.dspace.content.packager.DSpaceAIPDisseminator = AIP, \
org.dspace.content.packager.DSpaceMETSDisseminator = METS, \
org.dspace.content.packager.RoleDisseminator = DSPACE-ROLES
# Do NOT cache AIP/METS Disseminator plugin instances, as their exported obj lists
# (in AbstractPackageDisseminator) need to be reset each time a new export occurs
plugin.reusable.org.dspace.content.packager.DSpaceAIPDisseminator = false
plugin.reusable.org.dspace.content.packager.DSpaceMETSDisseminator = false
plugin.named.org.dspace.content.packager.PackageIngester = \
org.dspace.content.packager.DSpaceAIPIngester = AIP, \
org.dspace.content.packager.PDFPackager = Adobe PDF, PDF, \
org.dspace.content.packager.DSpaceMETSIngester = METS, \
org.dspace.content.packager.RoleIngester = DSPACE-ROLES
# Do NOT cache AIP/METS Ingester plugin instances, as their imported obj lists
# (in AbstractPackageIngester) need to be reset each time a new import occurs
plugin.reusable.org.dspace.content.packager.DSpaceAIPIngester = false
plugin.reusable.org.dspace.content.packager.DSpaceMETSIngester = false
#### METS ingester configuration:
# These settings configure how DSpace will ingest a METS-based package
# Configures the METS-specific package ingesters (defined above)
# 'default' settings are specified by 'default' key
# Default Option to save METS manifest in the item: (default is false)
mets.default.ingest.preserveManifest = false
# Default Option to make use of collection templates when using the METS ingester (default is false)
mets.default.ingest.useCollectionTemplate = false
# Default crosswalk mappings
# Maps a METS 'mdtype' value to a DSpace crosswalk for processing.
# When the 'mdtype' value is same as the name of a crosswalk, that crosswalk
# will be called automatically (e.g. mdtype='PREMIS' calls the crosswalk named
# 'PREMIS', unless specified differently in below mapping)
# Format is 'mets.default.ingest.crosswalk.<mdType> = <DSpace-crosswalk-name>'
mets.default.ingest.crosswalk.DC = QDC
mets.default.ingest.crosswalk.DSpaceDepositLicense = DSPACE_DEPLICENSE
mets.default.ingest.crosswalk.Creative\ Commons = DSPACE_CCRDF
mets.default.ingest.crosswalk.CreativeCommonsRDF = DSPACE_CCRDF
mets.default.ingest.crosswalk.CreativeCommonsText = NULLSTREAM
mets.default.ingest.crosswalk.EPDCX = EPDCX
# Locally cached copies of METS schema documents to save time on ingest. This
# will often speed up validation & ingest significantly. Before enabling
# these settings, you must manually cache all METS schemas in
# [dspace]/config/schemas/ (does not exist by default). Most schema documents
# can be found on the http://www.loc.gov/ website.
# Enable the below settings to pull these *.xsd files from your local cache.
# (Setting format: mets.xsd.<abbreviation> = <namespace> <local-file-name>)
#mets.xsd.mets = http://www.loc.gov/METS/ mets.xsd
#mets.xsd.xlink = http://www.w3.org/1999/xlink xlink.xsd
#mets.xsd.mods = http://www.loc.gov/mods/v3 mods.xsd
#mets.xsd.xml = http://www.w3.org/XML/1998/namespace xml.xsd
#mets.xsd.dc = http://purl.org/dc/elements/1.1/ dc.xsd
#mets.xsd.dcterms = http://purl.org/dc/terms/ dcterms.xsd
#mets.xsd.premis = http://www.loc.gov/standards/premis PREMIS.xsd
#mets.xsd.premisObject = http://www.loc.gov/standards/premis PREMIS-Object.xsd
#mets.xsd.premisEvent = http://www.loc.gov/standards/premis PREMIS-Event.xsd
#mets.xsd.premisAgent = http://www.loc.gov/standards/premis PREMIS-Agent.xsd
#mets.xsd.premisRights = http://www.loc.gov/standards/premis PREMIS-Rights.xsd
#### AIP Ingester & Disseminator Configuration
# These settings configure how DSpace will ingest/export its own
# AIP (Archival Information Package) format for backups and restores
# (Please note, as the DSpace AIP format is also METS based, it will also
# use many of the 'METS ingester configuration' settings directly above)
# AIP-specific ingestion crosswalk mappings
# (overrides 'mets.default.ingest.crosswalk' settings)
# Format is 'mets.dspaceAIP.ingest.crosswalk.<mdType> = <DSpace-crosswalk-name>'
mets.dspaceAIP.ingest.crosswalk.DSpaceDepositLicense = NULLSTREAM
mets.dspaceAIP.ingest.crosswalk.CreativeCommonsRDF = NULLSTREAM
mets.dspaceAIP.ingest.crosswalk.CreativeCommonsText = NULLSTREAM
# Create EPerson if necessary for Submitter when ingesting AIP (default=false)
# (by default, EPerson creation is already handled by 'DSPACE-ROLES' Crosswalk)
#mets.dspaceAIP.ingest.createSubmitter = false
## AIP-specific Disseminator settings
# These settings allow you to customize which metadata formats are exported in AIPs
# Technical metadata in AIP (exported to METS <techMD> section)
# Format is <label-for-METS>:<DSpace-crosswalk-name> [, ...] (label is optional)
# If unspecfied, defaults to "PREMIS"
aip.disseminate.techMD = PREMIS, DSPACE-ROLES
# Source metadata in AIP (exported to METS <sourceMD> section)
# Format is <label-for-METS>:<DSpace-crosswalk-name> [, ...] (label is optional)
# If unspecfied, defaults to "AIP-TECHMD"
aip.disseminate.sourceMD = AIP-TECHMD
# Preservation metadata in AIP (exported to METS <digipovMD> section)
# Format is <label-for-METS>:<DSpace-crosswalk-name> [, ...] (label is optional)
# If unspecified, defaults to nothing in <digiprovMD> section
#aip.disseminate.digiprovMD =
# Rights metadata in AIP (exported to METS <rightsMD> section)
# Format is <label-for-METS>:<DSpace-crosswalk-name> [, ...] (label is optional)
# If unspecified, default to adding all Licenses (CC and Deposit licenses),
# as well as METSRights information
aip.disseminate.rightsMD = DSpaceDepositLicense:DSPACE_DEPLICENSE, \
CreativeCommonsRDF:DSPACE_CCRDF, CreativeCommonsText:DSPACE_CCTEXT, METSRIGHTS
# Descriptive metadata in AIP (exported to METS <dmdSec> section)
# Format is <label-for-METS>:<DSpace-crosswalk-name> [, ...] (label is optional)
# If unspecfied, defaults to "MODS, DIM"
aip.disseminate.dmd = MODS, DIM
#### Event System Configuration ####
# default synchronous dispatcher (same behavior as traditional DSpace)
event.dispatcher.default.class = org.dspace.event.BasicDispatcher
#
# uncomment below and comment out original property to enable the legacy lucene indexing
# event.dispatcher.default.consumers = versioning, search, browse, eperson, harvester
#
# add the browse consumer if you want to switch back to the DBMS Browse DAOs implementation
# as the SOLR implementation rely on the discovery consumer
#
# event.dispatcher.default.consumers = versioning, browse, discovery, eperson, harvester
#
# Add doi here if you are using org.dspace.identifier.DOIIdentifierProvider to generate DOIs.
# Adding doi here makes DSpace send metadata updates to your doi registration agency.
# Add rdf here, if you are using dspace-rdf to export your repository content as RDF.
event.dispatcher.default.consumers = versioning, discovery, eperson, harvester, eudatreplication, xoai, bitstream
# The noindex dispatcher will not create search or browse indexes (useful for batch item imports)
event.dispatcher.noindex.class = org.dspace.event.BasicDispatcher
event.dispatcher.noindex.consumers = eperson
# consumer to maintain the search index
event.consumer.search.class = org.dspace.search.SearchConsumer
event.consumer.search.filters = Community|Collection|Item|Bundle+Add|Create|Modify|Modify_Metadata|Delete|Remove
# consumer to maintain the discovery index
event.consumer.discovery.class = org.dspace.discovery.IndexEventConsumer
event.consumer.discovery.filters = Community|Collection|Item|Bundle+Add|Create|Modify|Modify_Metadata|Delete|Remove
# consumer to maintain the browse index
event.consumer.browse.class = org.dspace.browse.BrowseConsumer
event.consumer.browse.filters = Community|Collection|Item|Bundle+Add|Create|Modify|Modify_Metadata|Delete|Remove
# consumer related to EPerson changes
event.consumer.eperson.class = org.dspace.eperson.EPersonConsumer
event.consumer.eperson.filters = EPerson+Create
# consumer to clean up harvesting data
event.consumer.harvester.class = org.dspace.harvest.HarvestConsumer
event.consumer.harvester.filters = Item+Delete
# consumer to update metadata of DOIs
event.consumer.doi.class = org.dspace.identifier.doi.DOIConsumer
event.consumer.doi.filters = Item+Modify_Metadata
# consumer to update the triplestore of dspace-rdf
event.consumer.rdf.class = org.dspace.rdf.RDFConsumer
event.consumer.rdf.filters = Community|Collection|Item|Bundle|Bitstream|Site+Add|Create|Modify|Modify_Metadata|Delete|Remove
# test consumer for debugging and monitoring
#event.consumer.test.class = org.dspace.event.TestConsumer
#event.consumer.test.filters = All+All
# consumer to maintain versions
event.consumer.versioning.class = org.dspace.versioning.VersioningConsumer
event.consumer.versioning.filters = Item+Install
# authority consumer
event.consumer.authority.class = org.dspace.authority.indexer.AuthorityConsumer
event.consumer.authority.filters = Item+Modify|Modify_Metadata
# consumer for eudatreplication
event.consumer.eudatreplication.class = cz.cuni.mff.ufal.dspace.b2safe.ItemModifyConsumer
event.consumer.eudatreplication.filters = Community|Collection|Item+Create|Modify
# consumer to maintain the oai index
event.consumer.xoai.class = cz.cuni.mff.ufal.event.OAIIndexEventConsumer
event.consumer.xoai.filters = Community|Collection|Item|Bundle|Bitstream+Add|Create|Modify|Modify_Metadata|Delete|Remove
# consumer processing bitstreams
event.consumer.bitstream.class = cz.cuni.mff.ufal.curation.ProcessBitstreams
event.consumer.bitstream.filters = Bitstream+Add|Create|Delete|Remove
# ...set to true to enable testConsumer messages to standard output
#testConsumer.verbose = true
#### Embargo Settings ####
# DC metadata field to hold the user-supplied embargo terms
embargo.field.terms = local.embargo.termslift
# DC metadata field to hold computed "lift date" of embargo
embargo.field.lift = local.embargo.termslift
# string in terms field to indicate indefinite embargo
embargo.terms.open = forever
# implementation of embargo setter plugin - replace with local implementation if applicable
plugin.single.org.dspace.embargo.EmbargoSetter = org.dspace.embargo.DefaultEmbargoSetter
# implementation of embargo lifter plugin - - replace with local implementation if applicable
plugin.single.org.dspace.embargo.EmbargoLifter = org.dspace.embargo.DefaultEmbargoLifter
#### Checksum Checker Settings ####
# Default dispatcher in case none specified
plugin.single.org.dspace.checker.BitstreamDispatcher=org.dspace.checker.SimpleDispatcher
# check history retention
checker.retention.default=10y
checker.retention.CHECKSUM_MATCH=8w
### Item export and download settings ###
# The directory where the exports will be done and compressed
org.dspace.app.itemexport.work.dir = ${dspace.dir}/exports
# The directory where the compressed files will reside and be read by the downloader
org.dspace.app.itemexport.download.dir = ${dspace.dir}/exports/download
# The length of time in hours each archive should live for. When new archives are
# created this entry is used to delete old ones
org.dspace.app.itemexport.life.span.hours = 48
# The maximum size in Megabytes the export should be. This is enforced before the
# compression. Each bitstream's size in each item being exported is added up, if their
# cummulative sizes are more than this entry the export is not kicked off
org.dspace.app.itemexport.max.size = 200
### Batch Item import settings ###
# The directory where the results of imports will be placed (mapfile, upload file)
org.dspace.app.batchitemimport.work.dir = ${dspace.dir}/imports
# Enable performance optimization for select-collection-step collection query
# Enable when having
# a large number of collections and no Shibboleth or LDAP authentication.
# default = false, (disabled)
#org.dspace.content.Collection.findAuthorizedPerformanceOptimize = true
# For backwards compatibility, the subscription emails by default include any modified items
# uncomment the following entry for only new items to be emailed
# eperson.subscription.onlynew = true
# Identifier providers.
# Following are configuration values for the EZID DOI provider, with appropriate
# values for testing. Replace the values with your assigned "shoulder" and
# credentials.
#identifier.doi.ezid.shoulder = 10.5072/FK2/
#identifier.doi.ezid.user = apitest
#identifier.doi.ezid.password = apitest
# A default publisher, for Items not previously published.
# (If generateDataciteXML bean property is enabled. Set default publisher in the
# XSL file configured by: crosswalk.dissemination.DataCite.stylesheet file.)
#identifier.doi.ezid.publisher = a publisher
#---------------------------------------------------------------#
#--------------JSPUI & XMLUI CONFIGURATIONS---------------------#
#---------------------------------------------------------------#
# These configs are used by both JSP and XML User Interfaces, #
# except where explicitly stated otherwise. #
#---------------------------------------------------------------#
# Determine if super administrators (those whom are in the Administrators group)
# can login as another user from the "edit eperson" page. This is useful for
# debugging problems in a running dspace instance, especially in the workflow
# process. The default value is false, i.e. no one may assume the login of another user.
webui.user.assumelogin = true
# whether to display the contents of the licence bundle (often just the deposit
# licence in standard DSpace installation
webui.licence_bundle.show = false
##### Hide Item Metadata Fields #####
# Fields named here are hidden in the following places UNLESS the
# logged-in user is an Administrator:
# 1. XMLUI metadata XML view, and Item splash pages (long and short views).
# 2. JSPUI Item splash pages
# To designate a field as hidden, add a property here in the form:
# metadata.hide.SCHEMA.ELEMENT.QUALIFIER = true
#
# This default configuration hides the dc.description.provenance field,
# since that usually contains email addresses which ought to be kept
# private and is mainly of interest to administrators:
metadata.hide.dc.description.provenance = true
metadata.hide.local.submission.note = submitter
##### Settings for Submission Process #####
# Should the submit UI block submissions marked as theses?
webui.submit.blocktheses = false
# Whether or not we REQUIRE that a file be uploaded
# during the 'Upload' step in the submission process
# Defaults to true; If set to 'false', submitter has option to skip upload
webui.submit.upload.required = false
# If the browser supports it, JSPUI uses html5 File API to enhance file upload.
# If this property is set to false the enhanced file upload is not used even
# if the browser would support it.
#webui.submit.upload.html5 = 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
# Special Group for UI: all the groups nested inside this group
# will be loaded in the multiple select list of the RestrictStep
#webui.submission.restrictstep.groups = SubmissionAdmin
#### Creative Commons settings ######
# The url to the web service API
cc.api.rooturl = http://api.creativecommons.org/rest/1.5
# Metadata field to hold CC license URI of selected license
# NB: DSpace (both JSPUI and XMLUI) presentation code expects 'dc.rights.uri' to hold CC data. If you change
# this to another field, please consult documentation on how to update UI configuration
cc.license.uri = dc.rights.uri
# Metadata field to hold CC license name of selected license (if defined)
# NB: DSpace (both JSPUI and XMLUI) presentation code expects 'dc.rights' to hold CC data. If you change
# this to another field, please consult documentation on how to update UI configuration
cc.license.name = dc.rights
# Assign license name during web submission
cc.submit.setname = true
# Store license bitstream (RDF license text) during web submission
cc.submit.addbitstream = true
# ONLY JSPUI, enable Creative Commons admin
webui.submit.enable-cc = false
# A list of license classes that should be excluded from selection process
# class names - comma-separated list - must exactly match what service returns.
# At time of implementation, these are:
# publicdomain - "Public Domain"
# standard - "Creative Commons"
# recombo - "Sampling"
# zero - "CC0"
# mark - "Public Domain Mark"
cc.license.classfilter = recombo, mark
# Jurisdiction of the creative commons license -- is it ported or not?
# Use the key from the url seen in the response from the api call,
# http://api.creativecommons.org/rest/1.5/support/jurisdictions
# Commented out means the license is unported.
# (e.g. nz = New Zealand, uk = England and Wales, jp = Japan)
cc.license.jurisdiction = us
# Locale for CC dialogs
# A locale in the form language or language-country.
# If no default locale is defined the CC default locale will be used
cc.license.locale = en
##### Settings for Thumbnail creation #####
# whether to display thumbnails on browse and search results pages (1.2+)
# If you have customised the Browse columnlist, then you must also
# include a 'thumbnail' column in your configuration (1.5+)
# (This configuration is not used by XMLUI. To show thumbnails in the
# XMLUI, you just need to create a theme which displays them)
webui.browse.thumbnail.show = false
# max dimensions of the browse/search thumbs. Must be <= thumbnail.maxwidth
# and thumbnail.maxheight. Only need to be set if required to be smaller than
# dimension of thumbnails generated by mediafilter (1.2+)
#webui.browse.thumbnail.maxheight = 80
#webui.browse.thumbnail.maxwidth = 80
# whether to display the thumb against each bitstream (1.2+)
# (This configuration is not used by XMLUI. To show thumbnails in the
# XMLUI, you just need to create a theme which displays them)
webui.item.thumbnail.show = true
# where should clicking on a thumbnail from browse/search take the user
# Only values currently supported are "item" and "bitstream"
#webui.browse.thumbnail.linkbehaviour = item
# maximum width and height of generated thumbnails
thumbnail.maxwidth = 80
thumbnail.maxheight = 80
# Blur before scaling. A little blur before scaling does wonders for keeping
# moire in check.
thumbnail.blurring = true
# High quality scaling option. Setting to true can dramatically increase
# image quality, but it takes longer to create thumbnails.
thumbnail.hqscaling = true
#### Settings for Item Preview ####
webui.preview.enabled = false
# max dimensions of the preview image
webui.preview.maxwidth = 600
webui.preview.maxheight = 600
# Blur before scaling. A little blur before scaling does wonders for keeping
# moire in check.
webui.preview.blurring = true
# High quality scaling option. Setting to true can dramatically increase
# image quality, but it will take much longer to create previews.
webui.preview.hqscaling = true
# the brand text
webui.preview.brand = My Institution Name
# an abbreviated form of the above text, this will be used
# when the preview image cannot fit the normal text
webui.preview.brand.abbrev = MyOrg
# the height of the brand
webui.preview.brand.height = 20
# font settings for the brand text
webui.preview.brand.font = SansSerif
webui.preview.brand.fontpoint = 12
#webui.preview.dc = rights
##### Settings for item count (strength) information ####
# whether to display collection and community strengths
# (Since DSpace 4.0, this config option is used by XMLUI, too.
# XMLUI only makes strengths available to themes if this is set to true!
# To show strengths in the XMLUI, you also need to create a theme which displays them)
webui.strengths.show = false
# if showing strengths, should they be counted in real time or
# fetched from cache?
#
# Counts fetched in real time will perform an actual count of the
# database contents every time a page with this feature is requested,
# which will not scale. The default behaviour is to use a cache (see
# ItemCounter configuration)
#
# The default is to use a cache
#
# webui.strengths.cache = true
###### ItemCounter Configuration ######
#
# Define the DAO class to use. This must correspond to your choice of
# storage for the browse system (RDBMS: PostgreSQL or Oracle, Solr).
# By default, since DSpace 4.0, the Solr implementation is used.
#
# Only if you use a DBMS implementation and want to use the cache
# (recommended!), you must run the following command periodically
# to update the count:
#
# [dspace]/bin/itemcounter (NOT required if you use the Solr implementation)
#
#
# PostgreSQL:
# ItemCountDAO.class = org.dspace.browse.ItemCountDAOPostgres
#
# Oracle:
# ItemCountDAO.class = org.dspace.browse.ItemCountDAOOracle
#
# Solr:
# ItemCountDAO.class = org.dspace.browse.ItemCountDAOSolr
###### Browse Configuration ######
#
# Define the DAO class to use this must meet your storage choice for
# the browse system (RDBMS: PostgreSQL or Oracle, Solr).
# By default, since DSpace 4.0, the Solr implementation is used
#
# PostgreSQL:
# browseDAO.class = org.dspace.browse.BrowseDAOPostgres
# browseCreateDAO.class = org.dspace.browse.BrowseCreateDAOPostgres
#
# Oracle:
# browseDAO.class = org.dspace.browse.BrowseDAOOracle
# browseCreateDAO.class = org.dspace.browse.BrowseCreateDAOOracle
#
# Solr:
# browseDAO.class = org.dspace.browse.SolrBrowseDAO
# browseCreateDAO.class = org.dspace.browse.SolrBrowseCreateDAO
#
# Use this to configure the browse indices. Each entry will receive a link in the
# navigation. Each entry can be configured in one of two ways. The first is:
#
# webui.browse.index.<n> = <index name> : metadata : \
# <schema prefix>.<element>[.<qualifier>|.*] : \
# (date | title | text) : (asc | desc)
#
# This form represent a unique index of metadata values from the item.
#
# (date | title | text | <other>) refers to the datatype of the field.
# date: the index type will be treated as a date object
# title: the index type will be treated like a title, which will include
# a link to the item page
# text: the index type will be treated as plain text. If single mode is
# specified then this will link to the full mode list
# <other>: any other datatype will be treated the same as 'text', although
# it will apply any custom ordering normalisation configured below
#
# The final part of the configuration is optional, and specifies the default ordering
# for the index - whether it is ASCending (the default, and best for text indexes), or
# DESCending (useful for dates - ie. most recent submissions)
#
# NOTE: the text to render the index will use the <index name> parameter to select
# the message key from Messages.properties using a key of the form:
#
# browse.type.metadata.<index name>
#
# The other form is for indexes of the items themselves, ie. each entry will be displayed
# according to the configuration of by webui.itemlist.columns:
#
# webui.browse.index.<n> = <index name> : item : <sort option name> : (asc | desc)
#
# sort option name: this is the sorting to be applied to the display. It must match the
# name given to one of the webui.itemlist.sort-option entries given below.
#
# The final part of the configuration is optional, and specifies the default ordering
# for the index - whether it is ASCending (the default, and best for text indexes), or
# DESCending (useful for dates - ie. most recent submissions)
# NOTE: the text to render the index will use the <sort option name> parameter to select
# the message key from Messages.properties (for JSPUI) using a key of the form:
#
# browse.type.item.<sort option name>
#
# Note: the index numbers <n> must start from 1 and increment continuously by 1
# thereafter. Deviation from this will cause an error during install or
# configuration update
#
# For compatibility with previous versions:
#
webui.browse.index.1 = dateissued:item:dateissued
webui.browse.index.2 = author:metadata:dc.contributor.*,dc.creator:text
webui.browse.index.3 = title:item:title
webui.browse.index.4 = subject:metadata:dc.subject.*:text
webui.browse.index.5 = publisher:metadata:dc.publisher:text
webui.browse.index.6 = language:metadata:dc.language.iso:iso_lang
webui.browse.index.7 = type:metadata:dc.type:text
webui.browse.index.8 = rights:metadata:dc.rights.label:text
## example of authority-controlled browse category - see authority control config
#webui.browse.index.5 = lcAuthor:metadataAuthority:dc.contributor.author:authority
# Enable/Disable tag cloud in browsing.
# webui.browse.index.tagcloud.<n> = true | false
# where n is the index number from the above options
# Default value is false. If no option exists for a specific index, it is assumed to be false.
# Changes to this option do NOT require re-indexing of discovery.
#
#webui.browse.index.tagcloud.4 = true
# Set the options for what can be sorted by
#
# Sort options will be available when browsing a list of items (i.e. an 'item' browse,
# or search results). You can define an arbitrary number of fields
# to sort on, irrespective of which fields you display using webui.itemlist.columns
#
# the format is:
#
# webui.itemlist.sort-option.<n> = <option name> : \
# <schema prefix>.<element>[.<qualifier>|.*] : \
# (date | text | ...) : (show | hide)
#
# This is defined much the same as above. The parameter after the metadata
# just lets the sorter know which normalisation to use - standard normalisations are title,
# text or date - however additional normalisations can be defined using the PluginManager.
#
# The final parts of the configuration is optional - whether to SHOW (the default) or
# HIDE the option from the sorting controls in the user interface. This can be useful if
# you need to define a specific date sort for use by the recent items lists,
# but otherwise don't want users to choose that option.
#
webui.itemlist.sort-option.1 = title:dc.title:title
webui.itemlist.sort-option.2 = dateissued:dc.date.issued:date
webui.itemlist.sort-option.3 = dateaccessioned:dc.date.accessioned:date
# By default, the display of metadata in the browse indexes is case sensitive
# So, you will get separate entries for the terms
#
# Olive oil
# olive oil
#
# However, clicking through from either of these will result in the same set of items
# (ie. any item that contains either representation in the correct field).
#
# Uncommenting the option below will make the metadata items case-insensitive. This will
# result in a single entry in the example above. However the value displayed may be either 'Olive oil'
# or 'olive oil' - depending on what representation was present in the first item indexed.
#
# If you care about the display of the metadata in the browse index - well, you'll have to go and
# fix the metadata in your items.
#
# webui.browse.metadata.case-insensitive = true
# Set the options for the size (number of characters) of the fields stored in the database.
#
# The default is 0, which is unlimited size for fields holding indexed data. Some
# database implementations (e.g. Oracle) will enforce their own limit on this field
# size. Reducing the field size will decrease the potential size of your database and
# increase the speed of the browse, but it will also increase the chance of
# mis-ordering of similar fields. Below are commented out, but proposed values for
# reasonably performance versus result quality
#
# Size of field for the browse value (this will affect display, and value sorting)
#
# webui.browse.value_columns.max = 500
# Size of field for hidden sort columns (this will affect only sorting, not display)
#
# webui.browse.sort_columns.max = 200
# Omission mark to place after truncated strings in display. The default is "..."
#
# webui.browse.value_columns.omission_mark = ...
# Set the options for how the indexes are sorted
#
# All sorts of normalisations are carried out by the OrderFormatDelegate.
# The plugin manager can be used to specify your own delegates for each datatype.
#
# The default datatypes (and delegates) are:
#
# author = org.dspace.sort.OrderFormatAuthor
# title = org.dspace.sort.OrderFormatTitle
# text = org.dspace.sort.OrderFormatText
#
# If you redefine a default datatype here, the configuration will be used in preference
# to the default, however, if you do not explicitly redefine a datatype, then the
# default will still be used in addition to the datatypes you do specify.
#
# As of 1.5.2, the multi-lingual MARC 21 title ordering is configured as default.
# To use the previous title ordering, comment out the configuration below
plugin.named.org.dspace.sort.OrderFormatDelegate= \
org.dspace.sort.OrderFormatTitleMarc21=title
#UFAL iso_lang to human readable in browse
plugin.named.org.dspace.sort.OrderFormatDelegate= \
cz.cuni.mff.ufal.dspace.sort.OrderFormatIsoLang=iso_lang
## Set the options for how authors are displayed in the browse listing
# Define which field is the author/editor etc listing. This should be listed in the
# field webui.itemlist.columns, otherwise it will have no effect.
# This cannot be a field already marked out as a title or a date, as this
# will also have no effect. This is used in conjunction with the
# webui.browse.author-limit field below, to truncate author lists. For
# configuring links to author publication lists use webui.browse.link below.
# (This setting is not used by the XMLUI as it is controlled by your theme)
#
# webui.browse.author-field = dc.contributor.*
# define how many authors to display before truncating and completing with "et al"
# (or language pack specific alternative)
#
# Use -1 for unlimited (which is what will be used if this option
# is omitted)
#
# webui.browse.author-limit = 3
# which fields should link to other browse listings. This should associated
# the name of one of the above browse indices with a metadata field listed
# in <webui.itemlist.columns> above. The form is:
#
# webui.browse.link.<n> = <index name>:<display column metadata>
#
# Note that cross linking will only work for fields other than title.
#
# The effect this has is to create links to browse views for the item clicked on.
# If it is a "single" type, it will link to a view of all the items which share
# that metadata element in common (i.e. all the papers by a single author). If
# it is a "full" type, it will link to a view of the standard full browse page,
# starting with the value of the link clicked on.
# (This setting is not used by the XMLUI, as links are controlled by your theme)
#
# The default below defines the authors to link to other publications by that author
#
webui.browse.link.1 = author:dc.contributor.*
### Render scientific formulas symbols in view/browse
# Use MathJax to render properly encoded text formulas to be visual for people
#webui.browse.render-scientific-formulas = true
#### Display browse frequencies
#
# webui.browse.metadata.show-freq.<n> = true | false
# where n is the same index as in webui.browse.index.<n> configurations
#
# For the browse indexes that this property is omitted, it is assumed as true
# please note that only a few overhead is required to compute frequencies when
# DBMS BrowseDAO is used and not overhead at all when SOLRBrowseDAO is used
# webui.browse.metadata.show-freq.1 = false
# webui.browse.metadata.show-freq.2 = false
# webui.browse.metadata.show-freq.3 = false
# webui.browse.metadata.show-freq.4 = true
#### Additional configuration for Recent Submissions code ####
# the sort option name (from webui.itemlist.sort-option above) to use for
# displaying recent submissions. (this
# is used by the Recent Submissions system and any other time based
# browse query such as FeedServlet)
#
recent.submissions.sort-option = dateaccessioned
# how many recent submissions should be displayed at any one time
# Set to 0 since discovery uses a separate configuration for this
recent.submissions.count = 0
# name of the browse index to display collection's items.
# You can set a "item" type of browse index only.
# default = title
#webui.collectionhome.browse-name = title
# how mamy items should be displayed per page in collection home page
# default = 20
#webui.collectionhome.perpage = 20
# whether does use "dateaccessioned" as a sort option
# If true and the sort option "dateaccessioned" exists, use "dateaccessioned" as a sort option.
# Otherwise use the sort option pertaining the specified browse index.
# default = true
#webui.collectionhome.use.dateaccessioned = true
# tell the community and collection pages that we are using the Recent
# Submissions code
#plugin.sequence.org.dspace.plugin.SiteHomeProcessor = \
# org.dspace.app.webui.components.TopCommunitiesSiteProcessor,\
# org.dspace.app.webui.components.RecentSiteSubmissions
#plugin.sequence.org.dspace.plugin.CommunityHomeProcessor = \
# org.dspace.app.webui.components.RecentCommunitySubmissions
#plugin.sequence.org.dspace.plugin.CollectionHomeProcessor = \
# org.dspace.app.webui.components.RecentCollectionSubmissions,\
# org.dspace.app.webui.components.CollectionItemList
#### JSPUI Discovery (extra Discovery setting that applies only to JSPUI) ####
# uncomment the following configuration if you want to restore the legacy Lucene
# search provider with JSPUI (be sure to re-enable also the search consumer)
# plugin.single.org.dspace.app.webui.search.SearchRequestProcessor = \
# org.dspace.app.webui.search.LuceneSearchRequestProcessor
#
# default since DSpace 4.0 is to use the Discovery search provider
plugin.single.org.dspace.app.webui.search.SearchRequestProcessor = \
org.dspace.app.webui.discovery.DiscoverySearchRequestProcessor
#### XMLUI Discovery (extra Discovery setting that applies only to XMLUI) ####
# uncomment the following configuration if you want to restore the legacy Lucene
# search provider with XMLUI (be sure to re-enable also the search consumer)
# plugin.single.org.dspace.app.xmlui.aspect.administrative.mapper.SearchRequestProcessor = \
# org.dspace.app.xmlui.aspect.administrative.mapper.LuceneSearchRequestProcessor
#
# default since DSpace 4.0 is to use the Discovery search provider
plugin.single.org.dspace.app.xmlui.aspect.administrative.mapper.SearchRequestProcessor = \
org.dspace.app.xmlui.aspect.administrative.mapper.DiscoverySearchRequestProcessor
#### Sidebar Facets ####
# to show facets on the site home page, community, collection
# comment out the following lines if you disable Discovery or don't want
# to show facets on side bars
# TagCloudProcessor is responsible for displaying a tag-cloud facet on the
# site home page, community or collection home page
plugin.sequence.org.dspace.plugin.CommunityHomeProcessor = \
org.dspace.app.webui.components.RecentCommunitySubmissions,\
org.dspace.app.webui.discovery.SideBarFacetProcessor
# org.dspace.app.webui.tagcloud.TagCloudProcessor
plugin.sequence.org.dspace.plugin.CollectionHomeProcessor = \
org.dspace.app.webui.components.CollectionItemList,\
org.dspace.app.webui.discovery.SideBarFacetProcessor
# org.dspace.app.webui.tagcloud.TagCloudProcessor
# org.dspace.app.webui.components.RecentCollectionSubmissions,\
plugin.sequence.org.dspace.plugin.SiteHomeProcessor = \
org.dspace.app.webui.components.TopCommunitiesSiteProcessor,\
org.dspace.app.webui.components.RecentSiteSubmissions,\
org.dspace.app.webui.discovery.SideBarFacetProcessor
# org.dspace.app.webui.tagcloud.TagCloudProcessor
#### JSON JSPUI Request Handler ####
# define any JSON handler here
#
# comment out this line if you disable Discovery
plugin.named.org.dspace.app.webui.json.JSONRequest = \
org.dspace.app.webui.discovery.DiscoveryJSONRequest = discovery,\
org.dspace.app.webui.json.SubmissionLookupJSONRequest = submissionLookup,\
org.dspace.app.webui.json.UploadProgressJSON = uploadProgress,\
org.dspace.app.webui.handle.HandleJSONResolver = hdlresolver,\
org.dspace.app.webui.json.CreativeCommonsJSONRequest = creativecommons
### i18n - Locales / Language ####
# Default Locale
# A Locale in the form country or country_language or country_language_variant
# if no default locale is defined the server default locale will be used.
default.locale = en
# All the Locales, that are supported by this instance of DSpace
# A comma-separated list of Locales. All types of Locales country, country_language, country_language_variant
# Note that the appropriate file are present, especially that all the Messages_x.properties are there
# may be used, e. g: webui.supported.locales = en, de
webui.supported.locales = ${supported.locales}
#### Submission License substitution variables ####
# it is possible include contextual information in the submission license using substitution variables
# the text substitution is driven by a plugin implementation
plugin.named.org.dspace.content.license.LicenseArgumentFormatter = \
org.dspace.content.license.SimpleDSpaceObjectLicenseFormatter = collection, \
org.dspace.content.license.SimpleDSpaceObjectLicenseFormatter = item, \
org.dspace.content.license.SimpleDSpaceObjectLicenseFormatter = eperson
#### Syndication Feed (RSS) Settings ######
# enable syndication feeds - links display on community and collection home pages
# (This setting is not used by XMLUI, as you enable feeds in your theme)
webui.feed.enable = true
# number of DSpace items per feed (the most recent submissions)
webui.feed.items = 10
# maximum number of feeds in memory cache
# value of 0 will disable caching
webui.feed.cache.size = 100
# number of hours to keep cached feeds before checking currency
# value of 0 will force a check with each request
webui.feed.cache.age = 24
# which syndication formats to offer
# use one or more (comma-separated) values from list:
# rss_0.90, rss_0.91, rss_0.92, rss_0.93, rss_0.94, rss_1.0, rss_2.0
webui.feed.formats = rss_1.0,rss_2.0,atom_1.0
# URLs returned by the feed will point at the global handle server (e.g. http://hdl.handle.net/123456789/1)
# Set to true to use local server URLs (i.e. http://myserver.myorg/handle/123456789/1)
webui.feed.localresolve = false
# Customize each single-value field displayed in the
# feed information for each item. Each of
# the below fields takes a *single* metadata field
#
# The form is <schema prefix>.<element>[.<qualifier>|.*]
webui.feed.item.title = dc.title
webui.feed.item.date = dc.date.issued
# Customise the metadata fields to show in the feed for each item's description.
# Elements will be displayed in the order that they are specified here.
#
# The form is <schema prefix>.<element>[.<qualifier>|.*][(date)], ...
#
# Similar to the item display UI, the name of the field for display
# in the feed will be drawn from the current UI dictionary,
# using the key:
# "metadata.<field>"
#
# e.g. "metadata.dc.title"
# "metadata.dc.contributor.author"
# "metadata.dc.date.issued"
webui.feed.item.description = dc.title, dc.contributor.author, \
dc.contributor.editor, dc.description.abstract, \
dc.description
# name of field to use for authors (Atom only) - repeatable
webui.feed.item.author = dc.contributor.author
# Customize the extra namespaced DC elements added to the item (RSS) or entry
# (Atom) element. These let you include individual metadata values in a
# structured format for easy extraction by the recipient, instead of (or in
# addition to) appending these values to the Description field.
## dc:creator value(s)
#webui.feed.item.dc.creator = dc.contributor.author
## dc:date value (may be contradicted by webui.feed.item.date)
#webui.feed.item.dc.date = dc.date.issued
## dc:description (e.g. for a distinct field that is ONLY the abstract)
#webui.feed.item.dc.description = dc.description.abstract
# Customize the image icon included with the site-wide feeds:
# Must be an absolute URL, e.g.
## webui.feed.logo.url = ${dspace.url}/themes/mysite/images/mysite-logo.png
# iTunes Podcast Enhanced RSS Feed Properties
# Add all the communities / collections, separated by commas (no spaces) that should
# have the iTunes podcast metadata added to their RSS feed.
# Default: Disabled, No collections or communities have iTunes Podcast enhanced metadata in their feed.
# webui.feed.podcast.collections =123456789/2,123456789/3
# webui.feed.podcast.communities =123456789/1
# Which MIMETypes of Bitstreams would you like to have podcastable in your item?
# Separate multiple entries with commas.
#webui.feed.podcast.mimetypes=audio/x-mpeg
# For the iTunes Podcast Feed, if you would like to specify an external media file,
# not on your DSpace server to be enclosed within the entry for each item,
# specify which metadata field will hold the URI to the external media file.
# This is useful if you store the metadata in DSpace, and a separate streaming server to host the media.
# Default: dc.source.uri
#webui.feed.podcast.sourceuri = dc.source.uri
#### OpenSearch Settings ####
# NB: for result data formatting, OpenSearch uses Syndication Feed Settings
# so even if Syndication Feeds are not enabled, they must be configured
# enable open search
websvc.opensearch.enable = false
# context for html request URLs - change only for non-standard servlet mapping
websvc.opensearch.uicontext = simple-search
# context for RSS/Atom request URLs - change only for non-standard servlet mapping
websvc.opensearch.svccontext = open-search/
# present autodiscovery link in every page head
websvc.opensearch.autolink = true
# number of hours to retain results before recalculating
websvc.opensearch.validity = 48
# short name used in browsers for search service
# should be 16 or fewer characters
websvc.opensearch.shortname = ${lr.dspace.name.short}
# longer (up to 48 characters) name
websvc.opensearch.longname = ${dspace.name}
# brief service description
websvc.opensearch.description = ${dspace.name}
# location of favicon for service, if any must be 16X16 pixels
websvc.opensearch.faviconurl = ${dspace.url}/themes/UFALHome/images/favicon.ico
# sample query - should return results
websvc.opensearch.samplequery = photosynthesis
# tags used to describe search service
websvc.opensearch.tags = IR DSpace
# result formats offered - use 1 or more comma-separated from: html,atom,rss
# NB: html is required for autodiscovery in browsers to function,
# and must be the first in the list if present
websvc.opensearch.formats = html,atom,rss
#### Content Inline Disposition Threshold ####
#
# Set the max size of a bitstream that can be served inline
# Use -1 to force all bitstream to be served inline
# The 'webui.*' setting is for the JSPUI, and
# the 'xmlui.*' setting is for the XMLUI
webui.content_disposition_threshold = 8388608
xmlui.content_disposition_threshold = 8388608
#### Multi-file HTML document/site settings #####
#
# When serving up composite HTML items, how deep can the request be for us to
# serve up a file with the same name?
#
# e.g. if we receive a request for "foo/bar/index.html"
# and we have a bitstream called just "index.html"
# we will serve up that bitstream for the request if webui.html.max-depth-guess
# is 2 or greater. If webui.html.max-depth-guess is 1 or less, we would not
# serve that bitstream, as the depth of the file is greater.
#
# If webui.html.max-depth-guess is zero, the request filename and path must
# always exactly match the bitstream name. Default value is 3.
#
# The 'webui.*' setting is for the JSPUI, and
# the 'xmlui.*' setting is for the XMLUI
#
# webui.html.max-depth-guess = 3
# xmlui.html.max-depth-guess = 3
#### Sitemap settings #####
# the directory where the generated sitemaps are stored
sitemap.dir = ${dspace.dir}/sitemaps
#
# Comma-separated list of search engine URLs to 'ping' when a new Sitemap has
# been created. Include everything except the Sitemap URL itself (which will
# be URL-encoded and appended to form the actual URL 'pinged').
#
sitemap.engineurls = http://www.google.com/webmasters/sitemaps/ping?sitemap=
# Add this to the above parameter if you have an application ID with Yahoo
# (Replace REPLACE_ME with your application ID)
# http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=REPLACE_ME&url=
#
# No known Sitemap 'ping' URL for MSN/Live search
##### SHERPA/Romeo Integration Settings ####
# the SHERPA/RoMEO endpoint
sherpa.romeo.url = http://www.sherpa.ac.uk/romeo/api29.php
# to disable the sherpa/romeo integration
# uncomment the follow line
# webui.submission.sherparomeo-policy-enabled = false
# please register for a free api access key to get many benefits
# http://www.sherpa.ac.uk/news/romeoapikeys.htm
# sherpa.romeo.apikey = YOUR-API-KEY
##### Authority Control Settings #####
#plugin.named.org.dspace.content.authority.ChoiceAuthority = \
# org.dspace.content.authority.SampleAuthority = Sample, \
# org.dspace.content.authority.LCNameAuthority = LCNameAuthority, \
# org.dspace.content.authority.SHERPARoMEOPublisher = SRPublisher, \
# org.dspace.content.authority.SHERPARoMEOJournalTitle = SRJournalTitle, \
# org.dspace.content.authority.SolrAuthority = SolrAuthorAuthority
plugin.named.org.dspace.content.authority.ChoiceAuthority = \
org.dspace.content.authority.OpenAIREAuthority = OpenAIRE
#Uncomment to enable ORCID authority control
#plugin.named.org.dspace.content.authority.ChoiceAuthority = \
# org.dspace.content.authority.SolrAuthority = SolrAuthorAuthority
## The DCInputAuthority plugin is automatically configured with every
## value-pairs element in input-forms.xml, namely:
## common_identifiers, common_types, common_iso_languages
##
## The DSpaceControlledVocabulary plugin is automatically configured
## with every *.xml file in [dspace]/config/controlled-vocabularies,
## and creates a plugin instance for each, using base filename as the name.
## eg: nsi, srsc.
## Each DSpaceControlledVocabulary plugin comes with three configuration options:
# vocabulary.plugin._plugin_.hierarchy.store = <true|false> # default: true
# vocabulary.plugin._plugin_.hierarchy.suggest = <true|false> # default: true
# vocabulary.plugin._plugin_.delimiter = "<string>" # default: "::"
##
## An example using "srsc" can be found later in this section
#plugin.selfnamed.org.dspace.content.authority.ChoiceAuthority = \
# org.dspace.content.authority.DCInputAuthority, \
# org.dspace.content.authority.DSpaceControlledVocabulary
## configure LC Names plugin
#lcname.url = http://alcme.oclc.org/srw/search/lcnaf
##
## This sets the default lowest confidence level at which a metadata value is included
## in an authority-controlled browse (and search) index. It is a symbolic
## keyword, one of the following values (listed in descending order):
## accepted
## uncertain
## ambiguous
## notfound
## failed
## rejected
## novalue
## unset
## See manual or org.dspace.content.authority.Choices source for descriptions.
authority.minconfidence = ambiguous
# Configuration settings for ORCID based authority control, uncomment the lines below to enable configuration
#solr.authority.server=${solr.server}/authority
#choices.plugin.dc.contributor.author = SolrAuthorAuthority
#choices.presentation.dc.contributor.author = authorLookup
#authority.controlled.dc.contributor.author = true
#
#authority.author.indexer.field.1=dc.contributor.author
## demo: use LC plugin for author
#choices.plugin.dc.contributor.author = LCNameAuthority
#choices.presentation.dc.contributor.author = lookup
#authority.controlled.dc.contributor.author = true
##
## This sets the lowest confidence level at which a metadata value is included
## in an authority-controlled browse (and search) index. It is a symbolic
## keyword from the same set as for the default "authority.minconfidence"
#authority.minconfidence.dc.contributor.author = accepted
choices.plugin.dc.relation = OpenAIRE
choices.presentation.dc.relation = suggest
choices.closed.dc.relation = true
authority.controlled.dc.relation = true
## demo: subject code autocomplete, using srsc as authority
## (DSpaceControlledVocabulary plugin must be enabled)
## Warning: when enabling this feature any controlled vocabulary configuration in the input-forms.xml for the metadata field will be overridden.
#choices.plugin.dc.subject = srsc
#choices.presentation.dc.subject = select
#vocabulary.plugin.srsc.hierarchy.store = true
#vocabulary.plugin.srsc.hierarchy.suggest = true
#vocabulary.plugin.srsc.delimiter = "::"
## Demo: publisher name lookup through SHERPA/RoMEO:
#choices.plugin.dc.publisher = SRPublisher
#choices.presentation.dc.publisher = suggest
## demo: journal title lookup, with ISSN as authority
#choices.plugin.dc.title.alternative = SRJournalTitle
#choices.presentation.dc.title.alternative = suggest
#authority.controlled.dc.title.alternative = true
## demo: use choice authority (without authority-control) to restrict dc.type on EditItemMetadata page
#choices.plugin.dc.type = common_types
#choices.presentation.dc.type = select
## demo: same idea for dc.language.iso
#choices.plugin.dc.language.iso = common_iso_languages
#choices.presentation.dc.language.iso = select
# Change number of choices shown in the select in Choices lookup popup
#xmlui.lookup.select.size = 12
#### Ordering of bitstreams ####
## Specify the ordering that bitstreams are listed.
##
## Bitstream field to sort on. Values: sequence_id or name. Default: sequence_id
webui.bitstream.order.field = bitstream_order
## Direction of sorting order. Values: DESC or ASC. Default: ASC
#webui.bitstream.order.direction = ASC
##### Google Scholar Metadata Configuration #####
google-metadata.config = ${dspace.dir}/config/crosswalks/google-metadata.properties
google-metadata.enable = true
#---------------------------------------------------------------#
#--------------JSPUI SPECIFIC CONFIGURATIONS--------------------#
#---------------------------------------------------------------#
# These configs are only used by the JSP User Interface #
#---------------------------------------------------------------#
##### JSPUI Layout #####
# set this value if you want to use a diffent main template.
# The value must match the name of a subfolder of dspace-jspui/src/main/webapp/layout
# jspui.template.name =
##### Show community or collection logo in list #####
# jspui.home-page.logos = true
# jspui.community-home.logos = true
# jspui.community-list.logos = true
##### Item Home Processor #####
plugin.sequence.org.dspace.plugin.ItemHomeProcessor = \
org.dspace.app.webui.components.VersioningItemHome
##### Upload File settings #####
# Where to temporarily store uploaded files
upload.temp.dir = ${dspace.dir}/upload
# Maximum size of uploaded files in bytes, negative setting will result in no limit being set
# 512Mb
# not in XMLUI - search in cocoon properties instead
upload.max = 536870912
###### Statistical Report Configuration Settings ######
# should the stats be publicly available? should be set to false if you only
# want administrators to access the stats, or you do not intend to generate
# any
report.public = false
# directory where live reports are stored
report.dir = ${dspace.dir}/reports/
###### Web Interface Settings ######
# Customise the DC metadata fields to show in the default simple item view.
#
# The form is <schema prefix>.<element>[.<qualifier>|.*][(date)|(link)|(nobreakline)], ...
#
# For example:
# dc.title = Dublin Core element 'title' (unqualified)
# dc.title.alternative = DC element 'title', qualifier 'alternative'
# dc.title.* = All fields with Dublin Core element 'title'
# (any or no qualifier)
# dc.identifier.uri(link) = DC identifier.uri, render as a link
# dc.date.issued(date) = DC date.issued, render as a date
# dc.subject(nobreakline) = DC subject.keyword, rendered as separated values
# (see also webui.itemdisplay.nobreakline.separator option)
# dc.language(inputform) = If the dc.language is in a controlled vocabulary, then the displayed value will be shown based on the stored value from the value-pairs-name in input forms.
# The input-forms will be loaded based on the session locale. If the displayed value is not found, then the value will be shown as is.
# "link/date" options can be combined with "nobreakline" option using a space among them i.e "dc.identifier.uri(link nobreakline)"
#
# If an item has no value for a particular field, it won't be displayed.
# The name of the field for display will be drawn from the current UI
# dictionary, using the key:
#
# "metadata.<style>.<field>" or if undefined the key "metadata.<field>"
#
# e.g. "metadata.default.dc.title" or "metadata.default.dc.title"
# "metadata.dc.contributor.*" or "metadata.default.dc.contributor.*"
# "metadata.dc.date.issued" or "metadata.default.dc.date.issued"
#
#webui.itemdisplay.default = dc.title, dc.title.alternative, dc.contributor.*, \
# dc.subject(nobreakline), dc.date.issued(date), dc.publisher, \
# dc.identifier.citation, dc.relation.ispartofseries, \
# dc.description.abstract, dc.description, \
# dc.identifier.govdoc, dc.identifier.uri(link), \
# dc.identifier.isbn, dc.identifier.issn, \
# dc.identifier.ismn, dc.identifier
#
# When using "resolver" in webui.itemdisplay to render identifiers as resolvable
# links, the base URL is taken from <code>webui.resolver.<n>.baseurl</code>
# where <code>webui.resolver.<n>.urn</code> matches the urn specified in the metadata value.
# The value is appended to the "baseurl" as is, so the baseurl need to end with slash almost in any case.
# If no urn is specified in the value it will be displayed as simple text.
#
#webui.resolver.1.urn = doi
#webui.resolver.1.baseurl = http://dx.doi.org/
#webui.resolver.2.urn = hdl
#webui.resolver.2.baseurl = http://hdl.handle.net/
#
# For the doi and hdl urn defaults values are provided, respectively http://dx.doi.org and
# http://hdl.handle.net are used.<br>
#
# If a metadata value with style: "doi", "handle" or "resolver" matches a URL
# already, it is simply rendered as a link with no other manipulation.
# If nobreakline option is applied for a field in itemdisplay then the following option defines the separator string.
# If a non-breaking space is needed before or after the separator, this can be included using &nbsp;
# (i.e. webui.itemdisplay.separator = ;&nbsp;)
# If ommitted, the default separator is ';&nbsp;'
webui.itemdisplay.nobreakline.separator = ;
# Specify which strategy use for select the style for an item
plugin.single.org.dspace.app.webui.util.StyleSelection = \
org.dspace.app.webui.util.CollectionStyleSelection
#org.dspace.app.webui.util.MetadataStyleSelection
# If use CollectionStyleSelection
# Specify which collections use which views by Handle.
#
# webui.itemdisplay.<style>.collections = <collection handle>, ...
#
# FIXME: This should be more database-driven
#
# webui.itemdisplay.thesis.collections = 123456789/24, 123456789/35
# If use MetadataStyleSelection, you MUST
# Specify which metadata use as name of the style
#
# webui.itemdisplay.metadata-style = schema.element[.qualifier|.*]
# webui.itemdisplay.metadata-style = dc.type
# Customise the DC fields to use in the item listing page. Elements will be
# displayed left to right in the order that they are specified here.
#
# The form is <schema prefix>.<element>[.<qualifier>|.*][(date)], ...
#
# Although not a requirement, it would make sense to include among the listed
# fields at least the date and title fields as specified by the
# webui.browse.index.* configuration options below.
#
# If you have enabled thumbnails (webui.browse.thumbnail.show), you must also
# include a 'thumbnail' entry in your columns - this is where the thumbnail will be displayed
#
# If you want to mark each item include a 'mark_[value]' (without the brackets - replace the word 'value' with anything that
# has a meaning for your mark) entry in your columns - this is where the icon will be displayed.
# Do not forget to add a Spring bean with id = "org.dspace.app.itemmarking.ItemMarkingExtractor.[value]"
# in file 'config/spring/api/item-marking.xml'. This bean is responsible for drawing the appropriate mark for each item.
# You can add more than one 'mark_[value]' options (with different value) in case you need to mark items more than one time for
# different purposes. Remember to add the respective beans in file 'config/spring/api/item-marking.xml'.
#
# webui.itemlist.columns = thumbnail, dc.date.issued(date), dc.title, dc.contributor.*
#
# You can customise the width of each column with the following line - you can have numbers (pixels)
# or percentages. For the 'thumbnail' column, a setting of '*' will use the max width specified
# for browse thumbnails (webui.browse.thumbnail.maxwidth, thumbnail.maxwidth)
# webui.itemlist.widths = *, 130, 60%, 40%
# Additionally, you can override the DC fields used on the listing page for
# a given browse index and/or sort option. As a sort option or index may be defined
# on a field that isn't normally included in the list, this allows you to display
# the fields that have been indexed / sorted on.
#
# There are a number of forms the configuration can take, and the order in which
# they are listed below is the priority in which they will be used (so a combination
# of an index name and sort name will take precedence over just the browse name).
#
# webui.itemlist.browse.<index name>.sort.<sort name>.columns
# webui.itemlist.sort.<sort name>.columns
# webui.itemlist.browse.<browse name>.columns
# webui.itemlist.<sort or index name>.columns
#
# In the last case, a sort option name will always take precedence over a browse
# index name. Note also, that for any additional columns you list, you will need to
# ensure there is an itemlist.<field name> entry in the messages file.
#
# The following example would display the date of accession in place of the issue date
# whenever the dateaccessioned browse index or sort option is selected.
#
# Just like webui.itemlist.columns, you will need to include a 'thumbnail' entry to display
# and thumbnails in the item list
#
# webui.itemlist.dateaccessioned.columns = thumbnail, dc.date.accessioned(date), dc.title, dc.contributor.*
#
# As above, you can customise the width of the columns for each configured column list, substituting '.widths' for
# '.columns' in the property name. See the setting for webui.itemlist.widths for more details
# webui.itemlist.dateaccessioned.widths = *, 130, 60%, 40%
# You can also set the overall size of the item list table with the following setting. It can lead to faster
# table rendering when used with the column widths above, but not generally recommended.
# webui.itemlist.tablewidth = 100%
#### Additional configuration for Item Mapper ####
# the index name (from webui.browse.index above) to use for
# displaying items by author
#
itemmap.author.index = author
### MyDSpace display of group membership ####
#
# if omitted, the default behaviour is false
#
# webui.mydspace.showgroupmemberships = false
### Configure the search indices to appear in advanced search drop down lists
#
jspui.search.index.display.1 = ANY
jspui.search.index.display.2 = author
jspui.search.index.display.3 = title
jspui.search.index.display.4 = keyword
jspui.search.index.display.5 = abstract
jspui.search.index.display.6 = series
jspui.search.index.display.7 = sponsor
jspui.search.index.display.8 = identifier
jspui.search.index.display.9 = language
##### SFX Server (OpenURL) #####
# SFX query is appended to this URL. If this property is commented out or
# omitted, SFX support is switched off.
# sfx.server.url = http://sfx.myu.edu:8888/sfx?
# This image will be displayed in the SFX link. If commented out, the SFX link will be only a text link.
# This customization usually contains an institution-branded SFX button.
# sfx.server.image_url = http://sfx.my.edu:8888/sfx.gif
#### Item Recommendation Settings #####
# show a link to the item recommendation page from item display page
webui.suggest.enable = false
#
# Enable only, if the user is logged in.
# If not set the default value is false
# webui.suggest.loggedinusers.only = true
#### Controlled Vocabulary Settings #####
# Enable or disable the controlled vocabulary add-on
# Warning: this feature is not compatible with WAI (it requires javascript to function)
#
# webui.controlledvocabulary.enable = true
#### Session invalidation #####
# Enable or disable session invalidation upon login or logout.
# This feature is enabled by default to help prevent session hijacking
# but may cause problems for shibboleth, etc
#
# webui.session.invalidate = true
# If you would like to use Google Analytics to track general website statistics then
# use the following parameter to provide your Analytics key. First sign up for an
# account at http://analytics.google.com, then create an entry for your repository
# website. Analytics will give you a snipet of JavaScript code to place on your site,
# inside that snipet is your Google Analytics key usually found in this line:
# _uacct = "UA-XXXXXXX-X"
# Take this key (just the UA-XXXXXX-X part) and place it here in this parameter.
# jspui.google.analytics.key=UA-XXXXXX-X
#---------------------------------------------------------------#
#--------------XMLUI SPECIFIC CONFIGURATIONS--------------------#
#---------------------------------------------------------------#
# These configs are only used by the XML User Interface #
#---------------------------------------------------------------#
# Force all authenticated connections to use SSL, only non-authenticated
# connections are allowed over plain http. If set to true, then you need to
# ensure that the 'dspace.hostname' parameter is set to the correctly.
#xmlui.force.ssl = true
# Determine if new users should be allowed to register or edit their own metadata.
# These parameters are useful in conjunction with shibboleth where you want to
# disallow registration and disable the user's ability to edit their metadata
# because both come from Shibboleth.
xmlui.user.registration=false
#xmlui.user.editmetadata=true
# Check if the user has a consistent ip address from the start of the login process
# to the end of the login process. Disabling this check is not recommended unless
# absolutely necessary as the ip check can be helpful for preventing session
# hijacking. Possible reasons to set this to false: many-to-many wireless networks
# that prevent consistent ip addresses or complex proxying of requests.
# The default value is set to true.
#xmlui.session.ipcheck = true
# After a user has logged into the system, which url should they be directed too?
# Leave this parameter blank or undefined to direct users to the homepage, or
# "/profile" for the user's profile, or another reasonable choice is "/submissions"
# to see if the user has any tasks awaiting their attention. The default is the
# repository home page.
#xmlui.user.loginredirect=/profile
# Allow the user to override which theme is used to display a particular page.
# When submitting a request add the HTTP parameter "themepath" which corresponds
# to a particular theme, that specified theme will be used instead of the any
# other configured theme. Note that this is a potential security hole allowing
# execution of unintended code on the server, this option is only for development
# and debugging it should be turned off for any production repository. The default
# value unless otherwise specified is "false"
#xmlui.theme.allowoverrides = false
# Enabling this property will concatenate CSS, JS and JSON files where possible.
# CSS files can be concatenated if multiple CSS files with the same media attribute
# are used in the same page. Links to the CSS files are automatically referring to the
# concatenated resulting CSS file.
# The theme sitemap should be updated to use the ConcatenationReader for all js, css and json
# files before enabling this property.
#xmlui.theme.enableConcatenation = false
# Enabling this property will minify CSS, JS and JSON files where possible.
# The theme sitemap should be updated to use the ConcatenationReader for all js, css and json
# files before enabling this property.
#xmlui.theme.enableMinification = false
# Themes only allow specific file formats (extensions) to be accessible, for security reasons.
# While the default list should work for most sites, you may wish to customize it. The default
# list is commented out below. To customize, just uncomment and add more file extensions.
xmlui.theme.whitelist = css, js, json, gif, jpg, jpeg, png, bmp, ico, htm, html, svg, ttf, woff, woff2, eot, js.map, css.map
### Settings for Item lists in Mirage theme ###
# What should the emphasis be in the display of item lists?
# Possible values : 'file', 'metadata'. If your repository is
# used mainly for scientific papers 'metadata' is probably the
# best way. If you have a lot of images and other files 'file'
# will be the best starting point
# (metdata is the default value if this option is not specified)
#xmlui.theme.mirage.item-list.emphasis = file
### Settings for the Item page in Mirage2 theme ###
# Whether the title or the label of a file should be used to display it on the item page
mirage2.item-view.bitstream.href.label.1 = label
# Whether the title or the label of a file should be used as a fallback to display it on the item page
mirage2.item-view.bitstream.href.label.2 = title
# Determine which bundles administrators and collection administrators may upload
# into an existing item through the administrative interface. If the user does not
# have the appropriate privileges (add & write) on the bundle then that bundle will
# not be shown to the user as an option.
#xmlui.bundle.upload = ORIGINAL, METADATA, THUMBNAIL, LICENSE, CC-LICENSE
# On the community-list page should all the metadata about a community/collection
# be available to the theme. This parameter defaults to true, but if you are
# experiencing performance problems on the community-list page you should experiment
# with turning this option off.
#xmlui.community-list.render.full = false
# Normally, Manakin will fully verify any cache pages before using a cache copy.
# This means that when the community-list page is viewed the database is queried
# for each community/collection to see if their metadata has been modified. This
# can be expensive for repositories with a large community tree. To help solve
# this problem you can set the cache to be assumed valued for a specific set of time.
# The downside of this is that new or editing communities/collections may not show up
# the website for a period of time.
#xmlui.community-list.cache = 12 hours
# Optionally you may configure Manakin to take advantage of metadata stored as a
# bitstream. These metadata files should be inside the "METADATA" bundle and named
# either MODS.xml or METS.xml. If either of the following options are turned on then
# these files will be made available to the theme when rendering an item.
#xmlui.bitstream.mods = true
#xmlui.bitstream.mets = true
# If you would like to use Google Analytics to track general website statistics then
# use the following parameter to provide your Analytics key. First sign up for an
# account at http://analytics.google.com, then create an entry for your repository
# website. Analytics will give you a snipet of JavaScript code to place on your site,
# inside that snipet is your Google Analytics key usually found in this line:
# _uacct = "UA-XXXXXXX-X"
# Take this key (just the UA-XXXXXX-X part) and place it here in this parameter.
xmlui.google.analytics.key=${xmlui.google.analytics.key}
# Assign how many page views will be recorded and displayed in the control panel's
# activity viewer. The activity tab allows an administrator to debug problems in a
# running DSpace by understanding who and how their dspace is currently being used.
# The default value is 250.
xmlui.controlpanel.activity.max = 500
# Determine where the control panel's activity viewer receives an event's IP address
# from. If your DSpace is in a load balanced enviornment or otherwise behind a
# context-switch then you will need to set the paramater to the HTTP parameter that
# records the original IP address.
#xmlui.controlpanel.activity.ipheader = X-Forwarded-For
#---------------------------------------------------------------#
#----------------REQUEST ITEM CONFIGURATION---------------------#
#---------------------------------------------------------------#
# Configuration of request-item. Possible values:
# all - Anonymous users can request an item
# logged - Login is mandatory to request an item
# empty/commented out - request-copy not allowed
#request.item.type = all
# Helpdesk E-mail
mail.helpdesk = ${mail.admin}
# Should all Request Copy emails go to the helpdesk instead of the item submitter?
request.item.helpdesk.override = false
#------------END REQUEST ITEM CONFIGURATION---------------------#
# lindat-dspace configuration
#
# - most of lindat-dspace configuration is inside modules/lr.cfg but we had
# to change some of te default configuration in this file
# - changes are minimal e.g., using hidden configuration or changing the value
# of a variable that was commented out
# - other changes introduce new variables which are used from e.g., emails because
# variables from modules/* are not interpolated
#
##### Settings for Thumbnail creation #####
xpdf.path.pdftotext = /usr/bin/pdftotext
xpdf.path.pdftoppm = /usr/bin/pdftoppm
xpdf.path.pdfinfo = /usr/bin/pdfinfo
#### Stackable Authentication Methods #####
# Authentication Method Used
authenticationMethod = cz.cuni.mff.ufal.dspace.authenticate.ShibAuthentication
# Stack of authentication methods
# (See org.dspace.authenticate.AuthenticationManager)
# Example:
# plugin.sequence.org.dspace.authenticate.AuthenticationMethod = \
# org.dspace.authenticate.ShibAuthentication, \
# org.dspace.authenticate.PasswordAuthentication
plugin.sequence.org.dspace.authenticate.AuthenticationMethod = \
${authenticationMethod}
# hidden dspace configuration option in HandlePlugin
# - do not check prefix authority, just handles
handle.plugin.checknameauthority = false
# SOLR Server url
solr.server = ${solr.server}
solr.log.server = ${solr.server}
#log4j loglevels
loglevel.other = ${loglevel.other}
loglevel.dspace = ${loglevel.dspace}
# CurrentActivity setting #
currentActivityAction.recordBotEvents = true
currentActivityAction.botStrings = google/, msnbot/, googlebot/, webcrawler/, \
inktomi, teoma, baiduspider, bot, ufal-dev
# Send the report to this address by default
info.recipient = ${info.recipient}
# Name used in e.g., email templates
lr.dspace.name.short = ${lr.dspace.name.short}
##### HELP DESK #####
lr.help.mail = ${lr.help.mail}
lr.help.phone = ${lr.help.phone}
...@@ -13,36 +13,35 @@ perl -pi -e 's/\$\{HANDLE_USER\}/$ENV{HANDLE_USER}/; s/\$\{HANDLE_PASSWORD\}/$EN ...@@ -13,36 +13,35 @@ perl -pi -e 's/\$\{HANDLE_USER\}/$ENV{HANDLE_USER}/; s/\$\{HANDLE_PASSWORD\}/$EN
/etc/init.d/handle-server start /etc/init.d/handle-server start
# initialize statistics & co # initialize statistics & co
/opt/tomcat8/bin/startup.sh
cd /opt/repository/workspace/scripts cd /opt/repository/workspace/scripts
make init_statistics make init_statistics
# https://ubuntuforums.org/showthread.php?t=979694 # Start cron job in the background
# Start process in the background and send its output to file descriptor 3 cron_hack(){
exec 3< <(while (true); do INIT="false"
timeout -k 30 300 make update_oai while (true); do
timeout -k 30 300 make update_statistics # the first time, wait for tomcat to start...
timeout -k 30 300 make update_sitemap [ "$INIT" = "false" ] && sleep 180 && INIT="true"
timeout -k 30 300 make lift_embargos
timeout -k 30 300 make update_openaire_cache set -x
timeout -k 30 300 make update_discovery LOGID=$(( (LOGID+1) % 5))
timeout -k 30 300 make send_info LOG="/tmp/entrypoint.log.$LOGID"
echo "INIT DONE." echo "$LOG" > $LOG
sleep 86400 timeout -k 30 300 make update_oai | tee -a $LOG
done) timeout -k 30 300 make update_statistics | tee -a $LOG
timeout -k 30 300 make update_sitemap | tee -a $LOG
# Read the output of the process line by line until one line contains Ready timeout -k 30 300 make lift_embargos | tee -a $LOG
while read line; do timeout -k 30 300 make update_openaire_cache | tee -a $LOG
case "$line" in timeout -k 30 300 make update_discovery | tee -a $LOG
"INIT DONE.") timeout -k 30 300 make send_info | tee -a $LOG
break date >> $LOG
;; echo "INIT DONE."
esac wget --no-check-certificate https://healthchecks.local.iiegn.eu/ping/24a81cdc-2906-4faa-89b3-0d57541abef6 -T 10 -t 5 -O /dev/null
done <&3 set +x
sleep 86400
# Close the file descriptor done
exec <&3 3<&- }
/opt/tomcat8/bin/shutdown.sh -force cron_hack &
# start tomcat # start tomcat
/opt/tomcat8/bin/catalina.sh run /opt/tomcat8/bin/catalina.sh run