blob: 102478c22ff19e4c911bde78d6c0ecc3879423f3 [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 com.cloud.hypervisor.ovm3.objects;
import java.io.IOException;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class OvmObject {
private volatile Connection client;
private static List<?> emptyParams = new ArrayList<Object>();
private static final Logger LOGGER = Logger
.getLogger(OvmObject.class);
private boolean success = false;
public OvmObject() {
}
public Connection getClient() {
return client;
}
public synchronized void setClient(Connection c) {
client = c;
}
/* remove dashes from uuids */
public String deDash(String str) {
return str.replaceAll("-", "");
}
/* generate a uuid */
public String newUuid() {
return UUID.randomUUID().toString();
}
/* generate a uuid */
public String newUuid(String str) {
return UUID.nameUUIDFromBytes(str.getBytes(Charset.defaultCharset())).toString();
}
/* capture most of the calls here */
public Object callWrapper(String call) throws Ovm3ResourceException {
try {
return client.call(call, emptyParams);
} catch (XmlRpcException e) {
String msg = "Client call " + call + " to " + client.getIp() + " went wrong: " + e.getMessage();
throw new Ovm3ResourceException(msg, e);
}
}
public void setSuccess(boolean s) {
success = s;
}
public Boolean getSuccess() {
return success;
}
/* nice try but doesn't work like that .. */
@SafeVarargs
public final <T> Object callWrapper(String call, T... args)
throws Ovm3ResourceException {
List<T> params = new ArrayList<T>();
for (T param : args) {
params.add(param);
}
try {
return client.call(call, params);
} catch (XmlRpcException e) {
String msg = "Client call " + call + " to " + client.getIp() + " with " + params + " went wrong: " + e.getMessage();
throw new Ovm3ResourceException(msg, e);
}
}
/* should check on nil ? */
@SafeVarargs
public final <T> Boolean nullCallWrapper(String call, Boolean nullReturn, T... args) throws Ovm3ResourceException {
Object x = callWrapper(call, args);
if (x == null) {
return nullReturn;
} else if (!nullReturn) {
return true;
}
return false;
}
@SafeVarargs
public final <T> Boolean nullIsFalseCallWrapper(String call, T... args) throws Ovm3ResourceException {
return nullCallWrapper(call, false, args);
}
@SafeVarargs
public final <T> Boolean nullIsTrueCallWrapper(String call, T... args) throws Ovm3ResourceException {
return nullCallWrapper(call, true, args);
}
/* returns a single string */
public Map<String, Long> callMap(String call) throws Ovm3ResourceException {
return (HashMap<String, Long>) callWrapper(call);
}
public <T> String callString(String call, T... args) throws Ovm3ResourceException {
Object result = callWrapper(call, args);
if (result == null) {
return null;
}
if (result instanceof String || result instanceof Integer || result instanceof Long || result instanceof HashMap) {
return result.toString();
}
Object[] results = (Object[]) result;
if (results.length == 0) {
return null;
}
if (results.length == 1) {
return results[0].toString();
}
return null;
}
/* was String, Object before */
public <E> Map<String, E> xmlToMap(String path, Document xmlDocument)
throws Ovm3ResourceException {
XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance();
XPath xPath = factory.newXPath();
try {
XPathExpression xPathExpression = xPath.compile(path);
NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument,
XPathConstants.NODESET);
Map<String, E> myMap = new HashMap<String, E>();
for (int ind = 0; ind < nodeList.getLength(); ind++) {
NodeList nodeListFor = nodeList.item(ind).getChildNodes();
for (int index = 0; index < nodeListFor.getLength(); index++) {
String rnode = nodeListFor.item(index).getNodeName();
NodeList nodeListFor2 = nodeListFor.item(index).getChildNodes();
if (nodeListFor2.getLength() > 1) {
/* Do we need to figure out all the sub elements here and put them in a map? */
} else {
String element = nodeListFor.item(index).getNodeValue();
myMap.put(rnode, (E) element);
}
}
}
return myMap;
} catch (XPathExpressionException e) {
throw new Ovm3ResourceException("Problem parsing XML to Map:", e);
}
}
public List<String> xmlToList(String path, Document xmlDocument)
throws Ovm3ResourceException {
List<String> list = new ArrayList<String>();
XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance();
XPath xPath = factory.newXPath();
try {
XPathExpression xPathExpression = xPath.compile(path);
NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument,
XPathConstants.NODESET);
for (int ind = 0; ind < nodeList.getLength(); ind++) {
if (!nodeList.item(ind).getNodeValue().isEmpty()) {
list.add("" + nodeList.item(ind).getNodeValue());
} else {
list.add("" + nodeList.item(ind).getNodeValue());
}
}
return list;
} catch (XPathExpressionException e) {
throw new Ovm3ResourceException("Problem parsing XML to List: ", e);
}
}
public String xmlToString(String path, Document xmlDocument)
throws Ovm3ResourceException {
XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance();
XPath xPath = factory.newXPath();
try {
XPathExpression xPathExpression = xPath.compile(path);
NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument,
XPathConstants.NODESET);
return nodeList.item(0).getNodeValue();
} catch (NullPointerException e) {
LOGGER.info("Got no items back from parsing, returning null: " + e);
return null;
} catch (XPathExpressionException e) {
throw new Ovm3ResourceException("Problem parsing XML to String: ", e);
}
}
public Document prepParse(String input)
throws Ovm3ResourceException {
DocumentBuilderFactory builderfactory = DocumentBuilderFactory
.newInstance();
builderfactory.setNamespaceAware(true);
DocumentBuilder builder;
try {
builder = builderfactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new Ovm3ResourceException("Unable to create document Builder: ", e);
}
Document xmlDocument;
try {
xmlDocument = builder.parse(new InputSource(new StringReader(
input)));
} catch (SAXException | IOException e) {
LOGGER.info(e.getClass() + ": ", e);
throw new Ovm3ResourceException("Unable to parse XML: ", e);
}
return xmlDocument;
}
}