org.vosao.business.impl.plugin.PluginClassLoader.java Source code

Java tutorial

Introduction

Here is the source code for org.vosao.business.impl.plugin.PluginClassLoader.java

Source

/**
 * Vosao CMS. Simple CMS for Google App Engine.
 * 
 * Copyright (C) 2009-2010 Vosao development team.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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 library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * email: vosao.dev@gmail.com
 */

package org.vosao.business.impl.plugin;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.vosao.business.plugin.PluginResourceCache;
import org.vosao.dao.Dao;
import org.vosao.entity.PluginResourceEntity;
import org.vosao.global.SystemService;

import com.google.appengine.api.datastore.Blob;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;

public class PluginClassLoader extends ClassLoader {

    private static final Log logger = LogFactory.getLog(PluginClassLoader.class);

    private SystemService systemService;
    private Dao dao;
    private PluginResourceCache cache;
    private String pluginName;

    public PluginClassLoader() {
        super(PluginClassLoader.class.getClassLoader());
    }

    public PluginClassLoader(SystemService systemService, Dao dao, PluginResourceCache cache, String pluginName) {
        super(PluginClassLoader.class.getClassLoader());
        this.systemService = systemService;
        this.dao = dao;
        this.cache = cache;
        this.pluginName = pluginName;
    }

    @Override
    public Class findClass(String name) throws ClassNotFoundException {
        Class cls = findLoadedClass(name);
        if (cls != null) {
            return cls;
        }
        try {
            byte[] b = findPluginResource(name);
            if (b == null) {
                throw new ClassNotFoundException(name);
            }
            return defineClass(name, b, 0, b.length);
        } catch (SecurityException e) {
            return super.loadClass(name);
        }
    }

    @Override
    public InputStream getResourceAsStream(String name) {
        byte[] b = findPluginResource(name);
        if (b == null) {
            throw new ResourceNotFoundException(name);
        }
        return new ByteArrayInputStream(b);
    }

    private byte[] findPluginResource(String name) {
        if (!getCache().contains(pluginName, name)) {
            byte[] data = loadPluginResource(name);
            if (data != null) {
                getCache().put(pluginName, name, data);
            } else {
                return null;
            }
        }
        return getCache().get(pluginName, name);
    }

    private byte[] loadPluginResource(String name) {
        PluginResourceEntity resource = getDao().getPluginResourceDao().getByUrl(pluginName, name);
        if (resource != null) {
            return resource.getContent();
        }
        return null;
    }

    public SystemService getSystemService() {
        return systemService;
    }

    public void setSystemService(SystemService systemService) {
        this.systemService = systemService;
    }

    public Dao getDao() {
        return dao;
    }

    public void setDao(Dao dao) {
        this.dao = dao;
    }

    public String getPluginName() {
        return pluginName;
    }

    public void setPluginName(String pluginName) {
        this.pluginName = pluginName;
    }

    public PluginResourceCache getCache() {
        return cache;
    }

    public void setCache(PluginResourceCache bean) {
        cache = bean;
    }

}