Merge pull request #205 from muff1nman/attempt-to-fix
Fix war deployment
This commit is contained in:
+19
-4
@@ -77,14 +77,15 @@
|
|||||||
|
|
||||||
<!-- taglibs -->
|
<!-- taglibs -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>org.apache.taglibs</groupId>
|
||||||
<artifactId>jstl</artifactId>
|
<artifactId>taglibs-standard-impl</artifactId>
|
||||||
<version>1.2</version>
|
<version>1.2.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>taglibs</groupId>
|
<groupId>taglibs</groupId>
|
||||||
<artifactId>string</artifactId>
|
<artifactId>string</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>1.1.0</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- END taglibs -->
|
<!-- END taglibs -->
|
||||||
|
|
||||||
@@ -223,6 +224,20 @@
|
|||||||
<version>2.5.1</version>
|
<version>2.5.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>jstl</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.mail</groupId>
|
<groupId>javax.mail</groupId>
|
||||||
<artifactId>javax.mail-api</artifactId>
|
<artifactId>javax.mail-api</artifactId>
|
||||||
@@ -284,7 +299,6 @@
|
|||||||
<artifactId>spring-web</artifactId>
|
<artifactId>spring-web</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -372,6 +386,7 @@
|
|||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<mainClass>org.libresonic.player.boot.Application</mainClass>
|
<mainClass>org.libresonic.player.boot.Application</mainClass>
|
||||||
|
<layout>WAR</layout>
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
package org.libresonic.player.boot;
|
package org.libresonic.player.boot;
|
||||||
|
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
import javax.servlet.ServletContextListener;
|
||||||
|
import net.sf.ehcache.constructs.web.ShutdownListener;
|
||||||
import org.directwebremoting.servlet.DwrServlet;
|
import org.directwebremoting.servlet.DwrServlet;
|
||||||
|
import org.libresonic.player.filter.BootstrapVerificationFilter;
|
||||||
|
import org.libresonic.player.filter.ParameterDecodingFilter;
|
||||||
|
import org.libresonic.player.filter.RESTFilter;
|
||||||
|
import org.libresonic.player.filter.RequestEncodingFilter;
|
||||||
|
import org.libresonic.player.filter.ResponseHeaderFilter;
|
||||||
import org.libresonic.player.spring.AdditionalPropertySourceConfigurer;
|
import org.libresonic.player.spring.AdditionalPropertySourceConfigurer;
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
import org.springframework.boot.web.support.SpringBootServletInitializer;
|
import org.springframework.boot.web.support.SpringBootServletInitializer;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
@@ -31,19 +39,124 @@ public class Application extends SpringBootServletInitializer {
|
|||||||
return servlet;
|
return servlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServletRegistrationBean cxfServletBean() {
|
||||||
|
return new ServletRegistrationBean(new org.apache.cxf.transport.servlet.CXFServlet(), "/ws/*");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServletContextListener ehCacheShutdownListener() {
|
||||||
|
return new ShutdownListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean bootstrapVerificationFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(bootstrapVerificationFiler());
|
||||||
|
registration.addUrlPatterns("/*");
|
||||||
|
registration.setName("BootstrapVerificationFilter");
|
||||||
|
registration.setOrder(1);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter bootstrapVerificationFiler() {
|
||||||
|
return new BootstrapVerificationFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean parameterDecodingFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(parameterDecodingFilter());
|
||||||
|
registration.addUrlPatterns("/*");
|
||||||
|
registration.setName("ParameterDecodingFilter");
|
||||||
|
registration.setOrder(2);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter parameterDecodingFilter() {
|
||||||
|
return new ParameterDecodingFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean restFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(restFilter());
|
||||||
|
registration.addUrlPatterns("/rest/*");
|
||||||
|
registration.setName("RESTFilter");
|
||||||
|
registration.setOrder(3);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter restFilter() {
|
||||||
|
return new RESTFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean requestEncodingFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(requestEncodingFilter());
|
||||||
|
registration.addUrlPatterns("/*");
|
||||||
|
registration.addInitParameter("encoding", "UTF-8");
|
||||||
|
registration.setName("RequestEncodingFilter");
|
||||||
|
registration.setOrder(4);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter requestEncodingFilter() {
|
||||||
|
return new RequestEncodingFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean cacheFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(cacheFilter());
|
||||||
|
registration.addUrlPatterns("/icons/*", "/style/*");
|
||||||
|
registration.addInitParameter("Cache-Control", "max-age=36000");
|
||||||
|
registration.setName("CacheFilter");
|
||||||
|
registration.setOrder(5);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter cacheFilter() {
|
||||||
|
return new ResponseHeaderFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean noCacheFilterRegistration() {
|
||||||
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
|
registration.setFilter(noCacheFilter());
|
||||||
|
registration.addUrlPatterns("/statusChart.view", "/userChart.view", "/playQueue.view", "/podcastChannels.view", "/podcastChannel.view", "/help.view", "/top.view", "/home.view");
|
||||||
|
registration.addInitParameter("Cache-Control", "no-cache, post-check=0, pre-check=0");
|
||||||
|
registration.addInitParameter("Pragma", "no-cache");
|
||||||
|
registration.addInitParameter("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
|
||||||
|
registration.setName("NoCacheFilter");
|
||||||
|
registration.setOrder(6);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Filter noCacheFilter() {
|
||||||
|
return new ResponseHeaderFilter();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||||
// Customize the application or call application.sources(...) to add sources
|
// Customize the application or call application.sources(...) to add sources
|
||||||
// Since our example is itself a @Configuration class (via @SpringBootApplication)
|
// Since our example is itself a @Configuration class (via @SpringBootApplication)
|
||||||
// we actually don't need to override this method.
|
// we actually don't need to override this method.
|
||||||
return application;
|
return application.sources(Application.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication springApplication = new SpringApplication(Application.class);
|
new Application().configure(new SpringApplicationBuilder(Application.class))
|
||||||
springApplication.addInitializers(new AdditionalPropertySourceConfigurer());
|
.web(true)
|
||||||
springApplication.run(args);
|
.initializers(new AdditionalPropertySourceConfigurer())
|
||||||
|
.run(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -676,7 +676,6 @@ public class MediaFileDao extends AbstractDao {
|
|||||||
for (int id = minId; id <= maxId; id += batchSize) {
|
for (int id = minId; id <= maxId; id += batchSize) {
|
||||||
update("delete from media_file where id between ? and ? and not present", id, id + batchSize);
|
update("delete from media_file where id between ? and ? and not present", id, id + batchSize);
|
||||||
}
|
}
|
||||||
update("checkpoint");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class MediaFileMapper implements RowMapper<MediaFile> {
|
private static class MediaFileMapper implements RowMapper<MediaFile> {
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class MusicFolderDao extends AbstractDao {
|
|||||||
*/
|
*/
|
||||||
public void createMusicFolder(MusicFolder musicFolder) {
|
public void createMusicFolder(MusicFolder musicFolder) {
|
||||||
String sql = "insert into music_folder (" + INSERT_COLUMNS + ") values (?, ?, ?, ?)";
|
String sql = "insert into music_folder (" + INSERT_COLUMNS + ") values (?, ?, ?, ?)";
|
||||||
update(sql, musicFolder.getPath(), musicFolder.getName(), musicFolder.isEnabled(), musicFolder.getChanged());
|
update(sql, musicFolder.getPath().getPath(), musicFolder.getName(), musicFolder.isEnabled(), musicFolder.getChanged());
|
||||||
|
|
||||||
Integer id = queryForInt("select max(id) from music_folder", 0);
|
Integer id = queryForInt("select max(id) from music_folder", 0);
|
||||||
update("insert into music_folder_user (music_folder_id, username) select ?, username from " + userDao.getUserTable(), id);
|
update("insert into music_folder_user (music_folder_id, username) select ?, username from " + userDao.getUserTable(), id);
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ public class PodcastDao extends AbstractDao {
|
|||||||
public List<PodcastEpisode> getEpisodes(int channelId) {
|
public List<PodcastEpisode> getEpisodes(int channelId) {
|
||||||
String sql = "select " + EPISODE_QUERY_COLUMNS + " from podcast_episode where channel_id = ? " +
|
String sql = "select " + EPISODE_QUERY_COLUMNS + " from podcast_episode where channel_id = ? " +
|
||||||
"and status != ? order by publish_date desc";
|
"and status != ? order by publish_date desc";
|
||||||
return query(sql, episodeRowMapper, channelId, PodcastStatus.DELETED);
|
return query(sql, episodeRowMapper, channelId, PodcastStatus.DELETED.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,7 +135,7 @@ public class PodcastDao extends AbstractDao {
|
|||||||
String sql = "select " + EPISODE_QUERY_COLUMNS
|
String sql = "select " + EPISODE_QUERY_COLUMNS
|
||||||
+ " from podcast_episode where status = ? and publish_date is not null " +
|
+ " from podcast_episode where status = ? and publish_date is not null " +
|
||||||
"order by publish_date desc limit ?";
|
"order by publish_date desc limit ?";
|
||||||
return query(sql, episodeRowMapper, PodcastStatus.COMPLETED, count);
|
return query(sql, episodeRowMapper, PodcastStatus.COMPLETED.name(), count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+11
-43
@@ -1,64 +1,31 @@
|
|||||||
package org.libresonic.player.spring;
|
package org.libresonic.player.spring;
|
||||||
|
|
||||||
import liquibase.changelog.ChangeSet;
|
|
||||||
import liquibase.changelog.DatabaseChangeLog;
|
|
||||||
import liquibase.database.Database;
|
import liquibase.database.Database;
|
||||||
import liquibase.exception.PreconditionErrorException;
|
import liquibase.exception.CustomPreconditionErrorException;
|
||||||
import liquibase.exception.PreconditionFailedException;
|
import liquibase.exception.CustomPreconditionFailedException;
|
||||||
import liquibase.exception.ValidationErrors;
|
import liquibase.exception.DatabaseException;
|
||||||
import liquibase.exception.Warnings;
|
import liquibase.precondition.CustomPrecondition;
|
||||||
import liquibase.precondition.Precondition;
|
|
||||||
import liquibase.serializer.AbstractLiquibaseSerializable;
|
|
||||||
|
|
||||||
public class DbmsVersionPrecondition extends AbstractLiquibaseSerializable implements Precondition {
|
public class DbmsVersionPrecondition implements CustomPrecondition {
|
||||||
private Integer major;
|
private Integer major;
|
||||||
private Integer minor;
|
private Integer minor;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public void check(Database database) throws CustomPreconditionFailedException, CustomPreconditionErrorException {
|
||||||
return "dbmsVersion";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Warnings warn(Database database) {
|
|
||||||
return new Warnings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ValidationErrors validate(Database database) {
|
|
||||||
return new ValidationErrors();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void check(
|
|
||||||
Database database, DatabaseChangeLog changeLog, ChangeSet changeSet
|
|
||||||
) throws PreconditionFailedException, PreconditionErrorException {
|
|
||||||
try {
|
try {
|
||||||
int dbMajor = database.getDatabaseMajorVersion();
|
int dbMajor = database.getDatabaseMajorVersion();
|
||||||
int dbMinor = database.getDatabaseMinorVersion();
|
int dbMinor = database.getDatabaseMinorVersion();
|
||||||
if(major != null && !major.equals(dbMajor)) {
|
if(major != null && !major.equals(dbMajor)) {
|
||||||
throw new PreconditionFailedException("DBMS Major Version Precondition failed: expected " + major + ", got " + dbMajor, changeLog, this);
|
throw new CustomPreconditionFailedException("DBMS Major Version Precondition failed: expected " + major + ", got " + dbMajor);
|
||||||
}
|
}
|
||||||
if(minor != null && !minor.equals(dbMinor)) {
|
if(minor != null && !minor.equals(dbMinor)) {
|
||||||
throw new PreconditionFailedException("DBMS Minor Version Precondition failed: expected " + minor + ", got " + dbMinor, changeLog, this);
|
throw new CustomPreconditionFailedException("DBMS Minor Version Precondition failed: expected " + minor + ", got " + dbMinor);
|
||||||
}
|
}
|
||||||
} catch (PreconditionFailedException e) {
|
} catch (DatabaseException e) {
|
||||||
throw e;
|
throw new CustomPreconditionErrorException(e.getMessage());
|
||||||
} catch (Exception e) {
|
|
||||||
throw new PreconditionErrorException(e, changeLog, this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSerializedObjectName() {
|
|
||||||
return getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSerializedObjectNamespace() {
|
|
||||||
return GENERIC_CHANGELOG_EXTENSION_NAMESPACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getMajor() {
|
public Integer getMajor() {
|
||||||
return major;
|
return major;
|
||||||
}
|
}
|
||||||
@@ -74,4 +41,5 @@ public class DbmsVersionPrecondition extends AbstractLiquibaseSerializable imple
|
|||||||
public void setMinor(Integer minor) {
|
public void setMinor(Integer minor) {
|
||||||
this.minor = minor;
|
this.minor = minor;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ public class SpringLiquibase extends liquibase.integration.spring.SpringLiquibas
|
|||||||
if (StringUtils.trimToNull(this.defaultSchema) != null) {
|
if (StringUtils.trimToNull(this.defaultSchema) != null) {
|
||||||
database.setDefaultSchemaName(this.defaultSchema);
|
database.setDefaultSchemaName(this.defaultSchema);
|
||||||
}
|
}
|
||||||
liquibase.precondition.PreconditionFactory.getInstance().register(DbmsVersionPrecondition.class);
|
|
||||||
return database;
|
return database;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
spring.mvc.view.prefix: /WEB-INF/jsp/
|
||||||
|
spring.mvc.view.suffix: .jsp
|
||||||
|
server.error.includeStacktrace: ALWAYS
|
||||||
@@ -47,4 +47,6 @@
|
|||||||
<property name="suffix" value=".jsp"/>
|
<property name="suffix" value=".jsp"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean class="org.libresonic.player.spring.LoggingExceptionResolver" />
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
|
|||||||
@@ -238,7 +238,7 @@
|
|||||||
</customPrecondition>
|
</customPrecondition>
|
||||||
<sqlCheck expectedResult="0">
|
<sqlCheck expectedResult="0">
|
||||||
select count(*) from INFORMATION_SCHEMA.SYSTEM_INDEXINFO where
|
select count(*) from INFORMATION_SCHEMA.SYSTEM_INDEXINFO where
|
||||||
TABLE_NAME = 'album' and INDEX_NAME = 'idx_album_name';
|
lower(TABLE_NAME) = 'album' and lower(INDEX_NAME) = 'idx_album_name';
|
||||||
</sqlCheck>
|
</sqlCheck>
|
||||||
</preConditions>
|
</preConditions>
|
||||||
<createIndex tableName="album" indexName="idx_album_name">
|
<createIndex tableName="album" indexName="idx_album_name">
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
</customPrecondition>
|
</customPrecondition>
|
||||||
<sqlCheck expectedResult="0">
|
<sqlCheck expectedResult="0">
|
||||||
select count(*) from INFORMATION_SCHEMA.SYSTEM_INDEXINFO where
|
select count(*) from INFORMATION_SCHEMA.SYSTEM_INDEXINFO where
|
||||||
TABLE_NAME = 'podcast_episode' and INDEX_NAME = 'idx_podcast_episode_url';
|
lower(TABLE_NAME) = 'podcast_episode' and lower(INDEX_NAME) = 'idx_podcast_episode_url';
|
||||||
</sqlCheck>
|
</sqlCheck>
|
||||||
</preConditions>
|
</preConditions>
|
||||||
<createIndex tableName="podcast_episode" indexName="idx_podcast_episode_url">
|
<createIndex tableName="podcast_episode" indexName="idx_podcast_episode_url">
|
||||||
|
|||||||
+15
-9
@@ -1,5 +1,7 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" isErrorPage="true" %>
|
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8" isErrorPage="true" %>
|
||||||
<%@ page import="java.io.PrintWriter, java.io.StringWriter"%>
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
|
||||||
|
|
||||||
<html><head>
|
<html><head>
|
||||||
<!--[if lt IE 7.]>
|
<!--[if lt IE 7.]>
|
||||||
@@ -22,8 +24,6 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<%
|
<%
|
||||||
StringWriter sw = new StringWriter();
|
|
||||||
exception.printStackTrace(new PrintWriter(sw));
|
|
||||||
|
|
||||||
long totalMemory = Runtime.getRuntime().totalMemory();
|
long totalMemory = Runtime.getRuntime().totalMemory();
|
||||||
long freeMemory = Runtime.getRuntime().freeMemory();
|
long freeMemory = Runtime.getRuntime().freeMemory();
|
||||||
@@ -32,9 +32,7 @@
|
|||||||
|
|
||||||
<table class="ruleTable indent">
|
<table class="ruleTable indent">
|
||||||
<tr><td class="ruleTableHeader">Exception</td>
|
<tr><td class="ruleTableHeader">Exception</td>
|
||||||
<td class="ruleTableCell"><%=exception.getClass().getName()%></td></tr>
|
<td class="ruleTableCell"><c:out value="${exception}" /></td></tr>
|
||||||
<tr><td class="ruleTableHeader">Message</td>
|
|
||||||
<td class="ruleTableCell"><%=exception.getMessage()%></td></tr>
|
|
||||||
<tr><td class="ruleTableHeader">Java version</td>
|
<tr><td class="ruleTableHeader">Java version</td>
|
||||||
<td class="ruleTableCell"><%=System.getProperty("java.vendor") + ' ' + System.getProperty("java.version")%></td></tr>
|
<td class="ruleTableCell"><%=System.getProperty("java.vendor") + ' ' + System.getProperty("java.version")%></td></tr>
|
||||||
<tr><td class="ruleTableHeader">Operating system</td>
|
<tr><td class="ruleTableHeader">Operating system</td>
|
||||||
@@ -43,8 +41,16 @@
|
|||||||
<td class="ruleTableCell"><%=application.getServerInfo()%></td></tr>
|
<td class="ruleTableCell"><%=application.getServerInfo()%></td></tr>
|
||||||
<tr><td class="ruleTableHeader">Memory</td>
|
<tr><td class="ruleTableHeader">Memory</td>
|
||||||
<td class="ruleTableCell">Used <%=usedMemory/1024L/1024L%> of <%=totalMemory/1024L/1024L%> MB</td></tr>
|
<td class="ruleTableCell">Used <%=usedMemory/1024L/1024L%> of <%=totalMemory/1024L/1024L%> MB</td></tr>
|
||||||
<tr><td class="ruleTableHeader" style="vertical-align:top;">Stack trace</td>
|
<c:if test="${not empty trace}">
|
||||||
<td class="ruleTableCell" style="white-space:pre"><%=sw.getBuffer()%></td></tr>
|
<tr>
|
||||||
|
<td class="ruleTableHeader" style="vertical-align:top;">Stack trace</td>
|
||||||
|
<td class="ruleTableCell" style="white-space:pre">
|
||||||
|
<pre>
|
||||||
|
${fn:escapeXml(trace)}
|
||||||
|
</pre>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</c:if>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="mainframe bgcolor1" onload="document.getElementById('j_username').focus()">
|
<body class="mainframe bgcolor1" onload="document.getElementById('j_username').focus()">
|
||||||
|
|
||||||
<form action="/login" method="POST">
|
<form action="<c:url value="/login"/>" method="POST">
|
||||||
|
|
||||||
<sec:csrfInput />
|
<sec:csrfInput />
|
||||||
<div class="bgcolor2 shadow" align="center" style="padding:20px 50px 20px 50px; margin-top:100px;margin-left:50px;margin-right:50px">
|
<div class="bgcolor2 shadow" align="center" style="padding:20px 50px 20px 50px; margin-top:100px;margin-left:50px;margin-right:50px">
|
||||||
|
|||||||
@@ -1,225 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
<web-app id="libresonic" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
|
|
||||||
|
|
||||||
<display-name>Libresonic Music Streamer</display-name>
|
|
||||||
|
|
||||||
<!-- Location of application context. Used by ContextLoaderListener. -->
|
|
||||||
<context-param>
|
|
||||||
<param-name>contextConfigLocation</param-name>
|
|
||||||
<param-value>
|
|
||||||
/WEB-INF/applicationContext-service.xml
|
|
||||||
/WEB-INF/applicationContext-security.xml
|
|
||||||
/WEB-INF/applicationContext-cache.xml
|
|
||||||
/WEB-INF/applicationContext-sonos.xml
|
|
||||||
</param-value>
|
|
||||||
</context-param>
|
|
||||||
|
|
||||||
<context-param>
|
|
||||||
<param-name>contextInitializerClasses</param-name>
|
|
||||||
<param-value>org.libresonic.player.spring.AdditionalPropertySourceConfigurer</param-value>
|
|
||||||
</context-param>
|
|
||||||
|
|
||||||
<listener>
|
|
||||||
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
|
||||||
</listener>
|
|
||||||
<listener>
|
|
||||||
<listener-class>net.sf.ehcache.constructs.web.ShutdownListener</listener-class>
|
|
||||||
</listener>
|
|
||||||
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
|
||||||
<load-on-startup>1</load-on-startup>
|
|
||||||
</servlet>
|
|
||||||
|
|
||||||
<servlet>
|
|
||||||
<display-name>CFX Servlet</display-name>
|
|
||||||
<servlet-name>cxfservlet</servlet-name>
|
|
||||||
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
|
|
||||||
<load-on-startup>1</load-on-startup>
|
|
||||||
</servlet>
|
|
||||||
|
|
||||||
<servlet>
|
|
||||||
<display-name>DWR Servlet</display-name>
|
|
||||||
<servlet-name>dwr-invoker</servlet-name>
|
|
||||||
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>crossDomainSessionSecurity</param-name>
|
|
||||||
<param-value>false</param-value>
|
|
||||||
</init-param>
|
|
||||||
</servlet>
|
|
||||||
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>*.view</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/podcast</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/wap</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/play.m3u</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/stream/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/rest/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/hls/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>libresonic</servlet-name>
|
|
||||||
<url-pattern>/share/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>dwr-invoker</servlet-name>
|
|
||||||
<url-pattern>/dwr/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>cxfservlet</servlet-name>
|
|
||||||
<url-pattern>/ws/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
|
|
||||||
<welcome-file-list>
|
|
||||||
<welcome-file>index.html</welcome-file>
|
|
||||||
<welcome-file>index.jsp</welcome-file>
|
|
||||||
</welcome-file-list>
|
|
||||||
|
|
||||||
<error-page>
|
|
||||||
<exception-type>java.lang.Throwable</exception-type>
|
|
||||||
<location>/error.jsp</location>
|
|
||||||
</error-page>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<filter-name>BootstrapVerificationFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.BootstrapVerificationFilter</filter-class>
|
|
||||||
</filter>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>BootstrapVerificationFilter</filter-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<filter-name>ParameterDecodingFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.ParameterDecodingFilter</filter-class>
|
|
||||||
</filter>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>ParameterDecodingFilter</filter-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<filter-name>RESTFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.RESTFilter</filter-class>
|
|
||||||
</filter>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>RESTFilter</filter-name>
|
|
||||||
<url-pattern>/rest/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<filter-name>RequestEncodingFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.RequestEncodingFilter</filter-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>encoding</param-name>
|
|
||||||
<param-value>UTF-8</param-value>
|
|
||||||
</init-param>
|
|
||||||
</filter>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>RequestEncodingFilter</filter-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<description>Sets HTTP headers to enable browser caching.</description>
|
|
||||||
<filter-name>CacheFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.ResponseHeaderFilter</filter-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>Cache-Control</param-name>
|
|
||||||
<param-value>max-age=36000</param-value>
|
|
||||||
</init-param>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<description>Sets HTTP headers to disable browser caching.</description>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<filter-class>org.libresonic.player.filter.ResponseHeaderFilter</filter-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>Cache-Control</param-name>
|
|
||||||
<param-value>no-cache, post-check=0, pre-check=0</param-value>
|
|
||||||
</init-param>
|
|
||||||
<init-param>
|
|
||||||
<param-name>Pragma</param-name>
|
|
||||||
<param-value>no-cache</param-value>
|
|
||||||
</init-param>
|
|
||||||
<init-param>
|
|
||||||
<param-name>Expires</param-name>
|
|
||||||
<param-value>Thu, 01 Dec 1994 16:00:00 GMT</param-value>
|
|
||||||
</init-param>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>CacheFilter</filter-name>
|
|
||||||
<url-pattern>/icons/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>CacheFilter</filter-name>
|
|
||||||
<url-pattern>/style/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/statusChart.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/userChart.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/playQueue.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/podcastChannels.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/podcastChannel.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/help.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/top.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>NoCacheFilter</filter-name>
|
|
||||||
<url-pattern>/home.view</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
<filter>
|
|
||||||
<filter-name>springSecurityFilterChain</filter-name>
|
|
||||||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>springSecurityFilterChain</filter-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
|
|
||||||
</web-app>
|
|
||||||
@@ -142,6 +142,12 @@
|
|||||||
<artifactId>maven-jaxb2-plugin</artifactId>
|
<artifactId>maven-jaxb2-plugin</artifactId>
|
||||||
<version>0.13.1</version>
|
<version>0.13.1</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<failOnMissingWebXml>false</failOnMissingWebXml>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</pluginManagement>
|
</pluginManagement>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user