package org.ourgrid.matchers; /* * Copyright (C) 2008 Universidade Federal de Campina Grande * * This file is part of OurGrid. * * OurGrid is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ import java.util.ArrayList; import java.util.List; import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; import org.ourgrid.common.statistics.beans.aggregator.AG_Attribute; import org.ourgrid.common.statistics.beans.aggregator.AG_Login; import org.ourgrid.common.statistics.beans.aggregator.AG_Peer; import org.ourgrid.common.statistics.beans.aggregator.AG_User; import org.ourgrid.common.statistics.beans.aggregator.AG_Worker; import org.ourgrid.common.statistics.beans.aggregator.monitor.AG_WorkerStatusChange; import org.ourgrid.common.status.CompleteStatus; import org.ourgrid.peer.status.PeerCompleteHistoryStatus; public class PeerCompleteHistoryStatusMatcher implements IArgumentMatcher { private PeerCompleteHistoryStatus completeStatus; /** * @param remoteExecuteMessageHandle */ public PeerCompleteHistoryStatusMatcher(PeerCompleteHistoryStatus completeStatus) { this.completeStatus = completeStatus; } /* * (non-Javadoc) * * @see org.easymock.IArgumentMatcher#appendTo(java.lang.StringBuffer) */ public void appendTo(StringBuffer arg0) { } /* * (non-Javadoc) * * @see org.easymock.IArgumentMatcher#matches(java.lang.Object) */ public boolean matches(Object arg0) { if (!(CompleteStatus.class.isInstance(arg0))) { return false; } if (arg0 == null) { return false; } PeerCompleteHistoryStatus other = (PeerCompleteHistoryStatus) arg0; if (!this.completeStatus.getPeerInfo().isEmpty()) { List<AG_Peer> peerInfo = this.completeStatus.getPeerInfo(); List<AG_Peer> otherPeerInfo = other.getPeerInfo(); //Special treatment to peer empty if (peerInfo.get(0).getAddress() == null) { return true; } if (peerInfo.size() != otherPeerInfo.size()) return false; for (int i = 0; i < peerInfo.size(); i++) { AG_Peer peer = peerInfo.get(i); AG_Peer otherPeer = otherPeerInfo.get(i); if (!peer.getAddress().equals(otherPeer.getAddress())) return false; } } if (this.completeStatus.getPeerInfo() != null && !getWorkersList(this.completeStatus.getPeerInfo()).isEmpty()) { List<AG_Worker> workersInfo = getWorkersList(this.completeStatus.getPeerInfo()); List<AG_Worker> otherWorkersInfo = getWorkersList(other.getPeerInfo()); if (workersInfo.size() != otherWorkersInfo.size()) return false; for (int i = 0; i < workersInfo.size(); i++) { AG_Worker workerInfo = workersInfo.get(i); AG_Worker otherWorkerInfo = otherWorkersInfo.get(i); if (!workerInfo.getAddress().equals(otherWorkerInfo.getAddress())) return false; if (workerInfo.getPeer() != null) { if (otherWorkerInfo.getPeer() == null) { return false; } if (!workerInfo.getPeer().getAddress().equals(otherWorkerInfo.getPeer().getAddress())) return false; } for (AG_Attribute attribute : workerInfo.getAttributes()) { boolean hasProperty = false; for (AG_Attribute otherAttribute : otherWorkerInfo.getAttributes()) { if (attribute.getProperty().equals(otherAttribute.getProperty())) { hasProperty = true; if (!attribute.getValue().equals(otherAttribute.getValue())) return false; else break; } } if (!hasProperty) return false; } } } if (!this.completeStatus.getWorkerStatusChangeInfo().isEmpty()) { List<AG_WorkerStatusChange> workerStatusChangeInfo = this.completeStatus.getWorkerStatusChangeInfo(); List<AG_WorkerStatusChange> otherWorkerStatusChangeInfo = other.getWorkerStatusChangeInfo(); if (workerStatusChangeInfo.size() != otherWorkerStatusChangeInfo.size()) return false; for (int i = 0; i < workerStatusChangeInfo.size(); i++) { AG_WorkerStatusChange statusChange = workerStatusChangeInfo.get(i); AG_WorkerStatusChange otherStatusChange = otherWorkerStatusChangeInfo.get(i); if (!statusChange.getStatus().equals(otherStatusChange.getStatus())) return false; if (!statusChange.getWorker().getAddress().equals(otherStatusChange.getWorker().getAddress())) return false; } } if (this.completeStatus.getPeerInfo() != null && !getUsersList(this.completeStatus.getPeerInfo()).isEmpty()) { List<AG_User> usersInfo = getUsersList(this.completeStatus.getPeerInfo()); List<AG_User> otherUsersInfo = getUsersList(other.getPeerInfo()); if (usersInfo.size() != otherUsersInfo.size()) return false; for (int i = 0; i < usersInfo.size(); i++) { AG_User user = usersInfo.get(i); AG_User otherUser = otherUsersInfo.get(i); if (!user.getAddress().equals(otherUser.getAddress())) return false; if (!user.getPeer().getAddress().equals(otherUser.getPeer().getAddress())) return false; if (!user.getPublicKey().equals(otherUser.getPublicKey())) return false; } } if (this.completeStatus.getPeerInfo() != null && !getLoginList(this.completeStatus.getPeerInfo()).isEmpty()) { List<AG_Login> loginInfo = getLoginList(this.completeStatus.getPeerInfo()); List<AG_Login> otherLoginInfo = getLoginList(other.getPeerInfo()); if (loginInfo.size() != otherLoginInfo.size()) return false; for (int i = 0; i < loginInfo.size(); i++) { AG_Login login = loginInfo.get(i); AG_Login otherLogin = otherLoginInfo.get(i); if (!login.getLoginResult().equals(otherLogin.getLoginResult())) return false; if (login.getUser().getId() != otherLogin.getUser().getId()) return false; } } return true; } private List<AG_Worker> getWorkersList(List<AG_Peer> peerInfo) { List<AG_Worker> workers = new ArrayList<AG_Worker>(); for (AG_Peer peer : peerInfo) { workers.addAll(peer.getWorkers()); } return workers; } private List<AG_Login> getLoginList(List<AG_Peer> peerInfo) { List<AG_User> users = getUsersList(peerInfo); List<AG_Login> logins = new ArrayList<AG_Login>(); for (AG_User user : users) { logins.addAll(user.getLogins()); } return logins; } private List<AG_User> getUsersList(List<AG_Peer> peerInfo) { List<AG_User> users = new ArrayList<AG_User>(); if (peerInfo != null) { for (AG_Peer peer : peerInfo) { users.addAll(peer.getUsers()); } } return users; } public static PeerCompleteHistoryStatus eqMatcher(PeerCompleteHistoryStatus completeStatus) { EasyMock.reportMatcher(new PeerCompleteHistoryStatusMatcher(completeStatus)); return null; } }