Package org.projectforge.ldap

Source Code of org.projectforge.ldap.GroupDOConverter

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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 org.projectforge.ldap;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.SetUtils;
import org.apache.commons.lang.StringUtils;
import org.projectforge.common.BeanHelper;
import org.projectforge.common.ListHelper;
import org.projectforge.common.NumberHelper;
import org.projectforge.core.ConfigXml;
import org.projectforge.registry.Registry;
import org.projectforge.user.GroupDO;
import org.projectforge.user.PFUserDO;
import org.projectforge.xml.stream.XmlObjectReader;
import org.projectforge.xml.stream.XmlObjectWriter;

/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class GroupDOConverter
{
  private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(GroupDOConverter.class);

  static final String ID_PREFIX = "pf-id-";

  public static Integer getId(final LdapGroup group)
  {
    final String businessCategory = group.getBusinessCategory();
    if (businessCategory != null && businessCategory.startsWith(ID_PREFIX) == true && businessCategory.length() > ID_PREFIX.length()) {
      final String id = businessCategory.substring(ID_PREFIX.length());
      return NumberHelper.parseInteger(id);
    }
    return null;
  }

  public static GroupDO convert(final LdapGroup ldapGroup)
  {
    final GroupDO group = new GroupDO();
    group.setId(getId(ldapGroup));
    group.setName(ldapGroup.getCommonName());
    group.setOrganization(ldapGroup.getOrganization());
    group.setDescription(ldapGroup.getDescription());
    if (isPosixAccountValuesEmpty(ldapGroup) == false) {
      group.setLdapValues(getLdapValuesAsXml(ldapGroup));
    }
    return group;
  }

  public static LdapGroup convert(final GroupDO pfGroup, final String baseDN, final Map<Integer, LdapUser> ldapUserMap)
  {
    final LdapGroup ldapGroup = new LdapGroup();
    if (pfGroup.getId() != null) {
      ldapGroup.setBusinessCategory(buildBusinessCategory(pfGroup));
    }
    ldapGroup.setCommonName(pfGroup.getName());
    ldapGroup.setOrganization(pfGroup.getOrganization());
    ldapGroup.setDescription(pfGroup.getDescription());
    if (pfGroup.getAssignedUsers() != null) {
      for (final PFUserDO user : pfGroup.getAssignedUsers()) {
        if (user.isDeactivated() == true || user.isDeleted() == true) {
          // Do not add deleted or deactivated users.
          continue;
        }
        final LdapUser ldapUser = ldapUserMap.get(user.getId());
        if (ldapUser != null) {
          ldapGroup.addMember(ldapUser, baseDN);
        } else {
          final PFUserDO cacheUser = Registry.instance().getUserGroupCache().getUser(user.getId());
          if (cacheUser == null || cacheUser.isDeleted() == false) {
            log.warn("LDAP user with id '"
                + user.getId()
                + "' not found in given ldapUserMap. User will be ignored in group '"
                + pfGroup.getName()
                + "'.");
          }
        }
      }
    }
    setLdapValues(ldapGroup, pfGroup.getLdapValues());
    return ldapGroup;
  }

  public static boolean isPosixAccountValuesEmpty(final LdapGroup ldapGroup)
  {
    return ldapGroup.getGidNumber() == null;
  }

  /**
   * Sets the LDAP values such as posix account properties of the given ldapGroup configured in the given xml string.
   * @param ldapGroup
   * @param ldapValuesAsXml Posix account values as xml.
   */
  public static void setLdapValues(final LdapGroup ldapGroup, final String ldapValuesAsXml)
  {
    if (StringUtils.isBlank(ldapValuesAsXml) == true) {
      return;
    }
    final LdapConfig ldapConfig = ConfigXml.getInstance().getLdapConfig();
    final LdapPosixAccountsConfig posixAccountsConfig = ldapConfig != null ? ldapConfig.getPosixAccountsConfig() : null;
    if (posixAccountsConfig == null) {
      // No posix account default values configured
      return;
    }
    final LdapGroupValues values = readLdapGroupValues(ldapValuesAsXml);
    if (values == null) {
      return;
    }
    if (values.getGidNumber() != null) {
      ldapGroup.setGidNumber(values.getGidNumber());
    } else {
      ldapGroup.setGidNumber(-1);
    }
  }

  public static LdapGroupValues readLdapGroupValues(final String ldapValuesAsXml)
  {
    if (StringUtils.isBlank(ldapValuesAsXml) == true) {
      return null;
    }
    final XmlObjectReader reader = new XmlObjectReader();
    reader.initialize(LdapGroupValues.class);
    final LdapGroupValues values = (LdapGroupValues) reader.read(ldapValuesAsXml);
    return values;
  }

  /**
   * Exports the LDAP values such as posix account properties of the given ldapGroup as xml string.
   * @param ldapGroup
   */
  public static String getLdapValuesAsXml(final LdapGroup ldapGroup)
  {
    final LdapConfig ldapConfig = ConfigXml.getInstance().getLdapConfig();
    final LdapPosixAccountsConfig posixAccountsConfig = ldapConfig != null ? ldapConfig.getPosixAccountsConfig() : null;
    LdapGroupValues values = null;
    if (posixAccountsConfig != null) {
      values = new LdapGroupValues();
      if (ldapGroup.getGidNumber() != null) {
        values.setGidNumber(ldapGroup.getGidNumber());
      }
    }
    return getLdapValuesAsXml(values);
  }

  /**
   * Exports the LDAP values such as posix account properties of the given ldapGroup as xml string.
   * @param values
   */
  public static String getLdapValuesAsXml(final LdapGroupValues values)
  {
    final XmlObjectReader reader = new XmlObjectReader();
    reader.initialize(LdapGroupValues.class);
    final String xml = XmlObjectWriter.writeAsXml(values);
    return xml;
  }


  public static String buildBusinessCategory(final GroupDO group)
  {
    return ID_PREFIX + group.getId();
  }

  /**
   * Copies the fields shared with ldap.
   * @param src
   * @param dest
   * @return true if any modification is detected, otherwise false.
   */
  public static boolean copyGroupFields(final GroupDO src, final GroupDO dest)
  {
    final boolean modified = BeanHelper.copyProperties(src, dest, true, "name", "organization", "description");
    return modified;
  }

  /**
   * Copies the fields.
   * @param src
   * @param dest
   * @return true if any modification is detected, otherwise false.
   */
  public static boolean copyGroupFields(final LdapGroup src, final LdapGroup dest)
  {
    boolean modified;
    final List<String> properties = new LinkedList<String>();
    ListHelper.addAll(properties, "description", "organization");
    if (LdapUserDao.isPosixAccountsConfigured() == true && isPosixAccountValuesEmpty(src) == false) {
      ListHelper.addAll(properties, "gidNumber");
    }
    modified = BeanHelper.copyProperties(src, dest, true, properties.toArray(new String[0]));
    // Checks if the sets aren't equal:
    if (SetUtils.isEqualSet(src.getMembers(), dest.getMembers()) == false) {
      if (LdapGroupDao.hasMembers(src) == true || LdapGroupDao.hasMembers(dest) == true) {
        // If both, src and dest have no members, then do nothing, otherwise:
        modified = true;
        dest.clearMembers();
        dest.addAllMembers(src.getMembers());
      }
    }
    return modified;
  }
}
TOP

Related Classes of org.projectforge.ldap.GroupDOConverter

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.