/*******************************************************************************
 * Copyright (c) 2011, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.equinox.internal.region;

import static org.eclipse.equinox.region.RegionFilter.VISIBLE_OSGI_SERVICE_NAMESPACE;
import static org.eclipse.equinox.region.RegionFilter.VISIBLE_SERVICE_NAMESPACE;

import java.util.*;
import org.eclipse.equinox.region.RegionFilter;
import org.eclipse.equinox.region.RegionFilterBuilder;
import org.osgi.framework.*;

public final class StandardRegionFilterBuilder implements RegionFilterBuilder {

	private final Object monitor = new Object();

	private final Map<String, Collection<Filter>> policy = new HashMap<String, Collection<Filter>>();

	@SuppressWarnings("deprecation")
	@Override
	public RegionFilterBuilder allow(String namespace, String filter) throws InvalidSyntaxException {
		if (namespace == null)
			throw new IllegalArgumentException("The namespace must not be null."); //$NON-NLS-1$
		if (filter == null)
			throw new IllegalArgumentException("The filter must not be null."); //$NON-NLS-1$
		synchronized (this.monitor) {
			Collection<Filter> namespaceFilters = policy.get(namespace);
			if (namespaceFilters == null) {
				// use set to avoid duplicates
				namespaceFilters = new LinkedHashSet<Filter>();
				policy.put(namespace, namespaceFilters);
			}

			namespaceFilters.add(createFilter(filter));
		}
		if (VISIBLE_SERVICE_NAMESPACE.equals(namespace)) {
			// alias the deprecated namespace to osgi.service
			allow(VISIBLE_OSGI_SERVICE_NAMESPACE, filter);
		}
		return this;
	}

	public Filter createFilter(String spec) throws InvalidSyntaxException {
		// TODO need to use BundleContext.createFilter here
		Filter filter = FrameworkUtil.createFilter(spec);
		return (StandardRegionFilter.ALL.equals(filter)) ? StandardRegionFilter.ALL : filter;
	}

	@SuppressWarnings("deprecation")
	@Override
	public RegionFilterBuilder allowAll(String namespace) {
		if (namespace == null)
			throw new IllegalArgumentException("The namespace must not be null."); //$NON-NLS-1$
		synchronized (this.monitor) {
			Collection<Filter> namespaceFilters = policy.get(namespace);
			if (namespaceFilters == null) {
				// use set to avoid duplicates
				namespaceFilters = new LinkedHashSet<Filter>();
				policy.put(namespace, namespaceFilters);
			}
			// remove any other filters since this will override them all.
			namespaceFilters.clear();
			namespaceFilters.add(StandardRegionFilter.ALL);
		}
		if (VISIBLE_SERVICE_NAMESPACE.equals(namespace)) {
			// alias the deprecated namespace to osgi.service
			allowAll(VISIBLE_OSGI_SERVICE_NAMESPACE);
		}
		return this;
	}

	@Override
	public RegionFilter build() {
		synchronized (this.monitor) {
			return new StandardRegionFilter(policy);
		}
	}
}
