/**
* DataCleaner (community edition)
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.datacleaner.job.builder;
import java.util.List;
import java.util.Objects;
import org.datacleaner.api.InputColumn;
import org.datacleaner.data.MutableInputColumn;
import org.datacleaner.descriptors.ConfiguredPropertyDescriptor;
import org.datacleaner.util.ReflectionUtils;
public class ComponentBuilderTransformerChangeListener implements TransformerChangeListener {
private final ComponentBuilder _componentBuilder;
private final ConfiguredPropertyDescriptor _propertyDescriptor;
public ComponentBuilderTransformerChangeListener(final ComponentBuilder componentBuilder,
final ConfiguredPropertyDescriptor propertyDescriptor) {
_componentBuilder = componentBuilder;
_propertyDescriptor = propertyDescriptor;
}
@Override
public void onAdd(final TransformerComponentBuilder<?> builder) {
// Do nothing.
}
@Override
public void onConfigurationChanged(final TransformerComponentBuilder<?> builder) {
synchronizeInputColumns(builder);
}
@Override
public void onRequirementChanged(final TransformerComponentBuilder<?> builder) {
// Do nothing.
}
@Override
public void onRemove(final TransformerComponentBuilder<?> componentBuilder) {
synchronizeInputColumns(componentBuilder);
}
@Override
public void onOutputChanged(final TransformerComponentBuilder<?> transformerJobBuilder,
final List<MutableInputColumn<?>> outputColumns) {
synchronizeInputColumns(transformerJobBuilder);
}
private void synchronizeInputColumns(final TransformerComponentBuilder<?> changedBuilder) {
if (!changedBuilder.equals(_componentBuilder)) {
final List<InputColumn<?>> availableColumns = _componentBuilder.getAnalysisJobBuilder()
.getAvailableInputColumns(_componentBuilder, _propertyDescriptor.getTypeArgument(0));
for (final ConfiguredPropertyDescriptor propertyDescriptor : _componentBuilder.getDescriptor()
.getConfiguredPropertiesForInput()) {
final Object configuredProperty = _componentBuilder.getConfiguredProperty(propertyDescriptor);
if (configuredProperty != null) {
if (ReflectionUtils.isInputColumn(configuredProperty.getClass())) {
if (ReflectionUtils.isArray(configuredProperty)) {
for (final InputColumn<?> column : (InputColumn<?>[]) configuredProperty) {
if (!availableColumns.contains(column)) {
_componentBuilder.removeInputColumn(column, propertyDescriptor);
}
}
} else {
if (!availableColumns.contains(configuredProperty)) {
_componentBuilder
.removeInputColumn((InputColumn<?>) configuredProperty, propertyDescriptor);
}
}
}
}
}
}
}
@Override
public boolean equals(final Object object) {
return (super.equals(object) || (object != null && object instanceof ComponentBuilderTransformerChangeListener
&& ((ComponentBuilderTransformerChangeListener) object)._componentBuilder == _componentBuilder
&& ((ComponentBuilderTransformerChangeListener) object)._propertyDescriptor == _propertyDescriptor));
}
@Override
public int hashCode() {
return Objects.hash(_componentBuilder, _propertyDescriptor);
}
}