/*
* Copyright (c) 2014.
*
* BaasBox - info-at-baasbox.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baasbox.configuration;
import com.baasbox.service.logging.BaasBoxLogger;
import com.baasbox.configuration.index.IndexApplicationConfiguration;
import com.baasbox.security.ISessionTokenProvider;
import com.baasbox.security.SessionTokenProvider;
import com.google.common.annotations.VisibleForTesting;
public enum Application implements IProperties{
APPLICATION_NAME("application.name", "The App name", String.class),
SESSION_TOKENS_TIMEOUT("session_tokens.timeout", "The expiration time of the session tokens (in minutes). WARNING: the admin console refreshes the session token every 5 minutes, if you set a value lower than 5, you may experience disconnection from the console. To disable expiration set it to 0.", Integer.class,
//this callback function is invoked when the value changes. It sets the timeout for the session tokens
new IPropertyChangeCallback(){
public void change(final Object iCurrentValue, final Object iNewValue){
ISessionTokenProvider stp = SessionTokenProvider.getSessionTokenProvider();
stp.setTimeout(Integer.parseInt(iNewValue.toString())*60000);
}
}),
NETWORK_HTTP_SSL("network.http.ssl", "Set to TRUE if the BaasBox server is reached via SSL through a reverse proxy.", Boolean.class),
NETWORK_HTTP_URL("network.http.url", "The public url of the BaasBox server. I.e. the url used by the App to contact BaasBox, without the protocol prefix (i.e. http://) and PORT", String.class),
NETWORK_HTTP_PORT("network.http.port", "The public TCP port used by the App to contact BaasBox. Please note: when behind a reverse proxy, this could be different from the port used by BaasBox.", Integer.class);
private final String key;
private final Class<?> type;
private String description;
private IPropertyChangeCallback changeCallback = null;
//override
private boolean editable=true;
private boolean visible=true;
private Object overriddenValue=null;
private boolean overridden=false;
Application(final String iKey, final String iDescription, final Class<?> iType,
final IPropertyChangeCallback iChangeAction) {
this(iKey, iDescription, iType);
changeCallback = iChangeAction;
}
Application(final String iKey, final String iDescription, final Class<?> iType) {
key = iKey;
description = iDescription;
type = iType;
}
@Override
public void setValue(Object newValue) throws IllegalStateException{
if (!editable) throw new IllegalStateException("The value cannot be changed");
_setValue(newValue);
}
@Override
public void _setValue(Object newValue) {
Object parsedValue=null;
if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("New setting value, key: " + this.key + ", type: "+ this.type + ", new value: " + newValue);
if (newValue != null)
if (type == Boolean.class)
parsedValue = Boolean.parseBoolean(newValue.toString());
else if (type == Integer.class)
parsedValue = Integer.parseInt(newValue.toString());
else if (type == Float.class)
parsedValue = Float.parseFloat(newValue.toString());
else if (type == String.class)
parsedValue = newValue.toString();
else
parsedValue = newValue;
if (changeCallback != null) changeCallback.change(getValue(), newValue);
IndexApplicationConfiguration idx;
try {
idx = new IndexApplicationConfiguration();
idx.put(key, parsedValue);
} catch (Exception e) {
BaasBoxLogger.error("Could not store key " + key, e);
throw new RuntimeException("Could not store key " + key,e);
}
}
@Override
public Object getValue() {
if (overridden) return overriddenValue;
return _getValue();
}
@Override
public Object _getValue() {
IndexApplicationConfiguration idx;
try {
idx = new IndexApplicationConfiguration();
if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("getting "+key+" from index");
return idx.get(key);
} catch (Exception e) {
BaasBoxLogger.error("Could not retrieve key " + key, e);
}
return null;
}
@Override
public boolean getValueAsBoolean() {
Object v = getValue();
return v instanceof Boolean ? ((Boolean) v).booleanValue() : Boolean.parseBoolean(v.toString());
}
@Override
public String getValueAsString() {
Object v = getValue();
return v != null ? v.toString() : null;
}
@Override
public int getValueAsInteger() {
Object v = getValue();
return (int) (v instanceof Number ? ((Number) v).intValue() : Integer.parseInt(v.toString()));
}
@Override
public long getValueAsLong() {
Object v = getValue();
return (long) (v instanceof Number ? ((Number) v).longValue() : Long.parseLong(v.toString()));
}
@Override
public float getValueAsFloat() {
Object v = getValue();
return (float) (v instanceof Number ? ((Number) v).floatValue() : Float.parseFloat(v.toString()));
}
@Override
public String getKey() {
return key;
}
@Override
public Class<?> getType() {
return type;
}
@Override
public String getValueDescription() {
return description;
}
public static String getEnumDescription() {
return "Configurations for general App(lication) related properties";
}
@Override
public void override(Object newValue) {
Object parsedValue=null;
if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("New setting value, key: " + this.key + ", type: "+ this.type + ", new value: " + newValue);
if (changeCallback != null) changeCallback.change(getValue(), newValue);
if (newValue != null)
if (type == Boolean.class)
parsedValue = Boolean.parseBoolean(newValue.toString());
else if (type == Integer.class)
parsedValue = Integer.parseInt(newValue.toString());
else if (type == Float.class)
parsedValue = Float.parseFloat(newValue.toString());
else if (type == String.class)
parsedValue = newValue.toString();
else
parsedValue = newValue;
this.overriddenValue=parsedValue;
this.overridden=true;
this.editable=false;
}
@Override
public void setEditable(boolean editable) {
this.editable = editable;
}
@Override
public void setVisible(boolean visible) {
this.visible = visible;
}
@Override
public boolean isOverridden() {
return overridden;
}
@Override
public boolean isVisible() {
return visible;
}
@Override
public boolean isEditable() {
return editable;
}
@VisibleForTesting
public void _setOverridden(boolean value){
this.overridden=value;
}
}