/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis; import java.io.Serializable; import java.net.URI; import java.util.ArrayList; import java.util.List; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; import com.emc.storageos.volumecontroller.ControllerException; import com.emc.storageos.volumecontroller.impl.ControllerServiceImpl; import com.google.common.base.Joiner; /** * Jobs for Scanner. */ public class DataCollectionScanJob extends DataCollectionJob implements Serializable { private static final long serialVersionUID = -2787824457961906580L; ArrayList<ScanTaskCompleter> _completers = new ArrayList<ScanTaskCompleter>(); public DataCollectionScanJob() { super(JobOrigin.USER_API); } DataCollectionScanJob(JobOrigin origin) { super(origin); } public void addCompleter(ScanTaskCompleter completer) { _completers.add(completer); } public ArrayList<ScanTaskCompleter> getCompleters() { return _completers; } @Override public ScanTaskCompleter getCompleter() throws ControllerException { throw new DeviceControllerException("Wrong job"); } public List<URI> getProviders() { List<URI> providers = new ArrayList<URI>(); for (ScanTaskCompleter completer : _completers) { providers.add(completer.getId()); } return providers; } public ScanTaskCompleter findProviderTaskCompleter(URI provider) { for (ScanTaskCompleter completer : _completers) { if (completer.getId().equals(provider)) { return completer; } } return null; } @Override public void ready(DbClient dbClient) throws DeviceControllerException { for (DataCollectionTaskCompleter completer : _completers) { completer.ready(dbClient); } } @Override public void error(DbClient dbClient, ServiceCoded serviceCoded) throws DeviceControllerException { for (DataCollectionTaskCompleter completer : _completers) { completer.error(dbClient, serviceCoded); } } @Override public void schedule(DbClient dbClient) { for (ScanTaskCompleter completer : _completers) { completer.schedule(dbClient); } } @Override final public void setTaskError(DbClient dbClient, ServiceCoded code) { for (ScanTaskCompleter completer : _completers) { completer.statusError(dbClient, code); } } @Override final public void setTaskReady(DbClient dbClient, String message) { for (ScanTaskCompleter completer : _completers) { completer.statusReady(dbClient, message); } } @Override final public void updateTask(DbClient dbClient, String message) { for (ScanTaskCompleter completer : _completers) { completer.statusPending(dbClient, message); } } public String getType() { return ControllerServiceImpl.SCANNER; } public String systemString() { return Joiner.on("\t").join(getProviders()); } public boolean isActiveJob(DbClient dbClient) { for (DataCollectionTaskCompleter completer : _completers) { DataObject dbObject = dbClient.queryObject(completer.getType(), completer.getId()); if (dbObject != null && !dbObject.getInactive()) { return true; } } return false; } private boolean providersMatch(DataCollectionScanJob job) { if (_completers == null && job.getCompleters() == null) { return true; } if ((_completers == null && job.getCompleters() != null) || (_completers != null && job.getCompleters() == null)) { return false; } List<URI> thisProviderIds = new ArrayList<URI>(); for (ScanTaskCompleter completer : _completers) { thisProviderIds.add(completer.getId()); } List<URI> otherProviderIds = new ArrayList<URI>(); for (ScanTaskCompleter completer : job.getCompleters()) { otherProviderIds.add(completer.getId()); } return thisProviderIds.size() == otherProviderIds.size() && thisProviderIds.containsAll(otherProviderIds); } @Override public boolean matches(DataCollectionJob job) { return (this.getClass().equals(job.getClass()) && getType().equals(job.getType()) && getNamespace().equals(job.getNamespace()) && providersMatch((DataCollectionScanJob) job)); } }