| /** |
| * Copyright (C) 2015 DataTorrent, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.datatorrent.api; |
| |
| /** |
| * Basic interface which is implemented by almost all entities in the system. |
| * This interface provides a convenient way of setting up and tearing down most |
| * entities in the system. |
| * |
| * @param <CONTEXT> Context used for the current run of the component. |
| * @since 0.3.2 |
| */ |
| public interface Component<CONTEXT extends Context> |
| { |
| /** |
| * It's recommended to use this separator to create scoped names for the components. |
| * e.g. Port p on Operator o can be identified as o.concat(CONCAT_SEPARATOR).concat(p). |
| */ |
| public static final String CONCAT_SEPARATOR = "."; |
| /** |
| * It's recommended to use this separator to split the scoped names into individual components. |
| * e.g. o.concat(CONCAT_SEPARATOR).concat(p).split(SPLIT_SEPARATOR) will return String[]{o, p}. |
| * |
| */ |
| public static final String SPLIT_SEPARATOR = "\\."; |
| |
| /** |
| * Callback to give the component a chance to perform tasks required as part of setting itself up. |
| * This callback is made exactly once during the operator lifetime. If you want to perform certain |
| * setup tasks every time the operator is activated/deactivated, please implement ActivationListener. |
| * |
| * @param context - context in which the operator executues. |
| */ |
| public void setup(CONTEXT context); |
| |
| /** |
| * Callback to give the component a chance to perform tasks required as part of tearing itself down. |
| * A recommended practice is to reciprocate the tasks in setup by doing exactly opposite. |
| */ |
| public void teardown(); |
| |
| /** |
| * A utility class to club component along with the entity such as context or configuration. |
| * |
| * We use ComponentComplementPair for better readability of the code compared to using a bare |
| * pair where first and second do not have semantic meaning. |
| * |
| * @param <COMPONENT> |
| * @param <COMPLEMENT> |
| * @since 0.3.2 |
| */ |
| public static abstract class ComponentComplementPair<COMPONENT extends Component<?>, COMPLEMENT> |
| { |
| public final COMPONENT component; |
| |
| /** |
| * <p>Constructor for ComponentComplementPair.</p> |
| */ |
| public ComponentComplementPair(COMPONENT component) |
| { |
| super(); |
| this.component = component; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public int hashCode() |
| { |
| int hash = 7; |
| hash = 73 * hash + (this.component != null ? this.component.hashCode() : 0); |
| hash = 73 * hash + (this.getComplement() != null ? this.getComplement().hashCode() : 0); |
| return hash; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public boolean equals(Object obj) |
| { |
| if (obj == null) { |
| return false; |
| } |
| if (getClass() != obj.getClass()) { |
| return false; |
| } |
| @SuppressWarnings(value = "unchecked") |
| final ComponentComplementPair<COMPONENT, COMPLEMENT> other = (ComponentComplementPair<COMPONENT, COMPLEMENT>)obj; |
| if (this.component != other.component && (this.component == null || !this.component.equals(other.component))) { |
| return false; |
| } |
| if (this.getComplement() != other.getComplement() && (this.getComplement() == null || !this.getComplement().equals(other.getComplement()))) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * <p>getComplement.</p> |
| */ |
| public abstract COMPLEMENT getComplement(); |
| |
| } |
| |
| } |