Calculation fixable messages

This commit is contained in:
Sergey Solovyev
2012-11-17 21:58:48 +04:00
parent 44ed81a5ca
commit 1ab714b044
33 changed files with 571 additions and 65 deletions

View File

@@ -132,6 +132,10 @@ public enum CalculatorEventType {
*
**********************************************************************
*/
// List<Message>
calculation_messages,
show_history,
show_history_detached,

View File

@@ -0,0 +1,43 @@
package org.solovyev.android.calculator;
import jscl.AngleUnit;
import jscl.text.msg.Messages;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.common.collections.CollectionsUtils;
import java.util.List;
/**
* User: serso
* Date: 11/17/12
* Time: 7:30 PM
*/
public enum CalculatorFixableError {
must_be_rad(Messages.msg_23, Messages.msg_24, Messages.msg_25) {
@Override
public void fix() {
CalculatorLocatorImpl.getInstance().getPreferenceService().setAngleUnits(AngleUnit.rad);
}
};
@NotNull
private final List<String> messageCodes;
CalculatorFixableError(@Nullable String... messageCodes) {
this.messageCodes = CollectionsUtils.asList(messageCodes);
}
@Nullable
public static CalculatorFixableError getErrorByMessageCode(@NotNull String messageCode) {
for (CalculatorFixableError fixableError : values()) {
if (fixableError.messageCodes.contains(messageCode)) {
return fixableError;
}
}
return null;
}
public abstract void fix();
}

View File

@@ -25,6 +25,7 @@ import org.solovyev.common.text.StringUtils;
import org.solovyev.math.units.ConversionException;
import org.solovyev.math.units.ConversionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -189,10 +190,14 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
final CalculatorLogger logger = CalculatorLocatorImpl.getInstance().getLogger();
try {
final List<Message> messages = new ArrayList<Message>();
while (messageRegistry.hasMessage()) {
handleJsclMessage(messageRegistry.getMessage());
messages.add(messageRegistry.getMessage());
}
} catch (Throwable e) {
if (!messages.isEmpty()) {
fireCalculatorEvent(newCalculationEventData(operation, expression, sequenceId), CalculatorEventType.calculation_messages, messages);
}
} catch (Throwable e) {
// todo serso: not good be we need proper synchronization
logger.error("Calculator", e.getMessage(), e);
}
@@ -221,11 +226,6 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
}
}
private void handleJsclMessage(@NotNull Message message) {
final CalculatorNotifier notifier = CalculatorLocatorImpl.getInstance().getNotifier();
notifier.showMessage(message);
}
@NotNull
@Override
public PreparedExpression prepareExpression(@NotNull String expression) throws CalculatorParseException {

View File

@@ -15,7 +15,8 @@ public interface CalculatorLocator {
@NotNull CalculatorClipboard clipboard,
@NotNull CalculatorNotifier notifier,
@NotNull CalculatorHistory history,
@NotNull CalculatorLogger logger);
@NotNull CalculatorLogger logger,
@NotNull CalculatorPreferenceService preferenceService);
@NotNull
Calculator getCalculator();
@@ -43,4 +44,7 @@ public interface CalculatorLocator {
@NotNull
CalculatorLogger getLogger();
@NotNull
CalculatorPreferenceService getPreferenceService();
}

View File

@@ -40,6 +40,9 @@ public class CalculatorLocatorImpl implements CalculatorLocator {
@NotNull
private static final CalculatorLocator instance = new CalculatorLocatorImpl();
@NotNull
private CalculatorPreferenceService calculatorPreferenceService;
public CalculatorLocatorImpl() {
}
@@ -49,7 +52,8 @@ public class CalculatorLocatorImpl implements CalculatorLocator {
@NotNull CalculatorClipboard clipboard,
@NotNull CalculatorNotifier notifier,
@NotNull CalculatorHistory history,
@NotNull CalculatorLogger logger) {
@NotNull CalculatorLogger logger,
@NotNull CalculatorPreferenceService preferenceService) {
this.calculator = calculator;
this.calculatorEngine = engine;
@@ -57,6 +61,7 @@ public class CalculatorLocatorImpl implements CalculatorLocator {
this.calculatorNotifier = notifier;
this.calculatorHistory = history;
this.calculatorLogger = logger;
this.calculatorPreferenceService = preferenceService;
calculatorEditor = new CalculatorEditorImpl(this.calculator);
calculatorDisplay = new CalculatorDisplayImpl(this.calculator);
@@ -121,4 +126,10 @@ public class CalculatorLocatorImpl implements CalculatorLocator {
public CalculatorLogger getLogger() {
return calculatorLogger;
}
@NotNull
@Override
public CalculatorPreferenceService getPreferenceService() {
return this.calculatorPreferenceService;
}
}

View File

@@ -0,0 +1,14 @@
package org.solovyev.android.calculator;
import jscl.AngleUnit;
import org.jetbrains.annotations.NotNull;
/**
* User: serso
* Date: 11/17/12
* Time: 7:45 PM
*/
public interface CalculatorPreferenceService {
void setAngleUnits(@NotNull AngleUnit angleUnit);
}

View File

@@ -11,7 +11,7 @@ import org.solovyev.android.calculator.history.CalculatorHistory;
public class AbstractCalculatorTest {
protected void setUp() throws Exception {
CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), CalculatorTestUtils.newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger());
CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), CalculatorTestUtils.newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class));
CalculatorLocatorImpl.getInstance().getEngine().init();
}

View File

@@ -23,7 +23,7 @@ public class CalculatorTestUtils {
public static final int TIMEOUT = 1;
public static void staticSetUp() throws Exception {
CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger());
CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class));
CalculatorLocatorImpl.getInstance().getEngine().init();
}