WIP.First cut of amqp-rabbit configuration-based api
[aquarium] / logic / src / main / scala / gr / grnet / aquarium / messaging / amqp / rabbitmq / v091 / RabbitMQConfigurations.scala
1 /*
2  * Copyright 2011 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
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.
16  *
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.
29  *
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.
34  */
35
36 package gr.grnet.aquarium.messaging.amqp
37 package rabbitmq
38 package v091
39
40
41 import com.ckkloverdos.resource.StreamResourceContext
42 import confmodel.RabbitMQConfigurationsModel
43 import gr.grnet.aquarium.util.xstream.XStreamHelpers
44 import com.ckkloverdos.maybe.{Failed, NoVal, Just, Maybe}
45 import gr.grnet.aquarium.util.{ConfModel, Loggable, shortClassNameOf}
46
47 /**
48  * 
49  * @author Christos KK Loverdos <loverdos@gmail.com>.
50  */
51 class RabbitMQConfigurations(val confModel: RabbitMQConfigurationsModel) extends AMQPConfigurations {
52   private val _configurations = confModel.configurations.map(new RabbitMQConfiguration(_))
53   def configurations = _configurations
54 }
55
56 object RabbitMQConfigurations extends Loggable {
57   object RCFolders {
58     val rabbitmq = "rabbitmq"
59
60     val producers = "producers"
61     val consumers = "consumers"
62   }
63
64   object PropFiles {
65 //    val configurations = "configuration.properties"
66     val configurations = "configurations.xml"
67   }
68
69   def apply(baseRC: StreamResourceContext): Maybe[RabbitMQConfigurations] = {
70     val xs = XStreamHelpers.DefaultXStream
71     val rabbitMQRC = baseRC / RCFolders.rabbitmq
72
73     val maybeConfsResource = rabbitMQRC.getResource(PropFiles.configurations)
74     val maybeConfsModel = maybeConfsResource.flatMap(XStreamHelpers.parseType[RabbitMQConfigurationsModel](_, xs))
75
76     def logErrors(errors: List[ConfModel.ConfModelError], theClass: Class[_]): String = {
77       val errorMsg = "%s has %s error(s)".format(shortClassNameOf(theClass))
78       logger.error(errorMsg)
79       for(error <- errors) {
80         logger.error(error)
81       }
82       errorMsg
83     }
84
85     maybeConfsModel match {
86       case Just(confsModel) =>
87         // parsed <configurations>.xml (like: rabbitmq/configurations.xml)
88         // now have a RabbitMQConfigurationsModel
89         val confsModelErrors = confsModel.validateConfModel
90
91         if(confsModelErrors.size > 0) {
92           val errorMsg = logErrors(confsModelErrors, confsModel.getClass)
93           Failed(new Exception(errorMsg))
94         } else {
95           Just(new RabbitMQConfigurations(confsModel))
96         }
97       case NoVal =>
98         NoVal
99       case Failed(e, m) =>
100         Failed(e, m)
101     }
102   }
103 }