| CODENOTIFIER | HelpYou are not signed inSign in |
Project: ProActive
Revision: 10097
Author: bsauvan
Date: 05 Sep 2008 10:16:21
Changes:Add method to clean the statistics of the monitor controller + cleanup code.
PROACTIVE-463
| ... | ...@@ -2,12 +2,24 @@ | |
| 2 | 2 | |
| 3 | 3 | import java.util.List; |
| 4 | 4 | |
| 5 | import org.objectweb.proactive.annotation.PublicAPI; | |
| 5 | 6 | |
| 7 | ||
| 8 | /** | |
| 9 | * This class manages the statistics for a method exposed by a component server interface. | |
| 10 | * <br> | |
| 11 | * The MethodStatistics instances of each method are managed by the monitor controller. | |
| 12 | * | |
| 13 | * @author The ProActive Team | |
| 14 | * @see org.objectweb.proactive.core.component.controller.MonitorController | |
| 15 | * | |
| 16 | */ | |
| 17 | @PublicAPI | |
| 6 | 18 | public interface MethodStatistics { |
| 7 | 19 | /** |
| 8 | 20 | * Maximum number of requests saved. |
| 9 | 21 | */ |
| 10 | public static int maxNbRequests = 10000; | |
| 22 | public static int maxNbRequests = 1000; | |
| 11 | 23 | |
| 12 | 24 | /** |
| 13 | 25 | * Get the current length of the requests incoming queue related to the monitored method. |
| ... | ...@@ -1,5 +1,16 @@ | |
| 1 | 1 | package org.objectweb.proactive.core.component.controller; |
| 2 | 2 | |
| 3 | import org.objectweb.proactive.annotation.PublicAPI; | |
| 4 | ||
| 5 | ||
| 6 | /** | |
| 7 | * Useful methods for the monitor controller. | |
| 8 | * | |
| 9 | * @author The ProActive Team | |
| 10 | * @see org.objectweb.proactive.core.component.controller.MonitorController | |
| 11 | * | |
| 12 | */ | |
| 13 | @PublicAPI | |
| 3 | 14 | public class MonitorControllerHelper { |
| 4 | 15 | private static final String KEY_INFO_SEPARATOR = "-"; |
| 5 | 16 |
| ... | ...@@ -69,6 +69,7 @@ | |
| 69 | 69 | PAActiveObject.setImmediateService("getStatistics", new Class[] { String.class, String.class, |
| 70 | 70 | (new Class<?>[] {}).getClass() }); |
| 71 | 71 | PAActiveObject.setImmediateService("getAllStatistics"); |
| 72 | ||
| 72 | 73 | statistics = Collections.synchronizedMap(new HashMap<String, MethodStatistics>()); |
| 73 | 74 | keysList = new HashMap<String, String>(); |
| 74 | 75 | NameController nc = null; |
| ... | ...@@ -100,8 +101,9 @@ | |
| 100 | 101 | Iterator<ProActiveInterface> delegatee = multicastController.getDelegatee( |
| 101 | 102 | itf.getFcItfName()).iterator(); |
| 102 | 103 | List<Component> bindedComponents = new ArrayList<Component>(); |
| 103 | while (delegatee.hasNext()) | |
| 104 | while (delegatee.hasNext()) { | |
| 104 | 105 | bindedComponents.add(delegatee.next().getFcItfOwner()); |
| 106 | } | |
| 105 | 107 | bindedComponentsIterator = bindedComponents.iterator(); |
| 106 | 108 | } catch (NoSuchInterfaceException e) { |
| 107 | 109 | e.printStackTrace(); |
| ... | ...@@ -127,10 +129,10 @@ | |
| 127 | 129 | String key = MonitorControllerHelper.generateKey(itf.getFcItfName(), m.getName(), |
| 128 | 130 | parametersTypes); |
| 129 | 131 | keysList.put(m.getName(), key); |
| 130 | if (subcomponentMonitors.isEmpty()) | |
| 132 | if (subcomponentMonitors.isEmpty()) { | |
| 131 | 133 | statistics.put(key, new MethodStatisticsPrimitiveImpl(itf.getFcItfName(), m |
| 132 | 134 | .getName(), parametersTypes)); |
| 133 | else { | |
| 135 | } else { | |
| 134 | 136 | statistics.put(key, new MethodStatisticsCompositeImpl(itf.getFcItfName(), m |
| 135 | 137 | .getName(), parametersTypes, subcomponentMonitors)); |
| 136 | 138 | } |
| ... | ...@@ -156,8 +158,9 @@ | |
| 156 | 158 | } |
| 157 | 159 | |
| 158 | 160 | public void startMonitoring() { |
| 159 | if (statistics == null) | |
| 161 | if (statistics == null) { | |
| 160 | 162 | registerMethods(); |
| 163 | } | |
| 161 | 164 | if (!started) { |
| 162 | 165 | initMethodStatistics(); |
| 163 | 166 | try { |
| ... | ...@@ -194,31 +197,34 @@ | |
| 194 | 197 | String supposedCorrespondingKey = MonitorControllerHelper.generateKey(itfName, methodName, |
| 195 | 198 | parametersTypes); |
| 196 | 199 | MethodStatistics methodStats = statistics.get(supposedCorrespondingKey); |
| 197 | if (methodStats != null) | |
| 200 | if (methodStats != null) { | |
| 198 | 201 | return methodStats; |
| 199 | else if (parametersTypes.length == 0) { | |
| 202 | } else if (parametersTypes.length == 0) { | |
| 200 | 203 | String correspondingKey = null; |
| 201 | 204 | String[] keys = statistics.keySet().toArray(new String[] {}); |
| 202 | 205 | for (int i = 0; i < keys.length; i++) { |
| 203 | 206 | if (keys[i].startsWith(supposedCorrespondingKey)) { |
| 204 | if (correspondingKey == null) | |
| 207 | if (correspondingKey == null) { | |
| 205 | 208 | correspondingKey = keys[i]; |
| 206 | else | |
| 209 | } else { | |
| 207 | 210 | throw new ProActiveRuntimeException("The method name: " + methodName + |
| 208 | 211 | " of the interface " + itfName + " is ambiguous: more than 1 method found"); |
| 212 | } | |
| 209 | 213 | } |
| 210 | 214 | } |
| 211 | if (correspondingKey != null) | |
| 215 | if (correspondingKey != null) { | |
| 212 | 216 | return statistics.get(correspondingKey); |
| 213 | else | |
| 217 | } else { | |
| 214 | 218 | throw new ProActiveRuntimeException("The method: " + methodName + "() of the interface " + |
| 215 | 219 | itfName + " cannot be found so no statistics are available"); |
| 220 | } | |
| 216 | 221 | } else { |
| 217 | 222 | String msg = "The method: " + methodName + "("; |
| 218 | 223 | for (int i = 0; i < parametersTypes.length; i++) { |
| 219 | 224 | msg += parametersTypes[i].getName(); |
| 220 | if (i + 1 < parametersTypes.length) | |
| 225 | if (i + 1 < parametersTypes.length) { | |
| 221 | 226 | msg += ", "; |
| 227 | } | |
| 222 | 228 | } |
| 223 | 229 | msg += ") of the interface " + itfName + " cannot be found so no statistics are available"; |
| 224 | 230 | throw new ProActiveRuntimeException(msg); |
| ... | ...@@ -234,33 +240,38 @@ | |
| 234 | 240 | if (type.equals(NotificationType.requestReceived)) { |
| 235 | 241 | RequestNotificationData data = (RequestNotificationData) notification.getUserData(); |
| 236 | 242 | String key = keysList.get(data.getMethodName()); |
| 237 | if (key != null) | |
| 243 | if (key != null) { | |
| 238 | 244 | ((MethodStatisticsAbstract) statistics.get(key)).notifyArrivalOfRequest(notification |
| 239 | 245 | .getTimeStamp()); |
| 246 | } | |
| 240 | 247 | } else if (type.equals(NotificationType.servingStarted)) { |
| 241 | 248 | RequestNotificationData data = (RequestNotificationData) notification.getUserData(); |
| 242 | 249 | String key = keysList.get(data.getMethodName()); |
| 243 | if (key != null) | |
| 250 | if (key != null) { | |
| 244 | 251 | ((MethodStatisticsAbstract) statistics.get(key)).notifyDepartureOfRequest(notification |
| 245 | 252 | .getTimeStamp()); |
| 253 | } | |
| 246 | 254 | } else if (type.equals(NotificationType.replySent)) { |
| 247 | 255 | RequestNotificationData data = (RequestNotificationData) notification.getUserData(); |
| 248 | 256 | String key = keysList.get(data.getMethodName()); |
| 249 | if (key != null) | |
| 257 | if (key != null) { | |
| 250 | 258 | ((MethodStatisticsAbstract) statistics.get(key)).notifyReplyOfRequestSent(notification |
| 251 | 259 | .getTimeStamp()); |
| 260 | } | |
| 252 | 261 | } else if (type.equals(NotificationType.voidRequestServed)) { |
| 253 | 262 | RequestNotificationData data = (RequestNotificationData) notification.getUserData(); |
| 254 | 263 | String key = keysList.get(data.getMethodName()); |
| 255 | if (key != null) | |
| 264 | if (key != null) { | |
| 256 | 265 | ((MethodStatisticsAbstract) statistics.get(key)).notifyReplyOfRequestSent(notification |
| 257 | 266 | .getTimeStamp()); |
| 267 | } | |
| 258 | 268 | } else if (type.equals(NotificationType.setOfNotifications)) { |
| 259 | 269 | @SuppressWarnings("unchecked") |
| 260 | 270 | ConcurrentLinkedQueue<Notification> notificationsList = (ConcurrentLinkedQueue<Notification>) notification |
| 261 | 271 | .getUserData(); |
| 262 | for (Iterator<Notification> iterator = notificationsList.iterator(); iterator.hasNext();) | |
| 272 | for (Iterator<Notification> iterator = notificationsList.iterator(); iterator.hasNext();) { | |
| 263 | 273 | handleNotification(iterator.next(), handback); |
| 274 | } | |
| 264 | 275 | } |
| 265 | 276 | } |
| 266 | 277 |
| ... | ...@@ -24,7 +24,7 @@ | |
| 24 | 24 | |
| 25 | 25 | // Sometimes a replySent notification is received before the corresponding servingStarted notification |
| 26 | 26 | // Therefore the notification is stored and will be used when the corresponding servingStarted notification will be received |
| 27 | protected ArrayList<Long> replyInAdvance; | |
| 27 | protected List<Long> replyInAdvance; | |
| 28 | 28 | |
| 29 | 29 | /* |
| 30 | 30 | * Reset all the statistics for the monitored method. |
| ... | ...@@ -38,21 +38,6 @@ | |
| 38 | 38 | this.replyInAdvance = new ArrayList<Long>(); |
| 39 | 39 | } |
| 40 | 40 | |
| 41 | // TODO Use this method | |
| 42 | @SuppressWarnings("unused") | |
| 43 | private void clean() { | |
| 44 | int shift = requestsStats.size() - maxNbRequests; | |
| 45 | if (shift > 0) { | |
| 46 | requestsStats = requestsStats.subList(shift, requestsStats.size() - 1); | |
| 47 | indexNextDepartureRequest = indexNextDepartureRequest - shift; | |
| 48 | if (indexNextDepartureRequest < 0) | |
| 49 | indexNextDepartureRequest = 0; | |
| 50 | indexNextReply = indexNextReply - shift; | |
| 51 | if (indexNextReply < 0) | |
| 52 | indexNextReply = 0; | |
| 53 | } | |
| 54 | } | |
| 55 | ||
| 56 | 41 | /* |
| 57 | 42 | * Notify the arrival of a new request in the incoming queue related to the monitored method. |
| 58 | 43 | * |
| ... | ...@@ -62,8 +47,9 @@ | |
| 62 | 47 | if (!requestsStats.isEmpty()) { |
| 63 | 48 | requestsStats.add(new RequestStatistics(arrivalTime, requestsStats.get(requestsStats.size() - 1) |
| 64 | 49 | .getArrivalTime())); |
| 65 | } else | |
| 50 | } else { | |
| 66 | 51 | requestsStats.add(new RequestStatistics(arrivalTime, startTime)); |
| 52 | } | |
| 67 | 53 | currentLengthQueue++; |
| 68 | 54 | } |
| 69 | 55 | |
| ... | ...@@ -77,13 +63,34 @@ | |
| 77 | 63 | requestsStats.get(indexNextDepartureRequest).setDepartureTime(departureTime); |
| 78 | 64 | indexNextDepartureRequest++; |
| 79 | 65 | currentLengthQueue--; |
| 80 | if (!replyInAdvance.isEmpty() && (replyInAdvance.get(0) > departureTime)) | |
| 66 | if (!replyInAdvance.isEmpty() && (replyInAdvance.get(0) > departureTime)) { | |
| 81 | 67 | notifyReplyOfRequestSent(replyInAdvance.remove(0)); |
| 68 | } | |
| 82 | 69 | } catch (IndexOutOfBoundsException e) { |
| 83 | 70 | } |
| 84 | 71 | } |
| 85 | 72 | |
| 86 | 73 | /* |
| 74 | * Erase the maxNbRequests oldest requests. | |
| 75 | */ | |
| 76 | private void clean() { | |
| 77 | int shift = requestsStats.size() - maxNbRequests; | |
| 78 | if (shift > 0) { | |
| 79 | requestsStats.subList(shift, requestsStats.size()).clear(); | |
| 80 | startTime = requestsStats.get(0).getArrivalTime(); | |
| 81 | indexNextDepartureRequest = indexNextDepartureRequest - shift; | |
| 82 | if (indexNextDepartureRequest < 0) { | |
| 83 | indexNextDepartureRequest = 0; | |
| 84 | } | |
| 85 | indexNextReply = indexNextReply - shift; | |
| 86 | if (indexNextReply < 0) { | |
| 87 | indexNextReply = 0; | |
| 88 | } | |
| 89 | currentLengthQueue = requestsStats.size() - indexNextDepartureRequest; | |
| 90 | } | |
| 91 | } | |
| 92 | ||
| 93 | /* | |
| 87 | 94 | * Notify that the reply to a request related to the monitored method has been sent. |
| 88 | 95 | * |
| 89 | 96 | * @param time Time of the reply to a request has been sent in microseconds. |
| ... | ...@@ -93,8 +100,12 @@ | |
| 93 | 100 | if (indexNextReply < indexNextDepartureRequest) { |
| 94 | 101 | requestsStats.get(indexNextReply).setReplyTime(replyTime); |
| 95 | 102 | indexNextReply++; |
| 96 | } else | |
| 103 | if (indexNextReply == (2 * maxNbRequests)) { | |
| 104 | clean(); | |
| 105 | } | |
| 106 | } else { | |
| 97 | 107 | replyInAdvance.add(replyTime); |
| 108 | } | |
| 98 | 109 | } catch (IndexOutOfBoundsException e) { |
| 99 | 110 | } |
| 100 | 111 | } |
| ... | ...@@ -102,8 +113,9 @@ | |
| 102 | 113 | protected int findNumberOfRequests(long time, int indexToStart) { |
| 103 | 114 | long currentTime = System.nanoTime() / 1000; |
| 104 | 115 | for (int i = indexToStart - 1; i >= 0; i--) { |
| 105 | if (((currentTime - requestsStats.get(i).getArrivalTime()) / 1000) > time) | |
| 116 | if (((currentTime - requestsStats.get(i).getArrivalTime()) / 1000) > time) { | |
| 106 | 117 | return indexToStart - (i + 1); |
| 118 | } | |
| 107 | 119 | } |
| 108 | 120 | |
| 109 | 121 | return indexToStart; |
| ... | ...@@ -135,12 +147,14 @@ | |
| 135 | 147 | if (lastNRequest != 0) { |
| 136 | 148 | double res = 0; |
| 137 | 149 | int indexToReach = Math.max(requestsStats.size() - 1 - lastNRequest, 0); // To avoid to have negative index |
| 138 | for (int i = requestsStats.size() - 1; i >= indexToReach; i--) | |
| 150 | for (int i = requestsStats.size() - 1; i >= indexToReach; i--) { | |
| 139 | 151 | res += requestsStats.get(i).getInterArrivalTime(); |
| 152 | } | |
| 140 | 153 | |
| 141 | 154 | return res / lastNRequest / 1000; |
| 142 | } else | |
| 155 | } else { | |
| 143 | 156 | return 0; |
| 157 | } | |
| 144 | 158 | } |
| 145 | 159 | |
| 146 | 160 | public double getAverageInterArrivalTime(long pastXMilliseconds) { |
| ... | ...@@ -155,12 +169,14 @@ | |
| 155 | 169 | if (lastNRequest != 0) { |
| 156 | 170 | double res = 0; |
| 157 | 171 | int indexToReach = Math.max(indexNextDepartureRequest - 1 - lastNRequest, 0); // To avoid to have negative index |
| 158 | for (int i = indexNextDepartureRequest - 1; i >= indexToReach; i--) | |
| 172 | for (int i = indexNextDepartureRequest - 1; i >= indexToReach; i--) { | |
| 159 | 173 | res += requestsStats.get(i).getPermanenceTimeInQueue(); |
| 174 | } | |
| 160 | 175 | |
| 161 | 176 | return res / lastNRequest / 1000; |
| 162 | } else | |
| 177 | } else { | |
| 163 | 178 | return 0; |
| 179 | } | |
| 164 | 180 | } |
| 165 | 181 | |
| 166 | 182 | public double getAveragePermanenceTimeInQueue(long pastXMilliseconds) { |
| ... | ...@@ -178,8 +194,9 @@ | |
| 178 | 194 | int nbParameters = parametersTypes.length; |
| 179 | 195 | for (int i = 0; i < nbParameters; i++) { |
| 180 | 196 | res += parametersTypes[i].getName(); |
| 181 | if (i + 1 < nbParameters) | |
| 197 | if (i + 1 < nbParameters) { | |
| 182 | 198 | res += ", "; |
| 199 | } | |
| 183 | 200 | } |
| 184 | 201 | res += ") of the interface " + itfName + ":\n"; |
| 185 | 202 | res += "Average length of the queue: " + getAverageLengthQueue() + "\n"; |
| ... | ...@@ -1,9 +1,8 @@ | |
| 1 | 1 | package org.objectweb.proactive.core.component.controller; |
| 2 | 2 | |
| 3 | 3 | import java.io.Serializable; |
| 4 | import java.util.ArrayList; | |
| 5 | import java.util.Collections; | |
| 6 | 4 | import java.util.List; |
| 5 | import java.util.Vector; | |
| 7 | 6 | |
| 8 | 7 | |
| 9 | 8 | public class MethodStatisticsCompositeImpl extends MethodStatisticsAbstract implements Serializable { |
| ... | ...@@ -15,42 +14,47 @@ | |
| 15 | 14 | this.methodName = methodName; |
| 16 | 15 | this.parametersTypes = parametersTypes; |
| 17 | 16 | this.subcomponentMonitors = subcomponentMonitors; |
| 18 | this.requestsStats = Collections.synchronizedList(new ArrayList<RequestStatistics>()); | |
| 17 | this.requestsStats = new Vector<RequestStatistics>(); | |
| 19 | 18 | reset(); |
| 20 | 19 | } |
| 21 | 20 | |
| 22 | 21 | public long getLatestServiceTime() { |
| 23 | 22 | long latestServiceTime = 0; |
| 24 | for (int i = 0; i < subcomponentMonitors.size(); i++) | |
| 23 | for (int i = 0; i < subcomponentMonitors.size(); i++) { | |
| 25 | 24 | latestServiceTime = Math.max(latestServiceTime, subcomponentMonitors.get(i).getStatistics( |
| 26 | 25 | itfName, methodName, parametersTypes).getLatestServiceTime()); |
| 26 | } | |
| 27 | 27 | return latestServiceTime; |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | 30 | public double getAverageServiceTime() { |
| 31 | 31 | double averageServiceTime = 0; |
| 32 | for (int i = 0; i < subcomponentMonitors.size(); i++) | |
| 32 | for (int i = 0; i < subcomponentMonitors.size(); i++) { | |
| 33 | 33 | averageServiceTime = Math.max(averageServiceTime, subcomponentMonitors.get(i).getStatistics( |
| 34 | 34 | itfName, methodName, parametersTypes).getAverageServiceTime()); |
| 35 | } | |
| 35 | 36 | return averageServiceTime; |
| 36 | 37 | } |
| 37 | 38 | |
| 38 | 39 | public double getAverageServiceTime(int lastNRequest) { |
| 39 | 40 | if (lastNRequest != 0) { |
| 40 | 41 | double averageServiceTime = 0; |
| 41 | for (int i = 0; i < subcomponentMonitors.size(); i++) | |
| 42 | for (int i = 0; i < subcomponentMonitors.size(); i++) { | |
| 42 | 43 | averageServiceTime = Math.max(averageServiceTime, subcomponentMonitors.get(i).getStatistics( |
| 43 | 44 | itfName, methodName, parametersTypes).getAverageServiceTime(lastNRequest)); |
| 45 | } | |
| 44 | 46 | return averageServiceTime; |
| 45 | } else | |
| 47 | } else { | |
| 46 | 48 | return 0; |
| 49 | } | |
| 47 | 50 | } |
| 48 | 51 | |
| 49 | 52 | public double getAverageServiceTime(long pastXMilliseconds) { |
| 50 | 53 | double averageServiceTime = 0; |
| 51 | for (int i = 0; i < subcomponentMonitors.size(); i++) | |
| 54 | for (int i = 0; i < subcomponentMonitors.size(); i++) { | |
| 52 | 55 | averageServiceTime = Math.max(averageServiceTime, subcomponentMonitors.get(i).getStatistics( |
| 53 | 56 | itfName, methodName, parametersTypes).getAverageServiceTime(pastXMilliseconds)); |
| 57 | } | |
| 54 | 58 | return averageServiceTime; |
| 55 | 59 | } |
| 56 | 60 | } |
| 57 | 61 | \ No newline at end of file |
| ... | ...@@ -1,8 +1,7 @@ | |
| 1 | 1 | package org.objectweb.proactive.core.component.controller; |
| 2 | 2 | |
| 3 | 3 | import java.io.Serializable; |
| 4 | import java.util.ArrayList; | |
| 5 | import java.util.Collections; | |
| 4 | import java.util.Vector; | |
| 6 | 5 | |
| 7 | 6 | |
| 8 | 7 | public class MethodStatisticsPrimitiveImpl extends MethodStatisticsAbstract implements Serializable { |
| ... | ...@@ -11,7 +10,7 @@ | |
| 11 | 10 | this.itfName = itfName; |
| 12 | 11 | this.methodName = methodName; |
| 13 | 12 | this.parametersTypes = parametersTypes; |
| 14 | this.requestsStats = Collections.synchronizedList(new ArrayList<RequestStatistics>()); | |
| 13 | this.requestsStats = new Vector<RequestStatistics>(); | |
| 15 | 14 | reset(); |
| 16 | 15 | } |
| 17 | 16 | |
| ... | ...@@ -32,8 +31,9 @@ | |
| 32 | 31 | } |
| 33 | 32 | |
| 34 | 33 | return res / lastNRequest / 1000; |
| 35 | } else | |
| 34 | } else { | |
| 36 | 35 | return 0; |
| 36 | } | |
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | public double getAverageServiceTime(long pastXMilliseconds) { |
| ... | ...@@ -23,6 +23,7 @@ | |
| 23 | 23 | * @author The ProActive Team |
| 24 | 24 | */ |
| 25 | 25 | public class TestMonitoring extends ComponentTest { |
| 26 | private static final long OVERHEAD = 400; | |
| 26 | 27 | private Factory factory; |
| 27 | 28 | private Component root; |
| 28 | 29 | private MonitorController monitor; |
| ... | ...@@ -59,12 +60,13 @@ | |
| 59 | 60 | |
| 60 | 61 | private void printStats() { |
| 61 | 62 | Iterator<MethodStatistics> stats = monitor.getAllStatistics().values().iterator(); |
| 62 | while (stats.hasNext()) | |
| 63 | while (stats.hasNext()) { | |
| 63 | 64 | System.out.println(stats.next().toString()); |
| 65 | } | |
| 64 | 66 | } |
| 65 | 67 | |
| 66 | 68 | private boolean checkTime(double supposedTime, double realTime) { |
| 67 | return ((supposedTime * 0.70) <= realTime); | |
| 69 | return ((supposedTime * 0.7) <= realTime) && (realTime <= ((supposedTime * 1.3) + OVERHEAD)); | |
| 68 | 70 | } |
| 69 | 71 | |
| 70 | 72 | private void checkMethodStatistics(String itfName, String methodName, int nbCalls, int nbMethods, |
| ... | ...@@ -78,8 +80,9 @@ | |
| 78 | 80 | Component[] subComponents = Fractal.getContentController(root).getFcSubComponents(); |
| 79 | 81 | for (int i = 0; i < subComponents.length; i++) { |
| 80 | 82 | if (((NameController) subComponents[i].getFcInterface(Constants.NAME_CONTROLLER)).getFcName() |
| 81 | .equals("server")) | |
| 83 | .equals("server")) { | |
| 82 | 84 | monitor = (MonitorController) subComponents[i].getFcInterface(Constants.MONITOR_CONTROLLER); |
| 85 | } | |
| 83 | 86 | } |
| 84 | 87 | |
| 85 | 88 | Fractal.getLifeCycleController(root).startFc(); |