/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jumpmind.symmetric.service.impl;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.ISqlTemplate;
import org.jumpmind.db.sql.Row;
import org.jumpmind.properties.TypedProperties;
import org.jumpmind.symmetric.ITypedPropertiesFactory;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.config.IParameterFilter;
import org.jumpmind.symmetric.config.IParameterSaveFilter;
import org.jumpmind.symmetric.model.DatabaseParameter;
import org.jumpmind.symmetric.service.IParameterService;
/**
* @see IParameterService
*/
public class ParameterService extends AbstractParameterService implements IParameterService {
String tablePrefix;
private ITypedPropertiesFactory factory;
private ParameterServiceSqlMap sql;
private ISqlTemplate sqlTemplate;
private Date lastUpdateTime;
public ParameterService(IDatabasePlatform platform, ITypedPropertiesFactory factory, String tablePrefix) {
this.tablePrefix = tablePrefix;
this.factory = factory;
this.sql = new ParameterServiceSqlMap(platform, AbstractService.createSqlReplacementTokens(
tablePrefix, platform.getDatabaseInfo().getDelimiterToken()));
this.sqlTemplate = platform.getSqlTemplate();
}
public String getTablePrefix() {
return this.tablePrefix;
}
public boolean refreshFromDatabase() {
Date date = sqlTemplate.queryForObject(sql.getSql("selectMaxLastUpdateTime"), Date.class);
if (date != null) {
if (lastUpdateTime == null || lastUpdateTime.before(date)) {
if (lastUpdateTime != null) {
log.info("Newer database parameters were detected");
}
lastUpdateTime = date;
rereadParameters();
return true;
}
}
return false;
}
/**
* Save a parameter that applies to {@link ParameterConstants#ALL} external
* ids and all node groups.
*/
public void saveParameter(String key, Object paramValue, String lastUpdateBy) {
this.saveParameter(ParameterConstants.ALL, ParameterConstants.ALL, key, paramValue, lastUpdateBy);
}
public void saveParameter(String externalId, String nodeGroupId, String key, Object paramValue, String lastUpdateBy) {
paramValue = paramValue != null ? paramValue.toString() : null;
if (extensionService != null) {
for (IParameterSaveFilter filter : extensionService.getExtensionPointList(IParameterSaveFilter.class)) {
paramValue = filter.filterSaveParameter(key, (String) paramValue);
}
}
int count = sqlTemplate.update(sql.getSql("updateParameterSql"), new Object[] { paramValue, lastUpdateBy,
externalId, nodeGroupId, key });
if (count == 0) {
sqlTemplate.update(sql.getSql("insertParameterSql"), new Object[] { externalId,
nodeGroupId, key, paramValue, lastUpdateBy });
}
rereadParameters();
}
public void deleteParameter(String externalId, String nodeGroupId, String key) {
sqlTemplate.update(sql.getSql("deleteParameterSql"), externalId, nodeGroupId, key);
rereadParameters();
}
public void deleteParameterWithUpdate(String externalId, String nodeGroupId, String key) {
String oldSql = sql.getSql("deleteParameterSql");
String newSql = "";
int j = 0;
for (int i = 0; i < oldSql.length(); i++) {
if (oldSql.charAt(i) == '?') {
if (j == 0) {
newSql += "'" + externalId + "'";;
} else if (j == 1) {
newSql += "'" + nodeGroupId + "'";
} else {
newSql += "'" + key + "'";
}
j++;
} else {
newSql += oldSql.charAt(i);
}
}
sqlTemplate.update(newSql);
}
public void saveParameters(String externalId, String nodeGroupId, Map<String, Object> parameters, String lastUpdateBy) {
Set<String> keys = parameters.keySet();
for (String key : keys) {
saveParameter(externalId, nodeGroupId, key, parameters.get(key), lastUpdateBy);
}
}
protected TypedProperties readParametersFromDatabase(String sqlKey, Object... values) {
final TypedProperties properties = new TypedProperties();
final IParameterFilter filter = extensionService != null ? extensionService.getExtensionPoint(IParameterFilter.class) : null;
sqlTemplate.query(sql.getSql(sqlKey), new ISqlRowMapper<Object>() {
public Object mapRow(Row row) {
String key = row.getString("param_key");
String value = row.getString("param_value");
if (filter != null) {
value = filter.filterParameter(key, value);
}
if (value != null) {
properties.setProperty(key, value);
}
return row;
}
}, values);
return properties;
}
public boolean isRegistrationServer() {
return StringUtils.isBlank(getRegistrationUrl())
|| getRegistrationUrl().equals(getSyncUrl());
}
protected TypedProperties rereadApplicationParameters() {
TypedProperties p = this.factory.reload();
p.putAll(systemProperties);
p.putAll(rereadDatabaseParameters(p));
return p;
}
public List<DatabaseParameter> getDatabaseParametersFor(String paramKey) {
return sqlTemplate.query(sql.getSql("selectParametersByKeySql"),
new DatabaseParameterMapper(), paramKey);
}
public TypedProperties getDatabaseParameters(String externalId, String nodeGroupId) {
return readParametersFromDatabase("selectParametersSql", externalId, nodeGroupId);
}
class DatabaseParameterMapper implements ISqlRowMapper<DatabaseParameter> {
IParameterFilter filter = extensionService != null ? extensionService.getExtensionPoint(IParameterFilter.class) : null;
public DatabaseParameter mapRow(Row row) {
String key = row.getString("param_key");
String value = row.getString("param_value");
if (filter != null) {
value = filter.filterParameter(key, value);
}
return new DatabaseParameter(key, value, row.getString("external_id"), row.getString("node_group_id"));
}
}
}