Package com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig

Source Code of com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig.PageUserConfigDAO

/*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
* This file is part of Entando software.
* Entando is a free software;
* You can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions  
* and limitations under the License
*
*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
*/
package com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.entando.entando.aps.system.services.widgettype.IWidgetTypeManager;
import org.entando.entando.aps.system.services.widgettype.WidgetType;

import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.common.AbstractDAO;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.page.IPage;
import com.agiletec.aps.system.services.page.IPageManager;
import com.agiletec.aps.system.services.page.Widget;
import com.agiletec.aps.system.services.pagemodel.IPageModelManager;
import com.agiletec.aps.system.services.pagemodel.PageModel;
import com.agiletec.aps.util.ApsProperties;
import com.agiletec.plugins.jpmyportalplus.aps.system.JpmyportalplusSystemConstants;
import com.agiletec.plugins.jpmyportalplus.aps.system.services.config.model.MyPortalConfig;
import com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig.model.CustomPageConfig;
import com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig.model.PageUserConfigBean;
import com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig.model.WidgetUpdateInfoBean;

/**
* @author E.Santoboni
*/
public class PageUserConfigDAO extends AbstractDAO implements IPageUserConfigDAO {

  @Override
  public void syncCustomization(List<WidgetType> allowedShowlets, String voidShowletCode) {
    Set<String> allowedShowletCodes = this.getAllowedShowletCodes(allowedShowlets);
    Connection conn = null;
    PreparedStatement stat = null;
    ResultSet res = null;
    try {
      conn = this.getConnection();
      stat = conn.prepareStatement(GET_CONFIGURED_SHOWLET_CODE);
      res = stat.executeQuery();
      while (res.next()) {
        String currentCode = res.getString(1);
        WidgetType currentConfiguredShowlet = this.getWidgetTypeManager().getWidgetType(currentCode);
        if (null == currentConfiguredShowlet) {
          ApsSystemUtils.getLogger().info(JpmyportalplusSystemConstants.MYPORTALPLUS_CONFIG_ITEM + ": deleting unknown showlet '"+currentCode+"' from the configuration bean");
          this.purgeConfigurationFromInvalidShowlets(conn, currentCode);
        } else {
          if (!allowedShowletCodes.contains(currentCode) && !currentCode.equals(voidShowletCode)) {
            ApsSystemUtils.getLogger().info(JpmyportalplusSystemConstants.MYPORTALPLUS_CONFIG_ITEM + ": removing the no longer configurable showlet '"+currentCode+"' from the configuration bean");
            this.purgeConfigurationFromInvalidShowlets(conn, currentCode);
          }
        }
      }
    } catch (Throwable t) {
      processDaoException(t, "Error while cleaning the configuration database", "syncCustomization");
    } finally {
      this.closeDaoResources(res, stat, conn);
    }
  }

  private Set<String> getAllowedShowletCodes(List<WidgetType> allowedShowlets) {
    Set<String> codes = new HashSet<String>();
    if (null == allowedShowlets) {
      return codes;
    }
    for (int i = 0; i < allowedShowlets.size(); i++) {
      WidgetType type = allowedShowlets.get(i);
      if (null != type) {
        codes.add(type.getCode());
      }
    }
    return codes;
  }

  private void purgeConfigurationFromInvalidShowlets(Connection conn, String code) throws ApsSystemException {
    PreparedStatement stat = null;
    try {
      stat = conn.prepareStatement(DELETE_USER_CONFIG_BY_SHOWLET_CODE);
      stat.setString(1, code);
      stat.execute();
    } catch (Throwable t) {
      throw new ApsSystemException("ERROR: could not remove invalid showlets from the customization database",t);
    } finally {
      closeDaoResources(null, stat);
    }
  }

  @Override
  public List<WidgetType> buildCustomizableShowletsList(MyPortalConfig config) {
    List<WidgetType> result = new ArrayList<WidgetType>();
    List<WidgetType> allShowlets = null;
    if (null == config) {
      return result;
    }
    allShowlets = this.getWidgetTypeManager().getWidgetTypes();
    if (null != allShowlets) {
      Set<String> allowedShowletsCode = config.getAllowedShowlets();
      if (allowedShowletsCode != null && allowedShowletsCode.size() > 0) {
        for (WidgetType currentType : allShowlets) {
          if (allowedShowletsCode.contains(currentType.getCode())) {
            result.add(currentType);
          }
        }
      }
    }
    return result;
  }

