Package com.agiletec.plugins.jpavatar.aps.system.services.avatar

Source Code of com.agiletec.plugins.jpavatar.aps.system.services.avatar.AvatarManager

/*
*
* 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.jpavatar.aps.system.services.avatar;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.baseconfig.ConfigInterface;
import com.agiletec.aps.system.services.user.UserDetails;

import com.agiletec.plugins.jpavatar.aps.system.JpAvatarSystemConstants;
import com.agiletec.plugins.jpavatar.aps.system.services.avatar.parse.AvatarConfigDOM;
import com.agiletec.plugins.jpavatar.aps.system.utils.MD5Util;

import org.entando.entando.aps.system.services.userprofile.IUserProfileManager;
import org.entando.entando.aps.system.services.userprofile.model.IUserProfile;

/**
* @author S.Puddu
*/
@Aspect
public class AvatarManager extends AbstractService implements IAvatarManager {
 
  @Override
  public void init() throws Exception {
    this.loadConfig();
    ApsSystemUtils.getLogger().info(this.getClass().getName() + " : inizialized");
  }
 
  /**
   * Load the XML configuration containing service configuration.
   * @throws ApsSystemException
   */
  private void loadConfig() throws ApsSystemException {
    try {
      ConfigInterface configManager = this.getConfigManager();
      String xml = configManager.getConfigItem(JpAvatarSystemConstants.CONFIG_ITEM);
      if (xml == null) {
        throw new ApsSystemException("Configuration item not present: " + JpAvatarSystemConstants.CONFIG_ITEM);
      }
      AvatarConfigDOM configDOM = new AvatarConfigDOM();
      this.setConfig(configDOM.extractConfig(xml));
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "loadConfigs");
      throw new ApsSystemException("Error on AvatarManager startup", t);
    }
  }

  @Override
  public void updateConfig(AvatarConfig config) throws ApsSystemException {
    try {
      String xml = new AvatarConfigDOM().createConfigXml(config);
      this.getConfigManager().updateConfigItem(JpAvatarSystemConstants.CONFIG_ITEM, xml);
      this.setConfig(config);
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "updateConfig");
      throw new ApsSystemException("Error updating jpavatar config", t);
    }
  }
 
  @Override
  public String getAvatar(String username) throws ApsSystemException {
    return this.getAvatarUrl(username);
  }

  @Override
  public String getAvatarUrl(String username) throws ApsSystemException {
    String url = null;
    try {
      if (this.getConfig().getStyle().equalsIgnoreCase(AvatarConfig.STYLE_LOCAL)) {
        String avatarFileName = null;
        StringBuilder urlBuffer = new StringBuilder();
        String sep = System.getProperty("file.separator");
        urlBuffer.append(this.getConfigManager().getParam(SystemConstants.PAR_RESOURCES_ROOT_URL));
        if (!urlBuffer.toString().endsWith(sep)) {
          urlBuffer.append(sep);
        }
        urlBuffer.append("plugins").append(sep).append("jpavatar").append(sep);
        File avatarResource = this.getAvatarResource(username);
        if (null != avatarResource) {
          avatarFileName = avatarResource.getName();
        }
        if (StringUtils.isNotBlank(avatarFileName)) {
          url = urlBuffer.toString() + "avatar" + sep + avatarFileName;
        } else {
          url = urlBuffer.toString() + JpAvatarSystemConstants.DEFAULT_AVATAR_NAME;
        }
      } else if (this.getConfig().getStyle().equalsIgnoreCase(AvatarConfig.STYLE_GRAVATAR)) {
        url = this.getGravatarUrl() + this.getGravatarHash(username);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getAvatar");
      throw new ApsSystemException("Error getting avatar for user " + username, t);
    }
    return url;
  }
 
  @Override
  public File getAvatarResource(String username) throws ApsSystemException {
    File avatarFile = null;
    try {
      if (StringUtils.isNotBlank(username)) {
        String basePath = this.getAvatarDiskFolder() + AVATAR_SUBFOLDER;
        File dir = new File(basePath);
        String[] files = dir.list(new PrefixFileFilter(username.toLowerCase() + "."));
        if (null != files && files.length > 0) {
          File resFile = new File(basePath + System.getProperty("file.separator") + files[0]);
          if (resFile.exists()) {
            avatarFile = resFile;
          }
        }
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getAvatarResource");
      throw new ApsSystemException("Error getting avatar resource for user " + username, t);
    }
    return avatarFile;
  }
 
  public String getGravatarHash(String username) throws ApsSystemException {
    String hash = null;
    try {
      if (null == username) {
        return null;
      }
      IUserProfile profile = (IUserProfile) this.getUserProfileManager().getProfile(username);
      if (null != profile) {
        String emailAttr = profile.getMailAttributeName();
        if (null == emailAttr) {
          return null;
        }
        String email = (String) profile.getValue(emailAttr);
        if (null != email) {
          hash = MD5Util.md5Hex(email);
        }
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getGravatarHash");
      throw new ApsSystemException("Error getting gravatar hash for user " + username, t);
    }
    return hash;
  }

  @Override
  public void saveAvatar(String username, File file, String filename) throws ApsSystemException {
    try {
      String path = this.createFullDiskPath(username.toLowerCase(), filename);
      if (null == path) {
        ApsSystemUtils.getLogger().warn("Impossible to save avatar for user " + username + " . Wrong filename: " + file.getName());
        return;
      }
      ApsSystemUtils.getLogger().trace("Saving avatar to position: " + path);
      File destFile = new File(path);
      FileUtils.copyFile(file, destFile);
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "saveAvatar");
      throw new ApsSystemException("Error saving avatar for user " + username, t);
    }
  }

  private String createFullDiskPath(String username, String filename) {
    StringBuffer diskFolder = new StringBuffer(this.getAvatarDiskFolder()).append(AVATAR_SUBFOLDER).append(System.getProperty("file.separator"));
    int point = filename.lastIndexOf(".");
    if (point < 1) {
      return null;
    }
    diskFolder.append(username).append(filename.substring(point));
    String path = diskFolder.toString();
    return path;
  }
 
  @Override
  @AfterReturning(pointcut="execution(* com.agiletec.aps.system.services.user.IUserManager.removeUser(..)) && args(key)")
  public void removeAvatar(Object key) throws ApsSystemException {
    String username = null;
    try {
      if (key instanceof String) {
        username = key.toString();
      } else if (key instanceof UserDetails) {
        UserDetails userDetails = (UserDetails) key;
        username = userDetails.getUsername();
      }
      username = username.toLowerCase();
      File fileToDelete = this.getAvatarResource(username);
      if (null != fileToDelete) {
        FileUtils.forceDelete(fileToDelete);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "removeAvatar");
      throw new ApsSystemException("Error deleting avatar for user " + username, t);
    }
  }
 
  public void setAvatarDiskFolder(String avatarDiskFolder) {
    this._avatarDiskFolder = avatarDiskFolder;
  }
 
  @Override
  public String getAvatarDiskFolder() {
    try {
      if (null == this._avatarDiskFolder) {
        this._avatarDiskFolder = this.createAvatarDiskFolderPath(SystemConstants.PAR_RESOURCES_DISK_ROOT, File.separator);
        File dir = new File(this._avatarDiskFolder);
        if (!dir.exists()) {
          FileUtils.forceMkdir(dir);
        }
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getAvatarDiskFolder");
      throw new RuntimeException("Error creating Avatar Disk Folder", t);
    }
    return _avatarDiskFolder;
  }
 
  private String createAvatarDiskFolderPath(String baseParamName, String separator) {
    StringBuilder buffer = new StringBuilder();
    buffer.append(this.getConfigManager().getParam(baseParamName));
    if (!buffer.toString().endsWith(separator)) {
      buffer.append(separator);
    }
    buffer.append("plugins").append(separator).append("jpavatar").append(separator);
    return buffer.toString();
  }

  protected ConfigInterface getConfigManager() {
    return _configManager;
  }
  public void setConfigManager(ConfigInterface configManager) {
    this._configManager = configManager;
  }

  protected IUserProfileManager getUserProfileManager() {
    return _userProfileManager;
  }
  public void setUserProfileManager(IUserProfileManager userProfileManager) {
    this._userProfileManager = userProfileManager;
  }

  protected String getGravatarUrl() {
    return _gravatarUrl;
  }
  public void setGravatarUrl(String gravatarUrl) {
    this._gravatarUrl = gravatarUrl;
  }
 
  @Override
  public AvatarConfig getConfig() {
    return _config;
  }
  public void setConfig(AvatarConfig config) {
    this._config = config;
  }
 
  private String _avatarDiskFolder;
 
  private ConfigInterface _configManager;
  private IUserProfileManager _userProfileManager;
 
  private String _gravatarUrl;
  private AvatarConfig _config;
 
  public static final String AVATAR_SUBFOLDER = "avatar";
 
}
TOP

Related Classes of com.agiletec.plugins.jpavatar.aps.system.services.avatar.AvatarManager

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.