/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* 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 org.apache.jetspeed.services.webpage;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Properties;
import javax.servlet.ServletException;
import org.apache.log4j.Logger;
/*
* Mutable Configuration settings for the WebPage Service
* Provides the singleton interface to the WebPage Service configuration state.
* The state of the configuration is serialized to persistence store in standard
* java <code>java.util.Parameter</code> format (name/value/pair)
*
* @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
* @version $Id: Configuration.java,v 1.2 2004/02/23 03:46:26 jford Exp $
*/
public class Configuration
{
public static final String WPS_SERVLET = "/wps";
public static final int STATUS_NOT_CONFIGURED = 0;
public static final int STATUS_ONLINE = 1;
public static final int STATUS_OFFLINE = -1;
static Logger log = Logger.getLogger(Configuration.class);
// Key and default value for SID Query Request parameter
public static final String KEY_WPS_SID = "wps.sid";
public static final String WPS_SID = "wpsid";
private String sid = WPS_SID; // cached value
// Key and default value for PATH Query Request parameter
public static final String KEY_WPS_PATH = "wps.path";
public static final String WPS_PATH = "wpspath";
private String path = WPS_PATH; // cached value
// Key and default value for URL Query Request parameter
public static final String KEY_WPS_URL = "wps.url";
public static final String WPS_URL = "wps.url";
private String url = WPS_URL; // cached value
// Key and default value for DEBUG setting
public static final String KEY_WPS_DEBUG = "wps.debug";
private boolean debug = false; // cached value
// Key and default value for Parser setting
public static final String KEY_PARSER = "parser.default";
public static final String PARSER_SWING = "swing";
public static final String PARSER_OPENXML = "openxml";
private String parser = PARSER_SWING; // cached value
// Key and default value for Content Log Enabling/Disabling
public static final String KEY_LOG_ENABLE = "log.content.enable";
private boolean enableContentLog = false;
// Key and default value for ContentLog Location
public static final String KEY_LOG_LOCATION = "log.content.location";
public static final String WPS_LOG_LOCATION = "/WEB-INF/logs/wps-content.log";
private String logLocation = WPS_LOG_LOCATION; // cached value
// Key and default value for Content Log Reset on Startup
public static final String KEY_LOG_RESET = "log.content.reset";
private boolean resetContentLog = false;
// Key and default value for Webapp name
public static final String KEY_WEBAPP = "wps.webapp.name";
public static final String WPS_WEBAPP = "/jetspeed";
private String webapp = WPS_WEBAPP; // cached value
// Key and default value for Login Path web application
public static final String KEY_LOGIN = "ne.webapp.login";
public static final String WPS_LOGIN = "/jetspeed/loginController.php";
private String login = WPS_LOGIN; // cached value
// Key and default value for Logout Path web application
public static final String KEY_LOGOUT = "ne.webapp.logout";
public static final String WPS_LOGOUT = "/jetspeed/logoutController.php";
private String logout = WPS_LOGOUT; // cached value
// Key and default value for User Session Key
public static final String KEY_USER_SESSION = "user.session.key";
public static final String WPS_USER_SESSION = "turbine.user";
private String userSessionKey = WPS_USER_SESSION; // cached value
// Key and default value for Default User
public static final String KEY_USER_DEFAULT = "user.default";
public static final String WPS_USER_DEFAULT = "joe";
private String userDefault = WPS_USER_DEFAULT; // cached value
// Key and default value for Web Interface User Parameter
public static final String KEY_PARAM_USER = "ne.webapp.param.username";
public static final String WPS_PARAM_USER = "da_username";
private String paramUser = WPS_PARAM_USER; // cached value
// Key and default value for Web Interface Password Parameter
public static final String KEY_PARAM_PASSWORD = "webapp.param.password";
public static final String WPS_PARAM_PASSWORD = "da_password";
private String paramPassword = WPS_PARAM_PASSWORD; // cached value
// Key and default value for Web Interface Permission Parameter
public static final String KEY_PARAM_PERMISSIONS = "webapp.param.permissions";
public static final String WPS_PARAM_PERMISSIONS = "serialized_permissions";
private String paramPermissions = WPS_PARAM_PERMISSIONS; // cached value
// Key and default value for Web Interface Login Failure String
public static final String KEY_LOGIN_FAILURE = "webapp.login.failure";
public static final String WPS_LOGIN_FAILURE = "LOGIN FAIL";
private String loginFailureString = WPS_LOGIN_FAILURE; // cached value
// Key and default value for Web Interface Login Success String
public static final String KEY_LOGIN_SUCCESS = "webapp.login.success";
public static final String WPS_LOGIN_SUCCESS = "LOGIN SUCCESS";
private String loginSuccessString = WPS_LOGIN_SUCCESS; // cached value
// keys that don't need to be cached for performance
public static final String KEY_CONTENT_INFO = "content.info";
public static final String KEY_CONTENT_ERROR = "content.error";
// constants
public static final String TRUE_VALUE = "true";
public static final String FALSE_VALUE = "false";
// singleton instance
private static Configuration instance = null;
// the properties are contained in memory here
private Properties properties;
// path to the properties NVP (name/value/pair) file
private String ppath;
// text placed into the first line of the configuration file.
public static final String HEADER = "Jetspeed Web Page Service Configuration Properties";
/*
* Singleton instance factory.
*
* @return the Configuration singleton
*
*/
public static Configuration getInstance()
{
return instance;
}
/*
* Singleton instance factory. Call this to get the initial instance, loaded
* the state from persistent store.
*
* @return the Configuration singleton
* @throws ServletException
*/
public static Configuration getInitialInstance(String ppath) throws ServletException
{
if (instance == null)
{
Properties properties = new Properties();
try
{
properties.load(new FileInputStream(ppath));
instance = new Configuration(properties, ppath);
instance.refresh();
}
catch (Exception e)
{
log.debug(e.toString());
instance = null;
}
}
return instance;
}
/*
* Private constructor for singleton configuration.
*
* @param properties the properties collection for this configuration
* @param path the path to the properties file
*
*/
private Configuration(Properties properties, String ppath)
{
this.properties = properties;
this.ppath = ppath;
}
/*
* Used to obtain a configuration property.
*
* @param name - the property name
* @return the property value or <code>null</code> if the property isn't found
*
*/
public String getProperty(String name)
{
return properties.getProperty(name);
}
/*
* Inserts a new property or updates an existing one.
* @param name - the property name
* @param value - the property value
*
*/
public void setProperty(String name, String value)
{
properties.setProperty(name, value);
OutputStream out;
try
{
out = new FileOutputStream(ppath);
properties.store(out, HEADER);
out.close();
}
catch (FileNotFoundException e)
{
String error = "Unable to update configuration file " + ppath + e.toString();
log.debug(error);
}
catch (SecurityException e)
{
String error = "Unable to update configuration file " + ppath + e.toString();
log.debug(error);
}
catch (IOException e)
{
String error = "Error updating configuration file " + ppath + e.toString();
log.debug(error);
}
out = null;
}
/*
* Refresh the configuration internal state from the properties persistent store.
*
*/
public void refresh()
{
String result = getInstance().getProperty(Configuration.KEY_WPS_DEBUG);
if (null == result)
{
debug = false;
}
else
{
debug = (result.equalsIgnoreCase(TRUE_VALUE));
}
sid = getInstance().getProperty(Configuration.KEY_WPS_SID);
if (null == sid)
{
sid = WPS_SID;
}
path = getInstance().getProperty(Configuration.KEY_WPS_PATH);
if (null == path)
path = WPS_PATH;
url = getInstance().getProperty(Configuration.KEY_WPS_URL);
if (null == url)
url = WPS_URL;
parser = getInstance().getProperty(Configuration.KEY_PARSER);
if (null == parser)
parser = PARSER_SWING;
result = getInstance().getProperty(Configuration.KEY_LOG_ENABLE);
if (null == result)
enableContentLog = false;
else
enableContentLog = (result.equalsIgnoreCase(TRUE_VALUE));
logLocation = getInstance().getProperty(Configuration.KEY_LOG_LOCATION);
if (null == logLocation)
logLocation = WPS_LOG_LOCATION;
result = getInstance().getProperty(Configuration.KEY_LOG_RESET);
if (null == result)
resetContentLog = false;
else
resetContentLog = (result.equalsIgnoreCase(TRUE_VALUE));
webapp = getInstance().getProperty(Configuration.KEY_WEBAPP);
if (null == webapp)
webapp = WPS_WEBAPP;
login = getInstance().getProperty(Configuration.KEY_LOGIN);
if (null == login)
login = WPS_LOGIN;
logout = getInstance().getProperty(Configuration.KEY_LOGOUT);
if (null == logout)
login = WPS_LOGOUT;
userSessionKey = getInstance().getProperty(Configuration.KEY_USER_SESSION);
if (null == userSessionKey)
userSessionKey = WPS_USER_SESSION;
userDefault = getInstance().getProperty(Configuration.KEY_USER_DEFAULT);
if (null == userDefault)
userDefault = WPS_USER_DEFAULT;
paramUser = getInstance().getProperty(Configuration.KEY_PARAM_USER);
if (null == paramUser)
paramUser = WPS_PARAM_USER;
paramPassword = getInstance().getProperty(Configuration.KEY_PARAM_PASSWORD);
if (null == paramPassword)
paramPassword = WPS_PARAM_PASSWORD;
paramPermissions = getInstance().getProperty(Configuration.KEY_PARAM_PERMISSIONS);
if (null == paramPermissions)
paramPermissions = WPS_PARAM_PERMISSIONS;
loginFailureString = getInstance().getProperty(Configuration.KEY_LOGIN_FAILURE);
if (null == loginFailureString)
loginFailureString = WPS_LOGIN_FAILURE;
loginSuccessString = getInstance().getProperty(Configuration.KEY_LOGIN_SUCCESS);
if (null == loginSuccessString)
loginSuccessString = WPS_LOGIN_SUCCESS;
}
/*
* Static accessors for convenient access to configuration state.
*
*/
public boolean getDebug()
{
return debug;
}
public String getSID()
{
return sid;
}
public String getPath()
{
return path;
}
public String getURL()
{
return url;
}
public String getParser()
{
return parser;
}
public boolean getEnableContentLog()
{
return enableContentLog;
}
public String getLogLocation()
{
return logLocation;
}
public boolean getResetContentLog()
{
return resetContentLog;
}
public String getWebapp()
{
return webapp;
}
public String getLogin()
{
return login;
}
public String getLogout()
{
return logout;
}
public String getUserSessionKey()
{
return userSessionKey;
}
public String getDefaultUser()
{
return userDefault;
}
public String getParamUser()
{
return paramUser;
}
public String getParamPassword()
{
return paramPassword;
}
public String getParamPermissions()
{
return paramPermissions;
}
public String getLoginFailureString()
{
return loginFailureString;
}
public String getLoginSuccessString()
{
return loginSuccessString;
}
/*
* Create a go-between String using the format expected by the WPS.
*
* Example:
*
* http://<ProxyHostAddess>/jetProxy?jaid=1.Element?japath=/somestuff/Controller.php
*
* @param proxyHost The base URL of the proxy server's host, i.e (http://localhost).
* @param neid The unique network element id.
* @param resource The resource to be proxied. This can be a combination of the relative
* path + the resource, or just solely the resource.
* @param relativePath The relative path to the resource. Necessary for request-relative
* resources. Specify as null to disable this parameter.
*/
public static String createProxyString(String proxyHost,
String neid,
String resource,
String relativePath)
{
String base = WebPageHelper.concatURLs(proxyHost, WPS_SERVLET);
StringBuffer buffer = new StringBuffer(base);
//
// build the request string in proxy server expected format
//
// Example:
//
// http://<ProxyHostAddess>/jetProxy?jaid=1.Element?japath=/somestuff/Controller.php
//
buffer.append("?");
buffer.append(getInstance().getSID());
buffer.append("=");
buffer.append(neid);
buffer.append("&");
buffer.append(getInstance().getPath());
buffer.append("=");
//
// Is it a request-relative or webapp-relative resource?
// When the target resource starts with "/", then it is webapp-relative
// otherwise it is request-relative. When request relative, use the
// path from the original request to find the resource, otherwise take
// the resource as is.
//
if (null != relativePath && !resource.startsWith("/"))
{
// its request-relative, use path from request
buffer.append(relativePath);
}
buffer.append(resource.replace('&', '@'));
String proxiedPath = buffer.toString();
return proxiedPath;
}
}