package comeon;
import com.google.common.base.Charsets;
import com.google.common.eventbus.EventBus;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.multibindings.MapBinder;
import com.google.inject.multibindings.Multibinder;
import comeon.core.*;
import comeon.mediawiki.MediaWikiFactory;
import comeon.model.TemplateKind;
import comeon.model.processors.*;
import comeon.templates.Templates;
import comeon.templates.TemplatesImpl;
import comeon.templates.velocity.VelocityTemplate;
import comeon.ui.UI;
import comeon.ui.actions.*;
import comeon.ui.menu.EditMenu;
import comeon.ui.menu.FileMenu;
import comeon.ui.menu.HelpMenu;
import comeon.ui.menu.MenuBar;
import comeon.ui.preferences.main.*;
import comeon.ui.preferences.templates.TemplateSubController;
import comeon.ui.preferences.templates.TemplateSubPanel;
import comeon.ui.preferences.wikis.WikiSubController;
import comeon.ui.preferences.wikis.WikiSubPanel;
import comeon.ui.toolbar.Toolbar;
import comeon.wikis.Wikis;
import comeon.wikis.WikisImpl;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.CoreProtocolPNames;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.StringWriter;
import java.security.AccessControlException;
import java.security.Security;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.prefs.BackingStoreException;
import java.util.prefs.InvalidPreferencesFormatException;
import java.util.prefs.Preferences;
public final class ComeOn extends AbstractModule {
private static final Logger LOGGER = LoggerFactory.getLogger(ComeOn.class);
private final EventBus bus;
private final Preferences preferences;
public ComeOn() {
this.bus = new EventBus();
this.preferences = Preferences.userNodeForPackage(ComeOn.class);
}
private DefaultHttpClient configureHttpClient() {
final ClientConnectionManager connectionManager = new PoolingClientConnectionManager();
final DefaultHttpClient client = new DefaultHttpClient(connectionManager);
final String userAgentString = UI.BUNDLE.getString("useragent");
client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, userAgentString);
LOGGER.info("ComeOn! uses \"{}\" as User-Agent", userAgentString);
return client;
}
@Override
protected void configure() {
bind(Core.class).to(CoreImpl.class);
bind(Templates.class).to(TemplatesImpl.class);
bind(Wikis.class).to(WikisImpl.class);
bind(MediaWikiFactory.class);
Multibinder<PreProcessor> preProcessorsBinder = Multibinder.newSetBinder(binder(), PreProcessor.class);
preProcessorsBinder.addBinding().to(GpsPreProcessor.class);
preProcessorsBinder.addBinding().to(IptcPreProcessor.class);
preProcessorsBinder.addBinding().to(XmpPreProcessor.class);
Multibinder<PostProcessor> postProcessorsBinder = Multibinder.newSetBinder(binder(), PostProcessor.class);
postProcessorsBinder.addBinding().to(DefaultPostProcessor.class);
bind(ExecutorService.class).toInstance(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));
MapBinder<String, TemplateKind> templateKinds = MapBinder.newMapBinder(binder(), String.class, TemplateKind.class);
templateKinds.addBinding(VelocityTemplate.class.getSimpleName()).to(VelocityTemplate.class);
bind(AbstractHttpClient.class).toInstance(configureHttpClient());
bind(UI.class);
bind(PreferencesDialog.class);
bind(PreferencesController.class);
bind(PreferencesModel.class);
bind(PreferencesPanel.class);
bind(TemplatesListPanel.class);
bind(WikisListPanel.class);
bind(TemplateSubController.class);
bind(TemplateSubPanel.class);
bind(WikiSubController.class);
bind(WikiSubPanel.class);
bind(MenuBar.class);
bind(FileMenu.class);
bind(EditMenu.class);
bind(HelpMenu.class);
bind(Toolbar.class);
bind(TransferMonitor.class);
bind(EventBus.class).toInstance(bus);
}
private void resetPreferences() throws BackingStoreException {
this.preferences.removeNode();
this.loadDefaults();
}
private void checkPreferences() throws BackingStoreException {
if (this.preferences.childrenNames().length == 0) {
loadDefaults();
}
}
private void loadDefaults() {
try {
Preferences.importPreferences(WikisImpl.class.getResourceAsStream("defaultPreferences.xml"));
} catch (final InvalidPreferencesFormatException | IOException e) {
LOGGER.warn(UI.BUNDLE.getString("error.preferences.cantloaddefault.message"), e);
}
}
public static void main(final String... args) throws Exception {
System.setProperty("file.encoding", Charsets.UTF_8.name());
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
final Arguments arguments = new Arguments();
final CmdLineParser parser = new CmdLineParser(arguments);
try {
parser.parseArgument(args);
final ComeOn comeOn = new ComeOn();
if (arguments.getRescue()) {
comeOn.resetPreferences();
} else {
comeOn.checkPreferences();
}
final UI ui = assemble(comeOn);
SwingUtilities.invokeLater(() -> {
final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash != null) {
splash.close();
}
ui.setVisible(true);
});
} catch (final CmdLineException e) {
final StringWriter usageBuffer = new StringWriter();
usageBuffer.append(UI.BUNDLE.getString("comeon"));
usageBuffer.append(" – ");
usageBuffer.append(UI.BUNDLE.getString("args.usage"));
usageBuffer.append('\n');
parser.printUsage(usageBuffer, UI.BUNDLE);
System.err.println(usageBuffer.toString());
usageBuffer.close();
}
}
private static UI assemble(final ComeOn comeOn) throws BackingStoreException {
final Injector injector = Guice.createInjector(comeOn);
final List<WithPreferences> withPrefs = Arrays.asList(
injector.getInstance(Templates.class),
injector.getInstance(Wikis.class)
);
for (final WithPreferences withPref : withPrefs) {
withPref.loadPreferences();
}
final UI ui = injector.getInstance(UI.class);
comeOn.bus.register(ui);
comeOn.bus.register(injector.getInstance(Core.class));
comeOn.bus.register(injector.getInstance(AddMediaAction.class));
comeOn.bus.register(injector.getInstance(UploadMediaAction.class));
comeOn.bus.register(injector.getInstance(ClearMediaAction.class));
comeOn.bus.register(injector.getInstance(AbortAction.class));
comeOn.bus.register(injector.getInstance(TransferMonitor.class));
comeOn.bus.register(injector.getInstance(UploaderReporter.class));
return ui;
}
}