Added UI for Database settings
Also cleanup some documentation *Database Settings have been renamed and will require manually fixing from 6.2beta1* database.varchar.maxlength -> DatabaseMysqlMaxlength database.config.type -> DatabaseConfigType database.config.embed.driver -> DatabasigEmbedDriver database.config.embed.url -> DatabaseConfigEmbedUrl database.config.embed.username -> DatabasigEmbedUsername database.config.embed.password -> DatabasigEmbedPassword database.config.jndi.name -> DatabaseConfigJNDIName database.usertable.quote -> DatabaseUsertableQuote Signed-off-by: Andrew DeMaria <lostonamountain@gmail.com>
This commit is contained in:
@@ -381,6 +381,12 @@
|
||||
<artifactId>maven-artifact</artifactId>
|
||||
<version>3.3.9</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.validation</groupId>
|
||||
<artifactId>validation-api</artifactId>
|
||||
<version>1.1.0.Final</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
package org.libresonic.player.command;
|
||||
|
||||
import org.libresonic.player.spring.DataSourceConfigType;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
public class DatabaseSettingsCommand {
|
||||
|
||||
@NotNull
|
||||
private DataSourceConfigType configType;
|
||||
private String embedDriver;
|
||||
private String embedPassword;
|
||||
private String embedUrl;
|
||||
private String embedUsername;
|
||||
private String JNDIName;
|
||||
private int mysqlVarcharMaxlength;
|
||||
private String usertableQuote;
|
||||
|
||||
public DataSourceConfigType getConfigType() {
|
||||
return configType;
|
||||
}
|
||||
|
||||
public void setConfigType(DataSourceConfigType configType) {
|
||||
this.configType = configType;
|
||||
}
|
||||
|
||||
public String getEmbedDriver() {
|
||||
return embedDriver;
|
||||
}
|
||||
|
||||
public void setEmbedDriver(String embedDriver) {
|
||||
this.embedDriver = embedDriver;
|
||||
}
|
||||
|
||||
public String getEmbedPassword() {
|
||||
return embedPassword;
|
||||
}
|
||||
|
||||
public void setEmbedPassword(String embedPassword) {
|
||||
this.embedPassword = embedPassword;
|
||||
}
|
||||
|
||||
public String getEmbedUrl() {
|
||||
return embedUrl;
|
||||
}
|
||||
|
||||
public void setEmbedUrl(String embedUrl) {
|
||||
this.embedUrl = embedUrl;
|
||||
}
|
||||
|
||||
public String getEmbedUsername() {
|
||||
return embedUsername;
|
||||
}
|
||||
|
||||
public void setEmbedUsername(String embedUsername) {
|
||||
this.embedUsername = embedUsername;
|
||||
}
|
||||
|
||||
public String getJNDIName() {
|
||||
return JNDIName;
|
||||
}
|
||||
|
||||
public void setJNDIName(String JNDIName) {
|
||||
this.JNDIName = JNDIName;
|
||||
}
|
||||
|
||||
public int getMysqlVarcharMaxlength() {
|
||||
return mysqlVarcharMaxlength;
|
||||
}
|
||||
|
||||
public void setMysqlVarcharMaxlength(int mysqlVarcharMaxlength) {
|
||||
this.mysqlVarcharMaxlength = mysqlVarcharMaxlength;
|
||||
}
|
||||
|
||||
public String getUsertableQuote() {
|
||||
return usertableQuote;
|
||||
}
|
||||
|
||||
public void setUsertableQuote(String usertableQuote) {
|
||||
this.usertableQuote = usertableQuote;
|
||||
}
|
||||
}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
This file is part of Libresonic.
|
||||
|
||||
Libresonic is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Libresonic is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Libresonic. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2016 (C) Libresonic Authors
|
||||
Based upon Subsonic, Copyright 2009 (C) Sindre Mehus
|
||||
*/
|
||||
package org.libresonic.player.controller;
|
||||
|
||||
import org.libresonic.player.command.DatabaseSettingsCommand;
|
||||
import org.libresonic.player.dao.AlbumDao;
|
||||
import org.libresonic.player.dao.ArtistDao;
|
||||
import org.libresonic.player.dao.MediaFileDao;
|
||||
import org.libresonic.player.service.MediaScannerService;
|
||||
import org.libresonic.player.service.SettingsService;
|
||||
import org.libresonic.player.spring.DataSourceConfigType;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.validation.BindingResult;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/databaseSettings")
|
||||
public class DatabaseSettingsController {
|
||||
|
||||
@Autowired
|
||||
private SettingsService settingsService;
|
||||
@Autowired
|
||||
private MediaScannerService mediaScannerService;
|
||||
@Autowired
|
||||
private ArtistDao artistDao;
|
||||
@Autowired
|
||||
private AlbumDao albumDao;
|
||||
@Autowired
|
||||
private MediaFileDao mediaFileDao;
|
||||
|
||||
@RequestMapping(method = RequestMethod.GET)
|
||||
protected String displayForm() throws Exception {
|
||||
return "databaseSettings";
|
||||
}
|
||||
|
||||
@ModelAttribute
|
||||
protected void formBackingObject(Model model) throws Exception {
|
||||
DatabaseSettingsCommand command = new DatabaseSettingsCommand();
|
||||
command.setConfigType(settingsService.getDatabaseConfigType());
|
||||
command.setEmbedDriver(settingsService.getDatabaseConfigEmbedDriver());
|
||||
command.setEmbedPassword(settingsService.getDatabaseConfigEmbedPassword());
|
||||
command.setEmbedUrl(settingsService.getDatabaseConfigEmbedUrl());
|
||||
command.setEmbedUsername(settingsService.getDatabaseConfigEmbedUsername());
|
||||
command.setJNDIName(settingsService.getDatabaseConfigJNDIName());
|
||||
command.setMysqlVarcharMaxlength(settingsService.getDatabaseMysqlVarcharMaxlength());
|
||||
command.setUsertableQuote(settingsService.getDatabaseUsertableQuote());
|
||||
model.addAttribute("command", command);
|
||||
}
|
||||
|
||||
@RequestMapping(method = RequestMethod.POST)
|
||||
protected String onSubmit(@ModelAttribute("command") @Validated DatabaseSettingsCommand command,
|
||||
BindingResult bindingResult,
|
||||
RedirectAttributes redirectAttributes) throws Exception {
|
||||
if (!bindingResult.hasErrors()) {
|
||||
settingsService.resetDatabaseToDefault();
|
||||
settingsService.setDatabaseConfigType(command.getConfigType());
|
||||
switch(command.getConfigType()) {
|
||||
case EMBED:
|
||||
settingsService.setDatabaseConfigEmbedDriver(command.getEmbedDriver());
|
||||
settingsService.setDatabaseConfigEmbedPassword(command.getEmbedPassword());
|
||||
settingsService.setDatabaseConfigEmbedUrl(command.getEmbedUrl());
|
||||
settingsService.setDatabaseConfigEmbedUsername(command.getEmbedUsername());
|
||||
break;
|
||||
case JNDI:
|
||||
settingsService.setDatabaseConfigJNDIName(command.getJNDIName());
|
||||
break;
|
||||
case LEGACY:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(command.getConfigType() != DataSourceConfigType.LEGACY) {
|
||||
settingsService.setDatabaseMysqlVarcharMaxlength(command.getMysqlVarcharMaxlength());
|
||||
settingsService.setDatabaseUsertableQuote(command.getUsertableQuote());
|
||||
}
|
||||
redirectAttributes.addFlashAttribute("settings_toast", true);
|
||||
settingsService.save();
|
||||
return "redirect:databaseSettings.view";
|
||||
} else {
|
||||
return "databaseSettings.view";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -79,7 +79,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
"/playerSettings.view", "/shareSettings.view","/passwordSettings.view")
|
||||
.hasRole("SETTINGS")
|
||||
.antMatchers("/generalSettings.view","/advancedSettings.view","/userSettings.view",
|
||||
"/musicFolderSettings.view")
|
||||
"/musicFolderSettings.view", "/databaseSettings.view")
|
||||
.hasRole("ADMIN")
|
||||
.antMatchers("/deletePlaylist.view","/savePlaylist.view")
|
||||
.hasRole("PLAYLIST")
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.libresonic.player.dao.InternetRadioDao;
|
||||
import org.libresonic.player.dao.MusicFolderDao;
|
||||
import org.libresonic.player.dao.UserDao;
|
||||
import org.libresonic.player.domain.*;
|
||||
import org.libresonic.player.spring.DataSourceConfigType;
|
||||
import org.libresonic.player.util.FileUtil;
|
||||
import org.libresonic.player.util.StringUtil;
|
||||
import org.libresonic.player.util.Util;
|
||||
@@ -105,6 +106,16 @@ public class SettingsService {
|
||||
private static final String KEY_SMTP_PASSWORD = "SmtpPassword";
|
||||
private static final String KEY_SMTP_FROM = "SmtpFrom";
|
||||
|
||||
// Database Settings
|
||||
private static final String KEY_DATABASE_CONFIG_TYPE = "DatabaseConfigType";
|
||||
private static final String KEY_DATABASE_CONFIG_EMBED_DRIVER = "DatabaseConfigEmbedDriver";
|
||||
private static final String KEY_DATABASE_CONFIG_EMBED_URL = "DatabaseConfigEmbedUrl";
|
||||
private static final String KEY_DATABASE_CONFIG_EMBED_USERNAME = "DatabaseConfigEmbedUsername";
|
||||
private static final String KEY_DATABASE_CONFIG_EMBED_PASSWORD = "DatabaseConfigEmbedPassword";
|
||||
private static final String KEY_DATABASE_CONFIG_JNDI_NAME = "DatabaseConfigJNDIName";
|
||||
private static final String KEY_DATABASE_MYSQL_VARCHAR_MAXLENGTH = "DatabaseMysqlMaxlength";
|
||||
private static final String KEY_DATABASE_USERTABLE_QUOTE = "DatabaseUsertableQuote";
|
||||
|
||||
// Default values.
|
||||
private static final String DEFAULT_INDEX_STRING = "A B C D E F G H I J K L M N O P Q R S T U V W X-Z(XYZ)";
|
||||
private static final String DEFAULT_IGNORED_ARTICLES = "The El La Los Las Le Les";
|
||||
@@ -168,13 +179,26 @@ public class SettingsService {
|
||||
private static final String DEFAULT_SMTP_PASSWORD = null;
|
||||
private static final String DEFAULT_SMTP_FROM = "libresonic@libresonic.org";
|
||||
|
||||
private static final DataSourceConfigType DEFAULT_DATABASE_CONFIG_TYPE = DataSourceConfigType.LEGACY;
|
||||
private static final String DEFAULT_DATABASE_CONFIG_EMBED_DRIVER = null;
|
||||
private static final String DEFAULT_DATABASE_CONFIG_EMBED_URL = null;
|
||||
private static final String DEFAULT_DATABASE_CONFIG_EMBED_USERNAME = null;
|
||||
private static final String DEFAULT_DATABASE_CONFIG_EMBED_PASSWORD = null;
|
||||
private static final String DEFAULT_DATABASE_CONFIG_JNDI_NAME = null;
|
||||
private static final Integer DEFAULT_DATABASE_MYSQL_VARCHAR_MAXLENGTH = 512;
|
||||
private static final String DEFAULT_DATABASE_USERTABLE_QUOTE = null;
|
||||
|
||||
// Array of obsolete keys. Used to clean property file.
|
||||
private static final List<String> OBSOLETE_KEYS = Arrays.asList("PortForwardingPublicPort", "PortForwardingLocalPort",
|
||||
"DownsamplingCommand", "DownsamplingCommand2", "DownsamplingCommand3", "AutoCoverBatch", "MusicMask",
|
||||
"VideoMask", "CoverArtMask, HlsCommand", "HlsCommand2", "JukeboxCommand",
|
||||
"CoverArtFileTypes", "UrlRedirectCustomHost", "CoverArtLimit", "StreamPort",
|
||||
"PortForwardingEnabled", "RewriteUrl", "UrlRedirectCustomUrl", "UrlRedirectContextPath",
|
||||
"UrlRedirectFrom", "UrlRedirectionEnabled", "UrlRedirectType", "Port", "HttpsPort");
|
||||
"UrlRedirectFrom", "UrlRedirectionEnabled", "UrlRedirectType", "Port", "HttpsPort",
|
||||
// Database settings renamed
|
||||
"database.varchar.maxlength", "database.config.type", "database.config.embed.driver",
|
||||
"database.config.embed.url", "database.config.embed.username", "database.config.embed.password",
|
||||
"database.config.jndi.name", "database.usertable.quote");
|
||||
|
||||
private static final String LOCALES_FILE = "/org/libresonic/player/i18n/locales.txt";
|
||||
private static final String THEMES_FILE = "/org/libresonic/player/theme/themes.txt";
|
||||
@@ -1243,7 +1267,83 @@ public class SettingsService {
|
||||
setString(KEY_SMTP_FROM, smtpFrom);
|
||||
}
|
||||
|
||||
public DataSourceConfigType getDatabaseConfigType() {
|
||||
String raw = getString(KEY_DATABASE_CONFIG_TYPE, DEFAULT_DATABASE_CONFIG_TYPE.name());
|
||||
return DataSourceConfigType.valueOf(StringUtils.upperCase(raw));
|
||||
}
|
||||
|
||||
public void setDatabaseConfigType(DataSourceConfigType databaseConfigType) {
|
||||
setString(KEY_DATABASE_CONFIG_TYPE, databaseConfigType.name());
|
||||
}
|
||||
|
||||
public String getDatabaseConfigEmbedDriver() {
|
||||
return getString(KEY_DATABASE_CONFIG_EMBED_DRIVER, DEFAULT_DATABASE_CONFIG_EMBED_DRIVER);
|
||||
}
|
||||
|
||||
public void setDatabaseConfigEmbedDriver(String embedDriver) {
|
||||
setString(KEY_DATABASE_CONFIG_EMBED_DRIVER, embedDriver);
|
||||
}
|
||||
|
||||
public String getDatabaseConfigEmbedUrl() {
|
||||
return getString(KEY_DATABASE_CONFIG_EMBED_URL, DEFAULT_DATABASE_CONFIG_EMBED_URL);
|
||||
}
|
||||
|
||||
public void setDatabaseConfigEmbedUrl(String url) {
|
||||
setString(KEY_DATABASE_CONFIG_EMBED_URL, url);
|
||||
}
|
||||
|
||||
public String getDatabaseConfigEmbedUsername() {
|
||||
return getString(KEY_DATABASE_CONFIG_EMBED_USERNAME, DEFAULT_DATABASE_CONFIG_EMBED_USERNAME);
|
||||
}
|
||||
|
||||
public void setDatabaseConfigEmbedUsername(String username) {
|
||||
setString(KEY_DATABASE_CONFIG_EMBED_USERNAME, username);
|
||||
}
|
||||
|
||||
public String getDatabaseConfigEmbedPassword() {
|
||||
return getString(KEY_DATABASE_CONFIG_EMBED_PASSWORD, DEFAULT_DATABASE_CONFIG_EMBED_PASSWORD);
|
||||
}
|
||||
|
||||
public void setDatabaseConfigEmbedPassword(String password) {
|
||||
setString(KEY_DATABASE_CONFIG_EMBED_PASSWORD, password);
|
||||
}
|
||||
|
||||
public String getDatabaseConfigJNDIName() {
|
||||
return getString(KEY_DATABASE_CONFIG_JNDI_NAME, DEFAULT_DATABASE_CONFIG_JNDI_NAME);
|
||||
}
|
||||
|
||||
public void setDatabaseConfigJNDIName(String jndiName) {
|
||||
setString(KEY_DATABASE_CONFIG_JNDI_NAME, jndiName);
|
||||
}
|
||||
|
||||
public Integer getDatabaseMysqlVarcharMaxlength() {
|
||||
return getInt(KEY_DATABASE_MYSQL_VARCHAR_MAXLENGTH, DEFAULT_DATABASE_MYSQL_VARCHAR_MAXLENGTH);
|
||||
}
|
||||
|
||||
public void setDatabaseMysqlVarcharMaxlength(int maxlength) {
|
||||
setInt(KEY_DATABASE_MYSQL_VARCHAR_MAXLENGTH, maxlength);
|
||||
}
|
||||
|
||||
public String getDatabaseUsertableQuote() {
|
||||
return getString(KEY_DATABASE_USERTABLE_QUOTE, DEFAULT_DATABASE_USERTABLE_QUOTE);
|
||||
}
|
||||
|
||||
public void setDatabaseUsertableQuote(String usertableQuote) {
|
||||
setString(KEY_DATABASE_USERTABLE_QUOTE, usertableQuote);
|
||||
}
|
||||
|
||||
public void setConfigurationService(ApacheCommonsConfigurationService configurationService) {
|
||||
this.configurationService = configurationService;
|
||||
}
|
||||
|
||||
public void resetDatabaseToDefault() {
|
||||
setDatabaseConfigEmbedDriver(DEFAULT_DATABASE_CONFIG_EMBED_DRIVER);
|
||||
setDatabaseConfigEmbedPassword(DEFAULT_DATABASE_CONFIG_EMBED_PASSWORD);
|
||||
setDatabaseConfigEmbedUrl(DEFAULT_DATABASE_CONFIG_EMBED_URL);
|
||||
setDatabaseConfigEmbedUsername(DEFAULT_DATABASE_CONFIG_EMBED_USERNAME);
|
||||
setDatabaseConfigJNDIName(DEFAULT_DATABASE_CONFIG_JNDI_NAME);
|
||||
setDatabaseMysqlVarcharMaxlength(DEFAULT_DATABASE_MYSQL_VARCHAR_MAXLENGTH);
|
||||
setDatabaseUsertableQuote(DEFAULT_DATABASE_USERTABLE_QUOTE);
|
||||
setDatabaseConfigType(DEFAULT_DATABASE_CONFIG_TYPE);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ import java.util.List;
|
||||
public class LibresonicPropertySourceConfigurer implements
|
||||
ApplicationContextInitializer<ConfigurableWebApplicationContext> {
|
||||
|
||||
public static final String DATASOURCE_CONFIG_TYPE = "database.config.type";
|
||||
public static final String DATASOURCE_CONFIG_TYPE = "DatabaseConfigType";
|
||||
|
||||
public void initialize(ConfigurableWebApplicationContext ctx) {
|
||||
|
||||
|
||||
@@ -20,14 +20,10 @@
|
||||
package org.libresonic.player.util;
|
||||
|
||||
import org.libresonic.player.Logger;
|
||||
import org.libresonic.player.service.SettingsService;
|
||||
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@@ -38,7 +34,6 @@ import java.util.*;
|
||||
public final class Util {
|
||||
|
||||
private static final Logger LOG = Logger.getLogger(Util.class);
|
||||
private static final Random RANDOM = new Random(System.currentTimeMillis());
|
||||
|
||||
/**
|
||||
* Disallow external instantiation.
|
||||
@@ -65,10 +60,6 @@ public final class Util {
|
||||
return System.getProperty("os.name", "Windows").toLowerCase().startsWith("windows");
|
||||
}
|
||||
|
||||
public static boolean isWindowsInstall() {
|
||||
return "true".equals(System.getProperty("libresonic.windowsInstall"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to {@link ServletResponse#setContentLength(int)}, but this
|
||||
* method supports lengths bigger than 2GB.
|
||||
@@ -86,90 +77,6 @@ public final class Util {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the local IP address. Honours the "libresonic.host" system property.
|
||||
* <p/>
|
||||
* NOTE: For improved performance, use {@link SettingsService#getLocalIpAddress()} instead.
|
||||
*
|
||||
* @return The local IP, or the loopback address (127.0.0.1) if not found.
|
||||
*/
|
||||
public static String getLocalIpAddress() {
|
||||
List<String> ipAddresses = getLocalIpAddresses();
|
||||
String libresonicHost = System.getProperty("libresonic.host");
|
||||
if (libresonicHost != null && ipAddresses.contains(libresonicHost)) {
|
||||
return libresonicHost;
|
||||
}
|
||||
return ipAddresses.get(0);
|
||||
}
|
||||
|
||||
private static List<String> getLocalIpAddresses() {
|
||||
List<String> result = new ArrayList<String>();
|
||||
|
||||
// Try the simple way first.
|
||||
try {
|
||||
InetAddress address = InetAddress.getLocalHost();
|
||||
if (!address.isLoopbackAddress()) {
|
||||
result.add(address.getHostAddress());
|
||||
}
|
||||
} catch (Throwable x) {
|
||||
LOG.warn("Failed to resolve local IP address.", x);
|
||||
}
|
||||
|
||||
// Iterate through all network interfaces, looking for a suitable IP.
|
||||
try {
|
||||
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
|
||||
while (interfaces.hasMoreElements()) {
|
||||
NetworkInterface iface = interfaces.nextElement();
|
||||
Enumeration<InetAddress> addresses = iface.getInetAddresses();
|
||||
while (addresses.hasMoreElements()) {
|
||||
InetAddress addr = addresses.nextElement();
|
||||
if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) {
|
||||
result.add(addr.getHostAddress());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable x) {
|
||||
LOG.warn("Failed to resolve local IP address.", x);
|
||||
}
|
||||
|
||||
if (result.isEmpty()) {
|
||||
result.add("127.0.0.1");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static int randomInt(int min, int max) {
|
||||
if (min >= max) {
|
||||
return 0;
|
||||
}
|
||||
return min + RANDOM.nextInt(max - min);
|
||||
}
|
||||
|
||||
public static <T> Iterable<T> toIterable(final Enumeration<?> e) {
|
||||
return new Iterable<T>() {
|
||||
public Iterator<T> iterator() {
|
||||
return toIterator(e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static <T> Iterator<T> toIterator(final Enumeration<?> e) {
|
||||
return new Iterator<T>() {
|
||||
public boolean hasNext() {
|
||||
return e.hasMoreElements();
|
||||
}
|
||||
|
||||
public T next() {
|
||||
return (T) e.nextElement();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static <T> List<T> subList(List<T> list, long offset, long max) {
|
||||
return list.subList((int) offset, Math.min(list.size(), (int) (offset + max)));
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
<bean id="dataSource"
|
||||
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
|
||||
|
||||
<property name="driverClassName" value="${database.config.embed.driver}" />
|
||||
<property name="url" value="${database.config.embed.url}" />
|
||||
<property name="username" value="${database.config.embed.username}" />
|
||||
<property name="password" value="${database.config.embed.password}" />
|
||||
<property name="driverClassName" value="${DatabaseConfigEmbedDriver}" />
|
||||
<property name="url" value="${DatabaseConfigEmbedUrl}" />
|
||||
<property name="username" value="${DatabaseConfigEmbedUsername}" />
|
||||
<property name="password" value="${DatabaseConfigEmbedPassword}" />
|
||||
</bean>
|
||||
</beans>
|
||||
@@ -7,6 +7,6 @@
|
||||
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"
|
||||
profile="jndi">
|
||||
<jee:jndi-lookup id="dataSource"
|
||||
jndi-name="${database.config.jndi.name}"
|
||||
jndi-name="${DatabaseConfigJNDIName}"
|
||||
expected-type="javax.sql.DataSource" />
|
||||
</beans>
|
||||
@@ -23,7 +23,7 @@
|
||||
</bean>
|
||||
|
||||
<bean id="userTableQuote" class="java.lang.String">
|
||||
<constructor-arg value="${database.usertable.quote:}" />
|
||||
<constructor-arg value="${DatabaseUsertableQuote:}" />
|
||||
</bean>
|
||||
|
||||
<bean id="liquibase" class="org.libresonic.player.spring.SpringLiquibase">
|
||||
@@ -33,7 +33,7 @@
|
||||
<property name="changeLogParameters">
|
||||
<map>
|
||||
<entry key="defaultMusicFolder" value="#{T(org.libresonic.player.util.Util).getDefaultMusicFolder()}" />
|
||||
<entry key="varcharLimit" value="${database.varchar.maxlength:512}" />
|
||||
<entry key="mysqlVarcharLimit" value="${DatabaseMysqlMaxlength:512}" />
|
||||
<entry key="userTableQuote" value-ref="userTableQuote" />
|
||||
</map>
|
||||
</property>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<property name="binary_type" dbms="hsqldb" value="binary" />
|
||||
<property name="binary_type" value="blob" />
|
||||
<property name="curr_date_expr" value="current_timestamp" />
|
||||
<property name="varchar_type" dbms="mysql" value="varchar(${varcharLimit})" />
|
||||
<property name="varchar_type" dbms="mysql" value="varchar(${mysqlVarcharLimit})" />
|
||||
<property name="varchar_type" value="varchar" />
|
||||
<include file="legacy/legacy-changelog.xml" relativeToChangelogFile="true"/>
|
||||
<include file="6.2/changelog.xml" relativeToChangelogFile="true"/>
|
||||
|
||||
+33
@@ -340,6 +340,7 @@ settingsheader.user = Users
|
||||
settingsheader.search = Search/caching
|
||||
settingsheader.coverArt = Cover art
|
||||
settingsheader.password = Password
|
||||
settingsheader.database = Database
|
||||
|
||||
# generalSettings.jsp
|
||||
generalsettings.playlistfolder = Import playlists from
|
||||
@@ -599,6 +600,22 @@ usersettings.ldapdisabled = LDAP authentication is not enabled. See Advanced set
|
||||
usersettings.passwordnotsupportedforldap = Can't set or change password for LDAP-authenticated users.
|
||||
usersettings.ok = Password successfully changed for user {0}.
|
||||
|
||||
# databaseSettings.jsp
|
||||
databasesettings.moreinfo = Additional information on database settings can be read at \
|
||||
<a href="https://github.com/Libresonic/libresonic/blob/develop/documentation/DATABASE.md">DATABASE.md</a> on the \
|
||||
Libresonic github page.
|
||||
databasesettings.configtype = Database Connection Source
|
||||
databasesettings.mysqlvarcharmaxlength = MySQL Varchar Maximum Length
|
||||
databasesettings.usertablequote = User table Quote
|
||||
databasesettings.jndiname = Data Source JNDI Lookup Name
|
||||
databasesettings.jdbclibrary = Please ensure that you have your database driver on your \
|
||||
<a href="https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html">Java Classpath</a>
|
||||
databasesettings.embeddriver = JDBC Driver Java classname
|
||||
databasesettings.embedurl = JDBC URL
|
||||
databasesettings.embedusername = JDBC Username
|
||||
databasesettings.embedpassword = JDBC Password
|
||||
databasettings.restartRequired = Database settings require a restart to take affect.
|
||||
|
||||
# main.jsp
|
||||
main.up = Up
|
||||
main.playall = Play all
|
||||
@@ -732,6 +749,22 @@ helppopup.transcode.title = Max bitrate
|
||||
helppopup.transcode.text = <p>If you have constrained bandwidth, you may set an upper limit for the bitrate of the music streams. \
|
||||
For instance, if your original mp3 files are encoded using 256 Kbps (kilobits per second), setting max bitrate \
|
||||
to 128 will make {0} automatically resample the music from 256 to 128 Kbps.</p>
|
||||
helppopup.databaseConfigType.title = Data Source Config Type
|
||||
helppopup.databaseConfigType.text = <p>Legacy will default to an embed H2 database which is the backwards compatible \
|
||||
option. Embedded JDBC will connect to a JDBC database with the provided settings. JNDI will lookup \
|
||||
a DataSource connection already setup in your application container.</p>
|
||||
helppopup.mysqlvarcharmaxlength.title = MySQL Varchar Max Length
|
||||
helppopup.mysqlvarcharmaxlength.text = <p>MySQL has a maximum row length and as such needs varchar columns to be \
|
||||
bounded. This value entered here will be the maximum column size.</p>
|
||||
helppopup.usertablequote.title = User Table Quote
|
||||
helppopup.usertablequote.text = <p>The Libresonic users table is named user. This may be a keyword conflict in some \
|
||||
databases such as Postgres. So for postgres, you will want to use the double quote character (") here</p>
|
||||
helppopup.jndiname.title = Data Source JNDI Lookup Name
|
||||
helppopup.jndiname.text = A JNDI name to lookup a Data Source of type javax.sql.DataSource. This is something that is\
|
||||
created in your application container (i.e. tomcat).
|
||||
helppopup.embeddriver.title = JDBC Driver Class
|
||||
helppopup.embeddriver.text = JDBC Driver dependent class name that implments java.sql.Driver. I.E. for postgres one \
|
||||
would use org.postgresql.Driver. This class must be present on the classpath.
|
||||
helppopup.playlistfolder.title = Import playlist from
|
||||
helppopup.playlistfolder.text = <p>Libresonic will regularly import playlists stored in this folder.</p>
|
||||
helppopup.musicmask.title = Music files
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %>
|
||||
<%--@elvariable id="command" type="org.libresonic.player.command.DatabaseSettingsCommand"--%>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<%@ include file="head.jsp" %>
|
||||
<%@ include file="jquery.jsp" %>
|
||||
<script>
|
||||
function updateShownOptions() {
|
||||
$(".hideawayDatabaseOptions").hide();
|
||||
var value = $('select#configType').val();
|
||||
var objToShow = $("#" + value + "DatabaseOptions");
|
||||
if (objToShow.length) {
|
||||
objToShow.show();
|
||||
}
|
||||
if(value != 'LEGACY') {
|
||||
$("#nonLEGACYDatabaseOptions").show();
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
updateShownOptions();
|
||||
$('select#configType').on('change', function () {
|
||||
updateShownOptions();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body class="mainframe bgcolor1">
|
||||
<script type="text/javascript" src="<c:url value="/script/wz_tooltip.js"/>"></script>
|
||||
<script type="text/javascript" src="<c:url value="/script/tip_balloon.js"/>"></script>
|
||||
|
||||
<c:import url="settingsHeader.jsp">
|
||||
<c:param name="cat" value="database"/>
|
||||
<c:param name="toast" value="${settings_toast}"/>
|
||||
</c:import>
|
||||
|
||||
<form:form commandName="command" action="databaseSettings.view" method="post">
|
||||
<p><fmt:message key="databasesettings.moreinfo"/></p>
|
||||
|
||||
<table style="white-space:nowrap" class="indent">
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.configtype"/></td>
|
||||
<td>
|
||||
<form:select path="configType" cssStyle="width:12em" id="configType">
|
||||
<form:option value="LEGACY" label="Legacy"/>
|
||||
<form:option value="EMBED" label="Embedded JDBC"/>
|
||||
<form:option value="JNDI" label="JNDI"/>
|
||||
</form:select>
|
||||
<c:import url="helpToolTip.jsp"><c:param name="topic" value="databaseConfigType"/></c:import>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id="EMBEDDatabaseOptions" class="hideawayDatabaseOptions">
|
||||
<table style="white-space:nowrap;" class="indent">
|
||||
<table style="white-space:nowrap;" class="indent">
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.embeddriver"/></td>
|
||||
<td>
|
||||
<form:input path="embedDriver" size="30"/>
|
||||
<c:import url="helpToolTip.jsp"><c:param name="topic" value="embeddriver"/></c:import>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.embedurl"/></td>
|
||||
<td>
|
||||
<form:input path="embedUrl" size="58"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.embedusername"/></td>
|
||||
<td>
|
||||
<form:input path="embedUsername" size="36"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.embedpassword"/></td>
|
||||
<td>
|
||||
<form:input path="embedPassword" size="36"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div id="JNDIDatabaseOptions" class="hideawayDatabaseOptions">
|
||||
<table style="white-space:nowrap;" class="indent">
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.jndiname"/></td>
|
||||
<td>
|
||||
<form:input path="JNDIName" size="36"/>
|
||||
<c:import url="helpToolTip.jsp"><c:param name="topic" value="jndiname"/></c:import>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="nonLEGACYDatabaseOptions" class="hideawayDatabaseOptions">
|
||||
<table style="white-space:nowrap" class="indent">
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.mysqlvarcharmaxlength"/></td>
|
||||
<td>
|
||||
<form:input path="mysqlVarcharMaxlength" size="8"/>
|
||||
<c:import url="helpToolTip.jsp"><c:param name="topic" value="mysqlvarcharmaxlength"/></c:import>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><fmt:message key="databasesettings.usertablequote"/></td>
|
||||
<td>
|
||||
<form:input path="usertableQuote" size="1" htmlEscape="true"/>
|
||||
<c:import url="helpToolTip.jsp"><c:param name="topic" value="usertablequote"/></c:import>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="warning"><fmt:message key="databasesettings.jdbclibrary"/></p>
|
||||
</div>
|
||||
|
||||
<p class="warning"><fmt:message key="databasettings.restartRequired"/></p>
|
||||
|
||||
<p>
|
||||
<input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em">
|
||||
<input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'">
|
||||
</p>
|
||||
|
||||
</form:form>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -9,7 +9,7 @@
|
||||
</script>
|
||||
</c:if>
|
||||
|
||||
<c:set var="categories" value="${param.restricted ? 'personal password player share' : 'musicFolder general advanced personal user player share dlna sonos transcoding internetRadio podcast'}"/>
|
||||
<c:set var="categories" value="${param.restricted ? 'personal password player share' : 'musicFolder general advanced personal user player share dlna sonos transcoding internetRadio podcast database'}"/>
|
||||
<h1>
|
||||
<img src="<spring:theme code="settingsImage"/>" alt=""/>
|
||||
<span style="vertical-align: middle"><fmt:message key="settingsheader.title"/></span>
|
||||
|
||||
Reference in New Issue
Block a user