/*
* Eoulsan development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public License version 2.1 or
* later and CeCILL-C. This should be distributed with the code.
* If you do not have a copy, see:
*
* http://www.gnu.org/licenses/lgpl-2.1.txt
* http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt
*
* Copyright for this code is held jointly by the Genomic platform
* of the Institut de Biologie de l'École normale supérieure and
* the individual authors. These should be listed in @author doc
* comments.
*
* For more information on the Eoulsan project and its aims,
* or to join the Eoulsan Google group, visit the home page
* at:
*
* http://outils.genomique.biologie.ens.fr/eoulsan
*
*/
package fr.ens.biologie.genomique.eoulsan.core;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import fr.ens.biologie.genomique.eoulsan.EoulsanRuntimeException;
import fr.ens.biologie.genomique.eoulsan.data.DataFormat;
/**
* This class define a basic implementation of a Ports class.
* @since 2.0
* @author Laurent Jourdren
*/
public abstract class AbstractPorts<E extends Port>
implements Ports<E>, Serializable {
private static final long serialVersionUID = -5116830881426447140L;
private final Map<String, E> ports;
@Override
public Iterator<E> iterator() {
return this.ports.values().iterator();
}
@Override
public E getPort(final String name) {
if (name == null) {
return null;
}
return this.ports.get(name.trim().toLowerCase());
}
@Override
public boolean contains(final String name) {
if (name == null) {
return false;
}
return this.ports.containsKey(name.trim().toLowerCase());
}
@Override
public boolean contains(final E port) {
if (port == null) {
return false;
}
return this.ports.containsKey(port.getName());
}
@Override
public Set<String> getPortNames() {
return Collections.unmodifiableSet(this.ports.keySet());
}
@Override
public int size() {
return this.ports.size();
}
@Override
public boolean isEmpty() {
return size() == 0;
}
@Override
public E getFirstPort() {
if (size() == 0) {
return null;
}
return iterator().next();
}
@Override
public String toString() {
return this.ports.toString();
}
//
// Constructor
//
/**
* Constructor.
* @param ports ports of the object
*/
protected AbstractPorts(final Set<E> ports) {
// If ports is null
if (ports == null || ports.isEmpty()) {
this.ports = Collections.emptyMap();
return;
}
final Map<String, E> map = new HashMap<>();
for (E port : ports) {
if (port == null) {
continue;
}
if (map.containsKey(port.getName())) {
throw new EoulsanRuntimeException(
"A port already exists with the same name: " + port.getName());
}
map.put(port.getName(), port);
}
switch (map.size()) {
case 0:
this.ports = Collections.emptyMap();
break;
case 1:
final E value = map.values().iterator().next();
this.ports = Collections.singletonMap(value.getName(), value);
break;
default:
this.ports = map;
}
}
@Override
public int countDataFormat(final DataFormat format) {
if (format == null) {
return 0;
}
int count = 0;
for (E e : this) {
if (e.getFormat().equals(format)) {
count++;
}
}
return count;
}
@Override
public List<E> getPortsWithDataFormat(final DataFormat format) {
if (format == null) {
return Collections.emptyList();
}
final List<E> result = new ArrayList<>();
for (E e : this) {
if (e.getFormat().equals(format)) {
result.add(e);
}
}
return Collections.unmodifiableList(result);
}
}