/*
* Copyright 2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.rioproject.test.utils;
import org.rioproject.opstring.ClassBundle;
import org.rioproject.opstring.ServiceElement;
import org.rioproject.deploy.ServiceRecord;
import org.rioproject.cybernode.Cybernode;
import java.rmi.RemoteException;
import java.util.List;
/**
* The class provides static utility methods for manipulating Cybernodes.
*/
public class CybernodeUtils {
/**
* Searches the specified array of Cybernodes for the first occurence
* of a Cybernode running one or more service elements.
*
* @param cybernodes the array to be searched
* @return the found Cybernode, if successful.
* Otherwise <code>null</null>.
*
* @throws RemoteException if there was a communication failure
* while attempting to access one of the Cybernodes from
* the specified array.
*/
public static Cybernode findBusy(Cybernode[] cybernodes)
throws RemoteException {
for (Cybernode cybernode : cybernodes) {
if (cybernode.getServiceStatements().length > 0) {
return cybernode;
}
}
return null;
}
/**
* Searches the specified list of Cybernodes for the first occurence
* of a Cybernode running one or more service elements.
*
* @param cybernodes the list to be searched
* @return the found Cybernode, if successful.
* Otherwise <code>null</null>.
*/
public static Cybernode findBusy(List<Cybernode> cybernodes) {
for (Cybernode cybernode : cybernodes) {
try {
if (cybernode.getServiceStatements().length > 0) {
return cybernode;
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
return null;
}
/**
* Calculates the number of services of the specified type running on
* each of the specified Cybernodes.
*
* @param cybernodes the Cybernodes to consider
* @param type the service type to look for
* @return the resulting array. Every element of this array
* stores the number of services of the specified type
* running on a specific Cybernode. The order of elements
* corresponds to the one of services in the
* <code>cybernodes</code> parameter.
*
* @throws RemoteException if there was a communication failure
* while attempting to access one of the Cybernodes from
* the specified list.
*/
public static int[] calcServices(Cybernode[] cybernodes, Class type) throws RemoteException {
int[] res = new int[cybernodes.length];
for (int i = 0; i < cybernodes.length; i++) {
Cybernode cybernode = cybernodes[i];
ServiceRecord[] records = cybernode.getServiceRecords(ServiceRecord.ACTIVE_SERVICE_RECORD);
for (ServiceRecord record : records) {
ServiceElement element = record.getServiceElement();
ClassBundle[] exportBundles = element.getExportBundles();
for (ClassBundle bundle : exportBundles) {
if (bundle.getClassName().equals(type.getName())) {
res[i]++;
break;
}
}
}
}
return res;
}
public static int[] calcServices(List<Cybernode> cybernodes, Class type) throws RemoteException {
Cybernode[] cnodes = cybernodes.toArray(new Cybernode[cybernodes.size()]);
return calcServices(cnodes, type);
}
}