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.googlecode.gwt.crypto.util.Str; import com.yoghurt.crypto.transactions.client.place.TransactionPlace; import com.yoghurt.crypto.transactions.client.place.TransactionPlace.TransactionDataType; import com.yoghurt.crypto.transactions.client.util.AppAsyncCallback; import com.yoghurt.crypto.transactions.client.util.ParseUtil; import com.yoghurt.crypto.transactions.shared.domain.Transaction; import com.yoghurt.crypto.transactions.shared.domain.TransactionInformation; import com.yoghurt.crypto.transactions.shared.service.BlockchainRetrievalServiceAsync; /** * Refactor this catastrophe. * * - Gracefully handle the case where a raw transaction is passed. * - Less code * - Less confusing code * - Less redundant code * - Error to the views */ public class TransactionActivity extends LookupActivity<TransactionInformation, TransactionPlace> implements TransactionView.Presenter { private final TransactionView view; private boolean transactionHasError; @Inject public TransactionActivity(final TransactionView view, @Assisted final TransactionPlace place, final BlockchainRetrievalServiceAsync service) { super(place, service); this.view = view; } @Override protected void doDeferredStart(final AcceptsOneWidget panel, final TransactionInformation transactionInformation) { panel.setWidget(view); final Transaction transactionFromHex = ParseUtil.getTransactionFromHex(transactionInformation.getRawHex()); view.setTransaction(transactionFromHex, transactionHasError); // If an error occurred while parsing, don't bother getting the tx info if (transactionHasError) { return; } if (transactionInformation.getState() != null) { view.setTransactionInformation(transactionInformation); } else { service.getTransactionInformation(Str.toString(Hex.encode(transactionFromHex.getTransactionId())), new AppAsyncCallback<TransactionInformation>() { @Override public void onSuccess(final TransactionInformation result) { view.setTransactionInformation(result); } }); } } @Override protected void doDeferredError(final AcceptsOneWidget panel, final Throwable caught) { panel.setWidget(view); view.setError(place.getHex(), caught); } @Override protected boolean mustPerformLookup(final TransactionPlace place) { return place.getType() == TransactionDataType.ID; } @Override protected TransactionInformation createInfo(final TransactionPlace place) { final TransactionInformation ti = new TransactionInformation(); ti.setRawHex(place.getHex()); return ti; } @Override protected void doLookup(final TransactionPlace place, final AsyncCallback<TransactionInformation> callback) { service.getTransactionInformation(place.getHex(), callback); } }