1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.kernel.bi.rules.proxy;
24  
25  import com.liferay.portal.kernel.bi.rules.AdminRequestMessage;
26  import com.liferay.portal.kernel.bi.rules.AdminRequestType;
27  import com.liferay.portal.kernel.bi.rules.ExecutionRequestMessage;
28  import com.liferay.portal.kernel.bi.rules.Query;
29  import com.liferay.portal.kernel.bi.rules.RulesEngine;
30  import com.liferay.portal.kernel.bi.rules.RulesEngineException;
31  import com.liferay.portal.kernel.messaging.MessageBusException;
32  import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
33  import com.liferay.portal.kernel.messaging.sender.SingleDestinationSynchronousMessageSender;
34  import com.liferay.portal.kernel.resource.ResourceRetriever;
35  
36  import java.util.List;
37  
38  /**
39   * <a href="RulesEngineProxy.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Michael C. Han
42   *
43   */
44  public class RulesEngineProxy implements RulesEngine {
45  
46      public RulesEngineProxy(
47          SingleDestinationMessageSender ruleEngineAdminMessageSender,
48          SingleDestinationMessageSender asyncExecutionSender,
49          SingleDestinationSynchronousMessageSender ruleEngineExecutionSender) {
50  
51          _adminRequestMessageSender = ruleEngineAdminMessageSender;
52          _executionRequestMessageSender = asyncExecutionSender;
53          _synchronousExecutionRequestMessageSender = ruleEngineExecutionSender;
54      }
55  
56      public void add(String domainName, ResourceRetriever resourceRetriever) {
57          _sendAdminMessage(AdminRequestType.ADD, domainName, resourceRetriever);
58      }
59  
60      public void execute(ResourceRetriever resourceRetriever, List<?> facts) {
61          ExecutionRequestMessage executionRequestMessage =
62              new ExecutionRequestMessage(resourceRetriever);
63  
64          executionRequestMessage.addFact(facts);
65  
66          _executionRequestMessageSender.send(executionRequestMessage);
67      }
68  
69      public List<?> execute(
70              ResourceRetriever resourceRetriever, List<?> facts, Query query)
71          throws RulesEngineException {
72  
73          ExecutionRequestMessage executionRequestMessage =
74              new ExecutionRequestMessage(resourceRetriever);
75  
76          return _sendExecutionMessage(executionRequestMessage, facts, query);
77      }
78  
79      public void execute(String domainName, List<?> facts) {
80          ExecutionRequestMessage executionRequestMessage =
81              new ExecutionRequestMessage(domainName);
82  
83          executionRequestMessage.addFact(facts);
84  
85          _executionRequestMessageSender.send(executionRequestMessage);
86      }
87  
88      public List<?> execute(String domainName, List<?> facts, Query query)
89          throws RulesEngineException {
90  
91          ExecutionRequestMessage executionRequestMessage =
92              new ExecutionRequestMessage(domainName);
93  
94          return _sendExecutionMessage(executionRequestMessage, facts, query);
95      }
96  
97      public void remove(String domainName) {
98          _sendAdminMessage(AdminRequestType.REMOVE, domainName, null);
99      }
100 
101     public void update(String domainName, ResourceRetriever resourceRetriever) {
102         _sendAdminMessage(
103             AdminRequestType.UPDATE, domainName, resourceRetriever);
104     }
105 
106     private void _sendAdminMessage(
107         AdminRequestType adminRequestType, String domainName,
108         ResourceRetriever resourceRetriever) {
109 
110         AdminRequestMessage adminRequestMessage = null;
111 
112         if (AdminRequestType.ADD.equals(adminRequestType)) {
113             adminRequestMessage = AdminRequestMessage.add(
114                 domainName, resourceRetriever);
115         }
116         else if (AdminRequestType.REMOVE.equals(adminRequestType)) {
117             adminRequestMessage = AdminRequestMessage.remove(domainName);
118         }
119         else if (AdminRequestType.UPDATE.equals(adminRequestType)) {
120             adminRequestMessage = AdminRequestMessage.update(
121                 domainName, resourceRetriever);
122         }
123 
124         _adminRequestMessageSender.send(adminRequestMessage);
125     }
126 
127     private List<?> _sendExecutionMessage(
128             ExecutionRequestMessage executionRequestMessage,
129             List<?> facts, Query query)
130         throws RulesEngineException {
131 
132         executionRequestMessage.addFact(facts);
133         executionRequestMessage.setQuery(query);
134 
135         try {
136             return (List<?>)_synchronousExecutionRequestMessageSender.send(
137                 executionRequestMessage);
138         }
139         catch (MessageBusException mbe) {
140             throw new RulesEngineException("Unable to execute rules", mbe);
141         }
142     }
143 
144     private SingleDestinationMessageSender _adminRequestMessageSender;
145     private SingleDestinationMessageSender _executionRequestMessageSender;
146     private SingleDestinationSynchronousMessageSender
147         _synchronousExecutionRequestMessageSender;
148 
149 }