package com.yoghurt.crypto.transactions.client.ui;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.googlecode.gwt.crypto.bouncycastle.util.encoders.Hex;
import com.yoghurt.crypto.transactions.client.place.ScriptPlace;
import com.yoghurt.crypto.transactions.client.place.ScriptPlace.ScriptDataType;
import com.yoghurt.crypto.transactions.client.util.MorphCallback;
import com.yoghurt.crypto.transactions.client.util.ParseUtil;
import com.yoghurt.crypto.transactions.client.util.script.StackMachine;
import com.yoghurt.crypto.transactions.client.util.script.StackMachineFactory;
import com.yoghurt.crypto.transactions.shared.domain.ScriptEntity;
import com.yoghurt.crypto.transactions.shared.domain.ScriptInformation;
import com.yoghurt.crypto.transactions.shared.domain.Transaction;
import com.yoghurt.crypto.transactions.shared.domain.TransactionInformation;
import com.yoghurt.crypto.transactions.shared.domain.TransactionOutPoint;
import com.yoghurt.crypto.transactions.shared.domain.TransactionOutput;
import com.yoghurt.crypto.transactions.shared.service.BlockchainRetrievalServiceAsync;
import com.yoghurt.crypto.transactions.shared.util.ScriptParseUtil;
public class ScriptActivity extends LookupActivity<ScriptInformation, ScriptPlace> implements ScriptView.Presenter {
private final ScriptView view;
@Inject
public ScriptActivity(final ScriptView view, @Assisted final ScriptPlace place, final BlockchainRetrievalServiceAsync service) {
super(place, service);
this.view = view;
}
@Override
protected void doDeferredStart(final AcceptsOneWidget panel, final ScriptInformation scriptInformation) {
panel.setWidget(view);
final StackMachine machine = StackMachineFactory.createStackMachine(scriptInformation);
view.setScript(scriptInformation, machine);
}
@Override
protected void doDeferredError(final AcceptsOneWidget panel, final Throwable caught) {
// Not supported
}
@Override
protected boolean mustPerformLookup(final ScriptPlace place) {
return ScriptDataType.ID == place.getType();
}
@Override
protected ScriptInformation createInfo(final ScriptPlace place) {
final ScriptInformation information = new ScriptInformation();
final ScriptEntity pubKeySig = ScriptParseUtil.parseScript(Hex.decode(place.getPubKeySig()));
information.setPubKeySig(pubKeySig);
final ScriptEntity scriptSig = ScriptParseUtil.parseScript(Hex.decode(place.getScriptSig()));
information.setScriptSig(scriptSig);
return information;
}
@Override
protected void doLookup(final ScriptPlace place, final AsyncCallback<ScriptInformation> callback) {
final MorphCallback<TransactionInformation, ScriptInformation> morphCallback = new MorphCallback<TransactionInformation, ScriptInformation>(callback) {
@Override
protected ScriptInformation morphResult(final TransactionInformation result) {
// Parse the outpoint transaction in full
final Transaction tx = ParseUtil.getTransactionFromHex(result.getRawHex());
// Parse the ScriptSig from the place
final ScriptEntity scriptSig = ScriptParseUtil.parseScript(Hex.decode(place.getScriptSig()));
// Construct the OutPoint from the retrieved transaction index in the place
final TransactionOutPoint outPoint = new TransactionOutPoint();
outPoint.setReferenceTransaction(tx.getTransactionId());
outPoint.setIndex(place.getOutpointIndex());
// Get the OutPoint's pubKeySig from the parsed transaction
final TransactionOutput pubKeySig = tx.getOutputs().get(place.getOutpointIndex());
// Construct the ScriptInformation and return it
final ScriptInformation information = new ScriptInformation();
information.setPubKeySig(pubKeySig);
information.setScriptSig(scriptSig);
information.setOutpoint(outPoint);
return information;
}
};
switch (place.getType()) {
case ID:
service.getTransactionInformation(place.getOutpointTransaction(), morphCallback);
break;
default:
callback.onFailure(new IllegalStateException("No support lookup for type: " + place.getType().name()));
return;
}
}
}