  @Override
  public void updateUserPageConfig(String username, IPage page, WidgetUpdateInfoBean[] updateInfos) {
    Connection conn = null;
    try {
      conn = this.getConnection();
      conn.setAutoCommit(false);
      this.deleteUserConfig(username, page, updateInfos, conn);
      this.addUserConfig(username, page, updateInfos, conn);
      conn.commit();
    } catch (Throwable t) {
      this.executeRollback(conn);
      processDaoException(t, "Error while updating user config", "updateUserPageConfig");
    } finally {
      this.closeConnection(conn);
    }
  }

  protected void deleteUserConfig(String username, IPage page, WidgetUpdateInfoBean[] updateInfos, Connection conn) {
    PreparedStatement stat = null;
    try {
      stat = conn.prepareStatement(DELETE_PAGE_USER_CONFIG);
      for (int i = 0; i < updateInfos.length; i++) {
        WidgetUpdateInfoBean infoBean = updateInfos[i];
        stat.setString(1, username);
        stat.setString(2, page.getCode());
        stat.setInt(3, infoBean.getFramePos());
        stat.addBatch();
        stat.clearParameters();
      }
      stat.executeBatch();
    } catch (Throwable t) {
      processDaoException(t, "Error while deleting a user config record", "deleteUserConfig");
    } finally {
      closeDaoResources(null, stat);
    }
  }

  protected void addUserConfig(String username, IPage page, WidgetUpdateInfoBean[] updateInfos, Connection conn) {
    PreparedStatement stat = null;
    try {
      stat = conn.prepareStatement(ADD_USER_CONFIG);
      for (int i = 0; i < updateInfos.length; i++) {
        WidgetUpdateInfoBean infoBean = updateInfos[i];
        stat.setString(1, username);
        stat.setString(2, page.getCode());
        stat.setInt(3, infoBean.getFramePos());
        stat.setString(4, infoBean.getShowlet().getType().getCode());
        stat.setNull(5, java.sql.Types.CHAR);
        stat.setInt(6, infoBean.getStatus());
        stat.addBatch();
        stat.clearParameters();
      }
      stat.executeBatch();
    } catch (Throwable t) {
      processDaoException(t, "Error while adding a user config record", "addUserConfig");
    } finally {
      closeDaoResources(null, stat);
    }
  }

  @Override
  public PageUserConfigBean getUserConfig(String username) {
    Connection conn = null;
    PageUserConfigBean result = null;
    PreparedStatement stat = null;
    ResultSet res = null;
    try {
      conn = this.getConnection();
      stat = conn.prepareStatement(GET_USER_CONFIG);
      stat.setString(1, username);
      res = stat.executeQuery();
      result = this.createPageUserConfigBeanFromResultSet(username, res);
    } catch (Throwable t) {
      processDaoException(t, "Error while saving user customization", "getUserConfig");
    } finally {
      closeDaoResources(res, stat, conn);
    }
    return result;
  }

  private int getPageModelframe(String pageCode) throws ApsSystemException {
    PageModel current = this.getPageManager().getPage(pageCode).getModel();
    try {
      return current.getFrames().length;
    } catch (Throwable t) {
      throw new ApsSystemException("ERROR: unknown page code '" + pageCode + "'");
    }
  }

  /**
   * Create a showlet with a given code and optional configuration.
   * @param widgetcode the code of the showlet
   * @param config the configuration for the current showlet
   * @return a new object with the given code and configuration
   * @throws ApsSystemException if the given code is unknown or faulting XML configuration
   */
  private Widget createShowletFromRecord(String widgetcode, String config) throws ApsSystemException {
    Widget newShowlet = new Widget();
    WidgetType inheritedType = this.getWidgetTypeManager().getWidgetType(widgetcode);
    newShowlet.setType(inheritedType);
    ApsProperties properties = null;
    newShowlet.setConfig(properties);
    return newShowlet;
  }

  private PageUserConfigBean createPageUserConfigBeanFromResultSet(String username, ResultSet res) {
    PageUserConfigBean pageUserBean = new PageUserConfigBean(username);
    try {
      while (res.next()) {
        String currentPageCode = res.getString(1);
        CustomPageConfig pageConfig = pageUserBean.getConfig().get(currentPageCode);
        if (null == pageConfig) {
          int frames = this.getPageModelframe(currentPageCode);
          pageConfig = new CustomPageConfig(currentPageCode, frames);
          pageUserBean.getConfig().put(currentPageCode, pageConfig);
        }
        int currentFramePos = res.getInt(2);
        if (currentFramePos >= pageConfig.getConfig().length) {
          ApsSystemUtils.getLogger().error("Posizione " + currentFramePos + " incompatibile con pagina '" + currentPageCode + "' " +
              "- utente " + username);
          continue;
        }
        String currentShowletCode = res.getString(3);
        String currentConfig = res.getString(4);
        Widget showlet = this.createShowletFromRecord(currentShowletCode, currentConfig);
        pageConfig.getConfig()[currentFramePos] = showlet;
        int status = res.getInt(5);
        pageConfig.getStatus()[currentFramePos] = status;
      }
    } catch (Throwable t) {
      this.processDaoException(t, "Error while parsing the result set", "createPageUserConfigBeanFromResultSet");
    }
    return pageUserBean;
  }

