/*
* Copyright (c) 2010 StockPlay development team
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kapti.backend.api.user;
import com.kapti.backend.api.MethodClass;
import com.kapti.backend.helpers.DateHelper;
import com.kapti.data.Order;
import com.kapti.data.OrderStatus;
import com.kapti.data.persistence.GenericDAO;
import com.kapti.exceptions.ServiceException;
import com.kapti.exceptions.StockPlayException;
import com.kapti.filter.Filter;
import com.kapti.filter.parsing.Parser;
import com.kapti.filter.relation.RelationAnd;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.TimeZone;
import java.util.Vector;
/**
* \brief Handler van de User.Order subklasse.
*
* Deze klasse is de handler van de User.Order subklasse. Ze staat in
* voor de verwerking van aanroepen van functies die zich in deze klasse
* bevinden, lokaal de correcte aanvragen uit te voeren, en het resultaat
* op conforme wijze terug te sturen.
*/
public class OrderHandler extends MethodClass {
public Vector<HashMap<String, Object>> List() throws StockPlayException {
return List("");
}
public Vector<HashMap<String, Object>> List(String iFilter) throws StockPlayException {
// Get DAO reference
GenericDAO<com.kapti.data.Order, Integer> orDAO = getDAO().getOrderDAO();
// Create a filter
Parser parser = Parser.getInstance();
Filter filter = null;
Filter base = parser.parse(iFilter);
if (getRole().isBackendAdmin() || getRole().isTransactionAdmin()) {
filter = base;
} else {
Filter user = parser.parse("userid == '" + getUser().getId() + "'i");
if (!base.empty()) {
filter = Filter.merge(RelationAnd.class, base, user);
} else {
filter = user;
}
}
// Fetch and convert all orders
Collection<com.kapti.data.Order> tOrders = orDAO.findByFilter(filter);
Vector<HashMap<String, Object>> oVector = new Vector<HashMap<String, Object>>();
for (com.kapti.data.Order tOrder : tOrders) {
oVector.add(tOrder.toStruct(
com.kapti.data.Order.Fields.ID,
com.kapti.data.Order.Fields.USER,
com.kapti.data.Order.Fields.TYPE,
com.kapti.data.Order.Fields.ISIN,
com.kapti.data.Order.Fields.AMOUNT,
com.kapti.data.Order.Fields.STATUS,
com.kapti.data.Order.Fields.CREATIONTIME,
com.kapti.data.Order.Fields.EXECUTIONTIME,
com.kapti.data.Order.Fields.EXPIRATIONTIME,
com.kapti.data.Order.Fields.SECONDAIRYLIMIT,
com.kapti.data.Order.Fields.PRICE));
}
return oVector;
}
public int Create(HashMap<String, Object> iDetails) throws StockPlayException {
// Get DAO reference
GenericDAO<com.kapti.data.Order, Integer> orDAO = getDAO().getOrderDAO();
// Restrict the input hash
if (!getRole().isBackendAdmin() || getRole().isTransactionAdmin()) {
for (String tKey : iDetails.keySet()) {
if (tKey.equalsIgnoreCase(Order.Fields.USER.toString())) {
int tId = (Integer) iDetails.get(tKey);
if (tId != getUser().getId())
throw new ServiceException(ServiceException.Type.UNAUTHORIZED);
}
}
}
// Instantiate a new order
Order tOrder = Order.fromStruct(iDetails);
tOrder.applyStruct(iDetails);
tOrder.setStatus(OrderStatus.ACCEPTED);
tOrder.setCreationTime(DateHelper.convertCalendar(Calendar.getInstance(), TimeZone.getTimeZone("GMT")).getTime());
return orDAO.create(tOrder);
}
public boolean Modify(String iFilter, HashMap<String, Object> iDetails) throws StockPlayException {
// Get DAO reference
GenericDAO<com.kapti.data.Order, Integer> orDAO = getDAO().getOrderDAO();
// Create a filter
Parser parser = Parser.getInstance();
Filter filter = null;
Filter base = parser.parse(iFilter);
if (getRole().isBackendAdmin() || getRole().isTransactionAdmin()) {
filter = base;
} else {
Filter user = parser.parse("userid == '" + getUser().getId() + "'i");
filter = Filter.merge(RelationAnd.class, base, user);
}
// Get the orders we need to modify
Collection<com.kapti.data.Order> tOrders = orDAO.findByFilter(filter);
// Now apply the cancelation
boolean success = true;
for (com.kapti.data.Order tOrder : tOrders) {
tOrder.applyStruct(iDetails);
if (!orDAO.update(tOrder))
success = false;
}
return success;
}
public int Cancel(String iFilter) throws StockPlayException {
// Get DAO reference
GenericDAO<com.kapti.data.Order, Integer> orDAO = getDAO().getOrderDAO();
// Create a filter
Parser parser = Parser.getInstance();
Filter filter = null;
Filter base = parser.parse(iFilter);
if (getRole().isBackendAdmin() || getRole().isTransactionAdmin()) {
filter = base;
} else {
Filter user = parser.parse("userid == '" + getUser().getId() + "'i");
filter = Filter.merge(RelationAnd.class, base, user);
}
// Get the exchanges we need to modify
Collection<com.kapti.data.Order> tOrders = orDAO.findByFilter(filter);
// Now apply the cancelation
for (com.kapti.data.Order tOrder : tOrders) {
tOrder.setStatus(OrderStatus.CANCELLED);
orDAO.update(tOrder);
}
return 1;
}
}