package com.onaro.sanscreen.client.view.topology.queries.util; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.onaro.sanscreen.client.graph.replica.interfaces.data.ReplicaModel; import com.onaro.sanscreen.client.graph.replica.interfaces.data.VolumeAccessInfo; import com.onaro.sanscreen.client.graph.replica.interfaces.data.VolumeReplicaInfo; import com.onaro.sanscreen.client.model.beans.Bean; import com.onaro.sanscreen.client.model.beans.InternalVolumeBean; import com.onaro.sanscreen.client.model.beans.StorageBean; import com.onaro.sanscreen.client.model.beans.VolumeBean; import com.onaro.sanscreen.client.model.beans.VolumeLinkBean; import com.onaro.sanscreen.server.interfaces.data.inventory.InternalVolume; import com.onaro.sanscreen.server.interfaces.data.inventory.Volume; /** * Encapsulate the knowledge of how to create {@link Bean} instances based on * a given input parameter of the type {@link ReplicaModel} * * @author cohenj * @since 10/13/2009 - Everest */ public class TopologyReplicationBeanProviderImpl extends AbstractTopologyBeanProvider{ /** * Constructor. * * @param topologyBeanFactory */ public TopologyReplicationBeanProviderImpl(final TopologyBeanFactory topologyBeanFactory) { super(topologyBeanFactory); } @Override public void createBeans(T model) { if (model == null ||(!(model instanceof ReplicaModel))) { throw new IllegalArgumentException("'ReplicaModel' expected"); //$NON-NLS-1$ } // Cast the model to the one that this class knows how to work with. final ReplicaModel replicaModel = (ReplicaModel)model; // Replica information. final Map targetVolumeIdToReplicaInfo = new HashMap(); final Collection volumeReplicaInfos = replicaModel.getVolumeReplicaInfos(); for (VolumeReplicaInfo volumeReplicaInfo: volumeReplicaInfos){ getOrCreateStorageBean(volumeReplicaInfo.getSourceStorage()); getOrCreateStorageBean(volumeReplicaInfo.getTargetStorage()); getOrCreateVolumeBean(volumeReplicaInfo.getSourceVolume()); getOrCreateVolumeBean(volumeReplicaInfo.getTargetVolume()); targetVolumeIdToReplicaInfo.put(volumeReplicaInfo.getTargetVolume().getId(), volumeReplicaInfo); } // Connectivity information. final Set internalVolumes = new HashSet(); final Collection volumeAccessInfos = replicaModel.getVolumeAccessInfos(); for (VolumeAccessInfo volumeAccessInfo: volumeAccessInfos ) { getOrCreateInitiatorBean(volumeAccessInfo.getInitator()); internalVolumes.add(volumeAccessInfo.getInternalVolume()); getOrCreateStorageBean(volumeAccessInfo.getStorage()); getOrCreateVolumeBean(volumeAccessInfo.getVolume()); } // Creates Internal Volumes now. for (InternalVolume internalVolume : internalVolumes) { if (internalVolume == null) continue; if (topologyBeanFactory.containsId(internalVolume.getId())) continue; VolumeReplicaInfo volumeReplicaInfo = targetVolumeIdToReplicaInfo.get(internalVolume.getId()); createInternalVolumeBean(internalVolume, volumeReplicaInfo); } // Now creates the Access links, from Initiator to Volume. for (VolumeAccessInfo accessInfo : volumeAccessInfos) { createInitiatorToVolumeLinkPath(accessInfo, true); } // Now creates the Volume Links. for (VolumeReplicaInfo replicaInfo: volumeReplicaInfos){ createSourceVolumeToTargetVolumeLinkBean(replicaInfo); } } private InternalVolumeBean createInternalVolumeBean(InternalVolume internalVolume, VolumeReplicaInfo columeReplicaInfo) { InternalVolumeBean internalVolumeBean = topologyBeanFactory.getBeanManager().createBean(InternalVolumeBean.class, InternalVolumeBean.ID_PROPERTY_NAME, internalVolume.getId()); internalVolumeBean.setName(internalVolume.getName()); internalVolumeBean.setOwner(topologyBeanFactory.getBeanManager().findBean(StorageBean.class, StorageBean.ID_PROPERTY_NAME, internalVolume.getStorageId())); return internalVolumeBean; } private void createSourceVolumeToTargetVolumeLinkBean(VolumeReplicaInfo replicaInfo) { Volume sourceVolume = replicaInfo.getSourceVolume(); Volume targetVolume = replicaInfo.getTargetVolume(); VolumeBean sourceVolumeBean = topologyBeanFactory.getBeanManager().findBean(VolumeBean.class, VolumeBean.ID_PROPERTY_NAME, sourceVolume.getId()); VolumeBean targetVolumeBean = topologyBeanFactory.getBeanManager().findBean(VolumeBean.class, VolumeBean.ID_PROPERTY_NAME, targetVolume.getId()); Object beanId = topologyBeanFactory.generateLinkBeanId(VolumeLinkBean.class, sourceVolume.getId().longValue(), targetVolume.getId().longValue()); VolumeLinkBean volumeLinkBean = topologyBeanFactory.getBeanManager().createBean(VolumeLinkBean.class,VolumeLinkBean.ID_PROPERTY_NAME, beanId); volumeLinkBean.setSource(sourceVolumeBean); volumeLinkBean.setDestination(targetVolumeBean); volumeLinkBean.setExist(replicaInfo.isExist()); volumeLinkBean.setDirected(true); } }