public String perform(HttpServletRequest request) {
		List<String> errors = new ArrayList<String>();
		request.setAttribute("errors", errors);

		try {
			ResearchFundForm form = formBeanFactory.create(request);
			request.setAttribute("form", form);

			if (!form.isPresent()) {
				return "c_researchFund.jsp";
			}

			Transaction.begin();
			// System.out.print("!!ticker"+form.getFundTicker()+"\n");
			// Any validation errors?
			if (!fundDAO.checkFundByTicker(form.getFundTicker())) {
				// System.out.print("!! not exist !! \n");

				errors.add("No such fund exists");
			}
			// System.out.print("come here! \n");

			errors.addAll(form.getValidationErrors());
			if (errors.size() != 0) {
				Transaction.commit();
				return "c_researchFund.jsp";
			}

			// System.out.print("come here2! \n");
			String ticker = form.getFundTicker();
			FundBean fb = fundDAO.getFundByTicker(ticker);
			// System.out.print("come here3!"+fb.getSymbol()+" \n");
			FundPriceHistoryBean[] fphBean = fphDAO
					.getFundPriceHistoryByFundId(fb.getFund_id());
			// System.out.print("cprice history!"+fphBean.length+" \n");
			// for(FundPriceHistoryBean b: fphBean) {
			// System.out.print(b.getFund_id()+b.getDate()+"\n");
			// }
			request.setAttribute("fundInfo", fphBean);
			Transaction.commit();

			return "c_researchFund.jsp";
		} catch (FormBeanException e) {
			errors.add(e.getMessage());
			return "c_researchFund.jsp";
		} catch (RollbackException e) {
			return "c_researchFund.jsp";
		} catch (Exception e) {
			errors.add(e.getMessage());
			return "c_researchFund.jsp";
		} finally {
			if (Transaction.isActive())
				Transaction.rollback();
		}
	}