/*
* Seldon -- open source prediction engine
* =======================================
*
* Copyright 2011-2015 Seldon Technologies Ltd and Rummble Ltd (http://www.seldon.io/)
*
* ********************************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ********************************************************************************************
*/
package io.seldon.api;
import io.seldon.api.resource.ConsumerBean;
import io.seldon.api.resource.ListBean;
import io.seldon.db.jdo.JDOFactory;
import io.seldon.general.UserAttributePeer;
import io.seldon.general.jdo.SqlActionPeer;
import io.seldon.general.jdo.SqlItemPeer;
import io.seldon.general.jdo.SqlUserAttributePeer;
import io.seldon.general.jdo.SqlUserPeer;
import io.seldon.general.jdo.SqlVersionPeer;
import io.seldon.recommendation.CFAlgorithm;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.jdo.PersistenceManager;
import javax.servlet.http.HttpServletRequest;
public class Util {
private static AlgorithmService algorithmService;
public static void setAlgorithmService(AlgorithmService algorithmService) {
Util.algorithmService = algorithmService;
}
public static AlgorithmService getAlgorithmService() {
return algorithmService;
}
public static SqlItemPeer getItemPeer(String client) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(client);
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlItemPeer(pm);
}
public static SqlItemPeer getItemPeer(ConsumerBean c) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(c.getShort_name());
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlItemPeer(pm);
}
public static SqlItemPeer getItemPeer(PersistenceManager pm) throws APIException {
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlItemPeer(pm);
}
public static SqlUserPeer getUserPeer(ConsumerBean c) throws APIException {
return getUserPeer(c.getShort_name());
}
public static SqlUserPeer getUserPeer(String consumer) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(consumer);
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlUserPeer(pm);
}
public static SqlUserPeer getUserPeer(PersistenceManager pm) throws APIException {
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlUserPeer(pm);
}
public static SqlActionPeer getActionPeer(ConsumerBean c) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(c.getShort_name());
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlActionPeer(pm);
}
public static SqlActionPeer getActionPeer(PersistenceManager pm) throws APIException {
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlActionPeer(pm);
}
public static SqlVersionPeer getVersionPeer(ConsumerBean c) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(c.getShort_name());
return getVersionPeer(pm);
}
private static SqlVersionPeer getVersionPeer(PersistenceManager pm) {
if (pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlVersionPeer(pm);
}
public static int getLimit(HttpServletRequest req) throws NumberFormatException {
int limit = Constants.DEFAULT_RESULT_LIMIT;
String sLimit = req.getParameter(Constants.URL_LIMIT);
if(sLimit != null) {
limit = Integer.parseInt(sLimit);
}
return limit;
}
public static boolean getFull(HttpServletRequest req) {
boolean full = false;
String sFull = req.getParameter(Constants.URL_FULL);
if(sFull != null && sFull.equals(Boolean.TRUE.toString())) {
full = Boolean.TRUE;
}
return full;
}
public static String getName(HttpServletRequest req) {
return req.getParameter(Constants.URL_NAME);
}
public static String getAttrName(HttpServletRequest req) {
return req.getParameter(Constants.URL_ATTR_NAME);
}
public static String getAttributes(HttpServletRequest req) {
return req.getParameter(Constants.URL_ATTRIBUTES);
}
public static List<String> getKeywords(HttpServletRequest req) {
List<String> keywords = null;
String sKeywords = req.getParameter(Constants.URL_KEYWORD);
if(sKeywords != null) {
keywords = Arrays.asList(sKeywords.split(","));
}
return keywords;
}
public static Integer getDimension(HttpServletRequest req) throws NumberFormatException {
String sDim = req.getParameter(Constants.URL_ATTR_DIMENSION);
if(sDim != null) {
return Integer.parseInt(sDim);
}
else
return null;
}
public static Set<Integer> getDimensions(HttpServletRequest req) throws NumberFormatException {
String sDim = req.getParameter(Constants.URL_ATTR_DIMENSIONS);
if(sDim != null) {
String[] dParts = sDim.split(",");
Set<Integer> dimensions = new HashSet<Integer>();
for(int i=0;i<dParts.length;i++)
dimensions.add(Integer.parseInt(dParts[i]));
return dimensions;
}
else
return new HashSet<Integer>();
}
public static List<String> getSortItems(HttpServletRequest req)
{
String sortStr = req.getParameter(Constants.URL_ATTR_SORT);
if (sortStr != null)
return Arrays.asList(sortStr.split(","));
else
return null;
}
public static String getLocale(HttpServletRequest req)
{
return req.getParameter(Constants.URL_ATTR_LOCALE);
}
public static ListBean getLimitedBean(ListBean bean, int limit) {
if(bean != null && bean.getSize() == limit) {
bean.setRequested(limit);
}
else if(bean != null && bean.getSize() < bean.getRequested() && bean.getSize() <= limit)
{
bean.setRequested(limit);
}
else if(bean != null && bean.getSize() > limit)
{
bean.setRequested(limit);
bean.setSize(limit);
bean.setList(bean.getList().subList(0,limit));
}
else bean = null;
return bean;
}
public static String getSort(HttpServletRequest req) {
return req.getParameter(Constants.URL_SORT);
}
public static UserAttributePeer getUserAttributePeer(ConsumerBean c) throws APIException {
PersistenceManager pm = JDOFactory.get().getPersistenceManager(c.getShort_name());
return getUserAttributePeer(pm);
}
public static UserAttributePeer getUserAttributePeer(PersistenceManager pm) throws APIException {
if(pm == null) {
throw new APIException(APIException.INTERNAL_DB_ERROR);
}
return new SqlUserAttributePeer(pm);
}
public static Integer getType(HttpServletRequest req) {
Integer res = null;
String s = req.getParameter(Constants.URL_TYPE);
if(s!=null && s.length()>0) {
try {
res = Integer.parseInt(s);
}
catch(NumberFormatException e) { }
}
return res;
}
public static final String algOptionSeparator = ",";
private static final String parameterSeparator = ":";
private static final String valueSeparator = "|";
public static List<String> getAlgorithms(HttpServletRequest req) {
List<String> res = null;
String algorithms = req.getParameter(Constants.URL_ALGORITHMS);
if(algorithms != null && !algorithms.isEmpty()) {
res = Arrays.asList(algorithms.split(algOptionSeparator));
}
return res;
}
public static CFAlgorithm getAlgorithmOptions(ConsumerBean c, List<String> algorithms,String recTag) throws CloneNotSupportedException {
CFAlgorithm cfAlgorithm = Util.getAlgorithmService().getAlgorithmOptions(c,recTag).clone();
for(String algorithm : algorithms) {
try {
if(!algorithm.isEmpty() && algorithm.contains(parameterSeparator)) {
String[] parameter = algorithm.split("\\"+parameterSeparator);
String field = parameter[0];
List<String> values = Arrays.asList(parameter[1].split("\\"+valueSeparator));
cfAlgorithm.setParameter(field,values);
}
}
catch(Exception e) {}
}
return cfAlgorithm;
}
}