/** * 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.descriptors; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.datacleaner.api.Analyzer; import org.datacleaner.api.Filter; import org.datacleaner.api.Renderer; import org.datacleaner.api.Transformer; /** * A simple descriptor provider with a method signature suitable externalizing * class names of analyzer and transformer beans. For example, if you're using * the Spring Framework you initialize this descriptor provider as follows: * * <pre> * <bean id="descriptorProvider" class="org.datacleaner.descriptors.SimpleDescriptorProvider"> * <property name="analyzerClassNames"> * <list> * <value>org.datacleaner.beans.StringAnalyzer</value> * <value>org.datacleaner.beans.valuedist.ValueDistributionAnalyzer</value> * ... * </list> * </property> * <property name="transformerClassNames"> * <list> * <value>org.datacleaner.beans.TokenizerTransformer</value> * ... * </list> * </property> * <property name="rendererClassNames"> * <list> * <value>org.datacleaner.result.renderer.DefaultTextRenderer</value> * ... * </list> * </property> * </bean> * </pre> * * */ public class SimpleDescriptorProvider extends AbstractDescriptorProvider { private List<AnalyzerDescriptor<?>> _analyzerBeanDescriptors = new ArrayList<>(); private List<TransformerDescriptor<?>> _transformerBeanDescriptors = new ArrayList<>(); private List<RendererBeanDescriptor<?>> _rendererBeanDescriptors = new ArrayList<>(); private List<FilterDescriptor<?, ?>> _filterBeanDescriptors = new ArrayList<>(); public SimpleDescriptorProvider() { this(true); } public SimpleDescriptorProvider(final boolean autoDiscover) { super(autoDiscover); } public void refresh() { } public void addAnalyzerBeanDescriptor(final AnalyzerDescriptor<?> analyzerBeanDescriptor) { _analyzerBeanDescriptors.add(analyzerBeanDescriptor); } public void addTransformerBeanDescriptor(final TransformerDescriptor<?> transformerBeanDescriptor) { _transformerBeanDescriptors.add(transformerBeanDescriptor); } public void addRendererBeanDescriptor(final RendererBeanDescriptor<?> rendererBeanDescriptor) { _rendererBeanDescriptors.add(rendererBeanDescriptor); } public void addFilterBeanDescriptor(final FilterDescriptor<?, ?> descriptor) { _filterBeanDescriptors.add(descriptor); } @Override public List<AnalyzerDescriptor<?>> getAnalyzerDescriptors() { return _analyzerBeanDescriptors; } public void setAnalyzerBeanDescriptors(final List<AnalyzerDescriptor<?>> descriptors) { _analyzerBeanDescriptors = descriptors; } @Override public List<TransformerDescriptor<?>> getTransformerDescriptors() { return _transformerBeanDescriptors; } public void setTransformerBeanDescriptors(final List<TransformerDescriptor<?>> transformerBeanDescriptors) { _transformerBeanDescriptors = transformerBeanDescriptors; } @Override public List<RendererBeanDescriptor<?>> getRendererBeanDescriptors() { return _rendererBeanDescriptors; } public void setRendererBeanDescriptors(final List<RendererBeanDescriptor<?>> rendererBeanDescriptors) { _rendererBeanDescriptors = rendererBeanDescriptors; } @Override public Collection<FilterDescriptor<?, ?>> getFilterDescriptors() { return _filterBeanDescriptors; } public void setFilterBeanDescriptors(final List<FilterDescriptor<?, ?>> filterBeanDescriptors) { _filterBeanDescriptors = filterBeanDescriptors; } public void setAnalyzerClassNames(final Collection<String> classNames) throws ClassNotFoundException { for (final String className : classNames) { @SuppressWarnings("unchecked") final Class<? extends Analyzer<?>> c = (Class<? extends Analyzer<?>>) Class.forName(className); final AnalyzerDescriptor<?> descriptor = getAnalyzerDescriptorForClass(c); if (descriptor == null || !_analyzerBeanDescriptors.contains(descriptor)) { addAnalyzerBeanDescriptor(Descriptors.ofAnalyzer(c)); } } } public void setTransformerClassNames(final Collection<String> classNames) throws ClassNotFoundException { for (final String className : classNames) { @SuppressWarnings("unchecked") final Class<? extends Transformer> c = (Class<? extends Transformer>) Class.forName(className); final TransformerDescriptor<?> descriptor = getTransformerDescriptorForClass(c); if (descriptor == null || !_transformerBeanDescriptors.contains(descriptor)) { addTransformerBeanDescriptor(Descriptors.ofTransformer(c)); } } } public void setRendererClassNames(final Collection<String> classNames) throws ClassNotFoundException { for (final String className : classNames) { @SuppressWarnings("unchecked") final Class<? extends Renderer<?, ?>> c = (Class<? extends Renderer<?, ?>>) Class.forName(className); final RendererBeanDescriptor<?> descriptor = getRendererBeanDescriptorForClass(c); if (descriptor == null || !_rendererBeanDescriptors.contains(descriptor)) { addRendererBeanDescriptor(Descriptors.ofRenderer(c)); } } } public void setFilterClassNames(final Collection<String> classNames) throws ClassNotFoundException { for (final String className : classNames) { @SuppressWarnings("unchecked") final Class<? extends Filter<?>> c = (Class<? extends Filter<?>>) Class.forName(className); final FilterDescriptor<?, ?> descriptor = getFilterBeanDescriptorForClassUnbounded(c); if (descriptor == null || !_filterBeanDescriptors.contains(descriptor)) { addFilterBeanDescriptor(Descriptors.ofFilterUnbound(c)); } } } }