blob: ebea28f865da8001716175da1940d4fcec30a153 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.oodt.commons;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import org.apache.oodt.commons.util.Documentable;
import org.apache.oodt.commons.util.XML;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/** Configuration for an EDA exec-server.
*
* @author Kelly
*/
public class ExecServerConfig extends Executable implements Documentable {
/** Create an exec-server configuration.
*
* @param className Name of the class to execute.
* @param objectKey Object key under which class will register.
* @param properties Properties for the server.
*/
public ExecServerConfig(String className, String objectKey, InetAddress preferredHost, Properties properties) {
this.className = className;
this.objectKey = objectKey;
this.preferredHost = preferredHost;
this.properties = properties;
}
/** Create an exec-server configuration.
*
* @param xml XML DOM description, must be an <execServer> element.
* @throws SAXException If <var>xml</var> is invalid.
* @throws UnknownHostException If the <var>xml</var> refers to an unknown host name.
*/
public ExecServerConfig(Node xml) throws SAXException, UnknownHostException {
properties = new Properties();
preferredHost = org.apache.oodt.commons.net.Net.getLoopbackAddress();
NodeList children = xml.getChildNodes();
className = XML.unwrappedText(children.item(0));
objectKey = XML.unwrappedText(children.item(1));
for (int i = 2; i < children.getLength(); ++i) {
Node child = children.item(i);
String name = child.getNodeName();
if ("host".equals(name))
preferredHost = InetAddress.getByName(XML.unwrappedText(children.item(2)));
else if ("properties".equals(name))
Configuration.loadProperties(child, properties);
else throw new SAXException("Unknown node " + name + " in exec server XML");
}
}
/** Create an exec-server configuration.
*
* @param xml Serialized XML description.
* @throws SAXException If we can't parse <var>xml</var>.
* @throws UnknownHostException If the <var>xml</var> refers to an unknown host name.
*/
public ExecServerConfig(String xml) throws SAXException, UnknownHostException {
this(XML.parse(xml).getDocumentElement());
}
protected String[] getCommandLine() {
String[] commandLine = new String[6 + properties.size()];
commandLine[0] = "java";
commandLine[1] = "-Xms" + initialHeap;
commandLine[2] = "-Xmx" + maxHeap;
int index = 3;
for (Iterator i = properties.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
commandLine[index++] = "-D" + entry.getKey() + "=" + entry.getValue();
}
commandLine[index++] = "org.apache.oodt.commons.ExecServer";
commandLine[index++] = className;
commandLine[index++] = objectKey;
return commandLine;
}
/** Get the class name I'm going to execute.
*
* @return The class name.
*/
public String getClassName() {
return className;
}
/** Get the object key I'm going to use.
*
* @return The object key.
*/
public String getObjectKey() {
return objectKey;
}
/** Get the properties for my process.
*
* @return The properties.
*/
public Properties getProperties() {
return properties;
}
/** Get the preferred host.
*
* @return The host on which this server prefers to run.
*/
public InetAddress getPreferredHost() {
return preferredHost;
}
public int hashCode() {
return className.hashCode() ^ objectKey.hashCode() ^ properties.hashCode();
}
public boolean equals(Object rhs) {
if (rhs == this) return true;
if (rhs == null || !(rhs instanceof ExecServerConfig)) return false;
ExecServerConfig obj = (ExecServerConfig) rhs;
return className.equals(obj.className) && objectKey.equals(obj.objectKey) && properties.equals(obj.properties);
}
public String toString() {
return className + " " + objectKey;
}
public Node toXML(Document doc) throws DOMException {
Element execServerElement = doc.createElement("execServer");
XML.add(execServerElement, "class", getClassName());
XML.add(execServerElement, "objectKey", getObjectKey());
XML.add(execServerElement, "preferredHost", getPreferredHost().toString());
Configuration.dumpProperties(getProperties(), execServerElement);
return execServerElement;
}
/** Yield this exce-server configuration as serialized XML.
*
* @return This object as a string serialized XML document.
* @throws DOMException If we can't create the XML document.
*/
public String toXML() throws DOMException {
Document doc = Configuration.createDocument("execServer");
doc.replaceChild(toXML(doc), doc.getDocumentElement());
return XML.serialize(doc);
}
/** Class name for the ExecServer to execute. */
private String className;
/** Instance name. */
private String objectKey;
/** Properties for the server. */
private Properties properties;
/** Preferred host. */
private InetAddress preferredHost;
/** Initial heap size. */
private static String initialHeap;
/** Max heap size. */
private static String maxHeap;
/** Initialize the heap sizes. */
static {
Properties props = new Properties();
org.apache.oodt.commons.util.Utility.loadProperties(props, ExecServerConfig.class, "ExecServerConfig.properties");
initialHeap = props.getProperty("initialHeap", "32m");
maxHeap = props.getProperty("maxHeap", "128m");
}
}