package com.idega.business; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.data.ExplicitlySynchronizedEntity; import com.idega.util.ListUtil; import com.idega.util.expression.ELUtil; @Service(ExplicitSynchronizationBusiness.BEAN_NAME) @Scope(BeanDefinition.SCOPE_SINGLETON) public class ExplicitSynchronizationBusinessBean implements ExplicitSynchronizationBusiness{ private Map<String, Collection<SynchronizerWraper>> synchronizersEntityMap; @Override public void synchronize(ExplicitlySynchronizedEntity entity){ try{ RequestSynchronizer rs = ELUtil.getInstance().getBean(RequestSynchronizer.BEAN_NAME); rs.addEntityToSyncronize(entity); }catch (Exception e) { getLogger().log(Level.WARNING, "Non request synchronization is not implemented yet", e); } } private Logger getLogger(){ return Logger.getLogger(ExplicitSynchronizationBusinessBean.class.getName()); } @Override public void activateSynchronization(Collection<ExplicitlySynchronizedEntity> entities) { activateSynchronization(entities, new HashMap<String, Object>()); } @Override public void activateSynchronization(Collection<ExplicitlySynchronizedEntity> entities,Map<String, Object> properties) { if(ListUtil.isEmpty(entities)){ return; } if(synchronizersEntityMap == null){ return; } Map<SynchronizerWraper,Collection<ExplicitlySynchronizedEntity>> synchronizersToExecute = new HashMap<SynchronizerWraper,Collection<ExplicitlySynchronizedEntity>>(); for(ExplicitlySynchronizedEntity entity : entities){ Collection<SynchronizerWraper> synchronizers = synchronizersEntityMap.get(entity.getSynchronizerKey()); if(ListUtil.isEmpty(synchronizers)){ continue; } for(SynchronizerWraper synchronizer : synchronizers){ Collection<ExplicitlySynchronizedEntity> synchronizerEntities = synchronizersToExecute.get(synchronizer); if(synchronizerEntities == null){ synchronizerEntities = new ArrayList<ExplicitlySynchronizedEntity>(); synchronizersToExecute.put(synchronizer, synchronizerEntities); } synchronizerEntities.add(entity); } } Set<SynchronizerWraper> keySet = synchronizersToExecute.keySet(); for(SynchronizerWraper wraper : keySet){ try{ wraper.synchronizer.executeSynchronization(synchronizersToExecute.get(wraper), properties); }catch (Exception e) { getLogger().log(Level.WARNING, "Synchronizer " + wraper.synchronizer +" failed!", e); } } } private Map<String, Collection<SynchronizerWraper>> getSynchronizersEntityMap() { if(synchronizersEntityMap != null){ return synchronizersEntityMap; } synchronizersEntityMap = new HashMap<String, Collection<SynchronizerWraper>>(); return synchronizersEntityMap; } @Override public void addSynchronizer(String key,ExplicitSynchronizer synchronizer){ Map<String, Collection<SynchronizerWraper>> synchronizersEntityMap = getSynchronizersEntityMap(); Collection<SynchronizerWraper> synchronizers = synchronizersEntityMap.get(key); if(synchronizers == null){ synchronizers = new HashSet<SynchronizerWraper>(); } synchronizers.add(new SynchronizerWraper(synchronizer)); synchronizersEntityMap.put(key, synchronizers); } private class SynchronizerWraper { public ExplicitSynchronizer synchronizer; public Object equalKey; public SynchronizerWraper(ExplicitSynchronizer synchronizer){ this.synchronizer = synchronizer; equalKey = synchronizer.getClass(); } public boolean equals(SynchronizerWraper synchronizerWraper) { return synchronizerWraper.equalKey.equals(equalKey); } @Override public boolean equals(Object obj) { if(obj instanceof SynchronizerWraper){ return equals((SynchronizerWraper)obj); } return super.equals(obj); } @Override public int hashCode() { return equalKey.hashCode(); } } }