/************************************************************************************* * Copyright (c) 2010-2011 Red Hat, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.runtime.ui.internal.startup; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.ConfigurationScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IStartup; import org.eclipse.ui.PlatformUI; import org.jboss.tools.runtime.core.model.RuntimeDefinition; import org.jboss.tools.runtime.core.model.RuntimePath; import org.jboss.tools.runtime.core.util.RuntimeInitializerUtil; import org.jboss.tools.runtime.core.util.RuntimeModelUtil; import org.jboss.tools.runtime.ui.RuntimeUIActivator; import org.jboss.tools.runtime.ui.internal.Messages; import org.jboss.tools.runtime.ui.internal.dialogs.SearchRuntimePathDialog; import org.jboss.tools.runtime.ui.internal.preferences.JBossRuntimePreferencesInitializer; /** * @author snjeza * */ public class RuntimeScanner implements IStartup { private static RuntimeScanner instance = null; public static RuntimeScanner getDefault() { return instance; } private Job initializationJob = null; public RuntimeScanner() { instance = this; } @Override public void earlyStartup() { if( Boolean.getBoolean("skip.runtime.scanner")) //$NON-NLS-1$ return; boolean firstStart = isFirstStart(); Job runtimeJob = getOrCreateInitializationJob(firstStart); runtimeJob.schedule(1000); setFirstStartFalse(); } public Job getInitializationJob() { return this.initializationJob; } public Job getOrCreateInitializationJob(boolean firstStart ) { if( this.initializationJob == null ) { this.initializationJob = createJob(firstStart); } return this.initializationJob; } private Job createJob(final boolean firstStart) { Job runtimeJob = new Job(Messages.RuntimeScanner_Searching_runtimes) { @Override protected IStatus run(IProgressMonitor monitor) { if (firstStart) { JBossRuntimeStartup.initializeRuntimes(monitor); } boolean openDialog = wouldOpenSearchRuntimePathDialog(firstStart, monitor); if (monitor.isCanceled()) { RuntimeUIActivator.getDefault().getModel().setRuntimePaths(null); return Status.CANCEL_STATUS; } if (openDialog) { Display.getDefault().asyncExec(new Runnable() { public void run() { Shell shell = PlatformUI.getWorkbench().getModalDialogShellProvider().getShell(); Set<RuntimePath> runtimePaths = new HashSet<RuntimePath>(); for (RuntimePath runtimePath:RuntimeUIActivator.getDefault().getModel().getRuntimePaths()) { if (runtimePath.isScanOnEveryStartup() || firstStart) { runtimePaths.add(runtimePath); } } RuntimePath[] asArr = runtimePaths.toArray(new RuntimePath[runtimePaths.size()]); if (runtimePaths.size() > 0) { SearchRuntimePathDialog.launchSearchRuntimePathDialog( shell, asArr, false, 7); } } }); } return Status.OK_STATUS; } }; runtimeJob.setUser(false); runtimeJob.setSystem(false); runtimeJob.setPriority(Job.LONG); return runtimeJob; } private boolean isFirstStart() { boolean firstStartWorkspace = RuntimeUIActivator.getDefault(). getPreferenceStore().getBoolean(JBossRuntimePreferencesInitializer.FIRST_START); IEclipsePreferences configurationNode = ConfigurationScope.INSTANCE.getNode(RuntimeUIActivator.PLUGIN_ID); boolean firstStartConfiguration = configurationNode.getBoolean(JBossRuntimePreferencesInitializer.FIRST_START, true); final boolean firstStart = firstStartWorkspace || firstStartConfiguration; return firstStart; } private void setFirstStartFalse() { IEclipsePreferences configurationNode = ConfigurationScope.INSTANCE.getNode(RuntimeUIActivator.PLUGIN_ID); configurationNode.putBoolean(JBossRuntimePreferencesInitializer.FIRST_START, false); RuntimeUIActivator.getDefault().getPreferenceStore().setValue(JBossRuntimePreferencesInitializer.FIRST_START, false); } private boolean wouldOpenSearchRuntimePathDialog(boolean firstStart, IProgressMonitor monitor) { RuntimePath[] runtimePaths = RuntimeUIActivator.getDefault().getModel().getRuntimePaths(); boolean ret = false; for (RuntimePath runtimePath:runtimePaths) { if (!firstStart && !runtimePath.isScanOnEveryStartup()) { continue; } if (monitor.isCanceled()) { return false; } if (runtimePath.isModified()) { RuntimeInitializerUtil.createRuntimeDefinitions(runtimePath, monitor); } monitor.setTaskName(Messages.RuntimeScanner_JBoss_Runtime_Detector_checking + runtimePath.getPath()); RuntimeDefinition[] runtimeDefinitions = runtimePath.getRuntimeDefinitions(); for (RuntimeDefinition runtimeDefinition:runtimeDefinitions) { if (monitor.isCanceled()) { return false; } if (!runtimeDefinition.isEnabled()) { continue; } monitor.setTaskName(Messages.RuntimeScanner_JBoss_Runtime_Detector_checking + runtimeDefinition.getLocation()); if (!RuntimeModelUtil.verifyRuntimeDefinitionCreated(runtimeDefinition)) { ret = true; } } } RuntimeModelUtil.updateTimestamps(runtimePaths); RuntimeUIActivator.getDefault().saveRuntimePreferences(); return ret; } }