2 * Copyright 2011 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and
31 * documentation are those of the authors and should not be
32 * interpreted as representing official policies, either expressed
33 * or implied, of GRNET S.A.
36 package gr.grnet.aquarium.util.yaml
38 import java.util.{Map => JMap, List => JList}
39 import scala.collection.mutable
40 import scala.collection.JavaConversions._
44 * A representation of a parsed object that has originated in YAML format.
46 * @author Christos KK Loverdos <loverdos@gmail.com>.
49 def /(childName: String): YAMLNode
51 def name = path.substring(path.lastIndexOf('/') + 1)
54 def withPath(newPath: String): YAMLNode
57 def doubleValue: Double = 0.0
58 def stringValue: String = null
59 def listValue: List[YAMLNode] = Nil
60 def mapValue: Map[String, YAMLNode] = Map()
61 def booleanValue = false
73 def foreach[T](f: YAMLNode => T): Unit = {}
79 * @author Christos KK Loverdos <loverdos@gmail.com>.
82 def concatPaths(parent: String, child: String) = {
84 if(child startsWith "/") {
94 def indexedPath(basePath: String, index: Int) = "%s[%s]".format(basePath, index)
96 def apply(obj: AnyRef, basePath: String = "/"): YAMLNode = {
100 case javaMap: JMap[_, _] =>
101 val scalaMap: mutable.Map[String, AnyRef] = javaMap.asInstanceOf[JMap[String, AnyRef]]
102 val nodeMap = scalaMap map {
103 case (key, value) if value.isInstanceOf[YAMLNode] =>
104 val yvalue = value.asInstanceOf[YAMLNode]//.withPath(concatPaths(basePath, key))
107 (key, apply(value, concatPaths(basePath, key)))
109 YAMLMapNode(basePath, nodeMap)
110 case javaList: JList[_] =>
111 val scalaList: mutable.Buffer[AnyRef] = javaList.asInstanceOf[JList[AnyRef]]
112 val nodeList = scalaList.zipWithIndex.map { case (elem, index) => apply(elem, indexedPath(basePath, index)) }.toList
113 YAMLListNode(basePath, nodeList)
114 case string: String =>
115 YAMLStringNode(basePath, string)
116 case x: YAMLNode => x
117 case int: java.lang.Integer =>
118 YAMLIntNode(basePath, int)
119 case double: java.lang.Double =>
120 YAMLDoubleNode(basePath, double)
121 case x: java.lang.Boolean =>
122 YAMLBooleanNode(basePath, x)
124 YAMLUnknownNode(obj, obj.getClass.getName)