/* * 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/>. * */ package org.ourgrid.aggregator.business.dao; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Set; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.ourgrid.aggregator.business.messages.AggregatorControlMessages; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.statistics.beans.aggregator.AG_Attribute; import org.ourgrid.common.statistics.beans.aggregator.AG_Command; import org.ourgrid.common.statistics.beans.aggregator.AG_GridProcess; import org.ourgrid.common.statistics.beans.aggregator.AG_Job; 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_Task; 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_PeerStatusChange; import org.ourgrid.common.statistics.beans.aggregator.monitor.AG_WorkerStatusChange; import org.ourgrid.common.statistics.beans.ds.DS_PeerStatusChange; import org.ourgrid.common.statistics.beans.status.WorkerStatus; import org.ourgrid.common.statistics.util.hibernate.HibernateUtil; import org.ourgrid.peer.status.PeerCompleteHistoryStatus; /** * This class provide the DAO of this Module. * */ public class AggregatorDAO { private String cmmStatusProviderAddress; private long peerStatusChangeLastUpdate = 0L; private Hashtable<String,AggregatorPeerStatusProvider> aggregatorPeerStatusProviders; private List<String> currentProvidersAddress; /** * Constructor default. Initializing the HasTable aggregatorPeerStatusProviders. */ public AggregatorDAO() { this.aggregatorPeerStatusProviders = new Hashtable<String,AggregatorPeerStatusProvider>(); this.currentProvidersAddress = new ArrayList<String>(); } /** * Removes the AggregatorPeerStatusProvider, which has providerAddress it is equal to providerAddress * from one {@link AggregatorPeerStatus}. * This method does nothing if not exists matching. * @param providerAddress {@link String} * @return AggregatorPeerStatusProvider {@link AggregatorPeerStatusProvider} * corresponding if exists matching, else null. */ public AggregatorPeerStatusProvider removeProvider(String providerAddress) { return this.aggregatorPeerStatusProviders.remove(providerAddress); } /** * Put the aggProvider in a hashtable with corresponding providerAddress. * @param aggProvider {@link AggregatorPeerStatusProvider} */ public void putProvider(AggregatorPeerStatusProvider aggProvider) { aggregatorPeerStatusProviders.put(aggProvider.getProviderAddress(), aggProvider); } public boolean aggregatorCurrentPeerStatusProvidersIsEmpty(){ return this.currentProvidersAddress.isEmpty(); } public boolean containsCurrentProviderAddress(String providerAddress) { return this.currentProvidersAddress.contains(providerAddress); } public Set<String> getProvidersAddresses() { return aggregatorPeerStatusProviders.keySet(); } /** * This method adds the complete history status to the database, performing merge * when necessary. * @param completeStatus {@link PeerCompleteHistoryStatus} * @param providerAddress {@link String} */ public void addCompleteHistoryStatus(PeerCompleteHistoryStatus completeStatus, String providerAddress, List<IResponseTO> responses) { HibernateUtil.beginTransaction(); try { List<AG_Peer> peerInfo = completeStatus.getPeerInfo(); //iterate for all peers atualizing all those informations recursively //atualizing all workers owned of each peer. for (AG_Peer peer : peerInfo) { //update the worker status if the peerAddess does not match //to the providerAddress. if (!peer.getAddress().equals(providerAddress)) { for (AG_Worker worker : peer.getWorkers()) { worker.setStatus(WorkerStatus.DONATED); worker.setEndTime(null); } } AG_Peer existingPeer = getExistingPeer(peer.getAddress()); List<AG_Worker> existingWorkers = new ArrayList<AG_Worker>(); //save the peer if him not exists in dao. Else update him. if (existingPeer == null) { savePeer(peer); } else { if (peer.getAddress().equals(providerAddress)) { updatePeer(peer, existingPeer); } List<AG_Worker> workers = new ArrayList<AG_Worker>(peer.getWorkers()); for (AG_Worker worker : workers) { AG_Worker mergedWorker = mergeWorker(worker, existingPeer); existingWorkers.add(mergedWorker); } List<AG_User> users = new ArrayList<AG_User>(peer.getUsers()); for (AG_User user : users) { mergeUser(user, existingPeer, existingWorkers); } } } //Every WorkerStatusChange is new (lastModified > now) for (AG_WorkerStatusChange wsc : completeStatus.getWorkerStatusChangeInfo()) { saveWorkerStatusChange(wsc); } responses.add(new LoggerResponseTO(AggregatorControlMessages .getAddCompleteHistoryStatusSuccessfulMessage(), LoggerResponseTO.INFO)); HibernateUtil.commitTransaction(); } catch (Exception e) { responses.add(new LoggerResponseTO(AggregatorControlMessages .getRollbackTransactionMessage( "addCompleteHistoryStatus", e.getMessage()), LoggerResponseTO.WARN)); HibernateUtil.rollbackTransaction(); } finally { HibernateUtil.closeSession(); } } public void setCommunityStatusProviderAddress(String cmmStatusProviderAddress) { this.cmmStatusProviderAddress = cmmStatusProviderAddress; } public void setPeerStatusChangeLastUpdate(long peerStatusChangeLastUpdate) { this.peerStatusChangeLastUpdate = peerStatusChangeLastUpdate; } public String getCommunityStatusProviderAddress() { return this.cmmStatusProviderAddress; } public void setCurrentProvidersAddress(List<String> currentProvidersAddress) { this.currentProvidersAddress = currentProvidersAddress; } /** * Get the AggregatorPeerStatusProvider corresponding to providerAddress. * @param providerAddress {@link String} * @return AggregatorPeerStatusProvider {@link AggregatorPeerStatusProvider} corresponding if * exists matching, else null */ public AggregatorPeerStatusProvider getProvider(String providerAddress) { return aggregatorPeerStatusProviders.get(providerAddress); } public long getPeerStatusChangeLastUpdate() { return peerStatusChangeLastUpdate; } private void saveWorkerStatusChange(AG_WorkerStatusChange wsc) { AG_Worker existingWorker = getExistingWorker(wsc.getWorker(), wsc.getWorker().getPeer().getAddress()); wsc.setWorker(existingWorker); if (hasNotExistingWorkerStatusChange(existingWorker.getAddress(), wsc.getTimeOfChange())) { HibernateUtil.getSession().save(wsc); } } private boolean hasNotExistingWorkerStatusChange(String workerAddress, long timeOfChange) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_WorkerStatusChange.class); criteria.add(Restrictions.eq("timeOfChange", timeOfChange)); Criteria workerCriteria = criteria.createCriteria("worker"); workerCriteria.add(Restrictions.eq("address", workerAddress)); return criteria.list().isEmpty(); } private AG_Worker mergeWorker(AG_Worker worker, AG_Peer existingPeer) { AG_Worker existingWorker = getExistingWorker(worker, existingPeer.getAddress()); if (existingWorker == null) { return saveWorker(worker, existingPeer); } updateWorker(worker, existingWorker); for (AG_Attribute attribute : worker.getAttributes()) { mergeAttribute(attribute, existingWorker); } return existingWorker; } private void mergeAttribute(AG_Attribute attribute, AG_Worker existingWorker) { AG_Attribute existingAttribute = getExistingAttribute(attribute, existingWorker); if (existingAttribute == null) { saveAttribute(attribute, existingWorker); } else { updateAttribute(attribute, existingAttribute); } } private void mergeUser(AG_User user, AG_Peer existingPeer, List<AG_Worker> existingWorkers) { AG_User existingUser = getExistingUser(user, existingPeer.getAddress()); if (existingUser == null) { saveUser(user, existingPeer, existingWorkers); } else { updateUser(user, existingUser); List<AG_Login> logins = new ArrayList<AG_Login>(user.getLogins()); for (AG_Login login : logins) { mergeLogin(login, existingUser, existingWorkers); } } } private void mergeLogin(AG_Login login, AG_User existingUser, List<AG_Worker> existingWorkers) { AG_Login existingLogin = getExistingLogin(login, existingUser); if (existingLogin == null) { saveLogin(login, existingUser, existingWorkers); } else { updateLogin(login, existingLogin); List<AG_Job> jobs = new ArrayList<AG_Job>(login.getJobs()); for (AG_Job job : jobs) { mergeJob(job, existingLogin, existingWorkers); } } } private void mergeJob(AG_Job job, AG_Login existingLogin, List<AG_Worker> existingWorkers) { AG_Job existingJob = getExistingJob(job, existingLogin); if (existingJob == null) { saveJob(job, existingLogin, existingWorkers); } else { updateJob(job, existingJob); List<AG_Task> tasks = new ArrayList<AG_Task>(job.getTasks()); for (AG_Task task : tasks) { mergeTask(task, existingJob, existingWorkers); } } } private void mergeTask(AG_Task task, AG_Job existingJob, List<AG_Worker> existingWorkers) { AG_Task existingTask = getExistingTask(task, existingJob); if (existingTask == null) { saveTask(task, existingJob, existingWorkers); } else { updateTask(task, existingTask); List<AG_GridProcess> processes = new ArrayList<AG_GridProcess>(task.getProcesses()); for (AG_GridProcess process : processes) { mergeProcess(process, existingTask, existingWorkers); } } } private void mergeProcess(AG_GridProcess process, AG_Task existingTask, List<AG_Worker> existingWorkers) { AG_GridProcess existingProcess = getExistingProcess(process, existingTask); if (existingProcess == null) { saveProcess(process, existingTask, existingWorkers); } else { updateProcess(process, existingProcess); List<AG_Command> commands = new ArrayList<AG_Command>(process.getCommands()); for (AG_Command command : commands) { mergeCommand(command, existingProcess); } } } private void mergeCommand(AG_Command command, AG_GridProcess existingProcess) { AG_Command existingCommand = getExistingCommand(command, existingProcess); if (existingCommand == null) { saveCommand(command, existingProcess); } else { updateCommand(command, existingCommand); } } private void updateAttribute(AG_Attribute attribute, AG_Attribute existingAttribute) { existingAttribute.setBeginTime(attribute.getBeginTime()); existingAttribute.setEndTime(attribute.getEndTime()); existingAttribute.setLastModified(attribute.getLastModified()); existingAttribute.setProperty(attribute.getProperty()); existingAttribute.setValue(attribute.getValue()); HibernateUtil.getSession().update(existingAttribute); } private void saveAttribute(AG_Attribute attribute, AG_Worker existingWorker) { existingWorker.getAttributes().add(attribute); attribute.setWorker(existingWorker); HibernateUtil.getSession().save(attribute); HibernateUtil.getSession().update(existingWorker); } private AG_Attribute getExistingAttribute(AG_Attribute attribute, AG_Worker existingWorker) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Attribute.class); criteria.add(Restrictions.eq("property", attribute.getProperty())); criteria.add(Restrictions.eq("beginTime", attribute.getBeginTime())); Criteria worker = criteria.createCriteria("worker"); worker.add(Restrictions.eq("address", existingWorker.getAddress())); worker.add(Restrictions.eq("beginTime", existingWorker.getBeginTime())); Criteria peer = worker.createCriteria("peer"); peer.add(Restrictions.eq("address", existingWorker.getPeer().getAddress())); AG_Attribute dbAttribute = (AG_Attribute) criteria.uniqueResult(); return dbAttribute; } private void updateWorker(AG_Worker worker, AG_Worker existingWorker) { existingWorker.setAddress(worker.getAddress()); existingWorker.setBeginTime(worker.getBeginTime()); existingWorker.setEndTime(worker.getEndTime()); existingWorker.setLastModified(worker.getLastModified()); existingWorker.setStatus(worker.getStatus()); existingWorker.setAllocatedFor(worker.getAllocatedFor()); HibernateUtil.getSession().update(existingWorker); } private AG_Worker saveWorker(AG_Worker worker, AG_Peer existingPeer) { existingPeer.getWorkers().add(worker); worker.setPeer(existingPeer); HibernateUtil.getSession().save(worker); HibernateUtil.getSession().update(existingPeer); List<AG_Attribute> attributes = new ArrayList<AG_Attribute>(worker.getAttributes()); worker.setAttributes(new ArrayList<AG_Attribute>()); attachToExistentProcess(worker); for (AG_Attribute attribute : attributes) { saveAttribute(attribute, worker); } return worker; } private void attachToExistentProcess(AG_Worker worker) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_GridProcess.class); criteria.add(Restrictions.eq("workerAddress", worker.getAddress())); criteria.add(Restrictions.isNull("worker")); List<AG_GridProcess> processes = criteria.list(); for (AG_GridProcess process : processes) { process.setWorker(worker); HibernateUtil.getSession().saveOrUpdate(process); } } private AG_Worker getExistingWorker(AG_Worker worker, String peerAddress) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Worker.class); criteria.add(Restrictions.eq("address", worker.getAddress())); Criteria peerCriteria = criteria.createCriteria("peer"); peerCriteria.add(Restrictions.eq("address", peerAddress)); return (AG_Worker) criteria.uniqueResult(); } private void updateCommand(AG_Command command, AG_Command existingCommand) { existingCommand.setDestination(command.getDestination()); existingCommand.setFileName(command.getFileName()); existingCommand.setFileSize(command.getFileSize()); existingCommand.setLastModified(command.getLastModified()); existingCommand.setName(command.getName()); existingCommand.setProgress(command.getProgress()); existingCommand.setSource(command.getSource()); existingCommand.setStatus(command.getStatus()); existingCommand.setTransferBegin(command.getTransferBegin()); existingCommand.setTransferEnd(command.getTransferEnd()); existingCommand.setTransferRate(command.getTransferRate()); HibernateUtil.getSession().update(existingCommand); } private void saveCommand(AG_Command command, AG_GridProcess existingProcess) { command.setProcess(existingProcess); existingProcess.getCommands().add(command); HibernateUtil.getSession().save(command); HibernateUtil.getSession().update(existingProcess); } private AG_Command getExistingCommand(AG_Command command, AG_GridProcess existingProcess) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Command.class); criteria.add(Restrictions.eq("transferBegin", command.getTransferBegin())); Criteria process = criteria.createCriteria("process"); process.add(Restrictions.eq("creationTime", existingProcess.getCreationTime())); Criteria task = process.createCriteria("task"); task.add(Restrictions.eq("sequenceNumber", existingProcess.getTask().getSequenceNumber())); Criteria job = task.createCriteria("job"); job.add(Restrictions.eq("jobId", existingProcess.getTask().getJob().getJobId())); Criteria login = job.createCriteria("login"); login.add(Restrictions.eq("beginTime", existingProcess.getTask().getJob().getLogin().getBeginTime())); Criteria user = login.createCriteria("user"); user.add(Restrictions.eq("address", existingProcess.getTask().getJob().getLogin().getUser().getAddress())); user.add(Restrictions.eq("creationDate", existingProcess.getTask().getJob().getLogin().getUser().getCreationDate())); Criteria peer = user.createCriteria("peer"); peer.add(Restrictions.eq("address", existingProcess.getTask().getJob().getLogin().getUser().getPeer().getAddress())); AG_Command dbCommand = (AG_Command) criteria.uniqueResult(); return dbCommand; } private void updateProcess(AG_GridProcess process, AG_GridProcess existingProcess) { existingProcess.setCreationTime(process.getCreationTime()); existingProcess.setErrorCause(process.getErrorCause()); existingProcess.setExecutionErrorType(process.getExecutionErrorType()); existingProcess.setExitValue(process.getExitValue()); existingProcess.setFinalBeginning(process.getFinalBeginning()); existingProcess.setFinalEnd(process.getFinalEnd()); existingProcess.setInitBeginning(process.getInitBeginning()); existingProcess.setInitEnd(process.getInitEnd()); existingProcess.setLastModified(process.getLastModified()); existingProcess.setLatestPhase(process.getLatestPhase()); existingProcess.setRemoteBeginning(process.getRemoteBeginning()); existingProcess.setRemoteEnd(process.getRemoteEnd()); existingProcess.setSabotageCheck(process.getSabotageCheck()); existingProcess.setStatus(process.getStatus()); existingProcess.setSequenceNumber(process.getSequenceNumber()); existingProcess.setWorkerAddress(process.getWorkerAddress()); existingProcess.setStderr(process.getStderr()); existingProcess.setStdout(process.getStdout()); HibernateUtil.getSession().update(existingProcess); } private void saveProcess(AG_GridProcess process, AG_Task existingTask, List<AG_Worker> existingWorkers) { process.setTask(existingTask); existingTask.getProcesses().add(process); AG_Worker existingWorker = null; for (AG_Worker worker : existingWorkers) { if (worker.getAddress().equals(process.getWorkerAddress())) { existingWorker = worker; } } process.setWorker(existingWorker); HibernateUtil.getSession().save(process); HibernateUtil.getSession().update(existingTask); List<AG_Command> commands = new ArrayList<AG_Command>(process.getCommands()); process.setCommands(new ArrayList<AG_Command>()); for (AG_Command command : commands) { saveCommand(command, process); } } private AG_GridProcess getExistingProcess(AG_GridProcess process, AG_Task existingTask) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_GridProcess.class, "process"); criteria.add(Restrictions.eq("sequenceNumber",process.getSequenceNumber())); Criteria task = criteria.createCriteria("task"); task.add(Restrictions.eq("sequenceNumber", existingTask.getSequenceNumber())); Criteria job = task.createCriteria("job"); job.add(Restrictions.eq("jobId", existingTask.getJob().getJobId())); Criteria login = job.createCriteria("login"); login.add(Restrictions.eq("beginTime", existingTask.getJob().getLogin().getBeginTime())); Criteria user = login.createCriteria("user"); user.add(Restrictions.eq("address", existingTask.getJob().getLogin().getUser().getAddress())); user.add(Restrictions.eq("creationDate", existingTask.getJob().getLogin().getUser().getCreationDate())); Criteria peer = user.createCriteria("peer"); peer.add(Restrictions.eq("address", existingTask.getJob().getLogin().getUser().getPeer().getAddress())); AG_GridProcess dbProcess = (AG_GridProcess) criteria.uniqueResult(); return dbProcess; } private void updateTask(AG_Task task, AG_Task existingTask) { existingTask.setActualFails(task.getActualFails()); existingTask.setLastModified(task.getLastModified()); existingTask.setRemoteExec(task.getRemoteExec()); existingTask.setSabotageCheck(task.getSabotageCheck()); existingTask.setStatus(task.getStatus()); existingTask.setSequenceNumber(task.getSequenceNumber()); HibernateUtil.getSession().update(existingTask); } private void saveTask(AG_Task task, AG_Job existingJob, List<AG_Worker> existingWorkers) { task.setJob(existingJob); existingJob.getTasks().add(task); HibernateUtil.getSession().save(task); HibernateUtil.getSession().update(existingJob); List<AG_GridProcess> processes = new ArrayList<AG_GridProcess>(task.getProcesses()); task.setProcesses(new ArrayList<AG_GridProcess>()); for (AG_GridProcess process : processes) { saveProcess(process, task, existingWorkers); } } private AG_Task getExistingTask(AG_Task task, AG_Job existingJob) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Task.class); criteria.add(Restrictions.eq("sequenceNumber", task.getSequenceNumber())); Criteria job = criteria.createCriteria("job"); job.add(Restrictions.eq("jobId", existingJob.getJobId())); job.add(Restrictions.eq("creationTime", existingJob.getCreationTime())); Criteria login = job.createCriteria("login"); login.add(Restrictions.eq("beginTime", existingJob.getLogin().getBeginTime())); Criteria user = login.createCriteria("user"); user.add(Restrictions.eq("address", existingJob.getLogin().getUser().getAddress())); user.add(Restrictions.eq("creationDate", existingJob.getLogin().getUser().getCreationDate())); Criteria peer = user.createCriteria("peer"); peer.add(Restrictions.eq("address", existingJob.getLogin().getUser().getPeer().getAddress())); AG_Task dbTask = (AG_Task) criteria.uniqueResult(); return dbTask; } private void updateJob(AG_Job job, AG_Job existingJob) { existingJob.setCreationTime(job.getCreationTime()); existingJob.setFinishTime(job.getFinishTime()); existingJob.setJobId(job.getJobId()); existingJob.setLabel(job.getLabel()); existingJob.setLastModified(job.getLastModified()); existingJob.setMaxFails(job.getMaxFails()); existingJob.setMaxReplicas(job.getMaxReplicas()); existingJob.setRequestId(job.getRequestId()); existingJob.setRequirements(job.getRequirements()); existingJob.setStatus(job.getStatus()); HibernateUtil.getSession().update(existingJob); } private void saveJob(AG_Job job, AG_Login existingLogin, List<AG_Worker> existingWorkers) { job.setLogin(existingLogin); existingLogin.getJobs().add(job); HibernateUtil.getSession().save(job); HibernateUtil.getSession().update(existingLogin); List<AG_Task> tasks = new ArrayList<AG_Task>(job.getTasks()); job.setTasks(new ArrayList<AG_Task>()); for (AG_Task task : tasks) { saveTask(task, job, existingWorkers); } } private AG_Job getExistingJob(AG_Job job, AG_Login existingLogin) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Job.class); criteria.add(Restrictions.eq("jobId", job.getJobId())); criteria.add(Restrictions.eq("creationTime", job.getCreationTime())); Criteria login = criteria.createCriteria("login"); login.add(Restrictions.eq("beginTime", existingLogin.getBeginTime())); Criteria user = login.createCriteria("user"); user.add(Restrictions.eq("address", existingLogin.getUser().getAddress())); user.add(Restrictions.eq("creationDate", existingLogin.getUser().getCreationDate())); Criteria peer = user.createCriteria("peer"); peer.add(Restrictions.eq("address", existingLogin.getUser().getPeer().getAddress())); AG_Job dbJob = (AG_Job) criteria.uniqueResult(); return dbJob; } private void updateLogin(AG_Login login, AG_Login existingLogin) { existingLogin.setBeginTime(login.getBeginTime()); existingLogin.setEndTime(login.getEndTime()); existingLogin.setLastModified(login.getLastModified()); existingLogin.setLoginResult(login.getLoginResult()); HibernateUtil.getSession().update(existingLogin); } private void saveLogin(AG_Login login, AG_User existingUser, List<AG_Worker> existingWorkers) { login.setUser(existingUser); existingUser.getLogins().add(login); HibernateUtil.getSession().save(login); HibernateUtil.getSession().update(existingUser); List<AG_Job> jobs = new ArrayList<AG_Job>(login.getJobs()); login.setJobs(new ArrayList<AG_Job>()); for (AG_Job job : jobs) { saveJob(job, login, existingWorkers); } } private AG_Login getExistingLogin(AG_Login login, AG_User existingUser) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Login.class); criteria.add(Restrictions.eq("beginTime", login.getBeginTime())); Criteria user = criteria.createCriteria("user"); user.add(Restrictions.eq("address", existingUser.getAddress())); user.add(Restrictions.eq("creationDate", existingUser.getCreationDate())); Criteria peer = user.createCriteria("peer"); peer.add(Restrictions.eq("address", existingUser.getPeer().getAddress())); AG_Login dbLogin = (AG_Login) criteria.uniqueResult(); return dbLogin; } private void updateUser(AG_User user, AG_User existingUser) { existingUser.setCreationDate(user.getCreationDate()); existingUser.setDeletionDate(user.getDeletionDate()); existingUser.setLastModified(user.getLastModified()); existingUser.setPublicKey(user.getPublicKey()); HibernateUtil.getSession().update(existingUser); } private void updatePeer(AG_Peer peer, AG_Peer existingPeer) { setAttributes(peer, existingPeer); } private void savePeer(AG_Peer peer) { List<AG_Worker> workers = new ArrayList<AG_Worker>(peer.getWorkers()); peer.setWorkers(new ArrayList<AG_Worker>()); HibernateUtil.getSession().save(peer); List<AG_Worker> existingWorkers = new ArrayList<AG_Worker>(); for (AG_Worker worker : workers) { existingWorkers.add(saveWorker(worker, peer)); } List<AG_User> users = new ArrayList<AG_User>(peer.getUsers()); peer.setUsers(new ArrayList<AG_User>()); for (AG_User user : users) { saveUser(user, peer, existingWorkers); } } private void saveUser(AG_User user, AG_Peer existingPeer, List<AG_Worker> existingWorkers) { user.setPeer(existingPeer); existingPeer.getUsers().add(user); HibernateUtil.getSession().save(user); HibernateUtil.getSession().update(existingPeer); List<AG_Login> logins = new ArrayList<AG_Login>(user.getLogins()); user.setLogins(new ArrayList<AG_Login>()); for (AG_Login login : logins) { saveLogin(login, user, existingWorkers); } } private void setAttributes(AG_Peer peer, AG_Peer existingPeer) { existingPeer.setDescription(peer.getDescription()); existingPeer.setEmail(peer.getEmail()); existingPeer.setLabel(peer.getLabel()); existingPeer.setLastModified(peer.getLastModified()); existingPeer.setLatitude(peer.getLatitude()); existingPeer.setLongitude(peer.getLongitude()); existingPeer.setTimezone(peer.getTimezone()); existingPeer.setVersion(peer.getVersion()); HibernateUtil.getSession().update(existingPeer); } private AG_Peer getExistingPeer(String peerAddress) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_Peer.class); criteria.add(Restrictions.eq("address", peerAddress)); return (AG_Peer) criteria.uniqueResult(); } private AG_User getExistingUser(AG_User user, String peerAddress) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_User.class); criteria.add(Restrictions.eq("address", user.getAddress())); criteria.add(Restrictions.eq("creationDate", user.getCreationDate())); Criteria peerCriteria = criteria.createCriteria("peer"); peerCriteria.add(Restrictions.eq("address", peerAddress)); return (AG_User) criteria.uniqueResult(); } private boolean hasNotExistingPeerStatusChange(String peerAddress, long timeOfChange) { Criteria criteria = HibernateUtil.getSession().createCriteria(AG_PeerStatusChange.class); criteria.add(Restrictions.eq("timeOfChange", timeOfChange)); Criteria peerCriteria = criteria.createCriteria("peer"); peerCriteria.add(Restrictions.eq("address", peerAddress)); return criteria.list().isEmpty(); } /** * This method save the Peers Status Changes to the database. * @param statusChanges {@link List<DS_PeerStatusChange>} */ public void savePeersStatusChanges(List<DS_PeerStatusChange> statusChanges, List<IResponseTO> responses ) { HibernateUtil.beginTransaction(); try { for (DS_PeerStatusChange peerStatusChange : statusChanges) { AG_Peer peer = getExistingPeer(peerStatusChange.getPeerAddress()); AG_PeerStatusChange peerStatusChangeAG = convertPeerStatusChange(peerStatusChange); if (peer == null) { peer = new AG_Peer(); peer.setAddress(peerStatusChange.getPeerAddress()); HibernateUtil.getSession().save(peer); } peer.setStatus(peerStatusChange.getCurrentStatus()); HibernateUtil.getSession().update(peer); peerStatusChangeAG.setPeer(peer); if(hasNotExistingPeerStatusChange(peerStatusChange.getPeerAddress(), peerStatusChangeAG.getTimeOfChange())) { HibernateUtil.getSession().save(peerStatusChangeAG); } } responses.add(new LoggerResponseTO(AggregatorControlMessages .getSavePeersStatusChangesSuccessfulMessage(), LoggerResponseTO.INFO)); HibernateUtil.commitTransaction(); } catch (Exception e) { responses.add(new LoggerResponseTO(AggregatorControlMessages .getRollbackTransactionMessage( " savePeersStatusChanges", e.getMessage()), LoggerResponseTO.INFO)); HibernateUtil.rollbackTransaction(); } finally { HibernateUtil.closeSession(); } } private static AG_PeerStatusChange convertPeerStatusChange(DS_PeerStatusChange psc) { AG_PeerStatusChange agPsc = new AG_PeerStatusChange(); agPsc.setCurrentStatus(psc.getCurrentStatus()); agPsc.setLastModified(psc.getLastModified()); agPsc.setTimeOfChange(psc.getTimeOfChange()); agPsc.setVersion(psc.getVersion()); return agPsc; } }