Remove unused code
[aquarium] / src / main / scala / gr / grnet / aquarium / service / SimpleLocalRoleableActorProviderService.scala
1 /*
2  * Copyright 2011-2012 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.service
37
38 import com.ckkloverdos.props.Props
39 import akka.actor.ActorRef
40 import gr.grnet.aquarium.Configurable
41 import java.util.concurrent.ConcurrentHashMap
42 import gr.grnet.aquarium.util.Loggable
43 import gr.grnet.aquarium.util.date.TimeHelpers
44 import gr.grnet.aquarium.actor.message.config.{AquariumPropertiesLoaded, ActorProviderConfigured}
45 import gr.grnet.aquarium.actor._
46
47
48 /**
49  * All actors are provided locally.
50  *
51  * @author Christos KK Loverdos <loverdos@gmail.com>.
52  */
53 class SimpleLocalRoleableActorProviderService extends RoleableActorProviderService with Configurable with Loggable {
54   private[this] val actorCache = new ConcurrentHashMap[ActorRole, ActorRef]
55   private[this] var _props: Props = _
56
57   def configure(props: Props): Unit = {
58     this._props = props
59     logger.debug("Configured with props")
60   }
61
62   private[this] def __doStart(): Unit = {
63     // Start and configure actors
64     import SimpleLocalRoleableActorProviderService.RolesToBeStarted
65
66     for(role <- RolesToBeStarted) {
67       actorForRole(role)
68     }
69   }
70
71   def start(): Unit = {
72     logStarting()
73     val (ms0, ms1, _) = TimeHelpers.timed {
74       __doStart()
75     }
76     logStarted(ms0, ms1)
77   }
78
79   def stop(): Unit = {
80     logStopped(TimeHelpers.nowMillis(), TimeHelpers.nowMillis())
81   }
82
83   private[this] def _newActor(role: ActorRole): ActorRef = {
84     val actorRef = akka.actor.Actor.actorOf(role.actorType).start()
85
86     val propsMsg = AquariumPropertiesLoaded(this._props)
87     if(role.canHandleConfigurationMessage(propsMsg)) {
88       actorRef ! propsMsg
89     }
90
91     val providerMsg = ActorProviderConfigured(this)
92     if(role.canHandleConfigurationMessage(providerMsg)) {
93       actorRef ! providerMsg
94     }
95
96     actorRef
97   }
98
99   private[this] def _fromCacheOrNew(role: ActorRole): ActorRef = synchronized {
100     actorCache.get(role) match {
101       case null ⇒
102         val actorRef = _newActor(role)
103         actorCache.put(role, actorRef)
104         actorRef
105       case actorRef ⇒
106         actorRef
107     }
108   }
109
110   @throws(classOf[Exception])
111   def actorForRole(role: ActorRole, hints: Props = Props.empty) = synchronized {
112     if(role.isCacheable) {
113       _fromCacheOrNew(role)
114     } else {
115       _newActor(role)
116     }
117   }
118
119   override def toString = gr.grnet.aquarium.util.shortClassNameOf(this)
120 }
121
122 object SimpleLocalRoleableActorProviderService {
123   // Always set Dispatcher at the end.
124   // We could definitely use some automatic dependency sorting here (topological sorting anyone?)
125   final val RolesToBeStarted = List(
126     //    ResourceProcessorRole,
127     RESTRole,
128     PingerRole,
129     RouterRole)
130
131   lazy val ActorClassByRole: Map[ActorRole, Class[_ <: RoleableActor]] =
132     RolesToBeStarted map {
133       role ⇒
134         (role, role.actorType)
135     } toMap
136
137   lazy val ActorRefByRole: Map[ActorRole, ActorRef] =
138     ActorClassByRole map {
139       case (role, clazz) ⇒
140         (role, akka.actor.Actor.actorOf(clazz).start())
141     }
142 }