blob: f804fdeb9909cd69f23830c5deeedfa0295e7425 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* 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.android.server.wifi.hotspot2.omadm;
import android.annotation.NonNull;
import android.util.Log;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
/**
* Provides serialization API for OMA DM Management Object.
*/
class MoSerializer {
static final String TAG = "MoSerializable";
static final String DM_VERSION = "1.2";
static final String TAG_MGMT_TREE = "MgmtTree";
static final String TAG_VERSION = "VerDTD";
static final String TAG_NODE = "Node";
static final String TAG_NODENAME = "NodeName";
static final String TAG_PATH = "Path";
static final String TAG_VALUE = "Value";
static final String TAG_RTPROPERTIES = "RTProperties";
static final String TAG_TYPE = "Type";
static final String TAG_DDF_NAME = "DDFName";
private DocumentBuilder mDbBuilder;
public MoSerializer() throws ParserConfigurationException {
mDbBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
/**
* Serializes the Management Object into a XML format.
*
* @return {@link String) that indicates the entire xml of {@link MoSerializer}},
* <code>null<code/> in case of failure.
*/
String serialize(@NonNull Document doc) {
StringWriter writer = new StringWriter();
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(writer));
} catch (TransformerException e) {
e.printStackTrace();
return null;
}
return writer.toString();
}
/**
* Create new Document to make a XML document of OMA DM Management Object.
*
* @return new {@link Document}
*/
Document createNewDocument() {
return mDbBuilder.newDocument();
}
/**
* Generates root Node starting a "MgmtTree".
*
* Expected output: <MgmtTree></MgmtTree>
* @param doc {@link Document} that indicates an entire xml document.
* @return {@link Element} for Root
*/
Element createMgmtTree(@NonNull Document doc) {
// root element
Element rootElement = doc.createElement(TAG_MGMT_TREE);
doc.appendChild(rootElement);
return rootElement;
}
/**
* Generates DTD version Node.
*
* Expected output: <VerDTD>[value]</VerDTD>
* @param doc {@link Document} that indicates an entire xml document.
* @return {@link Element} for new Node
*/
Element writeVersion(@NonNull Document doc) {
Element dtdElement = doc.createElement(TAG_VERSION);
dtdElement.appendChild(doc.createTextNode(DM_VERSION));
return dtdElement;
}
/**
* Generates Node having {@param nodeName}
*
* Expected output: <Node><NodeName>[nodeName]</NodeName></Node>
* @param doc {@link Document} that indicates an entire xml document.
* @param nodeName node name for new node.
* @return {@link Element} for new Node
*/
Element createNode(@NonNull Document doc, @NonNull String nodeName) {
Element node = doc.createElement(TAG_NODE);
Element nameNode = doc.createElement(TAG_NODENAME);
nameNode.appendChild(doc.createTextNode(nodeName));
node.appendChild(nameNode);
return node;
}
/** Generates Node with the Unique Resource Name (URN).
*
* URN is encapsulated inside RTProperties node.
*
* Expected output: <RTProperties><Type><DDFName>[urn]</DDFName></Type></RTProperites>
* @param doc {@link Document} that indicates an entire xml document.
* @param urn The unique resource name
*
* @return {@link Element} for new Node
*/
Element createNodeForUrn(@NonNull Document doc, @NonNull String urn) {
Element node = doc.createElement(TAG_RTPROPERTIES);
Element type = doc.createElement(TAG_TYPE);
Element ddfName = doc.createElement(TAG_DDF_NAME);
ddfName.appendChild(doc.createTextNode(urn));
type.appendChild(ddfName);
node.appendChild(type);
return node;
}
/**
* Generates for a node with a value.
*
* Expected output:
* <Node><NodeName>[name]</NodeName><Value>[value]</Value></Node>
* @param doc {@link Document} that indicates an entire xml document.
* @param name name of the node.
* @param value value of the node
*
* @return {@link Element} for new Node
*/
Element createNodeForValue(@NonNull Document doc, @NonNull String name, @NonNull String value) {
Element node = doc.createElement(TAG_NODE);
Element nameNode = doc.createElement(TAG_NODENAME);
nameNode.appendChild(doc.createTextNode(name));
node.appendChild(nameNode);
Element valueNode = doc.createElement(TAG_VALUE);
valueNode.appendChild(doc.createTextNode(value));
node.appendChild(valueNode);
return node;
}
}