blob: 004abca8e16d6719557c387e858b40ef74d0ccb2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002-2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsi.internal.core.monitor.config.impl;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import org.eclipse.wst.wsi.internal.core.WSIConstants;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.WSIFileNotFoundException;
import org.eclipse.wst.wsi.internal.core.common.AddStyleSheet;
import org.eclipse.wst.wsi.internal.core.common.impl.AddStyleSheetImpl;
import org.eclipse.wst.wsi.internal.core.monitor.config.Comment;
import org.eclipse.wst.wsi.internal.core.monitor.config.ManInTheMiddle;
import org.eclipse.wst.wsi.internal.core.monitor.config.MonitorConfig;
import org.eclipse.wst.wsi.internal.core.monitor.config.MonitorConfigReader;
import org.eclipse.wst.wsi.internal.core.monitor.config.Redirect;
import org.eclipse.wst.wsi.internal.core.util.MessageList;
import org.eclipse.wst.wsi.internal.core.util.TestUtils;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Defines the implementation used to read the monitor config documents.
*
* @version 1.0.1
* @author Peter Brittenham (peterbr@us.ibm.com)
*/
public class MonitorConfigReaderImpl implements MonitorConfigReader
{
/**
* Message list reference.
*/
protected MessageList messageList = null;
/**
* Document location.
*/
protected String documentURI;
/**
* Initialize monitor config.
*/
public void init(MessageList messageList)
{
this.messageList = messageList;
}
/* (non-Javadoc)
* @see org.wsi.test.monitor.config.MonitorConfigReader#readMonitorConfig(String)
*/
public MonitorConfig readMonitorConfig(String monitorConfigURI)
throws WSIException
{
FileReader fileReader = null;
try
{
fileReader = new FileReader(monitorConfigURI);
}
catch (FileNotFoundException fnfe)
{
throw new WSIFileNotFoundException(
getMessage("config02", monitorConfigURI, "Could not find file:"),
fnfe);
}
catch (Exception e)
{
throw new WSIException(
getMessage("config03", monitorConfigURI, "Could not read file:"),
e);
}
return readMonitorConfig(fileReader);
}
/* (non-Javadoc)
* @see org.wsi.test.monitor.config.MonitorConfigReader#readMonitorConfig(Reader)
*/
public MonitorConfig readMonitorConfig(Reader reader) throws WSIException
{
MonitorConfig monitorConfig = new MonitorConfigImpl();
// Parse XML
Document doc = XMLUtils.parseXML(reader);
// Parse elements in the config document
parseConfigElement(monitorConfig, doc.getDocumentElement());
return monitorConfig;
}
/* (non-Javadoc)
* @see org.wsi.test.document.DocumentReader#getLocation()
*/
public String getLocation()
{
return this.documentURI;
}
/* (non-Javadoc)
* @see org.wsi.test.document.DocumentReader#setLocation(String)
*/
public void setLocation(String documentURI)
{
this.documentURI = documentURI;
}
/**
* Parse config element.
*/
private void parseConfigElement(MonitorConfig monitorConfig, Element element)
throws WSIException
{
// ADD: Verify that this is the config element
// Get first child element
Element nextElement = XMLUtils.getFirstChild(element);
boolean isLogDurationDefine = false;
boolean isCleanupTimeoutSecondsDefine = false;
// Process each child element
while (nextElement != null)
{
// <logFile>
if (isElement(nextElement, WSIConstants.ELEM_LOG_FILE))
{
// Parse the log element
parseLogFileElement(monitorConfig, nextElement);
}
// <logDuration>
else if (isElement(nextElement, WSIConstants.ELEM_LOG_DURATION))
{
monitorConfig.setLogDuration(getIntValue(nextElement));
if (monitorConfig.getLogDuration() < 0)
throw new IllegalArgumentException(
getMessage(
"config09",
WSIConstants.ELEM_LOG_DURATION,
"Parameter value can't be negative. Element name:"));
isLogDurationDefine = true;
}
// <cleanupTimeoutSeconds>
else if (
isElement(nextElement, WSIConstants.ELEM_CLEANUP_TIMEOUT_SECONDS))
{
monitorConfig.setTimeout(getIntValue(nextElement));
if (monitorConfig.getTimeout() < 0)
throw new IllegalArgumentException(
getMessage(
"config09",
WSIConstants.ELEM_CLEANUP_TIMEOUT_SECONDS,
"Parameter value can't be negative. Element name:"));
isCleanupTimeoutSecondsDefine = true;
}
// <manInTheMiddle>
else if (isElement(nextElement, WSIConstants.ELEM_MAN_IN_THE_MIDDLE))
{
ManInTheMiddle manInTheMiddle = new ManInTheMiddleImpl();
monitorConfig.setManInTheMiddle(manInTheMiddle);
parseManInTheMiddleElement(manInTheMiddle, nextElement);
}
// <comment>
else if (isElement(nextElement, WSIConstants.ELEM_COMMENT))
{
Comment comment = new CommentImpl();
comment.setText(XMLUtils.getText(nextElement));
monitorConfig.setComment(comment);
}
else
{
// ADD: handle invalid elements
}
// Get next element
nextElement = XMLUtils.getNextSibling(nextElement);
}
if (!isLogDurationDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_LOG_DURATION,
"Element is missing. Element name:"));
}
if (!isCleanupTimeoutSecondsDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_CLEANUP_TIMEOUT_SECONDS,
"Element is missing. Element name:"));
}
}
/**
* Parse logFile element.
*/
private void parseLogFileElement(
MonitorConfig monitorConfig,
Element element)
throws WSIException
{
// Get the location attribute
monitorConfig.setLogLocation(
XMLUtils.getAttributeValue(element, WSIConstants.ATTR_LOCATION));
// Get the replace attribute
monitorConfig.setReplaceLog(
XMLUtils.getBooleanValue(element, WSIConstants.ATTR_REPLACE, false));
// Get first child element
Element nextElement = XMLUtils.getFirstChild(element);
// Process each child element
while (nextElement != null)
{
// <addStyleSheet>
if (isElement(nextElement, WSIConstants.ELEM_ADD_STYLE_SHEET))
{
AddStyleSheet addStyleSheet = new AddStyleSheetImpl();
// Parse the element
TestUtils.parseAddStyleSheet(
nextElement,
addStyleSheet,
WSIConstants.DEFAULT_LOG_XSL);
// Set add style sheet
monitorConfig.setAddStyleSheet(addStyleSheet);
}
else
{
// ADD: handle invalid elements
}
// Get next element
nextElement = XMLUtils.getNextSibling(nextElement);
}
}
/**
* Parse manIntheMiddle element.
*/
private void parseManInTheMiddleElement(
ManInTheMiddle manInTheMiddle,
Element element)
throws WSIException
{
// Get first child element
Element nextElement = XMLUtils.getFirstChild(element);
// Process each child element
while (nextElement != null)
{
// <redirect>
if (isElement(nextElement, WSIConstants.ELEM_REDIRECT))
{
Redirect redirect = new RedirectImpl();
manInTheMiddle.addRedirect(redirect);
parseRedirectElement(redirect, nextElement);
}
// <comment>
else if (isElement(nextElement, WSIConstants.ELEM_COMMENT))
{
Comment comment = new CommentImpl();
comment.setText(XMLUtils.getText(nextElement));
manInTheMiddle.setComment(comment);
}
else
{
// ADD: handle invalid elements
}
// Get next element
nextElement = XMLUtils.getNextSibling(nextElement);
}
}
/**
* Parse redirect element.
*/
private void parseRedirectElement(Redirect redirect, Element element)
throws WSIException
{
// Get first child element
Element nextElement = XMLUtils.getFirstChild(element);
boolean isListenPortDefine = false;
boolean isSchemeAndHostPortDefine = false;
boolean isMaxConnectionsDefine = false;
boolean isReadTimeoutSecondsDefine = false;
// Process each child element
while (nextElement != null)
{
// <listenPort>
if (isElement(nextElement, WSIConstants.ELEM_LISTEN_PORT))
{
redirect.setListenPort(getIntValue(nextElement));
isListenPortDefine = true;
}
// <schemeAndHostPort>
else if (isElement(nextElement, WSIConstants.ELEM_SCHEME_AND_HOSTPORT))
{
redirect.setHost(XMLUtils.getText(nextElement));
isSchemeAndHostPortDefine = true;
}
// <maxConnections>
else if (isElement(nextElement, WSIConstants.ELEM_MAX_CONNECTIONS))
{
redirect.setMaxConnections(getIntValue(nextElement));
isMaxConnectionsDefine = true;
}
// <readTimeoutSeconds>
else if (isElement(nextElement, WSIConstants.ELEM_READ_TIMEOUT_SECONDS))
{
redirect.setReadTimeoutSeconds(getIntValue(nextElement));
if (redirect.getReadTimeoutSeconds() < 0)
{
throw new IllegalArgumentException(
getMessage(
"config09",
WSIConstants.ELEM_READ_TIMEOUT_SECONDS,
"Parameter value can't be negative. Element name:"));
}
isReadTimeoutSecondsDefine = true;
}
// <comment>
else if (isElement(nextElement, WSIConstants.ELEM_COMMENT))
{
Comment comment = new CommentImpl();
comment.setText(XMLUtils.getText(nextElement));
redirect.setComment(comment);
}
else
{
// ADD: handle invalid elements
}
// Get next element
nextElement = XMLUtils.getNextSibling(nextElement);
}
if (!isListenPortDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_LISTEN_PORT,
"Element is missing. Element name:"));
}
if (!isSchemeAndHostPortDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_SCHEME_AND_HOSTPORT,
"Element is missing. Element name:"));
}
if (!isMaxConnectionsDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_MAX_CONNECTIONS,
"Element is missing. Element name:"));
}
if (!isReadTimeoutSecondsDefine)
{
throw new IllegalArgumentException(
getMessage(
"config10",
WSIConstants.ELEM_READ_TIMEOUT_SECONDS,
"Element is missing. Element name:"));
}
}
/**
* Determine if this element matches specified local name in the analyzer config namespace.
*/
private boolean isElement(Element element, String localName)
{
return isElement(
element,
WSIConstants.NS_URI_WSI_MONITOR_CONFIG,
localName);
}
/**
* Determine if this element matches specified local name in the analyzer config namespace.
*/
private boolean isElement(
Element element,
String namespace,
String localName)
{
return XMLUtils.isElement(element, namespace, localName);
}
/**
* Get element text as an int.
*/
private int getIntValue(Element element) throws WSIException
{
int returnValue;
String intValue = null;
// Get value as a string
if ((intValue = XMLUtils.getText(element)) == null)
{
throw new WSIException(
getMessage(
"config04",
element.getLocalName() + "Element must contain an integer value:"));
}
else
{
returnValue = Integer.valueOf(intValue).intValue();
}
// Return int
return returnValue;
}
/**
* Get message from resource bundle.
*/
private String getMessage(String messageID, String defaultMessage)
{
return getMessage(messageID, null, defaultMessage);
}
/**
* Get message from resource bundle.
*/
private String getMessage(
String messageID,
String messageData,
String defaultMessage)
{
String message = defaultMessage;
if (messageList != null)
message = messageList.getMessage(messageID, messageData, defaultMessage);
else
message += " " + messageData + ".";
return message;
}
}