package rewardsadmin.web.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.struts.ActionSupport;
import rewardsadmin.app.Reward;
import rewardsadmin.app.RewardLookupService;
import common.datetime.SimpleDateEditor;
import common.money.MonetaryAmountEditor;
/**
* A Struts Action responsible fo looking up details about previously confirmed rewards. This action depends on the
* {@link RewardLookupService} to carry out this lookup.
*
* The {@link RewardLookupService} dependency is resolved using dependency lookup against the root Spring web
* application context. Struts-managed actions are unable to participate in dependency injection as they are not managed
* by a dependency injection container like Spring.
*
* The returned Reward is wrapped in a {@link FormattedReward} helper that format reward fields for display by the view.
* As Struts provides limited formatting capabilities for strongly-typed properties, this is the action's responsiblity.
*/
@SuppressWarnings("deprecation")
public class RewardLookupAction extends ActionSupport {
private RewardLookupService rewardLookupService;
@Override
protected void onInit() {
// lookup the reward lookup service needed to retrieve previously confirmed rewards
rewardLookupService = (RewardLookupService) getWebApplicationContext().getBean("rewardLookupService");
}
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
Reward reward = rewardLookupService.lookupReward(extractConfirmationNumber(request));
request.setAttribute("reward", new FormattedReward(reward));
return actionMapping.findForward("show");
}
private String extractConfirmationNumber(HttpServletRequest request) {
int lastSlash = request.getPathInfo().lastIndexOf('/');
return request.getPathInfo().substring(lastSlash + 1);
}
/**
* A trivial wrapper around a Reward record that formats values such as the "rewardAmount" and "rewardDate" for
* display.
*/
public static class FormattedReward {
private Reward reward;
private MonetaryAmountEditor amountEditor;
private SimpleDateEditor dateEditor;
public FormattedReward(Reward reward) {
amountEditor = new MonetaryAmountEditor();
amountEditor.setValue(reward.getAmount());
dateEditor = new SimpleDateEditor();
dateEditor.setValue(reward.getDate());
this.reward = reward;
}
public String getConfirmationNumber() {
return reward.getConfirmationNumber();
}
public String getAccountNumber() {
return reward.getAccountNumber();
}
public String getMerchantNumber() {
return reward.getMerchantNumber();
}
public String getDate() {
return dateEditor.getAsText();
}
public String getAmount() {
return amountEditor.getAsText();
}
}
}