/* * Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec 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. * * easyrec 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 easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.controller; import com.google.common.base.Strings; import com.google.common.collect.Maps; import org.easyrec.model.core.web.*; import org.easyrec.model.core.ItemAssocVO; import org.easyrec.model.core.TenantVO; import org.easyrec.model.plugin.LogEntry; import org.easyrec.model.web.*; import org.easyrec.plugin.container.PluginRegistry; import org.easyrec.plugin.generator.Generator; import org.easyrec.plugin.generator.GeneratorConfiguration; import org.easyrec.plugin.model.PluginId; import org.easyrec.plugin.stats.GeneratorStatistics; import org.easyrec.service.core.TenantService; import org.easyrec.service.web.ItemService; import org.easyrec.service.web.NamedConfigurationService; import org.easyrec.service.web.PluginScheduler; import org.easyrec.service.web.RemoteTenantService; import org.easyrec.service.web.nodomain.ShopRecommenderService; import org.easyrec.store.dao.IDMappingDAO; import org.easyrec.store.dao.core.ItemDAO; import org.easyrec.store.dao.core.types.AssocTypeDAO; import org.easyrec.store.dao.plugin.LogEntryDAO; import org.easyrec.store.dao.web.BackTrackingDAO; import org.easyrec.store.dao.web.OperatorDAO; import org.easyrec.store.dao.web.RemoteTenantDAO; import org.easyrec.util.core.MessageBlock; import org.easyrec.util.core.Security; import org.easyrec.util.core.Web; import org.easyrec.utils.servlet.ServletUtils; import org.easyrec.vocabulary.MSG; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import org.springframework.web.util.HtmlUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; /** * This Controller handles the Tenant operation. * <p/> * <p><b>Company: </b> * SAT, Research Studios Austria</p> * <p/> * <p><b>Copyright: </b> * (c) 2009</p> * <p/> * <p><b>last modified:</b><br/> * $Author: fsalcher $<br/> * $Date: 2012-03-23 15:35:07 +0100 (Fr, 23 Mär 2012) $<br/> * $Revision: 18791 $</p> * * @author dmann * @version 1.0 * @since 1.0 */ public class RemoteTenantController extends MultiActionController { // TODO: move to vocabulary? private static final String REGISTER_TENANT = "registerTenant"; private static final String UPDATE_TENANT = "updateTenant"; private static final String VIEW_TENANTS = "viewTenants"; private static final String VIEW_ITEMS = "viewItems"; private static final String VIEW_TOP_RANKED_ITEMS = "viewMostViewedItems"; private static final String VIEW_HOT_RECOMMENDATIONS = "viewHotRecommendations"; private static final String VIEW_CLUSTER_MANAGER = "clustermanager"; private static final String VIEW_RULES_TO_ITEM = "viewRulesToItem"; private static final String VIEW_STATISTICS = "viewStatistics"; private static final String REFRESH_STATISTICS = "refreshstatistics"; private OperatorDAO operatorDAO; private RemoteTenantDAO remoteTenantDAO; private ItemDAO itemDAO; private TenantService tenantService; private RemoteTenantService remoteTenantService; private ShopRecommenderService shopRecommenderService; private PluginScheduler pluginScheduler; private BackTrackingDAO backTrackingDAO; private IDMappingDAO idMappingDAO; private ItemService itemService; private AssocTypeDAO assocTypeDAO; private LogEntryDAO logEntryDAO; private NamedConfigurationService namedConfigurationService; private PluginRegistry pluginRegistry; public void setNamedConfigurationService(NamedConfigurationService namedConfigurationService) { this.namedConfigurationService = namedConfigurationService; } public void setPluginRegistry(PluginRegistry pluginRegistry) { this.pluginRegistry = pluginRegistry; } public void setLogEntryDAO(LogEntryDAO logEntryDAO) { this.logEntryDAO = logEntryDAO; } public void setRemoteTenantDAO(RemoteTenantDAO remoteTenantDAO) { this.remoteTenantDAO = remoteTenantDAO; } public void setItemDAO(ItemDAO itemDAO) { this.itemDAO = itemDAO; } public void setTenantService(TenantService tenantService) { this.tenantService = tenantService; } public void setOperatorDAO(OperatorDAO operatorDAO) { this.operatorDAO = operatorDAO; } public void setShopRecommenderService(ShopRecommenderService shopRecommenderService) { this.shopRecommenderService = shopRecommenderService; } public void setPluginScheduler(PluginScheduler pluginScheduler) { this.pluginScheduler = pluginScheduler; } public void setBackTrackingDAO(BackTrackingDAO backTrackingDAO) { this.backTrackingDAO = backTrackingDAO; } public void setAssocTypeDAO(AssocTypeDAO assocTypeDAO) { this.assocTypeDAO = assocTypeDAO; } public void setIdMappingDAO(IDMappingDAO idMappingDAO) { this.idMappingDAO = idMappingDAO; } public void setRemoteTenantService(RemoteTenantService remoteTenantService) { this.remoteTenantService = remoteTenantService; } public void setItemService(ItemService itemService) { this.itemService = itemService; } public ModelAndView register(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = HtmlUtils.htmlEscape(ServletUtils.getSafeParameter(request, "description", "")); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, REGISTER_TENANT, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } // an administrator is allowed to create a tenant for any operator if (Security.isDeveloper(request)) { if (!Strings.isNullOrEmpty(operatorId)) { signedInOperatorId = operatorId; } } tenantId = tenantId.replace("?", ""); logger.info("Registering Tenant: " + signedInOperator + ":" + tenantId); if (!Web.isValidUrl(url) || url.equalsIgnoreCase("http://localhost/")) { messages.add(MSG.NO_VALID_URL); } if (Strings.isNullOrEmpty(tenantId) || !tenantId.equals(tenantId.replaceAll("[^A-Za-z_0-9]+", ""))) { messages.add(MSG.INVALID_TENANTID); } TenantVO tenantVO = new TenantVO(tenantId, description); Integer iTenantId; if (remoteTenantDAO.exists(signedInOperatorId, tenantId)) { messages.add(MSG.REMOTE_TENANT_EXISTS); } if (messages.size() > 0) { return MessageBlock.create(mav, messages, REGISTER_TENANT, MSG.ERROR); } else { synchronized (this) { try { iTenantId = tenantService.insertTenantWithTypes(tenantVO, null); } catch (Exception e) { return MessageBlock.createSingle(mav, MSG.TENANT_AUTHENTICATION_FAILED, REGISTER_TENANT, MSG.ERROR); } remoteTenantDAO.update(signedInOperatorId, iTenantId, url, description); // enable auto archive function // by default actions older than 5 years are moved // to the archive tenantService.updateConfigProperty(iTenantId, RemoteTenant.AUTO_ARCHIVER_ENABLED, "true"); tenantService.updateConfigProperty(iTenantId, RemoteTenant.AUTO_ARCHIVER_TIME_RANGE, RemoteTenant.AUTO_ARCHIVER_DEFAULT_TIME_RANGE); // enable backtracking by default tenantService.updateConfigProperty(iTenantId, RemoteTenant.BACKTRACKING, "true"); // enable auto rule mining by default tenantService.updateConfigProperty(iTenantId, RemoteTenant.SCHEDULER_ENABLED, "true"); tenantService.updateConfigProperty(iTenantId, RemoteTenant.SCHEDULER_EXECUTION_TIME, RemoteTenant.SCHEDULER_DEFAULT_EXECUTION_TIME); pluginScheduler.addTask(remoteTenantDAO.get(iTenantId)); if (RemoteTenant.DEFAULT_TENANT_ID.equals(tenantId)) // create default items and rules for "EASYREC_DEMO" namedConfigurationService.setupDefaultTenant(iTenantId, request.getRemoteAddr()); else // create configuration for ARM plugin for buy, view, rate actions namedConfigurationService.setupDefaultConfiguration(iTenantId); } messages.add(MSG.TENANT_REGISTERED.append(" (" + iTenantId + "@" + url + ")")); return MessageBlock.create(mav, messages, REGISTER_TENANT, MSG.SUCCESS); } } public ModelAndView update(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, UPDATE_TENANT, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } if (remoteTenant == null) { messages.add(MSG.TENANT_NOT_EXISTS); } if (!Web.isValidUrl(url) || url.equalsIgnoreCase("http://localhost/")) { messages.add(MSG.NO_VALID_URL); } if (messages.size() > 0) { return MessageBlock.create(mav, messages, UPDATE_TENANT, MSG.ERROR); } else { remoteTenantDAO.update(operatorId, remoteTenant.getId(), url, description); itemDAO.emptyCache(); return MessageBlock.createSingle(mav, MSG.TENANT_UPDATED, UPDATE_TENANT, MSG.SUCCESS); } } public ModelAndView view(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_TENANTS, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } if (messages.size() > 0 && !"easyrec".equals(operatorId)) { return MessageBlock.create(mav, messages, VIEW_TENANTS, MSG.ERROR); } else { Security.setAttribute(request, "menu", "tenant"); mav.setViewName("easyrec/overview"); if (Security.signedInOperator(request) != null && remoteTenant != null) { mav.addObject("tenant", remoteTenant); } mav.addObject("tenantsShow", remoteTenant != null); } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } /** * Depending whenever the signed in user is a developer or not, this function allows the operator to impersonate * another operator and returns the corresponding remote tenant. * <p/> * This function was created due historical circumstances. The code was extracted from the Remote Tenant controller where * this code is used very often. Look into this controller tro understand the usage better - sorry * * @param request * @param mav * @param operatorId * @param tenantId * @param url * @param description * @param signedInOperatorId * @param signedInOperator * @param remoteTenant * @return */ private RemoteTenant initializeView(HttpServletRequest request, ModelAndView mav, String operatorId, String tenantId, String url, String description, String signedInOperatorId, Operator signedInOperator, RemoteTenant remoteTenant) { if (signedInOperator != null) { if (Security.isDeveloper(request) && !Strings.isNullOrEmpty(operatorId)) { remoteTenant = remoteTenantDAO.get(operatorId, tenantId); } else { remoteTenant = remoteTenantDAO.get(signedInOperator.getOperatorId(), tenantId); } if (remoteTenant != null) { mav.addObject("remoteTenant", remoteTenant); } } mav.addObject("title", "tenant"); if (Security.isDeveloper(request) && !Strings.isNullOrEmpty(operatorId)) { mav.addObject("operatorId", operatorId); } else { mav.addObject("operatorId", signedInOperatorId); } mav.addObject("tenantId", tenantId); mav.addObject("selectedMenu", "myEasyrec"); mav.addObject("url", url); mav.addObject("description", description); return remoteTenant; } public ModelAndView rulestoitem(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_RULES_TO_ITEM, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } List<ItemAssocVO<String, String>> itemAssocVOs; try { Item item = itemService.get(request); response.setContentType("text/xml; charset=utf-8"); itemAssocVOs = shopRecommenderService.getRules(item); Set<String> assocTypes; String viewType = null; // assocTypes = shopRecommenderService.getAssocTypes(remoteTenant.getId()); assocTypes = assocTypeDAO.getTypes(remoteTenant.getId()); // initializing itemAssocs e.g. // key value // "view" null // "bought" null // "rated" null HashMap<String, List<Assoc>> itemAssocs = new HashMap<String, List<Assoc>>(); for (String string : assocTypes) { itemAssocs.put(string, new ArrayList<Assoc>()); } // filling assoc types with rules for (ItemAssocVO<String, String> itemAssocVO : itemAssocVOs) { // no need to consider rule if for an uninteresting type if (itemAssocs.containsKey(itemAssocVO.getAssocType())) { Item itemFrom = itemDAO.get(remoteTenant, itemAssocVO.getItemFrom().getItem(), itemAssocVO.getItemFrom().getType()); Item itemTo = itemDAO.get(remoteTenant, itemAssocVO.getItemTo().getItem(), itemAssocVO.getItemTo().getType()); if (itemFrom != null && itemTo != null) { String sourceType = itemAssocVO.getSourceType(); try { PluginId pluginId = PluginId.parsePluginId(sourceType); Generator<?, ?> generator = pluginRegistry.getGenerators().get(pluginId); if (generator != null) { sourceType = generator.getDisplayName(); } } catch (IllegalArgumentException ignored) { } Assoc assoc = new Assoc(itemFrom, itemTo, itemAssocVO.getAssocType(), itemAssocVO.getAssocValue(), sourceType, itemAssocVO.getViewType(), itemAssocVO.getSourceInfo()); Integer count = backTrackingDAO.getItemCount(remoteTenant.getId(), idMappingDAO.lookup(itemAssocVO.getItemFrom().getItem()), idMappingDAO.lookup(itemAssocVO.getItemTo().getItem()), assocTypeDAO.getIdOfType(remoteTenant.getId(), itemAssocVO.getAssocType())); itemTo.setValue(count != null ? count.doubleValue() : null); itemAssocs.get(itemAssocVO.getAssocType()).add(assoc); } } } mav.setViewName("easyrec/viewrules"); mav.addObject("assocs", itemAssocs); mav.addObject("tenantId", tenantId); mav.addObject("item", item); } catch (Exception ex) { Logger.getLogger(ItemController.class.getName()).log(Level.SEVERE, null, ex); } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } public ModelAndView statistics(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String responseType = ServletUtils.getSafeParameter(request, "responseType", Web.HTML); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_STATISTICS, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } if (Web.HTML.equals(responseType)) { mav.setViewName("page"); } else { mav.setViewName("xml/statistics"); } Security.setAttribute(request, "menu", "statistics"); mav.addObject("title", "easyrec :: view statistics"); mav.addObject("menubar", VIEW_STATISTICS); mav.addObject("page", "easyrec/viewstatisticsassocs"); mav.addObject("tenantId", tenantId); mav.addObject("tenants", remoteTenantDAO.getTenantsFromOperator(operatorId)); if (remoteTenant != null) { mav.addObject("statAssoc", remoteTenantService.getAssocStatistic(remoteTenant.getId())); mav.addObject("tenantStatistics", remoteTenantService.getTenantStatistics(remoteTenant.getId())); mav.addObject("userStatistics", remoteTenantService.getUserStatistics(remoteTenant.getId())); mav.addObject("conversionStatistics", remoteTenantService.getConversionStatistics(remoteTenant.getId())); mav.addObject("ruleMinerStatistics", remoteTenantService.getRuleMinerStatistics(remoteTenant.getId())); if (remoteTenant.getPluginsEnabled() && (remoteTenant.getGeneratorConfig() != null)) { int assocType = assocTypeDAO.getIdOfType(remoteTenant.getId(), ((GeneratorConfiguration)remoteTenant.getGeneratorConfig()).getAssociationType()); List<LogEntry> logEntries = logEntryDAO.getLogEntriesForTenant(remoteTenant.getId(), assocType, 0, 1); LogEntry entry = logEntries.size() > 0 ? logEntries.get(0) : null; mav.addObject("generatorLog", entry); } // i am sorry for such a code... will be fixed soon if (remoteTenant == null) { // seems like there is no session for this user. messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, REGISTER_TENANT, MSG.ERROR); } // We need to get a full list of ASSOC types before we can create Statistics HashMap<String, Integer> mapping = assocTypeDAO.getMapping(remoteTenant.getId()); Map<String, String> assocTypeToStatistic = Maps.newHashMap(); Map<String, PluginId> assocTypeToPlugin = Maps.newHashMap(); Map<String, String> pluginRealName = Maps.newHashMap(); for (Map.Entry<String, Integer> assocTypeFromTenant : mapping.entrySet()) { // now we can load the last ran log entry from each assoc type. if there is no log the assoc type gets skipped. List<LogEntry> logEntries = logEntryDAO.getLogEntriesForTenant(remoteTenant.getId(), assocTypeFromTenant.getValue(), 0, 1); if (logEntries.size() == 0) continue; // due some problems with the taglib which converts the XML to a table we have to remove the first line which contains // <?xml version="1.0" encoding="UTF-8" standalone="yes"?> // if we don't remove this part from the string the taglib cannot create the HTML table. String xmlString = logEntries.get(0).getStatistics().getXmlRepresentation(); xmlString = xmlString.substring(xmlString.indexOf("?>") + 2); // here we fill our maps with the data for later use in the JSP. PluginId pluginId = logEntries.get(0).getPluginId(); assocTypeToPlugin.put(assocTypeFromTenant.getKey(), pluginId); assocTypeToStatistic.put(assocTypeFromTenant.getKey(), xmlString); Generator<GeneratorConfiguration, GeneratorStatistics> generator = pluginRegistry.getGenerators().get(pluginId); if (generator == null) continue; // avoid null pointer exception when the plugin is uninstalled now. pluginRealName.put(assocTypeFromTenant.getKey(), generator.getDisplayName()); } // as i told you we use this two hash-maps in our JSP mav.addObject("assocTypeToStatistic", assocTypeToStatistic); // this will be transformed to a table in the jsp. mav.addObject("assocTypeToPlugin", assocTypeToPlugin); // this is used to display the help texts mav.addObject("pluginRealName", pluginRealName); // contains human readable names of the plugins mav.addObject("title", "easyrec :: view statistics"); if (Security.isDeveloper(request) && !Strings.isNullOrEmpty(operatorId)) { mav.addObject("operatorId", operatorId); } else { mav.addObject("operatorId", signedInOperatorId); } mav.addObject("tenantId", tenantId); mav.addObject("selectedMenu", "myEasyrec"); mav.addObject("url", url); mav.addObject("description", description); } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } public ModelAndView viewmostvieweditems(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String timerange = ServletUtils.getSafeParameter(request, "timerange", "MONTH"); String assocType = ServletUtils.getSafeParameter(request, "assoc", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_TOP_RANKED_ITEMS, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } Security.setAttribute(request, "menu", "viewmostvieweditems"); mav.setViewName("page"); mav.addObject("menubar", VIEW_TOP_RANKED_ITEMS); mav.addObject("title", "easyrec :: view top ranked items"); mav.addObject("page", "easyrec/viewmostvieweditems"); mav.addObject("tenantId", tenantId); mav.addObject("tenants", remoteTenantDAO.getTenantsFromOperator(operatorId)); if (remoteTenant != null) { if ("mostviewed".equals(assocType) || Strings.isNullOrEmpty(assocType)) { List<Item> items = shopRecommenderService.mostViewedItems(remoteTenant.getId(), null, null, 50, timerange, null, new Session(null, request.getRemoteAddr())); mav.addObject("items", items); } if ("mostbought".equals(assocType)) { List<Item> items = shopRecommenderService.mostBoughtItems(remoteTenant.getId(), null, null, 50, timerange, null, new Session(null, request.getRemoteAddr())); mav.addObject("items", items); } if ("mostrated".equals(assocType)) { List<Item> items = shopRecommenderService.mostRatedItems(remoteTenant.getId(), null, null, 50, timerange, null, new Session(null, request.getRemoteAddr())); mav.addObject("items", items); } if ("bestrated".equals(assocType)) { List<Item> items = shopRecommenderService.bestRatedItems(remoteTenant.getId(), null, null, 50, timerange, null, new Session(null, request.getRemoteAddr())); mav.addObject("items", items); } if ("worstrated".equals(assocType)) { List<Item> items = shopRecommenderService.worstRatedItems(remoteTenant.getId(), null, null, 50, timerange, null, new Session(null, request.getRemoteAddr())); mav.addObject("items", items); } } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } public ModelAndView viewhotrecommendations(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_HOT_RECOMMENDATIONS, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } Security.setAttribute(request, "menu", "viewhotrecommendations"); // the page view provides the design with a side menu and the menu bar mav.setViewName("page"); mav.addObject("title", "easyrec :: view hot recommendations"); mav.addObject("menubar", VIEW_HOT_RECOMMENDATIONS); mav.addObject("page", "easyrec/viewhotrecommendations"); mav.addObject("tenantId", tenantId); mav.addObject("tenants", remoteTenantDAO.getTenantsFromOperator(operatorId)); if (remoteTenant != null) { mav.addObject("items", itemDAO.getHotItems(remoteTenant, 0, 100)); } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } /* * This view is used to start the cluster explorer from the tenant specific Menu bar * It will display a Start Cluster explorer link with a description text of the cluster * explorer. * * the code is a mess - sorry - i had to use the existing code to integrate it to the easyrec */ public ModelAndView clustermanager(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, VIEW_CLUSTER_MANAGER, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } Security.setAttribute(request, "menu", VIEW_CLUSTER_MANAGER); // the page view provides the design with a header and footer mav.setViewName("page"); mav.addObject("title", "easyrec :: cluster manager"); mav.addObject("menubar", VIEW_CLUSTER_MANAGER); mav.addObject("page", "easyrec/clustermanager"); mav.addObject("tenantId", tenantId); mav.addObject("tenants", remoteTenantDAO.getTenantsFromOperator(operatorId)); if (remoteTenant != null) { mav.addObject("items", itemDAO.getHotItems(remoteTenant, 0, 100)); } String apiKey = Operator.DEFAULT_API_KEY; if (signedInOperator != null) { apiKey = signedInOperator.getApiKey(); } mav.addObject("apiKey", apiKey); mav.addObject("signedIn", Security.isSignedIn(request)); return mav; } public ModelAndView refreshstatistics(HttpServletRequest request, HttpServletResponse response) { ModelAndView mav = new ModelAndView(); List<Message> messages = new ArrayList<Message>(); String operatorId = ServletUtils.getSafeParameter(request, "operatorId", ""); String tenantId = ServletUtils.getSafeParameter(request, "tenantId", ""); String url = ServletUtils.getSafeParameter(request, "url", ""); String description = ServletUtils.getSafeParameter(request, "description", ""); String signedInOperatorId = Security.signedInOperatorId(request); Operator signedInOperator = Security.signedInOperator(request); RemoteTenant remoteTenant = null; remoteTenant = initializeView(request, mav, operatorId, tenantId, url, description, signedInOperatorId, signedInOperator, remoteTenant); if (!Security.isSignedIn(request)) { messages.add(MSG.NOT_SIGNED_IN); return MessageBlock.create(mav, messages, REFRESH_STATISTICS, MSG.ERROR); } if (!operatorDAO.exists(operatorId)) { messages.add(MSG.NO_VALID_OPERATOR); } if (remoteTenant != null) { remoteTenantService.updateTenantStatistics(remoteTenant.getId()); } return MessageBlock.createSingle(mav, MSG.OPERATION_SUCCESSFUL, REFRESH_STATISTICS, MSG.SUCCESS); } }