/******************************************************************************
* Copyright (C) 2012-2013 Jonah Graham 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:
* Jonah Graham <jonah@kichwacoders.com> - initial API and implementation
* Fabio Zadrozny <fabiofz@gmail.com> - ongoing maintenance
******************************************************************************/
package org.python.pydev.shared_interactive_console.console.codegen;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.SafeRunner;
/**
* Wrapper around an unknown IScriptConsoleCodeGenerator that catches and logs
* exceptions using {@link SafeRunner}.
*/
public class SafeScriptConsoleCodeGenerator implements IScriptConsoleCodeGenerator {
private final IScriptConsoleCodeGenerator unsafeGenerator;
private boolean hasPyCode;
private String pyCode;
private final class HasPyCodeRunnable implements ISafeRunnable {
@Override
public void run() throws Exception {
hasPyCode = unsafeGenerator.hasPyCode();
}
@Override
public void handleException(Throwable exception) {
hasPyCode = false;
}
}
private final class GetPyCodeRunnable implements ISafeRunnable {
@Override
public void run() throws Exception {
pyCode = unsafeGenerator.getPyCode();
}
@Override
public void handleException(Throwable exception) {
pyCode = null;
}
}
/**
* Create a Safe wrapped generator for a possibly unsafe one.
* @param unsafeGenerator generator to wrap
*/
public SafeScriptConsoleCodeGenerator(IScriptConsoleCodeGenerator unsafeGenerator) {
this.unsafeGenerator = unsafeGenerator;
}
/**
* Calls nested generators getPyCode in a SafeRunner, on any exception
* returns null
*/
@Override
public String getPyCode() {
String ret;
try {
SafeRunner.run(new GetPyCodeRunnable());
ret = pyCode;
} finally {
pyCode = null;
}
return ret;
}
/**
* Calls nested generators getPyCode in a SafeRunner, on any exception
* returns false
*/
@Override
public boolean hasPyCode() {
SafeRunner.run(new HasPyCodeRunnable());
return hasPyCode;
}
}