All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.datacleaner.user.MutableReferenceDataCatalog Maven / Gradle / Ivy

/**
 * 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.user;

import java.util.ArrayList;
import java.util.List;

import org.datacleaner.descriptors.ComponentDescriptor;
import org.datacleaner.descriptors.Descriptors;
import org.datacleaner.lifecycle.LifeCycleHelper;
import org.datacleaner.reference.Dictionary;
import org.datacleaner.reference.ReferenceDataCatalog;
import org.datacleaner.reference.ReferenceDataCatalogImpl;
import org.datacleaner.reference.StringPattern;
import org.datacleaner.reference.SynonymCatalog;
import org.datacleaner.util.StringUtils;

/**
 * Reference data catalog implementation that allows mutations/modifications.
 * This is used to enable runtime changes by the user. This reference data
 * catalog wraps an immutable instance, which typically represents what is
 * configured in datacleaner's xml file.
 */
public class MutableReferenceDataCatalog implements ReferenceDataCatalog {

	private static final long serialVersionUID = 1L;

	private final List _dictionaries;
	private final List _dictionaryListeners = new ArrayList();
	private final List _synonymCatalogs;
	private final List _synonymCatalogListeners = new ArrayList();
	private final List _stringPatterns;
	private final List _stringPatternListeners = new ArrayList();
	private final ReferenceDataCatalog _immutableDelegate;
	private final LifeCycleHelper _lifeCycleHelper;

	/**
	 * No-args constructor, mostly usable for testing code.
	 */
	public MutableReferenceDataCatalog() {
		_immutableDelegate = new ReferenceDataCatalogImpl();
		_lifeCycleHelper = new LifeCycleHelper(null, true);
		_dictionaries = new ArrayList();
		_synonymCatalogs = new ArrayList();
		_stringPatterns = new ArrayList();
	}

	/**
	 * Main constructor for {@link MutableReferenceDataCatalog}.
	 * 
	 * @param immutableDelegate
	 * @param datastoreCatalog
	 * @param userPreferences
	 */
	public MutableReferenceDataCatalog(final ReferenceDataCatalog immutableDelegate, final UserPreferences userPreferences,
			LifeCycleHelper lifeCycleHelper) {
		_immutableDelegate = immutableDelegate;
		_lifeCycleHelper = lifeCycleHelper;
		_dictionaries = userPreferences.getUserDictionaries();
		_synonymCatalogs = userPreferences.getUserSynonymCatalogs();
		_stringPatterns = userPreferences.getUserStringPatterns();

		String[] names = _immutableDelegate.getDictionaryNames();
		for (String name : names) {
			if (containsDictionary(name)) {
				// remove any copies of the dictionary - the immutable (XML)
				// version should always win
				_dictionaries.remove(getDictionary(name));
			}
			addDictionary(_immutableDelegate.getDictionary(name));
		}

		names = _immutableDelegate.getSynonymCatalogNames();
		for (String name : names) {
			if (containsSynonymCatalog(name)) {
				// remove any copies of the synonym catalog - the immutable
				// (XML) version should always win
				_synonymCatalogs.remove(getSynonymCatalog(name));
			}
			addSynonymCatalog(_immutableDelegate.getSynonymCatalog(name));
		}

		names = _immutableDelegate.getStringPatternNames();
		for (String name : names) {
			if (containsStringPattern(name)) {
				_stringPatterns.remove(getStringPattern(name));
			}
			addStringPattern(_immutableDelegate.getStringPattern(name));
		}

		assignProvidedProperties(_dictionaries.toArray());
		assignProvidedProperties(_synonymCatalogs.toArray());
		assignProvidedProperties(_stringPatterns.toArray());
	}

	private void assignProvidedProperties(Object... objects) {
		for (Object object : objects) {
			ComponentDescriptor descriptor = Descriptors.ofComponent(object.getClass());
			_lifeCycleHelper.assignProvidedProperties(descriptor, object);
		}
	}

	@Override
	public String[] getDictionaryNames() {
		String[] result = new String[_dictionaries.size()];
		for (int i = 0; i < result.length; i++) {
			result[i] = _dictionaries.get(i).getName();
		}
		return result;
	}

	public boolean isDictionaryMutable(String name) {
		return _immutableDelegate.getDictionary(name) == null;
	}

	public boolean containsDictionary(String name) {
		for (Dictionary dictionary : _dictionaries) {
			if (name.equals(dictionary.getName())) {
				return true;
			}
		}
		return false;
	}

	public boolean isSynonymCatalogMutable(String name) {
		return _immutableDelegate.getSynonymCatalog(name) == null;
	}

	public boolean isStringPatternMutable(String name) {
		return _immutableDelegate.getStringPattern(name) == null;
	}

	public boolean containsSynonymCatalog(String name) {
		for (SynonymCatalog sc : _synonymCatalogs) {
			if (name.equals(sc.getName())) {
				return true;
			}
		}
		return false;
	}

	public boolean containsStringPattern(String name) {
		for (StringPattern sp : _stringPatterns) {
			if (name.equals(sp.getName())) {
				return true;
			}
		}
		return false;
	}

