package org.eftp.ftpserver.business.boot.control; /* * #%L * ftpservice * %% * Copyright (C) 2013 e2ftp * %% * Licensed 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. * #L% */ import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.ejb.ConcurrencyManagement; import javax.ejb.ConcurrencyManagementType; import javax.ejb.LocalBean; import javax.ejb.Singleton; import javax.enterprise.concurrent.ManagedThreadFactory; import javax.enterprise.inject.Instance; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.interceptor.Interceptors; import org.apache.ftpserver.ConnectionConfig; import org.apache.ftpserver.command.CommandFactory; import org.apache.ftpserver.ftplet.FileSystemFactory; import org.apache.ftpserver.ftplet.FtpStatistics; import org.apache.ftpserver.ftplet.Ftplet; import org.apache.ftpserver.ftplet.UserManager; import org.apache.ftpserver.ftpletcontainer.FtpletContainer; import org.apache.ftpserver.ftpletcontainer.impl.DefaultFtpletContainer; import org.apache.ftpserver.impl.DefaultFtpServerContext; import org.apache.ftpserver.impl.FtpServerContext; import org.apache.ftpserver.listener.Listener; import org.apache.ftpserver.message.MessageResource; import org.eftp.ftpserver.business.files.boundary.InstrumendFileSystemFactory; import org.eftp.ftpserver.business.logger.boundary.Log; import org.eftp.ftpserver.business.monitoring.boundary.CallTracker; import org.eftp.ftpserver.business.plugins.boundary.Plugin; import org.eftp.ftpserver.business.users.control.UserManagerIntegrationAdapter; /** * * @author adam-bien.com */ @LocalBean @Singleton @Interceptors(CallTracker.class) @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class ManagedFtpServerContext implements FtpServerContext { BlockingQueue<Runnable> workQueue; @Resource ManagedThreadFactory threadFactory; @Inject InstrumendFileSystemFactory fileSystemFactory; private DefaultFtpServerContext delegate; @Inject private ThreadPoolExecutor executor; private DefaultFtpletContainer ftpletContainer; @Inject @Plugin private Instance<Ftplet> hooks; @Inject Log LOG; @PostConstruct public void init() { this.delegate = new DefaultFtpServerContext(); this.delegate.setFileSystemManager(fileSystemFactory); this.ftpletContainer = (DefaultFtpletContainer) this.delegate.getFtpletContainer(); this.installPlugins(); } @Override public ConnectionConfig getConnectionConfig() { return delegate.getConnectionConfig(); } @Override public MessageResource getMessageResource() { return delegate.getMessageResource(); } @Override public FtpletContainer getFtpletContainer() { return delegate.getFtpletContainer(); } @Override public Listener getListener(String string) { return delegate.getListener(string); } @Override public Map<String, Listener> getListeners() { return delegate.getListeners(); } @Override public CommandFactory getCommandFactory() { return delegate.getCommandFactory(); } @Override public void dispose() { delegate.dispose(); } @Override public UserManager getUserManager() { return delegate.getUserManager(); } @Override public FileSystemFactory getFileSystemManager() { return this.fileSystemFactory; } @Override @Produces public FtpStatistics getFtpStatistics() { return delegate.getFtpStatistics(); } @Override public Ftplet getFtplet(String string) { return delegate.getFtplet(string); } @Override public ThreadPoolExecutor getThreadPoolExecutor() { return this.executor; } public void setConnectionConfig(ConnectionConfig createConnectionConfig) { this.delegate.setConnectionConfig(createConnectionConfig); } public void setUserManager(UserManagerIntegrationAdapter userManager) { this.delegate.setUserManager(userManager); } public void addListener(String adefault, Listener createListener) { this.delegate.addListener(adefault, createListener); } void installPlugins() { for (Ftplet ftplet : hooks) { LOG.info("Installing: " + ftplet); this.ftpletContainer.getFtplets().put(ftplet.getClass().getName(), ftplet); } } }