eu.gentech.osgi.packagescanner.ExportPackageScanner.java Source code

Java tutorial

Introduction

Here is the source code for eu.gentech.osgi.packagescanner.ExportPackageScanner.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 eu.gentech.osgi.packagescanner;

import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.felix.utils.version.VersionTable;
import org.osgi.framework.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import eu.gentech.osgi.ExportPackage;
import eu.gentech.osgi.packagescanner.filter.ExportPackageFilter;
import eu.gentech.osgi.packagescanner.strategy.ExportPackageScanningStrategy;
import eu.gentech.osgi.packagescanner.utils.PackageNameMatcher;
import eu.gentech.osgi.packagescanner.utils.PackageNameValidator;

/**
 * 
 * @author genious87
 */
public class ExportPackageScanner {

    private static final Logger logger = LoggerFactory.getLogger(ExportPackageScanner.class);

    private final Set<ExportPackageScanningStrategy> strategies = new LinkedHashSet<ExportPackageScanningStrategy>();
    private final Set<ExportPackageFilter> filters = new LinkedHashSet<ExportPackageFilter>();
    private final Map<String, String> versionMappings = new HashMap<String, String>();

    public static final ExportPackageScanner start() {
        return new ExportPackageScanner();
    }

    public Set<ExportPackage> scan() {
        final Result result = new Result();
        scan(result);
        return result.getPackages();
    }

    protected void scan(final ExportPackageScanningResult result) {
        for (final ExportPackageScanningStrategy strategy : strategies) {
            strategy.scan(result);
        }
    }

    public ExportPackageScanner with(final ExportPackageScanningStrategy strategy) {
        strategies.add(strategy);
        return this;
    }

    public ExportPackageScanner with(final ExportPackageScanningStrategy... strategies) {
        if (ArrayUtils.isNotEmpty(strategies)) {
            this.strategies.addAll(Arrays.asList(strategies));
        }
        return this;
    }

    public ExportPackageScanner with(final Collection<ExportPackageScanningStrategy> strategies) {
        if (CollectionUtils.isNotEmpty(strategies)) {
            this.strategies.addAll(strategies);
        }
        return this;
    }

    public ExportPackageScanner filter(final ExportPackageFilter filter) {
        filters.add(filter);
        return this;
    }

    public ExportPackageScanner filter(final ExportPackageFilter... filters) {
        if (ArrayUtils.isNotEmpty(filters)) {
            this.filters.addAll(Arrays.asList(filters));
        }
        return this;
    }

    public ExportPackageScanner filter(final Collection<ExportPackageFilter> filters) {
        if (CollectionUtils.isNotEmpty(filters)) {
            this.filters.addAll(filters);
        }
        return this;
    }

    public ExportPackageScanner withMapping(final String name, final String version) {
        versionMappings.put(name, version);
        return this;
    }

    public ExportPackageScanner withMappings(final Map<String, String> mappings) {
        if (mappings != null) {
            versionMappings.putAll(mappings);
        }
        return this;
    }

    private class Result implements ExportPackageScanningResult {

        private final Set<ExportPackage> packages = new TreeSet<ExportPackage>();

        /*
         * (non-Javadoc)
         * 
         * @see eu.gentech.osgi.packagescanner.ExportPackageScanningResult#add(java.lang.String, java.lang.String,
         * java.net.URL)
         */
        @Override
        public void add(final String name, final String version, final URL location) {

            Version mappedVersion = mappedVersion(name);
            if (mappedVersion == null) {
                mappedVersion = VersionTable.getVersion(version);
            }

            doAdd(name, mappedVersion, location);
        }

        /*
         * (non-Javadoc)
         * 
         * @see eu.gentech.osgi.packagescanner.ExportPackageScanningResult#add(java.lang.String,
         * org.osgi.framework.Version, java.net.URL)
         */
        @Override
        public void add(final String name, final Version version, final URL location) {

            Version mappedVersion = mappedVersion(name);
            if (mappedVersion == null) {
                mappedVersion = version;
            }

            doAdd(name, mappedVersion, location);

        }

        private Version mappedVersion(final String name) {
            if (MapUtils.isNotEmpty(versionMappings)) {
                for (final Entry<String, String> mapping : versionMappings.entrySet()) {
                    if (PackageNameMatcher.match(mapping.getKey(), name)) {
                        return VersionTable.getVersion(mapping.getValue());
                    }
                }
            }
            return null;
        }

        private void doAdd(final String name, final Version version, final URL location) {

            if (!PackageNameValidator.isValid(name)) {
                logger.warn("Invalid package name '{}', ignore it.", name);
                return;
            }

            final ExportPackage exportPackage = new ExportPackage(name, version, location);

            final boolean debugEnabled = logger.isDebugEnabled();

            if (packages.contains(exportPackage)) {
                if (debugEnabled) {
                    logger.debug("Duplicated package: {}", exportPackage);
                }
                return;
            }

            if (CollectionUtils.isNotEmpty(filters)) {
                for (final ExportPackageFilter filter : filters) {
                    if (!filter.accept(exportPackage)) {
                        if (debugEnabled) {
                            logger.debug("Package '{}' with version '{}' excluded from location '{}'",
                                    new Object[] { exportPackage.getName(), exportPackage.getVersion(),
                                            exportPackage.getLocation() });
                        }
                        return;
                    }
                }
            }

            packages.add(exportPackage);

        }

        /*
         * (non-Javadoc)
         * 
         * @see eu.gentech.osgi.packagescanner.ExportPackageScanningResult#getPackages()
         */
        @Override
        public Set<ExportPackage> getPackages() {
            return packages;
        }

    }

}