	public void addDictionary(Dictionary dict) {
		String name = dict.getName();
		if (StringUtils.isNullOrEmpty(name)) {
			throw new IllegalArgumentException("Dictionary has no name!");
		}
		for (Dictionary dictionary : _dictionaries) {
			if (name.equals(dictionary.getName())) {
				throw new IllegalArgumentException("Dictionary name '" + name + "' is not unique!");
			}
		}
		assignProvidedProperties(dict);
		_dictionaries.add(dict);
		for (DictionaryChangeListener listener : _dictionaryListeners) {
			listener.onAdd(dict);
		}
	}

	public void removeDictionary(Dictionary dict) {
		if (!isDictionaryMutable(dict.getName())) {
			throw new IllegalArgumentException("Dictionary '" + dict.getName() + " is not removeable");
		}
		if (_dictionaries.remove(dict)) {
			for (DictionaryChangeListener listener : _dictionaryListeners) {
				listener.onRemove(dict);
			}
		}
	}

	public void addStringPattern(StringPattern sp) {
		String name = sp.getName();
		if (StringUtils.isNullOrEmpty(name)) {
			throw new IllegalArgumentException("StringPattern has no name!");
		}
		for (StringPattern stringPattern : _stringPatterns) {
			if (name.equals(stringPattern.getName())) {
				throw new IllegalArgumentException("StringPattern name '" + name + "' is not unique!");
			}
		}
		assignProvidedProperties(sp);
		_stringPatterns.add(sp);
		for (StringPatternChangeListener listener : _stringPatternListeners) {
			listener.onAdd(sp);
		}
	}

	public void removeStringPattern(StringPattern sp) {
		if (!isStringPatternMutable(sp.getName())) {
			throw new IllegalArgumentException("StringPattern '" + sp.getName() + " is not removeable");
		}
		if (_stringPatterns.remove(sp)) {
			for (StringPatternChangeListener listener : _stringPatternListeners) {
				listener.onRemove(sp);
			}
		}
	}

	@Override
	public Dictionary getDictionary(String name) {
		if (name != null) {
			for (Dictionary dict : _dictionaries) {
				if (name.equals(dict.getName())) {
					return dict;
				}
			}
		}
		return null;
	}

	@Override
	public String[] getSynonymCatalogNames() {
		String[] result = new String[_synonymCatalogs.size()];
		for (int i = 0; i < result.length; i++) {
			result[i] = _synonymCatalogs.get(i).getName();
		}
		return result;
	}

	public void addSynonymCatalog(SynonymCatalog sc) {
		String name = sc.getName();
		if (StringUtils.isNullOrEmpty(name)) {
			throw new IllegalArgumentException("SynonymCatalog has no name!");
		}
		for (SynonymCatalog synonymCatalog : _synonymCatalogs) {
			if (name.equals(synonymCatalog.getName())) {
				throw new IllegalArgumentException("SynonymCatalog name '" + name + "' is not unique!");
			}
		}

		assignProvidedProperties(sc);
		_synonymCatalogs.add(sc);
		for (SynonymCatalogChangeListener listener : _synonymCatalogListeners) {
			listener.onAdd(sc);
		}
	}

	public void removeSynonymCatalog(SynonymCatalog sc) {
		if (!isSynonymCatalogMutable(sc.getName())) {
			throw new IllegalArgumentException("Synonym catalog '" + sc.getName() + " is not removeable");
		}
		if (_synonymCatalogs.remove(sc)) {
			for (SynonymCatalogChangeListener listener : _synonymCatalogListeners) {
				listener.onRemove(sc);
			}
		}
	}

	@Override
	public SynonymCatalog getSynonymCatalog(String name) {
		if (name != null) {
			for (SynonymCatalog sc : _synonymCatalogs) {
				if (name.equals(sc.getName())) {
					return sc;
				}
			}
		}
		return null;
	}

	@Override
	public String[] getStringPatternNames() {
		String[] names = new String[_stringPatterns.size()];
		for (int i = 0; i < names.length; i++) {
			names[i] = _stringPatterns.get(i).getName();
		}
		return names;
	}

	@Override
	public StringPattern getStringPattern(String name) {
		if (name != null) {
			for (StringPattern sp : _stringPatterns) {
				if (name.equals(sp.getName())) {
					return sp;
				}
			}
		}
		return null;
	}

	public void addDictionaryListener(DictionaryChangeListener listener) {
		_dictionaryListeners.add(listener);
	}

	public void removeDictionaryListener(DictionaryChangeListener listener) {
		_dictionaryListeners.remove(listener);
	}

	public void addSynonymCatalogListener(SynonymCatalogChangeListener listener) {
		_synonymCatalogListeners.add(listener);
	}

	public void removeSynonymCatalogListener(SynonymCatalogChangeListener listener) {
		_synonymCatalogListeners.remove(listener);
	}

	public void addStringPatternListener(StringPatternChangeListener listener) {
		_stringPatternListeners.add(listener);
	}

	public void removeStringPatternListener(StringPatternChangeListener listener) {
		_stringPatternListeners.remove(listener);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy