/**
* Copyright (c) Red Hat, Inc., contributors and others 2013 - 2014. All rights reserved
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.tools.forge.core.furnace;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.jboss.forge.addon.ui.command.UICommand;
import org.jboss.forge.furnace.services.Imported;
import org.jboss.tools.forge.core.internal.ForgeCorePlugin;
import org.jboss.tools.forge.core.io.ForgeOutputListener;
import org.jboss.tools.forge.core.runtime.ForgeRuntime;
import org.jboss.tools.forge.core.runtime.ForgeRuntimeState;
import org.jboss.tools.forge.core.runtime.ForgeRuntimeType;
public class FurnaceRuntime implements ForgeRuntime {
public static final FurnaceRuntime INSTANCE = new FurnaceRuntime();
private ForgeRuntimeState state = ForgeRuntimeState.STOPPED;
private String location = null;
private String version = null;
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private FurnaceRuntime() {
}
@Override
public String getName() {
return getVersion() + " - " + getType().toString().toLowerCase();
}
@Override
public String getLocation() {
if (location == null) {
initLocation();
}
return location;
}
@Override
public ForgeRuntimeType getType() {
return ForgeRuntimeType.EMBEDDED;
}
@Override
public ForgeRuntimeState getState() {
return state;
}
@Override
public String getVersion() {
if (version == null) {
version = initializeVersion();
}
return version;
}
@Override
public void start(IProgressMonitor progressMonitor) {
ForgeCorePlugin.getDefault().sendStartEvent(this);
if (progressMonitor == null) {
progressMonitor = new NullProgressMonitor();
}
try {
String taskName = "Please wait while Forge " + getVersion() + " is started.";
progressMonitor.beginTask(taskName, IProgressMonitor.UNKNOWN);
setNewState(ForgeRuntimeState.STARTING);
FurnaceProvider.INSTANCE.startFurnace();
progressMonitor.worked(1);
while (FurnaceService.INSTANCE.getContainerStatus().isStarting()) {
if (progressMonitor.isCanceled()) {
FurnaceService.INSTANCE.stop();
setNewState(ForgeRuntimeState.STOPPED);
} else {
Thread.sleep(1000);
progressMonitor.worked(1);
}
}
FurnaceService.INSTANCE.waitUntilContainerIsStarted();
getAllCandidatesAsMap();
setNewState(ForgeRuntimeState.RUNNING);
} catch (InterruptedException e) {
if (progressMonitor.isCanceled()) {
FurnaceService.INSTANCE.stop();
setNewState(ForgeRuntimeState.STOPPED);
}
}
}
@Override
public void stop(IProgressMonitor progressMonitor) {
setNewState(ForgeRuntimeState.STOPPED);
FurnaceService.INSTANCE.stop();
}
@Override
public String getErrorMessage() {
// TODO Auto-generated method stub
return null;
}
@Override
public void sendInput(String str) {
// TODO Auto-generated method stub
}
@Override
public String sendCommand(String str) {
// TODO Auto-generated method stub
return null;
}
@Override
public void addOutputListener(ForgeOutputListener outputListener) {
// TODO Auto-generated method stub
}
@Override
public void removeOutputListener(ForgeOutputListener outputListener) {
// TODO Auto-generated method stub
}
@Override
public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
propertyChangeSupport.addPropertyChangeListener(propertyChangeListener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener) {
propertyChangeSupport.removePropertyChangeListener(propertyChangeListener);
}
private void setNewState(ForgeRuntimeState newState) {
ForgeRuntimeState oldState = state;
state = newState;
propertyChangeSupport.firePropertyChange(PROPERTY_STATE, oldState, state);
}
private static Map<String, UICommand> getAllCandidatesAsMap() {
Map<String, UICommand> result = new TreeMap<>();
Imported<UICommand> instances = FurnaceService.INSTANCE.lookupImported(UICommand.class);
for (@SuppressWarnings("unused")
UICommand uiCommand : instances) {
}
return result;
}
private String initializeVersion() {
String result = "unknown version";
String location = getLocation();
if (location == null)
return result;
location += "/lib";
File file = new File(location);
if (!file.exists())
return result;
String[] candidates = file.list();
for (String candidate : candidates) {
if (candidate.startsWith("shell-spi-")) {
int end = candidate.indexOf(".jar");
if (end != -1) {
result = candidate.substring("shell-spi-".length(), end);
}
}
}
return result;
}
private void initLocation() {
try {
location = FileLocator.getBundleFile(Platform.getBundle("org.jboss.tools.forge.runtime"))
.getCanonicalPath();
} catch (IOException e) {
ForgeCorePlugin.log(e);
}
}
}