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  public class RulesEngineProxy implements RulesEngine {
44  
45      public RulesEngineProxy(
46          SingleDestinationMessageSender ruleEngineAdminMessageSender,
47          SingleDestinationMessageSender asyncExecutionSender,
48          SingleDestinationSynchronousMessageSender ruleEngineExecutionSender) {
49  
50          _adminRequestMessageSender = ruleEngineAdminMessageSender;
51          _executionRequestMessageSender = asyncExecutionSender;
52          _synchronousExecutionRequestMessageSender = ruleEngineExecutionSender;
53      }
54  
55      public void add(String domainName, ResourceRetriever resourceRetriever) {
56          _sendAdminMessage(AdminRequestType.ADD, domainName, resourceRetriever);
57      }
58  
59      public void execute(ResourceRetriever resourceRetriever, List<?> facts) {
60          ExecutionRequestMessage executionRequestMessage =
61              new ExecutionRequestMessage(resourceRetriever);
62  
63          executionRequestMessage.addFact(facts);
64  
65          _executionRequestMessageSender.send(executionRequestMessage);
66      }
67  
68      public List<?> execute(
69              ResourceRetriever resourceRetriever, List<?> facts, Query query)
70          throws RulesEngineException {
71  
72          ExecutionRequestMessage executionRequestMessage =
73              new ExecutionRequestMessage(resourceRetriever);
74  
75          return _sendExecutionMessage(executionRequestMessage, facts, query);
76      }
77  
78      public void execute(String domainName, List<?> facts) {
79          ExecutionRequestMessage executionRequestMessage =
80              new ExecutionRequestMessage(domainName);
81  
82          executionRequestMessage.addFact(facts);
83  
84          _executionRequestMessageSender.send(executionRequestMessage);
85      }
86  
87      public List<?> execute(String domainName, List<?> facts, Query query)
88          throws RulesEngineException {
89  
90          ExecutionRequestMessage executionRequestMessage =
91              new ExecutionRequestMessage(domainName);
92  
93          return _sendExecutionMessage(executionRequestMessage, facts, query);
94      }
95  
96      public void remove(String domainName) {
97          _sendAdminMessage(AdminRequestType.REMOVE, domainName, null);
98      }
99  
100     public void update(String domainName, ResourceRetriever resourceRetriever) {
101         _sendAdminMessage(
102             AdminRequestType.UPDATE, domainName, resourceRetriever);
103     }
104 
105     private void _sendAdminMessage(
106         AdminRequestType adminRequestType, String domainName,
107         ResourceRetriever resourceRetriever) {
108 
109         AdminRequestMessage adminRequestMessage = null;
110 
111         if (AdminRequestType.ADD.equals(adminRequestType)) {
112             adminRequestMessage = AdminRequestMessage.add(
113                 domainName, resourceRetriever);
114         }
115         else if (AdminRequestType.REMOVE.equals(adminRequestType)) {
116             adminRequestMessage = AdminRequestMessage.remove(domainName);
117         }
118         else if (AdminRequestType.UPDATE.equals(adminRequestType)) {
119             adminRequestMessage = AdminRequestMessage.update(
120                 domainName, resourceRetriever);
121         }
122 
123         _adminRequestMessageSender.send(adminRequestMessage);
124     }
125 
126     private List<?> _sendExecutionMessage(
127             ExecutionRequestMessage executionRequestMessage,
128             List<?> facts, Query query)
129         throws RulesEngineException {
130 
131         executionRequestMessage.addFact(facts);
132         executionRequestMessage.setQuery(query);
133 
134         try {
135             return (List<?>)_synchronousExecutionRequestMessageSender.send(
136                 executionRequestMessage);
137         }
138         catch (MessageBusException mbe) {
139             throw new RulesEngineException("Unable to execute rules", mbe);
140         }
141     }
142 
143     private SingleDestinationMessageSender _adminRequestMessageSender;
144     private SingleDestinationMessageSender _executionRequestMessageSender;
145     private SingleDestinationSynchronousMessageSender
146         _synchronousExecutionRequestMessageSender;
147 
148 }