VIVO-2 Modify the build so installers can create a container-neutral VIVO.
Split deploy.properties into build.properties and runtime.properties, with runtime.properties going into the Vitro home directory. Modify ConfigurationProperties to locate the Vitro home directory, either by System property or JNDI Environment variable, or from build.properties, and to read from both build.properties and runtime.properties. Revise the install and upgrade documents for VIVO and Vitro. Change comments and error messages that referred to deploy.properties by name. Change vitro.home.directory to vitro.home
This commit is contained in:
parent
6901a67670
commit
c2a1195fec
23 changed files with 739 additions and 590 deletions
493
webapp/build.xml
493
webapp/build.xml
|
@ -10,216 +10,226 @@
|
|||
|
||||
<project name="vitroCore" default="describe">
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
properties
|
||||
- - - - - - - - - - - - - - - - -->
|
||||
<dirname property="corebase.dir" file="${ant.file.vitroCore}" />
|
||||
|
||||
<!-- A product script will override appbase.dir, but not corebase.dir -->
|
||||
<dirname property="corebase.dir" file="${ant.file.vitroCore}" />
|
||||
<property name="appbase.dir" location="${corebase.dir}" />
|
||||
|
||||
<property name="build.properties.file" location="config/build.properties" />
|
||||
|
||||
<property name="build.dir" location=".build" />
|
||||
<property name="deploy.properties.file" location="config/deploy.properties" />
|
||||
|
||||
<property name="utilities.base.dir" location="${corebase.dir}/../utilities/buildutils" />
|
||||
<property name="utilities.source.dir" location="${utilities.base.dir}/src" />
|
||||
<property name="utilities.lib.dir" location="${utilities.base.dir}/lib" />
|
||||
<property name="buildtools.dir" location="${corebase.dir}/../utilities/buildutils" />
|
||||
<property name="buildtools.source.dir" location="${buildtools.dir}/src" />
|
||||
<property name="buildtools.lib.dir" location="${buildtools.dir}/lib" />
|
||||
<property name="buildtools.compiled.dir" location="${build.dir}/buildTools" />
|
||||
|
||||
<property name="war.dir" location="${build.dir}/war" />
|
||||
<property name="war.webinf.dir" location="${war.dir}/WEB-INF" />
|
||||
<property name="war.classes.dir" location="${war.webinf.dir}/classes" />
|
||||
<property name="war.resources.dir" location="${war.webinf.dir}/resources" />
|
||||
<property name="revisionInfo.build.file" location="${war.resources.dir}/revisionInfo.txt" />
|
||||
<property name="main.build.dir" location="${build.dir}/main"/>
|
||||
<property name="main.webapp.dir" location="${main.build.dir}/webapp" />
|
||||
<property name="main.webinf.dir" location="${main.webapp.dir}/WEB-INF" />
|
||||
<property name="main.compiled.dir" location="${main.webinf.dir}/classes" />
|
||||
<property name="main.resources.dir" location="${main.webinf.dir}/resources" />
|
||||
<property name="main.revisioninfo.file" location="${main.resources.dir}/revisionInfo.txt" />
|
||||
|
||||
<property name="test.classes.dir" location="${build.dir}/testClasses" />
|
||||
<property name="utility.classes.dir" location="${build.dir}/utilityClasses" />
|
||||
<property name="unittests.compiled.dir" location="${main.build.dir}/testClasses" />
|
||||
|
||||
<property name="solr.template.dir" location="${corebase.dir}/../solr" />
|
||||
<property name="solr.template.context.file" location="${solr.template.dir}/template.context.xml" />
|
||||
|
||||
<property name="solr.build.dir" location="${build.dir}/solr" />
|
||||
<property name="solr.webapp.dir" location="${solr.build.dir}/webapp" />
|
||||
<property name="solr.homeimage.dir" location="${solr.build.dir}/homeimage" />
|
||||
|
||||
<property name="javac.deprecation" value="true" />
|
||||
<property name="distribution.dir" location="${build.dir}/distribution" />
|
||||
<property name="distribution.tar.gz.file" location="${build.dir}/distribution.tar.gz" />
|
||||
|
||||
<property name="option.javac.deprecation" value="true" />
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
paths: for compiling and running
|
||||
target: buildProperties
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<path id="compile.classpath">
|
||||
<fileset dir="${appbase.dir}/lib" includes="*.jar" />
|
||||
</path>
|
||||
|
||||
<path id="utility.compile.classpath">
|
||||
<fileset dir="${utilities.lib.dir}" includes="*.jar" />
|
||||
</path>
|
||||
|
||||
<path id="utility.run.classpath">
|
||||
<pathelement location="${utility.classes.dir}" />
|
||||
<path refid="utility.compile.classpath" />
|
||||
</path>
|
||||
|
||||
<path id="test.compile.classpath">
|
||||
<pathelement location="${war.classes.dir}" />
|
||||
<path refid="compile.classpath" />
|
||||
</path>
|
||||
|
||||
<path id="test.run.classpath">
|
||||
<pathelement location="${appbase.dir}/test" />
|
||||
<pathelement location="${test.classes.dir}" />
|
||||
<path refid="test.compile.classpath" />
|
||||
<path refid="utility.run.classpath" />
|
||||
</path>
|
||||
|
||||
<!-- =================================
|
||||
target: describe
|
||||
================================= -->
|
||||
<target name="describe" description="--> Describe the targets (this is the default).">
|
||||
<echo>
|
||||
all - Runs "clean", then "deploy".
|
||||
clean - Delete all artifacts so the next build will be from scratch.
|
||||
compile - Compile the Java source files.
|
||||
orng - Configure and deploy the ORNG Shindig application.
|
||||
test - Compile and run the JUnit tests.
|
||||
war - Create a WAR file to be deployed in a servlet container.
|
||||
deploy - Deploy the application directly into the Tomcat webapps directory.
|
||||
</echo>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: all
|
||||
================================= -->
|
||||
<target name="all" depends="clean, deploy" description="--> Run 'clean', then 'deploy'" />
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: properties
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="properties">
|
||||
<fail message="You must create a "${deploy.properties.file}" file.">
|
||||
<target name="buildProperties">
|
||||
<fail message="You must create a "${build.properties.file}" file.">
|
||||
<condition>
|
||||
<not>
|
||||
<available file="${deploy.properties.file}" />
|
||||
<available file="${build.properties.file}" />
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
|
||||
<property file="${deploy.properties.file}" />
|
||||
<property file="${build.properties.file}" />
|
||||
|
||||
<fail unless="tomcat.home" message="${deploy.properties.file} must contain a value for tomcat.home" />
|
||||
<fail unless="webapp.name" message="${deploy.properties.file} must contain a value for webapp.name" />
|
||||
<fail unless="vitro.home.directory" message="${deploy.properties.file} must contain a value for vitro.home.directory" />
|
||||
<fail unless="Vitro.defaultNamespace" message="${deploy.properties.file} must contain a value for Vitro.defaultNamespace" />
|
||||
<fail unless="VitroConnection.DataSource.url" message="${deploy.properties.file} must contain a value for VitroConnection.DataSource.url" />
|
||||
<fail unless="VitroConnection.DataSource.username" message="${deploy.properties.file} must contain a value for VitroConnection.DataSource.username" />
|
||||
<fail unless="VitroConnection.DataSource.password" message="${deploy.properties.file} must contain a value for VitroConnection.DataSource.password" />
|
||||
<fail unless="rootUser.emailAddress" message="${deploy.properties.file} must contain a value for rootUser.emailAddress" />
|
||||
|
||||
<fail message="The vitro.home.directory "${vitro.home.directory}" does not exist.">
|
||||
<condition>
|
||||
<not>
|
||||
<available file="${vitro.home.directory}" />
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
|
||||
<fail message="The vitro.home.directory "${vitro.home.directory}" is not writable.">
|
||||
<condition>
|
||||
<not>
|
||||
<isfileselected file="${vitro.home.directory}">
|
||||
<writable />
|
||||
</isfileselected>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
|
||||
<property name="solr.home.dir" location="${vitro.home.directory}/solr" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: clean
|
||||
================================= -->
|
||||
<target name="clean" depends="properties" description="--> Delete all artifacts.">
|
||||
<delete dir="${build.dir}" />
|
||||
<delete dir="${solr.home.dir}" excludes="data/**/*" includeemptydirs="true" />
|
||||
<fail unless="webapp.name" message="${build.properties.file} must contain a value for webapp.name" />
|
||||
<property name="solr.app.name" value="${webapp.name}solr" />
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: compileUtilities
|
||||
target: deployProperties
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="compileUtilities">
|
||||
<mkdir dir="${utility.classes.dir}" />
|
||||
<javac srcdir="${utilities.source.dir}" destdir="${utility.classes.dir}" debug="true" deprecation="${javac.deprecation}" encoding="UTF8" includeantruntime="false" optimize="false" source="1.6">
|
||||
<target name="deployProperties" depends="buildProperties">
|
||||
<fail unless="vitro.home" message="${build.properties.file} must contain a value for vitro.home" />
|
||||
<fail unless="tomcat.home" message="${build.properties.file} must contain a value for tomcat.home" />
|
||||
|
||||
<property name="solr.home.dir" location="${vitro.home}/solr" />
|
||||
|
||||
<property name="tomcat.context.filename" value="META-INF/context.xml" />
|
||||
<property name="main.tomcat.webapp.dir" value="${tomcat.home}/webapps/${webapp.name}" />
|
||||
<property name="main.tomcat.context.file" value="${main.tomcat.webapp.dir}/${tomcat.context.filename}" />
|
||||
<property name="solr.tomcat.webapp.dir" value="${tomcat.home}/webapps/${solr.app.name}" />
|
||||
<property name="solr.tomcat.context.file" value="${solr.tomcat.webapp.dir}/${tomcat.context.filename}" />
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: compileBuildtools
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="compileBuildtools">
|
||||
<path id="utility.compile.classpath">
|
||||
<fileset dir="${buildtools.lib.dir}" includes="*.jar" />
|
||||
</path>
|
||||
|
||||
<mkdir dir="${buildtools.compiled.dir}" />
|
||||
<javac srcdir="${buildtools.source.dir}"
|
||||
destdir="${buildtools.compiled.dir}"
|
||||
debug="true"
|
||||
deprecation="${option.javac.deprecation}"
|
||||
encoding="UTF8"
|
||||
includeantruntime="false"
|
||||
optimize="false"
|
||||
source="1.6">
|
||||
<classpath refid="utility.compile.classpath" />
|
||||
</javac>
|
||||
|
||||
<path id="utility.run.classpath">
|
||||
<pathelement location="${buildtools.compiled.dir}" />
|
||||
<path refid="utility.compile.classpath" />
|
||||
</path>
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: prepare
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="prepare" depends="properties, compileUtilities">
|
||||
<target name="prepare">
|
||||
<mkdir dir="${build.dir}" />
|
||||
<mkdir dir="${war.classes.dir}" />
|
||||
<mkdir dir="${war.resources.dir}" />
|
||||
<mkdir dir="${test.classes.dir}" />
|
||||
|
||||
<!-- copy all sorts of web stuff into the war directory. -->
|
||||
<copy todir="${war.dir}">
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: prepareWebappDir
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="prepareWebappDir" depends="prepare">
|
||||
<!-- copy all sorts of web stuff into the webapp directory. -->
|
||||
<copy todir="${main.webapp.dir}">
|
||||
<fileset dir="${appbase.dir}/web" />
|
||||
<fileset dir="${appbase.dir}" includes="themes/**/*" />
|
||||
</copy>
|
||||
|
||||
<copy todir="${war.webinf.dir}">
|
||||
<copy todir="${main.webinf.dir}">
|
||||
<fileset dir="${appbase.dir}">
|
||||
<!-- copy the JARs into the war directory -->
|
||||
<include name="lib/*" />
|
||||
<!-- these are already in Tomcat: we mustn't conflict. -->
|
||||
<!-- these will be in the servlet container: we mustn't conflict. -->
|
||||
<exclude name="lib/jsp-api.jar" />
|
||||
<exclude name="lib/servlet-api.jar" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- use the production Log4J properties, unless a debug version exists. -->
|
||||
<available file="${appbase.dir}/config/debug.log4j.properties" property="debug.log4j.exists" />
|
||||
<copy tofile="${war.classes.dir}/log4j.properties" filtering="true" overwrite="true">
|
||||
<fileset dir="${appbase.dir}/config">
|
||||
<include name="default.log4j.properties" unless="debug.log4j.exists" />
|
||||
<include name="debug.log4j.properties" if="debug.log4j.exists" />
|
||||
</fileset>
|
||||
<condition property="log4j.properties.file" value="debug.log4j.properties" else="default.log4j.properties">
|
||||
<available file="${appbase.dir}/config/debug.log4j.properties" />
|
||||
</condition>
|
||||
<copy file="${appbase.dir}/config/${log4j.properties.file}"
|
||||
tofile="${main.build.dir}/log4j.properties"
|
||||
filtering="true"
|
||||
overwrite="true">
|
||||
<filterchain>
|
||||
<expandproperties />
|
||||
</filterchain>
|
||||
</copy>
|
||||
|
||||
<copy todir="${war.classes.dir}">
|
||||
<!-- copy the deploy.properties into the war directory -->
|
||||
<fileset file="${deploy.properties.file}" />
|
||||
|
||||
<!-- copy any xml files from source tree to the war directory -->
|
||||
<fileset dir="${appbase.dir}/src" includes="**/*.xml" />
|
||||
<copy todir="${main.compiled.dir}">
|
||||
<fileset dir="${main.build.dir}">
|
||||
<filename name="log4j.properties"/>
|
||||
<different targetdir="${main.compiled.dir}" ignorefiletimes="true"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- copy the context file into the war directory -->
|
||||
<copy file="${appbase.dir}/context.xml" tofile="${war.dir}/META-INF/context.xml" />
|
||||
<!-- Copy the build.properties file to the resources directory. -->
|
||||
<copy todir="${main.resources.dir}" file="${build.properties.file}" />
|
||||
|
||||
<!-- If there is a runtime.properties file in the same directory as build.properties, copy that too. -->
|
||||
<dirname file="${build.properties.file}" property="runtime.properties.dir"/>
|
||||
<copy todir="${main.resources.dir}" >
|
||||
<fileset dir="${runtime.properties.dir}" >
|
||||
<filename name="runtime.properties" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- copy any xml files from source tree to the war directory -->
|
||||
<copy todir="${main.compiled.dir}">
|
||||
<fileset dir="${appbase.dir}/src" includes="**/*.xml" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: clean
|
||||
================================= -->
|
||||
<target name="clean" description="--> Delete all artifacts.">
|
||||
<delete dir="${build.dir}" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: compile
|
||||
================================= -->
|
||||
<target name="compile" depends="prepare" description="--> Compile Java sources">
|
||||
<target name="compile" depends="prepareWebappDir" description="--> Compile Java sources">
|
||||
<path id="main.compile.classpath">
|
||||
<fileset dir="${appbase.dir}/lib" includes="*.jar" />
|
||||
</path>
|
||||
|
||||
<!-- deletes all files that depend on changed .java files -->
|
||||
<depend srcdir="${appbase.dir}/src" destdir="${war.classes.dir}" closure="false" cache="${build.dir}/.depcache">
|
||||
<classpath refid="compile.classpath" />
|
||||
<depend srcdir="${appbase.dir}/src"
|
||||
destdir="${main.compiled.dir}"
|
||||
closure="false"
|
||||
cache="${main.build.dir}/compileDependencyCache">
|
||||
<classpath refid="main.compile.classpath" />
|
||||
</depend>
|
||||
|
||||
<javac srcdir="${appbase.dir}/src" destdir="${war.classes.dir}" debug="true" deprecation="${javac.deprecation}" encoding="UTF8" includeantruntime="false" optimize="true" source="1.6">
|
||||
<classpath refid="compile.classpath" />
|
||||
<javac srcdir="${appbase.dir}/src"
|
||||
destdir="${main.compiled.dir}"
|
||||
debug="true"
|
||||
deprecation="${option.javac.deprecation}"
|
||||
encoding="UTF8"
|
||||
includeantruntime="false"
|
||||
optimize="true"
|
||||
source="1.6">
|
||||
<classpath refid="main.compile.classpath" />
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: test
|
||||
================================= -->
|
||||
<target name="test" depends="compile" unless="skiptests" description="--> Run JUnit tests">
|
||||
<javac srcdir="${appbase.dir}/test" destdir="${test.classes.dir}" debug="true" deprecation="${javac.deprecation}" encoding="UTF8" includeantruntime="false" optimize="false" source="1.6">
|
||||
<target name="test" depends="compile, compileBuildtools" unless="skiptests" description="--> Run JUnit tests">
|
||||
<path id="test.compile.classpath">
|
||||
<pathelement location="${main.compiled.dir}" />
|
||||
<path refid="main.compile.classpath" />
|
||||
</path>
|
||||
|
||||
<mkdir dir="${unittests.compiled.dir}" />
|
||||
<javac srcdir="${appbase.dir}/test"
|
||||
destdir="${unittests.compiled.dir}"
|
||||
debug="true"
|
||||
deprecation="${option.javac.deprecation}"
|
||||
encoding="UTF8"
|
||||
includeantruntime="false"
|
||||
optimize="false"
|
||||
source="1.6">
|
||||
<classpath refid="test.compile.classpath" />
|
||||
</javac>
|
||||
|
||||
<path id="test.run.classpath">
|
||||
<pathelement location="${appbase.dir}/test" />
|
||||
<pathelement location="${unittests.compiled.dir}" />
|
||||
<path refid="test.compile.classpath" />
|
||||
<path refid="utility.run.classpath" />
|
||||
</path>
|
||||
|
||||
<java classname="edu.cornell.mannlib.vitro.utilities.testing.VitroTestRunner" fork="yes" failonerror="true">
|
||||
<classpath refid="test.run.classpath" />
|
||||
<arg file="${appbase.dir}/test" />
|
||||
|
@ -227,112 +237,160 @@ deploy - Deploy the application directly into the Tomcat webapps directory.
|
|||
</java>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: jar
|
||||
================================= -->
|
||||
<target name="jar" depends="test" description="--> Compile the Java, and build a JAR file">
|
||||
<jar basedir="${war.classes.dir}" destfile="${build.dir}/${ant.project.name}.jar" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: revisionInfo
|
||||
================================= -->
|
||||
<target name="revisionInfo" depends="test" unless="skipinfo" description="--> Store revision info in build">
|
||||
<mkdir dir="${main.resources.dir}" />
|
||||
<tstamp>
|
||||
<format property="revisionInfo.timestamp" pattern="yyyy-MM-dd HH:mm:ss" />
|
||||
</tstamp>
|
||||
<echo file="${revisionInfo.build.file}">${revisionInfo.timestamp}
|
||||
<echo file="${main.revisioninfo.file}">${revisionInfo.timestamp}
|
||||
</echo>
|
||||
|
||||
<addRevisionInfoLine productName="vitroCore" productCheckoutDir="${corebase.dir}/.." />
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: prepareSolr
|
||||
target: deployWebapp
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="prepareSolr" depends="properties" unless="skipsolr">
|
||||
<mkdir dir="${solr.home.dir}" />
|
||||
<mkdir dir="${solr.build.dir}" />
|
||||
<target name="deployWebapp" depends="deployProperties, revisionInfo">
|
||||
<mkdir dir="${main.tomcat.webapp.dir}" />
|
||||
|
||||
<property name="solr.distrib.dir" location="${corebase.dir}/../solr" />
|
||||
<property name="solr.home.template.dir" location="${solr.distrib.dir}/homeDirectoryTemplate" />
|
||||
<property name="solr.context.template.file" location="${solr.distrib.dir}/template.context.xml" />
|
||||
<property name="solr.distrib.war" location="${solr.distrib.dir}/apache-solr-3.6.2.war" />
|
||||
<sync todir="${main.tomcat.webapp.dir}" includeemptydirs="true">
|
||||
<fileset dir="${main.webapp.dir}" />
|
||||
<preserveintarget>
|
||||
<include name="${tomcat.context.filename}"/>
|
||||
</preserveintarget>
|
||||
</sync>
|
||||
|
||||
<property name="solr.context.file" location="${solr.build.dir}/context.xml" />
|
||||
<property name="solr.context.temp.file" location="${solr.build.dir}/context.temp.xml" />
|
||||
<property name="solr.build.war" location="${solr.build.dir}/solr.war" />
|
||||
|
||||
<property name="solr.context.name" value="${webapp.name}solr" />
|
||||
<property name="solr.deployed.war" value="${tomcat.home}/webapps/${solr.context.name}.war" />
|
||||
|
||||
<!-- if no mask is defined, leave Solr unsecured. -->
|
||||
<property name="vitro.local.solr.ipaddress.mask" value=".*" />
|
||||
|
||||
<!-- Create and copy the example directory to the solr.home.dir directory. -->
|
||||
<copy todir="${solr.home.dir}">
|
||||
<fileset dir="${solr.home.template.dir}" includes="**/*" />
|
||||
</copy>
|
||||
|
||||
<!-- Create the context configuration XML with expanded properties. Store it in a temp file for now. -->
|
||||
<copy tofile="${solr.context.temp.file}" filtering="true" overwrite="true">
|
||||
<fileset file="${solr.context.template.file}" />
|
||||
<!-- Create the context XML with expanded properties. Store it in a temp file for now. -->
|
||||
<copy tofile="${main.build.dir}/context.xml" filtering="true" overwrite="true">
|
||||
<fileset file="${appbase.dir}/context.xml" />
|
||||
<filterchain>
|
||||
<expandproperties />
|
||||
</filterchain>
|
||||
</copy>
|
||||
|
||||
<!-- If the WAR is up to date and the context file hasn't changed, we can skip the deploy. -->
|
||||
<condition property="skipsolr">
|
||||
<and>
|
||||
<uptodate targetfile="${solr.build.war}">
|
||||
<srcfiles file="${solr.distrib.war}" />
|
||||
<srcfiles dir="${appbase.dir}/config/solr/" />
|
||||
</uptodate>
|
||||
<filesmatch file1="${solr.context.temp.file}" file2="${solr.context.file}" />
|
||||
<filesmatch file1="${solr.context.temp.file}" file2="${tomcat.home}/webapps/${solr.context.name}/META-INF/context.xml" />
|
||||
</and>
|
||||
</condition>
|
||||
<!-- Copy the new context XML only if it differs from the existing one. -->
|
||||
<copy todir="${main.tomcat.webapp.dir}/META-INF">
|
||||
<fileset dir="${main.build.dir}">
|
||||
<filename name="context.xml"/>
|
||||
<different targetdir="${main.tomcat.webapp.dir}/META-INF" ignorefiletimes="true"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: prepareSolr
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="prepareSolr" depends="prepare, buildProperties">
|
||||
<!-- create an image of the Solr home directory -->
|
||||
<copy todir="${solr.homeimage.dir}">
|
||||
<fileset dir="${solr.template.dir}/homeDirectoryTemplate" />
|
||||
</copy>
|
||||
|
||||
<!-- create an unpacked image of the Solr WAR, with our config options -->
|
||||
<unwar src="${solr.template.dir}/apache-solr-3.6.2.war" dest="${solr.webapp.dir}" />
|
||||
<copy todir="${solr.webapp.dir}/WEB-INF/classes">
|
||||
<fileset dir="${appbase.dir}/config/solr/" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - -
|
||||
target: deploySolr
|
||||
- - - - - - - - - - - - - - - - - -->
|
||||
<target name="deploySolr" depends="prepareSolr" unless="skipsolr">
|
||||
<!-- save the new context file, so we can compare against it next time. -->
|
||||
<copy file="${solr.context.temp.file}" tofile="${solr.context.file}" />
|
||||
|
||||
<war destfile="${solr.build.war}" needxmlfile="false">
|
||||
<zipfileset src="${solr.distrib.war}" />
|
||||
<classes dir="${appbase.dir}/config/solr" />
|
||||
<metainf file="${solr.context.file}" />
|
||||
</war>
|
||||
|
||||
<!-- deploy the new WAR -->
|
||||
<unwar src="${solr.build.war}" dest="${tomcat.home}/webapps/${solr.context.name}" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: deploy
|
||||
================================= -->
|
||||
<target name="deploy" depends="revisionInfo, deploySolr" description="--> Build the app and install in Tomcat">
|
||||
<property name="webapp.deploy.home" value="${tomcat.home}/webapps/${webapp.name}" />
|
||||
|
||||
<mkdir dir="${webapp.deploy.home}" />
|
||||
|
||||
<sync todir="${webapp.deploy.home}" includeemptydirs="true">
|
||||
<fileset dir="${build.dir}/war" />
|
||||
<target name="deploySolr" depends="deployProperties, prepareSolr">
|
||||
<!-- Deploy to the Solr home directory. -->
|
||||
<mkdir dir="${solr.home.dir}" />
|
||||
<sync todir="${solr.home.dir}" includeemptydirs="true">
|
||||
<fileset dir="${solr.homeimage.dir}" />
|
||||
<preserveintarget>
|
||||
<include name="data/**/*"/>
|
||||
</preserveintarget>
|
||||
</sync>
|
||||
|
||||
<!-- Deploy to Tomcat. -->
|
||||
<mkdir dir="${solr.tomcat.webapp.dir}" />
|
||||
<sync todir="${solr.tomcat.webapp.dir}" includeemptydirs="true">
|
||||
<fileset dir="${solr.webapp.dir}" />
|
||||
<preserveintarget>
|
||||
<include name="${tomcat.context.filename}"/>
|
||||
</preserveintarget>
|
||||
</sync>
|
||||
|
||||
<!-- Create the context XML with expanded properties. Store it in a temp file for now. -->
|
||||
<copy tofile="${solr.build.dir}/context.xml" filtering="true" overwrite="true">
|
||||
<fileset file="${solr.template.context.file}" />
|
||||
<filterchain>
|
||||
<expandproperties />
|
||||
</filterchain>
|
||||
</copy>
|
||||
|
||||
<!-- Copy the new context XML only if it differs from the existing one. -->
|
||||
<copy todir="${solr.tomcat.webapp.dir}/META-INF">
|
||||
<fileset dir="${solr.build.dir}">
|
||||
<filename name="context.xml"/>
|
||||
<different targetdir="${solr.tomcat.webapp.dir}/META-INF" ignorefiletimes="true"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: deploy
|
||||
================================= -->
|
||||
<target name="deploy"
|
||||
depends="deployWebapp, deploySolr"
|
||||
description="--> Build the app and install in Tomcat">
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: war
|
||||
target: all
|
||||
================================= -->
|
||||
<target name="war" depends="revisionInfo" description="--> Build the app and create a WAR file">
|
||||
<jar basedir="${build.dir}/war" destfile="${build.dir}/${webapp.name}.war" />
|
||||
<target name="all" depends="clean, deploy" description="--> Run 'clean', then 'deploy'" />
|
||||
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
OUTSIDE THE MAIN BUILD SEQUENCE
|
||||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
<!-- =================================
|
||||
target: distribute
|
||||
================================= -->
|
||||
<target name="distribute"
|
||||
depends="revisionInfo, prepareSolr"
|
||||
description="--> Build the app and create a distribution bundle">
|
||||
<mkdir dir="${distribution.dir}" />
|
||||
|
||||
<jar basedir="${main.webapp.dir}" destfile="${distribution.dir}/${webapp.name}.war" />
|
||||
<jar basedir="${solr.webapp.dir}" destfile="${distribution.dir}/${solr.app.name}.war" />
|
||||
<tar basedir="${solr.homeimage.dir}" destfile="${distribution.dir}/solrhome.tar" />
|
||||
|
||||
<tar basedir="${distribution.dir}" destfile="${distribution.tar.gz.file}" compression="gzip" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: describe
|
||||
================================= -->
|
||||
<target name="describe"
|
||||
description="--> Describe the targets (this is the default).">
|
||||
<echo>
|
||||
all - Runs "clean", then "deploy".
|
||||
clean - Delete all artifacts so the next build will be from scratch.
|
||||
compile - Compile the Java source files.
|
||||
orng - Configure and deploy the ORNG Shindig application.
|
||||
test - Compile and run the JUnit tests.
|
||||
distribute - Create WAR files to be deployed in a servlet container.
|
||||
deploy - Deploy the application directly into the Tomcat webapps directory.
|
||||
</echo>
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: jar
|
||||
================================= -->
|
||||
<target name="jar" depends="test" description="--> Compile the Java, and build a JAR file">
|
||||
<jar basedir="${main.compiled.dir}" destfile="${build.dir}/${ant.project.name}.jar" />
|
||||
</target>
|
||||
|
||||
<!-- =================================
|
||||
target: licenser
|
||||
|
@ -348,7 +406,7 @@ deploy - Deploy the application directly into the Tomcat webapps directory.
|
|||
<!-- =================================
|
||||
target: jarlist
|
||||
================================= -->
|
||||
<target name="jarlist" depends="jar" description="Figure out what JARs are not needed">
|
||||
<target name="jarlist" depends="compileBuildtools, jar" description="Figure out what JARs are not needed">
|
||||
<java classname="edu.cornell.mannlib.vitro.utilities.jarlist.JarLister" fork="no" failonerror="true">
|
||||
<classpath refid="utility.run.classpath" />
|
||||
<arg value="${build.dir}/${ant.project.name}.jar" />
|
||||
|
@ -393,13 +451,16 @@ deploy - Deploy the application directly into the Tomcat webapps directory.
|
|||
<attribute name="productName" />
|
||||
<attribute name="productCheckoutDir" />
|
||||
<sequential>
|
||||
<java classname="edu.cornell.mannlib.vitro.utilities.revisioninfo.RevisionInfoBuilder" fork="no" failonerror="true">
|
||||
<java classname="edu.cornell.mannlib.vitro.utilities.revisioninfo.RevisionInfoBuilder"
|
||||
fork="no"
|
||||
failonerror="true">
|
||||
<classpath refid="utility.run.classpath" />
|
||||
<arg value="@{productName}" />
|
||||
<arg file="@{productCheckoutDir}" />
|
||||
<arg file="${revisionInfo.build.file}" />
|
||||
<arg file="${main.revisioninfo.file}" />
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
</project>
|
||||
|
29
webapp/config/example.build.properties
Normal file
29
webapp/config/example.build.properties
Normal file
|
@ -0,0 +1,29 @@
|
|||
# -----------------------------------------------------------------------------
|
||||
#
|
||||
# Vitro build properties
|
||||
#
|
||||
# This file is provided as example.build.properties.
|
||||
#
|
||||
# Save a copy of this file as build.properties, and edit the properties as
|
||||
# needed for your installation.
|
||||
#
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# The base install directory for your Tomcat server. The Vitro application
|
||||
# will be deployed in the /webapps directory below this base.
|
||||
#
|
||||
tomcat.home = /usr/local/tomcat
|
||||
|
||||
#
|
||||
# The name of the Vitro application. This will be used as the name of the
|
||||
# subdirectory within your Tomcat server's /webapps directory. It also appears
|
||||
# in the URL for the application. For example, http://my.vitro.server/vitro
|
||||
#
|
||||
webapp.name = vitro
|
||||
|
||||
#
|
||||
# The location where the Vitro application will store the data that it creates.
|
||||
# This includes uploaded files (usually images) and the search index.
|
||||
#
|
||||
vitro.home = /usr/local/vitro/home
|
|
@ -1,11 +1,11 @@
|
|||
# -----------------------------------------------------------------------------
|
||||
#
|
||||
# Vitro deployment properties
|
||||
# Vitro runtime properties
|
||||
#
|
||||
# This file is provided as example.deploy.properties.
|
||||
# This file is provided as example.runtime.properties.
|
||||
#
|
||||
# Save a copy of this file as deploy.properties, and edit the properties as
|
||||
# needed for your deployment.
|
||||
# Save a copy of this file as runtime.properties in your Vitro home directory,
|
||||
# and edit the properties as needed for your installation.
|
||||
#
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
|
@ -22,19 +22,6 @@
|
|||
#
|
||||
Vitro.defaultNamespace = http://vivo.mydomain.edu/individual/
|
||||
|
||||
#
|
||||
# The base install directory for your Tomcat server. The Vitro application
|
||||
# will be deployed in the /webapps directory below this base.
|
||||
#
|
||||
tomcat.home = /usr/local/tomcat
|
||||
|
||||
#
|
||||
# The name of the Vitro application. This will be used as the name of the
|
||||
# subdirectory within your Tomcat server's /webapps directory. It also appears
|
||||
# in the URL for the application. For example, http://my.vitro.server/vitro
|
||||
#
|
||||
webapp.name = vitro
|
||||
|
||||
#
|
||||
# URL of Solr context used in local Vitro search. This will usually consist of:
|
||||
# scheme + server_name + port + vitro_webapp_name + "solr"
|
||||
|
@ -45,28 +32,6 @@ webapp.name = vitro
|
|||
# vitro.local.solr.url = http://localhost:8080/vitrosolr
|
||||
vitro.local.solr.url = http://localhost:8080/vitrosolr
|
||||
|
||||
#
|
||||
# Restricts access to the Solr search platform. The value is a regular expression.
|
||||
# When a request is made to Solr, the IP address of the requestor must match the
|
||||
# regular expression, or the request will be rejected.
|
||||
#
|
||||
# NOTE: don't leave a space on the end of the line, unless you want it to be
|
||||
# part of the expression.
|
||||
# Examples:
|
||||
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1
|
||||
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1|0:0:0:0:0:0:0:1
|
||||
# vitro.local.solr.ipaddress.mask = 169\.254\..*
|
||||
# If this line is removed, your Solr server will respond to requests from any
|
||||
# location. This may be useful for experimenting but would likely be considered
|
||||
# a security problem in a production environment.
|
||||
vitro.local.solr.ipaddress.mask = 127\.0\.0\.1|[0:]+:1
|
||||
|
||||
#
|
||||
# The location where the Vitro application will store the data that it creates.
|
||||
# This includes uploaded files (usually images) and the search index.
|
||||
#
|
||||
vitro.home.directory = /usr/local/vitro/data
|
||||
|
||||
#
|
||||
# Email parameters which VIVO can use to send mail. If these are left empty,
|
||||
# the "Contact Us" form will be disabled and users will not be notified of
|
|
@ -1,20 +1,5 @@
|
|||
<Context>
|
||||
|
||||
<!-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<!--
|
||||
Vitro will interpret this as either a file path or a resource path. So,
|
||||
if a simple resource path is used, such as "deploy.properties", Vitro
|
||||
will find the file at:
|
||||
${Tomcat}/webapps/vitro/WEB-INF/classes/deploy.properties
|
||||
For an external file, specify a full file path, like
|
||||
"/usr/local/vitro/deploy.properties".
|
||||
-->
|
||||
<Environment type="java.lang.String" override="false"
|
||||
name="path.configuration"
|
||||
value="deploy.properties"
|
||||
/>
|
||||
|
||||
<!--
|
||||
Disable the attempt to persist sessions when Tomcat shuts down.
|
||||
-->
|
||||
|
|
|
@ -120,7 +120,7 @@ public class RootUserPolicy implements PolicyIface {
|
|||
PROPERTY_ROOT_USER_EMAIL);
|
||||
if (email == null) {
|
||||
throw new IllegalStateException(
|
||||
"deploy.properties must contain a value for '"
|
||||
"runtime.properties must contain a value for '"
|
||||
+ PROPERTY_ROOT_USER_EMAIL + "'");
|
||||
} else {
|
||||
return email;
|
||||
|
@ -177,7 +177,7 @@ public class RootUserPolicy implements PolicyIface {
|
|||
|
||||
private void complainAboutMultipleRootUsers() {
|
||||
for (String other : otherRootUsers) {
|
||||
ss.warning(this, "deploy.properties specifies '"
|
||||
ss.warning(this, "runtime.properties specifies '"
|
||||
+ configuredRootUser + "' as the value for '"
|
||||
+ PROPERTY_ROOT_USER_EMAIL
|
||||
+ "', but the system also contains this root user: "
|
||||
|
@ -189,7 +189,7 @@ public class RootUserPolicy implements PolicyIface {
|
|||
|
||||
private void complainAboutWrongRootUsers() {
|
||||
for (String other : otherRootUsers) {
|
||||
ss.warning(this, "deploy.properties specifies '"
|
||||
ss.warning(this, "runtime.properties specifies '"
|
||||
+ configuredRootUser + "' as the value for '"
|
||||
+ PROPERTY_ROOT_USER_EMAIL
|
||||
+ "', but the system contains this root user instead: "
|
||||
|
|
|
@ -20,8 +20,8 @@ import org.apache.commons.logging.LogFactory;
|
|||
* are attached to the servlet context.
|
||||
*
|
||||
* The customary behavior is for ConfigurationPropertiesSetup to create a
|
||||
* ConfigurationPropertiesImpl, which will parse the deploy.properties file for
|
||||
* these properties.
|
||||
* ConfigurationPropertiesImpl, which will obtain the properties from the
|
||||
* build.properties file and the runtime.properties file.
|
||||
*/
|
||||
public abstract class ConfigurationProperties {
|
||||
private static final Log log = LogFactory
|
||||
|
|
|
@ -9,13 +9,16 @@ import java.util.Enumeration;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* The basic implementation of ConfigurationProperties. It loads the
|
||||
* configuration properties from a properties file and stores them in a map.
|
||||
* configuration properties from a properties file and stores them in a map. It
|
||||
* also permits the caller to supply a map of "preemptive" properties that will
|
||||
* be included and will override any matching properties from the file.
|
||||
*
|
||||
* Leading and trailing white space are trimmed from the property values.
|
||||
*
|
||||
|
@ -27,23 +30,25 @@ public class ConfigurationPropertiesImpl extends ConfigurationProperties {
|
|||
|
||||
private final Map<String, String> propertyMap;
|
||||
|
||||
public ConfigurationPropertiesImpl(InputStream stream) {
|
||||
public ConfigurationPropertiesImpl(InputStream stream,
|
||||
Map<String, String> preemptiveProperties) throws IOException {
|
||||
Properties props = loadFromPropertiesFile(stream);
|
||||
Map<String, String> map = copyPropertiesToMap(props);
|
||||
trimWhiteSpaceFromValues(map);
|
||||
this.propertyMap = Collections.unmodifiableMap(map);
|
||||
|
||||
if (preemptiveProperties != null) {
|
||||
map.putAll(preemptiveProperties);
|
||||
}
|
||||
|
||||
trimWhiteSpaceFromValues(map);
|
||||
|
||||
this.propertyMap = Collections.unmodifiableMap(map);
|
||||
log.debug("Configuration properties are: " + map);
|
||||
}
|
||||
|
||||
private Properties loadFromPropertiesFile(InputStream stream) {
|
||||
private Properties loadFromPropertiesFile(InputStream stream)
|
||||
throws IOException {
|
||||
Properties props = new Properties();
|
||||
try {
|
||||
props.load(stream);
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to parse the configuration properties file.", e);
|
||||
}
|
||||
props.load(stream);
|
||||
return props;
|
||||
}
|
||||
|
||||
|
@ -84,7 +89,8 @@ public class ConfigurationPropertiesImpl extends ConfigurationProperties {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ConfigurationPropertiesImpl[propertyMap=" + propertyMap + "]";
|
||||
return "ConfigurationPropertiesImpl[propertyMap="
|
||||
+ new TreeMap<String, String>(propertyMap) + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -4,11 +4,13 @@ package edu.cornell.mannlib.vitro.webapp.config;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.naming.Context;
|
||||
import javax.naming.InitialContext;
|
||||
import javax.naming.NamingException;
|
||||
import javax.servlet.ServletContext;
|
||||
|
@ -21,61 +23,45 @@ import org.apache.commons.logging.LogFactory;
|
|||
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
|
||||
|
||||
/**
|
||||
* Reads the configuration properties from a file and stores them in the servlet
|
||||
* Locates the runtime configuration properties and stores them in the servlet
|
||||
* context.
|
||||
*
|
||||
* This must be invoked before any listener that requires configuration
|
||||
* properties.
|
||||
*
|
||||
* The path to the file can be specified by an Environment name in the Context,
|
||||
* like this:
|
||||
* The properties file must be called 'runtime.properties' in the Vitro home
|
||||
* directory. The path to the Vitro home directory can be specifed by an JNDI
|
||||
* value, or by a System property, or by a property in
|
||||
* WEB-INF/resources/build.properties, in that order. If the Vitro home
|
||||
* directory is specified in more than one way, a warning is issued and the
|
||||
* first value is used.
|
||||
*
|
||||
* <pre>
|
||||
* If the Vitro home directory cannot be located, or if it does not contain a
|
||||
* file called 'runtime.properties', or if the file cannot be loaded, a fatal
|
||||
* error is registered to abort the startup.
|
||||
*
|
||||
* <Context override="true">
|
||||
* <Environment name="path.configuration"
|
||||
* value="/wherever/the/file/lives/deploy.properties"
|
||||
* type="java.lang.String"
|
||||
* override="false" />
|
||||
* </Context>
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* We look in this environment variable to find the path to the properties file.
|
||||
* If there is no such environment variable, the default path is used.
|
||||
*
|
||||
* Once the path has been determined, we will use it to look for a resource in
|
||||
* the classpath. So if the path is "deploy.properties", it might be found in
|
||||
* "tomcat/webapps/vivo/WEB-INF/classes/deploy.properties". Of course, it might
|
||||
* also be found in any other portion of the classpath as well.
|
||||
*
|
||||
* If we can't find the resource in the classpath, we will use it to look for an
|
||||
* external file. So, one might reasonably set this value to something like
|
||||
* "/usr/local/vitro/stuff/my.deploy.properties".
|
||||
*
|
||||
* If neither a resource nor an external file can be found, we throw an
|
||||
* exception and set AbortStartup.
|
||||
* The ConfigurationProperties bean is created from the key/value pairs found in
|
||||
* 'runtime.properties', and is stored in the servlet context. The value that
|
||||
* was determined for 'vitro.home' is also included in the bean.
|
||||
*/
|
||||
public class ConfigurationPropertiesSetup implements ServletContextListener {
|
||||
private static final Log log = LogFactory
|
||||
.getLog(ConfigurationPropertiesSetup.class);
|
||||
|
||||
/**
|
||||
* The JNDI naming context where Tomcat stores environment attributes.
|
||||
*/
|
||||
static final String JNDI_BASE = "java:comp/env";
|
||||
/** JNDI path that defines the Vitro home directory */
|
||||
private static final String VHD_JNDI_PATH = "java:comp/env/vitro/home";
|
||||
|
||||
/**
|
||||
* The name of the JNDI environment mapping for the path to the
|
||||
* configuration file (or resource).
|
||||
*/
|
||||
static final String PATH_CONFIGURATION = "path.configuration";
|
||||
/** System property that defines the Vitro home directory */
|
||||
private static final String VHD_SYSTEM_PROPERTY = "vitro.home";
|
||||
|
||||
/**
|
||||
* If we don't find the path to the config properties from a JNDI mapping,
|
||||
* use this. Not final, so we can jigger it for unit tests.
|
||||
*/
|
||||
private static String DEFAULT_CONFIG_PATH = "deploy.properties";
|
||||
/** build.properties property that defines the Vitro home directory */
|
||||
private static final String VHD_BUILD_PROPERTY = "vitro.home";
|
||||
|
||||
/** Configuration property to store the Vitro home directory */
|
||||
private static final String VHD_CONFIGURATION_PROPERTY = "vitro.home";
|
||||
|
||||
/** Name of the file that contains runtime properties. */
|
||||
private static final String FILE_RUNTIME_PROPERTIES = "runtime.properties";
|
||||
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent sce) {
|
||||
|
@ -85,12 +71,18 @@ public class ConfigurationPropertiesSetup implements ServletContextListener {
|
|||
try {
|
||||
InputStream stream = null;
|
||||
try {
|
||||
stream = locatePropertiesFile();
|
||||
|
||||
File vitroHomeDir = locateVitroHomeDirectory(ctx, ss);
|
||||
|
||||
File runtimePropertiesFile = locateRuntimePropertiesFile(
|
||||
vitroHomeDir, ss);
|
||||
stream = new FileInputStream(runtimePropertiesFile);
|
||||
|
||||
Map<String, String> preempts = createPreemptiveProperties(
|
||||
VHD_CONFIGURATION_PROPERTY, vitroHomeDir);
|
||||
ConfigurationPropertiesImpl bean = new ConfigurationPropertiesImpl(
|
||||
stream);
|
||||
stream, preempts);
|
||||
|
||||
ConfigurationProperties.setBean(ctx, bean);
|
||||
|
||||
ss.info(this, "Loaded " + bean.getPropertyMap().size()
|
||||
+ " properties.");
|
||||
} finally {
|
||||
|
@ -102,81 +94,171 @@ public class ConfigurationPropertiesSetup implements ServletContextListener {
|
|||
}
|
||||
}
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
ss.fatal(this, e.getMessage(), e);
|
||||
} catch (Exception e) {
|
||||
log.error(e, e);
|
||||
ss.fatal(this, e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private InputStream locatePropertiesFile() {
|
||||
String path = determinePathToProperties();
|
||||
log.debug("Configuration properties path is '" + path + "'");
|
||||
|
||||
if (resourceExists(path)) {
|
||||
log.debug("Found configuration properties as a resource.");
|
||||
return getResourceStream(path);
|
||||
}
|
||||
|
||||
if (externalFileExists(path)) {
|
||||
log.debug("Found configuration properties as an external file.");
|
||||
return getExternalFileStream(path);
|
||||
}
|
||||
|
||||
throw new IllegalStateException("Can't find the properties file at '"
|
||||
+ path + "'");
|
||||
}
|
||||
|
||||
/**
|
||||
* If we can't find it with JNDI, use the default.
|
||||
* Look in the JDNI environment, the system properties, and the
|
||||
* build.properties file.
|
||||
*
|
||||
* If we don't find it, fail. If we find it more than once, warn and use the
|
||||
* first one.
|
||||
*
|
||||
* Confirm that it is an existing, readable directory.
|
||||
*/
|
||||
private String determinePathToProperties() {
|
||||
private File locateVitroHomeDirectory(ServletContext ctx, StartupStatus ss) {
|
||||
Map<String, String> whereWasIt = new LinkedHashMap<String, String>();
|
||||
getVhdFromJndi(whereWasIt);
|
||||
getVhdFromSystemProperties(whereWasIt);
|
||||
getVhdFromBuildProperties(ctx, whereWasIt);
|
||||
|
||||
if (whereWasIt.isEmpty()) {
|
||||
String message = String.format("Can't find a value "
|
||||
+ "for the Vitro home directory. "
|
||||
+ "Looked in JNDI environment at '%s'. "
|
||||
+ "Looked for a system property named '%s'. "
|
||||
+ "Looked in 'WEB-INF/resources/build.properties' "
|
||||
+ "for '%s'.", VHD_JNDI_PATH, VHD_SYSTEM_PROPERTY,
|
||||
VHD_BUILD_PROPERTY);
|
||||
throw new IllegalStateException(message);
|
||||
} else if (whereWasIt.size() > 1) {
|
||||
String message = String.format("Found multiple values for the "
|
||||
+ "Vitro home directory: " + whereWasIt.keySet());
|
||||
ss.warning(this, message);
|
||||
}
|
||||
String message = whereWasIt.keySet().iterator().next();
|
||||
String vhdPath = whereWasIt.values().iterator().next();
|
||||
|
||||
ss.info(this, message);
|
||||
|
||||
File vhd = new File(vhdPath);
|
||||
if (!vhd.exists()) {
|
||||
throw new IllegalStateException("Vitro home directory '" + vhdPath
|
||||
+ "' does not exist.");
|
||||
}
|
||||
if (!vhd.isDirectory()) {
|
||||
throw new IllegalStateException("Vitro home directory '" + vhdPath
|
||||
+ "' is not a directory.");
|
||||
}
|
||||
if (!vhd.canRead()) {
|
||||
throw new IllegalStateException("Vitro home directory '" + vhdPath
|
||||
+ "' cannot be read.");
|
||||
}
|
||||
if (!vhd.canWrite()) {
|
||||
throw new IllegalStateException(
|
||||
"Can't write to Vitro home directory: '" + vhdPath + "'.");
|
||||
}
|
||||
|
||||
return vhd;
|
||||
}
|
||||
|
||||
private void getVhdFromJndi(Map<String, String> whereWasIt) {
|
||||
try {
|
||||
Context envCtx = (Context) new InitialContext().lookup(JNDI_BASE);
|
||||
if (envCtx == null) {
|
||||
log.debug("JNDI Lookup on '" + JNDI_BASE + "' failed.");
|
||||
return DEFAULT_CONFIG_PATH;
|
||||
String vhdPath = (String) new InitialContext()
|
||||
.lookup(VHD_JNDI_PATH);
|
||||
|
||||
if (vhdPath == null) {
|
||||
log.debug("Didn't find a JNDI value at '" + VHD_JNDI_PATH
|
||||
+ "'.");
|
||||
return;
|
||||
}
|
||||
|
||||
String configPath = (String) envCtx.lookup(PATH_CONFIGURATION);
|
||||
if (configPath == null) {
|
||||
log.debug("JNDI Lookup on '" + PATH_CONFIGURATION + "' failed.");
|
||||
return DEFAULT_CONFIG_PATH;
|
||||
}
|
||||
|
||||
log.debug("deploy.property as specified by JNDI: " + configPath);
|
||||
return configPath;
|
||||
log.debug("'" + VHD_JNDI_PATH + "' as specified by JNDI: "
|
||||
+ vhdPath);
|
||||
String message = String.format(
|
||||
"JNDI environment '%s' was set to '%s'", VHD_JNDI_PATH,
|
||||
vhdPath);
|
||||
whereWasIt.put(message, vhdPath);
|
||||
} catch (NamingException e) {
|
||||
log.warn("JNDI lookup failed. "
|
||||
+ "Using default path for config properties.", e);
|
||||
return DEFAULT_CONFIG_PATH;
|
||||
log.debug("JNDI lookup failed. " + e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean resourceExists(String path) {
|
||||
return getResourceStream(path) != null;
|
||||
private void getVhdFromSystemProperties(Map<String, String> whereWasIt) {
|
||||
String vhdPath = System.getProperty(VHD_SYSTEM_PROPERTY);
|
||||
|
||||
if (vhdPath == null) {
|
||||
log.debug("Didn't find a system property value at '"
|
||||
+ VHD_SYSTEM_PROPERTY + "'.");
|
||||
return;
|
||||
}
|
||||
|
||||
log.debug("'" + VHD_SYSTEM_PROPERTY
|
||||
+ "' as specified by system property: " + vhdPath);
|
||||
String message = String.format("System property '%s' was set to '%s'",
|
||||
VHD_SYSTEM_PROPERTY, vhdPath);
|
||||
whereWasIt.put(message, vhdPath);
|
||||
}
|
||||
|
||||
private InputStream getResourceStream(String path) {
|
||||
return getClass().getClassLoader().getResourceAsStream(path);
|
||||
}
|
||||
private void getVhdFromBuildProperties(ServletContext ctx,
|
||||
Map<String, String> whereWasIt) {
|
||||
String resourcePath = "/WEB-INF/resources/build.properties";
|
||||
|
||||
private boolean externalFileExists(String path) {
|
||||
File file = new File(path);
|
||||
return file.isFile();
|
||||
}
|
||||
|
||||
private InputStream getExternalFileStream(String path) {
|
||||
InputStream stream = null;
|
||||
File file = new File(path);
|
||||
if (file.isFile()) {
|
||||
try {
|
||||
stream = new FileInputStream(file);
|
||||
} catch (FileNotFoundException e) {
|
||||
// testing file.isFile() should have prevented this
|
||||
log.error(e, e);
|
||||
try {
|
||||
stream = ctx.getResourceAsStream(resourcePath);
|
||||
if (stream == null) {
|
||||
log.debug("Didn't find a resource at '" + resourcePath + "'.");
|
||||
return;
|
||||
}
|
||||
|
||||
Properties props = new Properties();
|
||||
props.load(stream);
|
||||
String vhdPath = props.getProperty(VHD_BUILD_PROPERTY);
|
||||
if (vhdPath == null) {
|
||||
log.debug("'" + resourcePath + "' didn't contain a value for '"
|
||||
+ VHD_BUILD_PROPERTY + "'.");
|
||||
return;
|
||||
}
|
||||
|
||||
log.debug("'" + VHD_BUILD_PROPERTY
|
||||
+ "' as specified by build.properties: " + vhdPath);
|
||||
String message = String.format(
|
||||
"In resource '%s', '%s' was set to '%s'.", resourcePath,
|
||||
VHD_BUILD_PROPERTY, vhdPath);
|
||||
whereWasIt.put(message, vhdPath);
|
||||
} catch (IOException e) {
|
||||
log.warn("Failed to load from '" + resourcePath + "'.", e);
|
||||
} finally {
|
||||
if (stream != null) {
|
||||
try {
|
||||
stream.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return stream;
|
||||
}
|
||||
|
||||
private File locateRuntimePropertiesFile(File vitroHomeDir, StartupStatus ss) {
|
||||
File rpf = new File(vitroHomeDir, FILE_RUNTIME_PROPERTIES);
|
||||
|
||||
if (!rpf.exists()) {
|
||||
throw new IllegalStateException("Did not find '"
|
||||
+ FILE_RUNTIME_PROPERTIES + "' in vitro home directory '"
|
||||
+ vitroHomeDir + "'");
|
||||
}
|
||||
if (!rpf.isFile()) {
|
||||
throw new IllegalStateException("'" + rpf.getPath()
|
||||
+ "' is not a file.");
|
||||
}
|
||||
if (!rpf.canRead()) {
|
||||
throw new IllegalStateException("Cannot read '" + rpf.getPath()
|
||||
+ "'.");
|
||||
}
|
||||
ss.info(this, "Loading runtime properties from '" + rpf.getPath() + "'");
|
||||
return rpf;
|
||||
}
|
||||
|
||||
private Map<String, String> createPreemptiveProperties(
|
||||
String propertyVitroHome, File vitroHomeDir) {
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put(propertyVitroHome, vitroHomeDir.getAbsolutePath());
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -32,7 +32,7 @@ public class ConfigurationPropertiesSmokeTests implements
|
|||
private static final Log log = LogFactory
|
||||
.getLog(ConfigurationPropertiesSmokeTests.class);
|
||||
|
||||
private static final String PROPERTY_HOME_DIRECTORY = "vitro.home.directory";
|
||||
private static final String PROPERTY_HOME_DIRECTORY = "vitro.home";
|
||||
private static final String PROPERTY_DB_URL = "VitroConnection.DataSource.url";
|
||||
private static final String PROPERTY_DB_USERNAME = "VitroConnection.DataSource.username";
|
||||
private static final String PROPERTY_DB_PASSWORD = "VitroConnection.DataSource.password";
|
||||
|
@ -61,7 +61,7 @@ public class ConfigurationPropertiesSmokeTests implements
|
|||
ConfigurationProperties props, StartupStatus ss) {
|
||||
String homeDirectoryPath = props.getProperty(PROPERTY_HOME_DIRECTORY);
|
||||
if (homeDirectoryPath == null || homeDirectoryPath.isEmpty()) {
|
||||
ss.fatal(this, "deploy.properties does not contain a value for '"
|
||||
ss.fatal(this, "Can't find a value for the home directory: '"
|
||||
+ PROPERTY_HOME_DIRECTORY + "'");
|
||||
return;
|
||||
}
|
||||
|
@ -97,19 +97,19 @@ public class ConfigurationPropertiesSmokeTests implements
|
|||
ConfigurationProperties props, StartupStatus ss) {
|
||||
String url = props.getProperty(PROPERTY_DB_URL);
|
||||
if (url == null || url.isEmpty()) {
|
||||
ss.fatal(this, "deploy.properties does not contain a value for '"
|
||||
ss.fatal(this, "runtime.properties does not contain a value for '"
|
||||
+ PROPERTY_DB_URL + "'");
|
||||
return;
|
||||
}
|
||||
String username = props.getProperty(PROPERTY_DB_USERNAME);
|
||||
if (username == null || username.isEmpty()) {
|
||||
ss.fatal(this, "deploy.properties does not contain a value for '"
|
||||
ss.fatal(this, "runtime.properties does not contain a value for '"
|
||||
+ PROPERTY_DB_USERNAME + "'");
|
||||
return;
|
||||
}
|
||||
String password = props.getProperty(PROPERTY_DB_PASSWORD);
|
||||
if (password == null || password.isEmpty()) {
|
||||
ss.fatal(this, "deploy.properties does not contain a value for '"
|
||||
ss.fatal(this, "runtime.properties does not contain a value for '"
|
||||
+ PROPERTY_DB_PASSWORD + "'");
|
||||
return;
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ public class ConfigurationPropertiesSmokeTests implements
|
|||
ConfigurationProperties props, StartupStatus ss) {
|
||||
String ns = props.getProperty(PROPERTY_DEFAULT_NAMESPACE);
|
||||
if (ns == null || ns.isEmpty()) {
|
||||
ss.fatal(this, "deploy.properties does not contain a value for '"
|
||||
ss.fatal(this, "runtime.properties does not contain a value for '"
|
||||
+ PROPERTY_DEFAULT_NAMESPACE + "'");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -117,7 +117,7 @@ public class ExternalAuthHelper {
|
|||
}
|
||||
|
||||
if (externalAuthServerUrl == null) {
|
||||
log.debug("deploy.properties doesn't contain a value for '"
|
||||
log.debug("runtime.properties doesn't contain a value for '"
|
||||
+ PROPERTY_EXTERNAL_AUTH_SERVER_URL
|
||||
+ "' -- sending directly to '" + returnUrl + "'");
|
||||
return returnUrl;
|
||||
|
@ -142,7 +142,7 @@ public class ExternalAuthHelper {
|
|||
|
||||
if (externalAuthHeaderName == null) {
|
||||
log.error("User asked for external authentication, "
|
||||
+ "but deploy.properties doesn't contain a value for '"
|
||||
+ "but runtime.properties doesn't contain a value for '"
|
||||
+ PROPERTY_EXTERNAL_AUTH_ID_HEADER + "'");
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public class LoginExternalAuthReturn extends BaseLoginServlet {
|
|||
* the header will contain the name of the user who just logged in.
|
||||
*
|
||||
* Deal with these possibilities:
|
||||
* - The header name was not configured in deploy.properties. Complain.
|
||||
* - The header name was not configured in runtime.properties. Complain.
|
||||
* - No username: the login failed. Complain
|
||||
* - User corresponds to a User acocunt. Record the login.
|
||||
* - User corresponds to an Individual (self-editor).
|
||||
|
|
|
@ -50,7 +50,7 @@ public class ContactMailController extends FreemarkerHttpServlet {
|
|||
private final static String TEMPLATE_ERROR = "contactForm-error.ftl";
|
||||
private final static String TEMPLATE_FORM = "contactForm-form.ftl";
|
||||
|
||||
private static final String PROPERTY_VITRO_HOME_DIR = "vitro.home.directory";
|
||||
private static final String PROPERTY_VITRO_HOME_DIR = "vitro.home";
|
||||
private static final String EMAIL_JOURNAL_FILE_DIR = "emailJournal";
|
||||
private static final String EMAIL_JOURNAL_FILE_NAME = "contactFormEmails.html";
|
||||
|
||||
|
|
|
@ -201,7 +201,7 @@ public class JSONReconcileServlet extends VitroHttpServlet {
|
|||
viewJson.put("url", urlBuf.toString() + "/individual?uri={{id}}");
|
||||
json.put("view", viewJson);
|
||||
|
||||
// parse defaultTypeList from deploy.properties
|
||||
// parse defaultTypeList from runtime.properties
|
||||
if (defaultTypeList != null) {
|
||||
String[] splitList = defaultTypeList.split(";");
|
||||
String[][] idNameArray = new String[splitList.length][splitList.length];
|
||||
|
|
|
@ -35,7 +35,7 @@ public class FileStorageSetup implements ServletContextListener {
|
|||
* {@link ConfigurationProperties} for the vivo home directory. The file
|
||||
* storage base directory is in a subdirectory below this one.
|
||||
*/
|
||||
public static final String PROPERTY_VITRO_HOME_DIR = "vitro.home.directory";
|
||||
public static final String PROPERTY_VITRO_HOME_DIR = "vitro.home";
|
||||
public static final String FILE_STORAGE_SUBDIRECTORY = "uploads";
|
||||
|
||||
/**
|
||||
|
|
|
@ -89,7 +89,7 @@ public class SolrSetup implements javax.servlet.ServletContextListener{
|
|||
/* setup the http connection with the solr server */
|
||||
String solrServerUrlString = ConfigurationProperties.getBean(sce).getProperty("vitro.local.solr.url");
|
||||
if( solrServerUrlString == null ){
|
||||
ss.fatal(this, "Could not find vitro.local.solr.url in deploy.properties. "+
|
||||
ss.fatal(this, "Could not find vitro.local.solr.url in runtime.properties. "+
|
||||
"Vitro application needs a URL of a solr server that it can use to index its data. " +
|
||||
"It should be something like http://localhost:${port}" + context.getContextPath() + "solr"
|
||||
);
|
||||
|
@ -101,7 +101,7 @@ public class SolrSetup implements javax.servlet.ServletContextListener{
|
|||
solrServerUrl = new URL(solrServerUrlString);
|
||||
} catch (MalformedURLException e) {
|
||||
ss.fatal(this, "Can't connect with the solr server. " +
|
||||
"The value for vitro.local.solr.url in deploy.properties is not a valid URL: " + solrServerUrlString);
|
||||
"The value for vitro.local.solr.url in runtime.properties is not a valid URL: " + solrServerUrlString);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -546,7 +546,7 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon {
|
|||
if ((dns != null) && (!dns.isEmpty())) {
|
||||
return dns;
|
||||
} else {
|
||||
throw new IllegalStateException("deploy.properties does not "
|
||||
throw new IllegalStateException("runtime.properties does not "
|
||||
+ "contain a value for '" + VITRO_DEFAULT_NAMESPACE + "'");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
.getProperty("vitro.local.solr.url", "");
|
||||
if (solrUrlString.isEmpty()) {
|
||||
ss.fatal(this, "Can't connect to Solr search engine. "
|
||||
+ "deploy.properties must contain a value for "
|
||||
+ "runtime.properties must contain a value for "
|
||||
+ "vitro.local.solr.url");
|
||||
return;
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
} catch (MalformedURLException e) {
|
||||
ss.fatal(this, "Can't connect to Solr search engine. "
|
||||
+ "The value for vitro.local.solr.url "
|
||||
+ "in deploy.properties is not a valid URL: '"
|
||||
+ "in runtime.properties is not a valid URL: '"
|
||||
+ solrUrlString + "'", e);
|
||||
}
|
||||
|
||||
|
@ -124,9 +124,7 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
int status = e.getStatusCode();
|
||||
Throwable cause = e.getCause();
|
||||
|
||||
if (status == HttpStatus.SC_FORBIDDEN) {
|
||||
warnForbidden();
|
||||
} else if (status == SOCKET_TIMEOUT_STATUS) {
|
||||
if (status == SOCKET_TIMEOUT_STATUS) {
|
||||
warnSocketTimeout();
|
||||
} else if (status != 0) {
|
||||
warnBadHttpStatus(status);
|
||||
|
@ -151,23 +149,14 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
ss.warning(listener, "Can't connect to the Solr search engine. "
|
||||
+ "The socket connection has repeatedly timed out. "
|
||||
+ "Check the value of vitro.local.solr.url in "
|
||||
+ "deploy.properties. Is Solr responding at that URL?");
|
||||
}
|
||||
|
||||
private void warnForbidden() {
|
||||
ss.warning(listener, "Can't connect to the Solr search engine. "
|
||||
+ "The Solr server will not accept connections from this "
|
||||
+ "host. Check the value of "
|
||||
+ "vitro.local.solr.ipaddress.mask in "
|
||||
+ "deploy.properties -- "
|
||||
+ "does it authorize access from this IP address?");
|
||||
+ "runtime.properties. Is Solr responding at that URL?");
|
||||
}
|
||||
|
||||
private void warnBadHttpStatus(int status) {
|
||||
ss.warning(listener, "Can't connect to the Solr search engine. "
|
||||
+ "The Solr server returned a status code of " + status
|
||||
+ ". Check the value of vitro.local.solr.url in "
|
||||
+ "deploy.properties.");
|
||||
+ "runtime.properties.");
|
||||
}
|
||||
|
||||
private void warnProtocolViolation(HttpException e) {
|
||||
|
@ -179,7 +168,7 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
ss.warning(listener, "Can't connect to the Solr search engine. '"
|
||||
+ e.getMessage() + "' is an unknown host."
|
||||
+ "Check the value of vitro.local.solr.url in "
|
||||
+ "deploy.properties.", e);
|
||||
+ "runtime.properties.", e);
|
||||
}
|
||||
|
||||
private void warnConnectionRefused(ConnectException e) {
|
||||
|
@ -187,7 +176,7 @@ public class SolrSmokeTest implements ServletContextListener {
|
|||
+ "The host refused the connection. "
|
||||
+ "Is it possible that the port number is incorrect? "
|
||||
+ "Check the value of vitro.local.solr.url in "
|
||||
+ "deploy.properties.", e);
|
||||
+ "runtime.properties.", e);
|
||||
}
|
||||
|
||||
private void warnTransportError(IOException e) {
|
||||
|
|
|
@ -182,10 +182,10 @@ public class UpdatePermissionSetUris implements ServletContextListener {
|
|||
|
||||
Journal(ServletContext ctx) throws IOException {
|
||||
String homeDirectoryPath = ConfigurationProperties.getBean(ctx)
|
||||
.getProperty("vitro.home.directory");
|
||||
.getProperty("vitro.home");
|
||||
if (homeDirectoryPath == null) {
|
||||
throw new IllegalStateException(
|
||||
"No value found for vitro.home.directory");
|
||||
"No value found for vitro.home");
|
||||
}
|
||||
File homeDirectory = new File(homeDirectoryPath);
|
||||
confirmIsDirectory(homeDirectory);
|
||||
|
|
|
@ -70,7 +70,7 @@ public class OpenSocialSmokeTests implements ServletContextListener {
|
|||
configProps = ConfigurationProperties.getBean(ctx);
|
||||
|
||||
/*
|
||||
* If OpenSocial is not configured in deploy.properties, skip the tests.
|
||||
* If OpenSocial is not configured in runtime.properties, skip the tests.
|
||||
*/
|
||||
if (!configurationPresent()) {
|
||||
ss.info(this, "The OpenSocial connection is not configured.");
|
||||
|
@ -188,7 +188,7 @@ public class OpenSocialSmokeTests implements ServletContextListener {
|
|||
}
|
||||
|
||||
/**
|
||||
* Check that the Token Key file has been specified in deploy.properties,
|
||||
* Check that the Token Key file has been specified in runtime.properties,
|
||||
* and that it actually does exist.
|
||||
*/
|
||||
private void checkTokenKeyFile() {
|
||||
|
@ -210,14 +210,14 @@ public class OpenSocialSmokeTests implements ServletContextListener {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the Token Service info from deploy.properties. It must be in the form
|
||||
* Get the Token Service info from runtime.properties. It must be in the form
|
||||
* of host:port, and may not refer to localhost.
|
||||
*/
|
||||
private void checkTokenServiceInfo() {
|
||||
String tsInfo = configProps.getProperty(PROPERTY_SHINDIG_TOKEN_SERVICE);
|
||||
if (StringUtils.isEmpty(tsInfo)) {
|
||||
warnings.add(new Warning("There is no value for '"
|
||||
+ PROPERTY_SHINDIG_TOKEN_SERVICE + "' in deploy.properties"));
|
||||
+ PROPERTY_SHINDIG_TOKEN_SERVICE + "' in runtime.properties"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -278,7 +278,7 @@ public class OpenSocialSmokeTests implements ServletContextListener {
|
|||
|
||||
private static class NoSuchPropertyException extends Exception {
|
||||
NoSuchPropertyException(String key) {
|
||||
super("There is no value for '" + key + "' in deploy.properties");
|
||||
super("There is no value for '" + key + "' in build.properties");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue