Package org.apache.abdera.protocol.server.provider.managed

Source Code of org.apache.abdera.protocol.server.provider.managed.CollectionAdapterManager

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  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.  For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.protocol.server.provider.managed;

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import org.apache.abdera.Abdera;
import org.apache.abdera.protocol.server.CollectionAdapter;

public class CollectionAdapterManager {

    public static Logger logger = Logger.getLogger(CollectionAdapterManager.class.getName());

    // maps a feed id to an adapter instance
    protected static Map<String, CollectionAdapter> adapterInstanceMap = new HashMap<String, CollectionAdapter>();

    protected final Abdera abdera;
    protected final ServerConfiguration config;

    public CollectionAdapterManager(Abdera abdera, ServerConfiguration config) {
        this.abdera = abdera;
        this.config = config;
    }

    public CollectionAdapter getAdapter(String feedId) throws Exception {
        FeedConfiguration feedConfiguration = config.loadFeedConfiguration(feedId);
        return createAdapterInstance(feedConfiguration, abdera);
    }

    public Map<String, FeedConfiguration> listAdapters() throws Exception {
        Map<String, FeedConfiguration> results = new HashMap<String, FeedConfiguration>();
        Enumeration<URL> e =
            Thread.currentThread().getContextClassLoader().getResources(config.getFeedConfigLocation());
        while (e.hasMoreElements()) {
            URL url = e.nextElement();
            File file = new File(url.toURI());
            if (!file.exists()) {
                throw new RuntimeException("Could not convert properties path to a File! \"" + file.getAbsolutePath()
                    + "\" does not exist.");
            }
            File[] files = file.listFiles(new FileFilter() {
                public boolean accept(File file) {
                    return !file.isDirectory();
                }
            });
            if (files != null) {
                for (File _file : files) {
                    String name = _file.getName();
                    int i = name.indexOf(config.getFeedConfigSuffix());
                    String id = i > -1 ? name.substring(0, i) : null;
                    if (id != null) {
                        FeedConfiguration feedConfiguration = loadFeedInfo(id);
                        if (null != feedConfiguration)
                            results.put(id, feedConfiguration);
                    }
                }
            }
        }
        return results;
    }

    protected FeedConfiguration loadFeedInfo(String feedId) throws Exception {
        return config.loadFeedConfiguration(feedId);
    }

    protected static synchronized CollectionAdapter createAdapterInstance(FeedConfiguration config, Abdera abdera)
        throws Exception {
        CollectionAdapter basicAdapter = adapterInstanceMap.get(config.getFeedId());
        if (basicAdapter != null) {
            return basicAdapter;
        }
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        Class<?> adapterClass = cl.loadClass(config.getAdapterClassName());
        Constructor<?>[] ctors = adapterClass.getConstructors();
        for (Constructor<?> element : ctors) {
            logger.finest("Public constructor found: " + element.toString());
        }
        Constructor<?> c = adapterClass.getConstructor(new Class[] {Abdera.class, FeedConfiguration.class});
        c.setAccessible(true);
        CollectionAdapter adapterInstance = (CollectionAdapter)c.newInstance(abdera, config);

        // put this adapter instance in adapterInstanceMap
        adapterInstanceMap.put(config.getFeedId(), adapterInstance);
        return adapterInstance;
    }

}
TOP

Related Classes of org.apache.abdera.protocol.server.provider.managed.CollectionAdapterManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.