  @Override
  public void removeUserPageConfig(String username, String pageCode, Integer framePosition) {
    Connection conn = null;
    PreparedStatement stat = null;
    try {
      String query = (null == username) ? DELETE_PAGE_CONFIGS : DELETE_PAGE_USER_CONFIGS;
      if (null != framePosition) {
        query += " AND framepos = ?";
      }
      conn = this.getConnection();
      conn.setAutoCommit(false);
      stat = conn.prepareStatement(query);
      int index = 0;
      if (null != username) {
        stat.setString(++index, username);
      }
      stat.setString(++index, pageCode);
      if (null != framePosition) {
        stat.setInt(++index, framePosition);
      }
      stat.execute();
      conn.commit();
    } catch (Throwable t) {
      this.executeRollback(conn);
      processDaoException(t, "Error while updating user configs", "removeUserPageConfig");
    } finally {
      closeDaoResources(null, stat, conn);
    }
  }

  @Override
  public void removeUnauthorizedShowlet(String username, String showletCode) {
    Connection conn = null;
    PreparedStatement stat = null;
    try {
      conn = this.getConnection();
      conn.setAutoCommit(false);
      stat = conn.prepareStatement(DELETE_UNAUTHORIZATED_SHOWLETS);
      stat.setString(1, username);
      stat.setString(2, showletCode);
      stat.execute();
      conn.commit();
    } catch (Throwable t) {
      this.executeRollback(conn);
      processDaoException(t, "Error while removing unauthorized showlet", "removeUnauthorizedShowlet");
    } finally {
      closeDaoResources(null, stat, conn);
    }
  }

  protected IPageManager getPageManager() {
    return _pageManager;
  }
  public void setPageManager(IPageManager pageManager) {
    this._pageManager = pageManager;
  }

  protected IPageModelManager getPageModelManager() {
    return _pageModelManager;
  }
  public void setPageModelManager(IPageModelManager pageModelManager) {
    this._pageModelManager = pageModelManager;
  }

  public IWidgetTypeManager getWidgetTypeManager() {
    return _widgetTypeManager;
  }

  public void setWidgetTypeManager(IWidgetTypeManager widgetTypeManager) {
    this._widgetTypeManager = widgetTypeManager;
  }

  private IPageManager _pageManager;
  private IPageModelManager _pageModelManager;

  private IWidgetTypeManager _widgetTypeManager;

  private final String ADD_USER_CONFIG =
    "INSERT INTO jpmyportalplus_userpageconfig (username, pagecode, framepos, widgetcode, config, closed) VALUES (?, ?, ?, ?, ?, ?)";

  private final String DELETE_PAGE_USER_CONFIG =
    "DELETE FROM jpmyportalplus_userpageconfig WHERE username = ? AND pagecode = ? AND framepos = ?";

  private final String DELETE_PAGE_CONFIGS =
    "DELETE FROM jpmyportalplus_userpageconfig WHERE pagecode = ? ";

  private final String DELETE_PAGE_USER_CONFIGS =
    "DELETE FROM jpmyportalplus_userpageconfig WHERE username = ? AND pagecode = ? ";

  private final String GET_USER_CONFIG =
    "SELECT pagecode, framepos, widgetcode, config, closed FROM jpmyportalplus_userpageconfig WHERE username = ? ORDER BY pagecode";

  private final String GET_CONFIGURED_SHOWLET_CODE =
    "SELECT widgetcode FROM jpmyportalplus_userpageconfig GROUP BY widgetcode";

  private final String DELETE_USER_CONFIG_BY_SHOWLET_CODE =
    "DELETE FROM jpmyportalplus_userpageconfig WHERE widgetcode = ? ";

  private final String DELETE_UNAUTHORIZATED_SHOWLETS =
      "DELETE FROM jpmyportalplus_userpageconfig WHERE username = ? AND widgetcode = ? ";

}
TOP

Related Classes of com.agiletec.plugins.jpmyportalplus.aps.system.services.userconfig.PageUserConfigDAO

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.