/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero 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
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program.
* If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.operator.ports;
import com.rapidminer.operator.IOContainer;
import com.rapidminer.operator.Operator;
import com.rapidminer.tools.Observable;
import java.util.List;
import java.util.Observer;
/**
* A collection of either input or output {@link Port}s (as defined by generic class T). <br/>
* Instances of this class serve as a factory and register of ports. Ports can be accessed by names
* or index. Actual behaviour is defined by specialized interfaces {@link InputPorts} and
* {@link OutputPorts}. <br/>
* Implementors of operators are encouraged to generate their ports at construction time and keep
* private references to them, rather than retrieving them via one of the get methods every time
* they are needed. The GUI will probably use the getter-methods. <br/>
*
* Instances of this class can be observed by the {@link Observer} pattern.
*
* @author Simon Fischer
* */
public interface Ports<T extends Port> extends Observable<Port> {
/** Returns all input port names registered with these ports. */
public String[] getPortNames();
/** Returns the number of ports. */
public int getNumberOfPorts();
/**
* Should be used in apply method to retrieve desired ports. name should be a constant defined
* in the operator. If a port with the given name does not exist, but a {@link PortExtender}
* with a suitable prefix is registered, ports will be created accordingly. In this case, the
* user must call {@link #unlockPortExtenders()} to guarantee that ports can be removed again.
*/
public T getPortByName(String name);
/** Should only be used by GUI. */
public T getPortByIndex(int index);
/** Returns an immutable view of the ports. */
public List<T> getAllPorts();
/**
* Add a port and notify the {@link Observer}s.
*
* @throws PortException
* if the name is already used.
*/
public void addPort(T port) throws PortException;
/**
* Remove a port and notify the {@link Observer}s.
*
* @throws PortException
* if port is not registered with this Ports instance.
*/
public void removePort(T port) throws PortException;
/** Removes all ports. */
public void removeAll() throws PortException;
/** Returns true if this port is contained within this Ports object. */
public boolean containsPort(T port);
/** Returns a textual description of the meta data currently assigned to these ports. */
public String getMetaDataDescription();
/** Returns the operator and process to which these ports are attached. */
public PortOwner getOwner();
/** Creates a new port and adds it to these Ports. */
public T createPort(String name);
/** Creates (and adds) a new port whose {@link Port#simulatesStack()} returns false. */
public T createPassThroughPort(String name);
/** Creates a new port and adds it to these Ports if add is true.. */
public T createPort(String name, boolean add);
/** Renames the given port. */
public void renamePort(T port, String newName);
/**
* Clears the input, meta data, and error messages.
*
* @see Ports#clear(int)
*/
public void clear(int clearFlags);
/**
* This is a backport method to generate IOContainers containing all output objects of the given
* ports.
*/
public IOContainer createIOContainer(boolean onlyConnected);
/**
* This is a backport method to generate IOContainers containing all output objects of the given
* ports.
*/
public IOContainer createIOContainer(boolean onlyConnected, boolean omitNullResults);
/** Re-adds this port as the last port in this collection. */
public void pushDown(T port);
/** Disconnects all ports. */
public void disconnectAll();
/**
* Disconnects all ports with exception to those connections to operators in the given list.
*/
public void disconnectAllBut(List<Operator> exception);
/** Registers a port extender with this ports. */
public void registerPortExtender(PortExtender extender);
/** While parsing the process XML file, we may have called loading */
public void unlockPortExtenders();
/** Frees memory occupied by references to ioobjects. */
public void freeMemory();
/** Returns the number of ports in these Ports that are actually connected. */
int getNumberOfConnectedPorts();
}