Example usage for org.apache.commons.collections CollectionUtils union

List of usage examples for org.apache.commons.collections CollectionUtils union

Introduction

In this page you can find the example usage for org.apache.commons.collections CollectionUtils union.

Prototype

public static Collection union(final Collection a, final Collection b) 

Source Link

Document

Returns a Collection containing the union of the given Collection s.

Usage

From source file:com.adaptris.core.runtime.RetryMessageErrorHandlerMonitorTest.java

private void registerMBeans(AdapterManager mgr) throws Exception {
    register(CollectionUtils.union(Arrays.asList(new BaseComponentMBean[] { mgr }), mgr.getAllDescendants()));
}

From source file:net.sf.jdmf.algorithms.association.AprioriAlgorithm.java

/**
 * Finds k-item sets based on (k - 1)-item sets.
 *///from w w  w .ja  v a  2 s  .  co m
@SuppressWarnings("unchecked")
protected List<Set<Item>> findCurrentItemSets(List<Set<Item>> previousItemSets, List<Instance> instances) {
    List<Set<Item>> currentItemSets = new ArrayList<Set<Item>>();

    while (previousItemSets.size() > 1) {
        Set<Item> firstItemSet = null;

        Iterator<Set<Item>> itemSetsIterator = previousItemSets.iterator();

        while (itemSetsIterator.hasNext()) {
            Set<Item> itemSet = itemSetsIterator.next();

            if (firstItemSet != null) {
                Set<Item> currentItemSet = new LinkedHashSet<Item>();
                currentItemSet.addAll(CollectionUtils.union(firstItemSet, itemSet));

                if ((calculateCoverage(currentItemSet, instances) >= minRuleCoverage)
                        && (currentItemSets.contains(currentItemSet) == false)) {
                    currentItemSets.add(currentItemSet);
                }
            } else {
                firstItemSet = itemSet;
            }
        }

        previousItemSets.remove(firstItemSet);
    }

    return currentItemSets;
}

From source file:com.yahoo.elide.graphql.ModelBuilder.java

/**
 * Builds a GraphQL schema./*w w w .j  ava2s . c  o  m*/
 * @return The built schema.
 */
public GraphQLSchema build() {
    Set<Class<?>> allClasses = dictionary.getBindings();

    if (allClasses.isEmpty()) {
        throw new IllegalArgumentException("None of the provided classes are exported by Elide");
    }

    Set<Class<?>> rootClasses = allClasses.stream().filter(dictionary::isRoot).collect(Collectors.toSet());

    /*
     * Walk the object graph (avoiding cycles) and construct the GraphQL input object types.
     */
    dictionary.walkEntityGraph(rootClasses, this::buildInputObjectStub);
    resolveInputObjectRelationships();

    /* Construct root object */
    GraphQLObjectType.Builder root = newObject().name("__root");
    for (Class<?> clazz : rootClasses) {
        String entityName = dictionary.getJsonAliasFor(clazz);
        root.field(newFieldDefinition().name(entityName).dataFetcher(dataFetcher).argument(relationshipOpArg)
                .argument(idArgument).argument(filterArgument).argument(sortArgument)
                .argument(pageFirstArgument).argument(pageOffsetArgument)
                .argument(buildInputObjectArgument(clazz, true)).type(buildConnectionObject(clazz)));
    }

    GraphQLObjectType queryRoot = root.build();
    GraphQLObjectType mutationRoot = root.name("__mutation_root").build();

    /*
     * Walk the object graph (avoiding cycles) and construct the GraphQL output object types.
     */
    dictionary.walkEntityGraph(rootClasses, this::buildConnectionObject);

    /* Construct the schema */
    GraphQLSchema schema = GraphQLSchema.newSchema().query(queryRoot).mutation(mutationRoot)
            .build(new HashSet<>(
                    CollectionUtils.union(connectionObjectRegistry.values(), inputObjectRegistry.values())));

    return schema;
}

From source file:com.silverwrist.dynamo.security.AclObject.java

public Enumeration getPermissions(Principal user) {
    PrincipalID prid = new PrincipalID(user);
    Collection rc = null;/*from   ww w . jav  a2  s  .  co m*/
    try { // is this for a user or a group?
        if (prid.isGroup()) { // compute permissions only for the group itself
            // (everything that appears in positive set but not in negative set)
            Set positive = m_ops.getGroupPermissionSetForGroup(m_aclid, prid.getID(), false);
            Set negative = m_ops.getGroupPermissionSetForGroup(m_aclid, prid.getID(), true);
            rc = CollectionUtils.subtract(positive, negative);

        } // end if
        else { // compute permissions for the user and for all groups of which the user is a member
            Set pos_group = m_ops.getGroupPermissionSetForUser(m_aclid, prid.getID(), false);
            Set neg_group = m_ops.getGroupPermissionSetForUser(m_aclid, prid.getID(), true);
            Set pos_user = m_ops.getUserPermissionSet(m_aclid, prid.getID(), false);
            Set neg_user = m_ops.getUserPermissionSet(m_aclid, prid.getID(), true);
            // "Real" groups have been normalized by removing all elements present in the corresponding
            // "other" group as well
            Collection real_pos_group = CollectionUtils.subtract(pos_group, neg_group);
            Collection real_neg_group = CollectionUtils.subtract(neg_group, pos_group);
            Collection real_pos_user = CollectionUtils.subtract(pos_user, neg_user);
            Collection real_neg_user = CollectionUtils.subtract(neg_user, pos_user);
            // "grant_group" = all permissions granted by the groups and not explicitly denied by user
            Collection grant_group = CollectionUtils.subtract(real_pos_group, real_neg_user);
            // "deny_group" = all permissions denied by the groups and not explicitly granted by user
            Collection deny_group = CollectionUtils.subtract(real_neg_group, real_pos_user);
            // "grant" - all grants from user plus all surviving grants from groups
            Collection grant = CollectionUtils.union(real_pos_user, grant_group);
            // "deny" - all denies from user plus all surviving denies from groups
            Collection deny = CollectionUtils.union(real_neg_user, deny_group);
            rc = CollectionUtils.subtract(grant, deny);

        } // end else

    } // end try
    catch (DatabaseException e) { // translate this into a SecurityRuntimeException
        throw new SecurityRuntimeException(e);

    } // end catch

    // Compute the proper return value.
    if (rc.isEmpty())
        return Collections.enumeration(Collections.EMPTY_LIST);
    ArrayList real_rc = new ArrayList(rc.size());
    Iterator it = rc.iterator();
    while (it.hasNext()) { // transform PropertyKey values into PermObjects
        PropertyKey pk = (PropertyKey) (it.next());
        real_rc.add(new PermObject(pk, m_ns_cache));

    } // end while

    return Collections.enumeration(real_rc);

}

From source file:com.wingnest.play2.origami.plugin.OrigamiPlugin.java

private void registerGraphClasses() {
    final OGraphDatabase db = GraphDB.open();
    try {/* ww w.  j  a v a 2s .  co  m*/
        debug("Registering Graph Classes");

        final Set<Class<GraphVertexModel>> vertexClasses = new HashSet<Class<GraphVertexModel>>();
        final Set<Class<GraphEdgeModel>> edgeClasses = new HashSet<Class<GraphEdgeModel>>();

        for (String pkg : models) {
            vertexClasses.addAll(getSubTypesOf(pkg, GraphVertexModel.class));
            edgeClasses.addAll(getSubTypesOf(pkg, GraphEdgeModel.class));
        }

        @SuppressWarnings("unchecked")
        final Collection<Class<?>> javaClasses = CollectionUtils.union(vertexClasses, edgeClasses);

        final Class<?>[] javaClassArray = javaClasses.toArray(new Class<?>[0]);
        Arrays.sort(javaClassArray, new Comparator<Class<?>>() {
            @Override
            public int compare(Class<?> o1, Class<?> o2) {
                if (o1.equals(o2))
                    return 0;
                if (o1.isAssignableFrom(o2))
                    return -1;
                if (o2.isAssignableFrom(o1))
                    return 1;
                int o1cnt = calSuperclassCount(o1);
                int o2cnt = calSuperclassCount(o2);
                return (o1cnt - o2cnt);
            }
        });

        javaClasses.clear();
        javaClasses.addAll(Arrays.asList(javaClassArray));

        final OSchema schema = db.getMetadata().getSchema();
        for (final Class<?> javaClass : javaClasses) {
            final String entityName = javaClass.getSimpleName();
            final OClass oClass;
            if (GraphVertexModel.class.isAssignableFrom(javaClass)) {
                final String className = javaClass.getSimpleName();
                debug("Entity: %s", className);
                if (schema.existsClass(className)) {
                    oClass = schema.getClass(className);
                } else {
                    oClass = db.createVertexType(className);
                }
                graphEntityMap.put(className, javaClass);
                final Class<?> sclass = javaClass.getSuperclass();
                if (javaClasses.contains(sclass)) {
                    final OClass sClass = db.getMetadata().getSchema().getClass(sclass.getSimpleName());
                    db.getMetadata().getSchema().getClass(entityName).setSuperClass(sClass);
                }
            } else if (GraphEdgeModel.class.isAssignableFrom(javaClass)) {
                final String className = javaClass.getSimpleName();
                debug("Entity: %s", className);
                if (schema.existsClass(className)) {
                    oClass = schema.getClass(className);
                } else {
                    oClass = db.createEdgeType(className);
                }
                graphEntityMap.put(className, javaClass);
                final Class<?> sclass = javaClass.getSuperclass();
                if (javaClasses.contains(sclass)) {
                    final OClass sClass = db.getMetadata().getSchema().getClass(sclass.getSimpleName());
                    db.getMetadata().getSchema().getClass(entityName).setSuperClass(sClass);
                }
            } else {
                throw new IllegalStateException("bug!?");
            }
            maintainProperties(oClass, javaClass);
        }
        debug("Registering Database Listeners");
        for (final Class<? extends ODatabaseListener> listener : getSubTypesOf("listeners",
                ODatabaseListener.class)) {
            debug("Listener: %s", listener.getName());
            GraphDB.getListeners().add(listener);
        }
        debug("Registering Record Hooks");
        for (final Class<? extends ORecordHook> hook : getSubTypesOf("hooks", ORecordHook.class)) {
            debug("Hook: %s", hook.getName());
            GraphDB.getGraphHooks().add(hook);
        }
    } catch (Exception e) {
        throw new OrigamiUnexpectedException(e);
    } finally {
        db.close();
    }
}

From source file:edu.uci.ics.jung.utils.GraphUtils.java

/**
 * Returns a graph which consists of the union of the two input graphs.
 * Assumes that both graphs are of a type that can accept the vertices
 * and edges found in both graphs.//from   w  ww.jav  a2  s .  c  o  m
 * The resultant graph contains all constraints that are common to both graphs.
 */
public static ArchetypeGraph union(ArchetypeGraph g1, ArchetypeGraph g2) {
    ArchetypeGraph g = g1.newInstance();
    //        g.getEdgeConstraints().clear();
    g.getEdgeConstraints()
            .addAll(CollectionUtils.intersection(g1.getEdgeConstraints(), g2.getEdgeConstraints()));

    Collection vertices = CollectionUtils.union(g1.getVertices(), g2.getVertices());
    Collection edges = CollectionUtils.union(g1.getEdges(), g2.getEdges());

    for (Iterator v_iter = vertices.iterator(); v_iter.hasNext();) {
        ArchetypeVertex v = (ArchetypeVertex) v_iter.next();
        v.copy(g);
    }

    for (Iterator e_iter = edges.iterator(); e_iter.hasNext();) {
        ArchetypeEdge e = (ArchetypeEdge) e_iter.next();
        e.copy(g);
    }
    return g;
}

From source file:com.perceptive.epm.perkolcentral.bl.EmployeeBL.java

@TriggersRemove(cacheName = { "EmployeeCache", "GroupCache",
        "EmployeeKeyedByGroupCache" }, when = When.AFTER_METHOD_INVOCATION, removeAll = true, keyGenerator = @KeyGenerator(name = "HashCodeCacheKeyGenerator", properties = @Property(name = "includeMethod", value = "false")))
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = ExceptionWrapper.class)
public void updateAllEmployee(List<EmployeeBO> employeeListFromLDAP) throws ExceptionWrapper {
    try {//w  w  w . j a v  a 2 s  . c om
        String messageTemplateAdded = "<html>\n" + "<head>\n" + "</head>\n" + "\n"
                + "<body style=\"font:Georgia; font-size:12px;\">\n" + "<p>Dear All,</p>\n" + "<blockquote>\n"
                + "  <p>A new user is added to the system.</p>\n" + "</blockquote>\n" + "<ul>\n"
                + "  <li><strong><em>User Name</em></strong>: <strong>%s</strong></li>\n"
                + "  <li><em><strong>User Short Id</strong></em>: <strong>%s</strong></li>\n"
                + "  <li><em><strong>Employee Id</strong></em>: <strong>%s</strong></li>\n"
                + "  <li><strong><em>User Email-Id</em></strong>:<strong> %s</strong></li>\n"
                + "  <li><em><strong>Mobile Number</strong></em>:<strong> %s</strong></li>\n"
                + "  <li><em><strong>Job Title</strong></em> : <strong>%s</strong></li>\n" + "</ul>\n"
                + "<p>Please take necessary actions.</p>\n" + "<p>Thanks,</p>\n" + "<blockquote>\n"
                + "  <p>Perceptive Kolkata Central</p>\n" + "</blockquote>\n" + "</body>\n" + "</html>";

        String messageTemplateDeleted = "<html>\n" + "<head>\n" + "</head>\n" + "\n"
                + "<body style=\"font:Georgia; font-size:12px;\">\n" + "<p>Dear All,</p>\n" + "<blockquote>\n"
                + "  <p>An  user is removed from the system.</p>\n" + "</blockquote>\n" + "<ul>\n"
                + "  <li><strong><em>User Name</em></strong>: <strong>%s</strong></li>\n"
                + "  <li><em><strong>User Short Id</strong></em>: <strong>%s</strong></li>\n"
                + "  <li><em><strong>Employee Id</strong></em>: <strong>%s</strong></li>\n"
                + "  <li><strong><em>User Email-Id</em></strong>:<strong> %s</strong></li>\n"
                + "  <li><em><strong>Mobile Number</strong></em>:<strong> %s</strong></li>\n"
                + "  <li><em><strong>Job Title</strong></em> : <strong>%s</strong></li>\n" + "</ul>\n"
                + "<p>Please take necessary actions.</p>\n" + "<p>Thanks,</p>\n" + "<blockquote>\n"
                + "  <p>Perceptive Kolkata Central</p>\n" + "</blockquote>\n" + "</body>\n" + "</html>";

        LinkedHashMap<Long, EmployeeBO> employeeLinkedHashMap = employeeDataAccessor.getAllEmployees();
        for (EmployeeBO employeeBO : employeeListFromLDAP) {
            if (!employeeLinkedHashMap.containsKey(Long.valueOf(employeeBO.getEmployeeId()))) {
                //Add a new employee
                Employee employee = new Employee();
                employee.setEmployeeId(Long.parseLong(employeeBO.getEmployeeId()));
                employee.setEmail(employeeBO.getEmail());
                employee.setEmployeeName(employeeBO.getEmployeeName());
                employee.setEmployeeUid(employeeBO.getEmployeeUid());
                employee.setJobTitle(employeeBO.getJobTitle());
                employee.setMobileNumber(employeeBO.getMobileNumber());
                employee.setManager(employeeBO.getManager());
                employee.setManagerEmail(employeeBO.getManagerEmail());
                employee.setExtensionNum(employeeBO.getExtensionNum());
                employee.setWorkspace(employeeBO.getWorkspace());
                employee.setIsActive(true);
                employeeDataAccessor.addEmployee(employee);
                LoggingHelpUtil.printDebug(String.format("Adding user ----> %s with details %s %s",
                        employeeBO.getEmployeeName(), System.getProperty("line.separator"),
                        ReflectionToStringBuilder.toString(employeeBO)));
                //Send the mail
                HtmlEmail emailToSend = new HtmlEmail();
                emailToSend.setHostName(email.getHostName());
                String messageToSend = String.format(messageTemplateAdded, employeeBO.getEmployeeName(),
                        employeeBO.getEmployeeUid(), employeeBO.getEmployeeId().toString(),
                        employeeBO.getEmail(), employeeBO.getMobileNumber(), employeeBO.getJobTitle());

                emailToSend.setHtmlMsg(messageToSend);
                //emailToSend.setTextMsg(StringEscapeUtils.escapeHtml(messageToSend));
                emailToSend.getToAddresses().clear();
                //Send mail to scrum masters and Development Managers Group Id 15
                Collection<EmployeeBO> allEmployeesNeedToGetMail = CollectionUtils.union(
                        getAllEmployeesKeyedByGroupId().get(Integer.valueOf("14")),
                        getAllEmployeesKeyedByGroupId().get(Integer.valueOf("15")));
                for (EmployeeBO item : allEmployeesNeedToGetMail) {
                    emailToSend.addTo(item.getEmail(), item.getEmployeeName());
                }
                emailToSend.addTo(employeeBO.getManagerEmail(), employeeBO.getManager());//Send the mail to manager
                //emailToSend.setFrom("PerceptiveKolkataCentral@perceptivesoftware.com", "Perceptive Kolkata Central");
                emailToSend.setFrom("EnterpriseSoftwareKolkata@lexmark.com", "Enterprise Software Kolkata");
                emailToSend.setSubject(String.format("New employee added : %s", employeeBO.getEmployeeName()));
                emailToSend.send();
                //==========================Mail send ends here===========================================================================================================
                //sendMailToPerceptiveOpsTeam(employeeBO);//Send mail to operations team in Shawnee
            } else {
                //Update a new employee
                employeeDataAccessor.updateEmployee(employeeBO);
                LoggingHelpUtil.printDebug(String.format("Updating user ----> %s with details %s %s",
                        employeeBO.getEmployeeName(), System.getProperty("line.separator"),
                        ReflectionToStringBuilder.toString(employeeBO)));
            }

            //========================================================================================================================================
        }
        //Delete employees if any
        for (Object obj : employeeLinkedHashMap.values()) {
            final EmployeeBO emp = (EmployeeBO) obj;
            if (!CollectionUtils.exists(employeeListFromLDAP, new Predicate() {
                @Override
                public boolean evaluate(Object o) {
                    return emp.getEmployeeId().trim().equalsIgnoreCase(((EmployeeBO) o).getEmployeeId().trim()); //To change body of implemented methods use File | Settings | File Templates.
                }
            })) {
                emp.setActive(false); //Soft delete the Employee
                employeeDataAccessor.updateEmployee(emp);//Rest deletion will be taken care by the Trigger AFTER_EMPLOYEE_UPDATE
                LoggingHelpUtil.printDebug(
                        String.format("Deleting user ----> %s with details %s %s", emp.getEmployeeName(),
                                System.getProperty("line.separator"), ReflectionToStringBuilder.toString(emp)));
                //Send the mail
                HtmlEmail emailToSend = new HtmlEmail();
                emailToSend.setHostName(email.getHostName());

                String messageToSend = String.format(messageTemplateDeleted, emp.getEmployeeName(),
                        emp.getEmployeeUid(), emp.getEmployeeId().toString(), emp.getEmail(),
                        emp.getMobileNumber(), emp.getJobTitle());
                emailToSend.setHtmlMsg(messageToSend);
                //emailToSend.setTextMsg(StringEscapeUtils.escapeHtml(messageToSend));
                emailToSend.getToAddresses().clear();
                //Send mail to scrum masters ==Group ID 14 and Development Managers Group Id 15
                Collection<EmployeeBO> allEmployeesNeedToGetMail = CollectionUtils.union(
                        getAllEmployeesKeyedByGroupId().get(Integer.valueOf("14")),
                        getAllEmployeesKeyedByGroupId().get(Integer.valueOf("15")));
                for (EmployeeBO item : allEmployeesNeedToGetMail) {
                    emailToSend.addTo(item.getEmail(), item.getEmployeeName());
                }
                //emailToSend.setFrom("PerceptiveKolkataCentral@perceptivesoftware.com", "Perceptive Kolkata Central");
                emailToSend.setFrom("EnterpriseSoftwareKolkata@lexmark.com", "Enterprise Software Kolkata");
                emailToSend.setSubject(String.format("Employee removed : %s", emp.getEmployeeName()));
                emailToSend.send();
            }
        }

        luceneUtil.indexUserInfo(getAllEmployees().values());

    } catch (Exception ex) {
        throw new ExceptionWrapper(ex);
    }
}

From source file:com.mirth.connect.client.ui.Frame.java

private void loadExtensionMetaData() throws ClientException {
    loadedPlugins = mirthClient.getPluginMetaData();
    loadedConnectors = mirthClient.getConnectorMetaData();

    // Register extension JAX-RS providers with the client
    Set<String> apiProviderPackages = new HashSet<String>();
    Set<String> apiProviderClasses = new HashSet<String>();

    for (Object extensionMetaData : CollectionUtils.union(loadedPlugins.values(), loadedConnectors.values())) {
        MetaData metaData = (MetaData) extensionMetaData;
        for (ApiProvider provider : metaData.getApiProviders(Version.getLatest())) {
            switch (provider.getType()) {
            case SERVLET_INTERFACE_PACKAGE:
            case CORE_PACKAGE:
                apiProviderPackages.add(provider.getName());
                break;
            case SERVLET_INTERFACE:
            case CORE_CLASS:
                apiProviderClasses.add(provider.getName());
                break;
            default:
            }//w ww  .j a v  a 2  s  .c  o m
        }
    }

    mirthClient.registerApiProviders(apiProviderPackages, apiProviderClasses);
}

From source file:nl.strohalm.cyclos.services.accounts.AccountTypeServiceImpl.java

@SuppressWarnings("unchecked")
@Override/*  w  w  w .  j  av  a2s.co m*/
public Collection<AccountType> getVisibleAccountTypes() {
    if (LoggedUser.isSystem()) {
        return (Collection<AccountType>) listAll();
    }
    if (!LoggedUser.hasUser()) {
        // Not system and no user - nothing is visible
        return Collections.emptyList();
    }
    final Group group = LoggedUser.group();
    return getCache().get("_VISIBLE_" + group.getId(), new CacheCallback() {
        @Override
        public Object retrieve() {
            Collection<AccountType> result;
            if (permissionService.permission().admin(AdminSystemPermission.ACCOUNTS_VIEW).hasPermission()) {
                result = (Collection<AccountType>) listAll();
            } else {
                if (LoggedUser.isOperator()) {
                    OperatorGroup group = LoggedUser.group();
                    result = fetchService.fetch(group, OperatorGroup.Relationships.CAN_VIEW_INFORMATION_OF)
                            .getCanViewInformationOf();
                } else {
                    MemberAccountTypeQuery memberQuery = new MemberAccountTypeQuery();
                    memberQuery.setRelatedToGroups(permissionService.getManagedMemberGroups());
                    result = (Collection<AccountType>) search(memberQuery);

                    // A logged admin can see both system and member account types
                    if (LoggedUser.isAdministrator()) {
                        AdminGroup group = LoggedUser.group();
                        Collection<SystemAccountType> systemTypes = fetchService
                                .fetch(group, AdminGroup.Relationships.VIEW_INFORMATION_OF)
                                .getViewInformationOf();
                        result = CollectionUtils.union(result, systemTypes);
                    }
                }
            }
            return fetchService.fetch(result, AccountType.Relationships.CURRENCY);
        }
    });
}

From source file:nl.strohalm.cyclos.services.groups.GroupServiceImpl.java

@SuppressWarnings("unchecked")
private <G extends Group> G save(G group) {
    if (group.isTransient()) {
        group = groupDao.insert(group);//  ww w .j  av  a 2 s .  c  o m
    } else {
        // We must keep the many-to-many relationships, or they would be cleared...
        final Group currentGroup = load(group.getId(), FETCH_TO_KEEP_DATA);

        group.setPermissions(new HashSet<Permission>(currentGroup.getPermissions()));
        group.setTransferTypes(new ArrayList<TransferType>(currentGroup.getTransferTypes()));
        group.setConversionSimulationTTs(
                new ArrayList<TransferType>(currentGroup.getConversionSimulationTTs()));
        group.setGuaranteeTypes(new ArrayList<GuaranteeType>(currentGroup.getGuaranteeTypes()));

        if (group instanceof SystemGroup) {
            final SystemGroup systemGroup = (SystemGroup) group;
            final SystemGroup currentSystemGroup = ((SystemGroup) currentGroup);
            systemGroup.setDocuments(new ArrayList<Document>(currentSystemGroup.getDocuments()));
            systemGroup.setMessageCategories(
                    new ArrayList<MessageCategory>(currentSystemGroup.getMessageCategories()));
            systemGroup.setChargebackTransferTypes(
                    new ArrayList<TransferType>(currentSystemGroup.getChargebackTransferTypes()));
        }

        if (group instanceof AdminGroup) {
            final AdminGroup adminGroup = (AdminGroup) group;
            final AdminGroup currentAdminGroup = ((AdminGroup) currentGroup);
            adminGroup.setTransferTypesAsMember(
                    new ArrayList<TransferType>(currentAdminGroup.getTransferTypesAsMember()));
            adminGroup.setManagesGroups(new ArrayList<MemberGroup>(currentAdminGroup.getManagesGroups()));
            adminGroup.setViewConnectedAdminsOf(
                    new ArrayList<AdminGroup>(currentAdminGroup.getViewConnectedAdminsOf()));
            adminGroup.setViewInformationOf(
                    new ArrayList<SystemAccountType>(currentAdminGroup.getViewInformationOf()));
            adminGroup.setViewAdminRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getViewAdminRecordTypes()));
            adminGroup.setCreateAdminRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getCreateAdminRecordTypes()));
            adminGroup.setModifyAdminRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getModifyAdminRecordTypes()));
            adminGroup.setDeleteAdminRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getDeleteAdminRecordTypes()));
            adminGroup.setViewMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getViewMemberRecordTypes()));
            adminGroup.setCreateMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getCreateMemberRecordTypes()));
            adminGroup.setModifyMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getModifyMemberRecordTypes()));
            adminGroup.setDeleteMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentAdminGroup.getDeleteMemberRecordTypes()));
        }
        if (group instanceof BrokerGroup) {
            final BrokerGroup brokerGroup = (BrokerGroup) group;
            final BrokerGroup currentBrokerGroup = (BrokerGroup) currentGroup;

            final List<Document> brokerDocuments = new ArrayList<Document>();
            if (currentBrokerGroup.getBrokerDocuments() != null) {
                brokerDocuments.addAll(currentBrokerGroup.getBrokerDocuments());
            }
            brokerGroup.setBrokerDocuments(brokerDocuments);

            final List<AccountType> brokerCanViewInformationOf = new ArrayList<AccountType>();
            if (brokerGroup.getBrokerCanViewInformationOf() != null) {
                brokerCanViewInformationOf.addAll(brokerGroup.getBrokerCanViewInformationOf());
            }
            brokerGroup.setBrokerCanViewInformationOf(brokerCanViewInformationOf);

            brokerGroup.setTransferTypesAsMember(
                    new ArrayList<TransferType>(currentBrokerGroup.getTransferTypesAsMember()));
            brokerGroup.setBrokerConversionSimulationTTs(
                    new ArrayList<TransferType>(currentBrokerGroup.getBrokerConversionSimulationTTs()));
            brokerGroup.setBrokerMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentBrokerGroup.getBrokerMemberRecordTypes()));
            brokerGroup.setBrokerCreateMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentBrokerGroup.getBrokerCreateMemberRecordTypes()));
            brokerGroup.setBrokerModifyMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentBrokerGroup.getBrokerModifyMemberRecordTypes()));
            brokerGroup.setBrokerDeleteMemberRecordTypes(
                    new ArrayList<MemberRecordType>(currentBrokerGroup.getBrokerDeleteMemberRecordTypes()));

            // "possibleInitialGroups" is updated at edit group screen, so it doesn't need to be copied
        }
        if (group instanceof MemberGroup) {
            final MemberGroup memberGroup = (MemberGroup) group;
            final MemberGroup currentMemberGroup = (MemberGroup) currentGroup;
            memberGroup.setAccountSettings(currentMemberGroup.getAccountSettings());

            // Ensure that no channel will be set by default if it's not accessible
            memberGroup.getDefaultChannels().retainAll(memberGroup.getChannels());

            // Ensure the removedChannels collection contains the channels which were removed
            final Collection<Channel> removedChannels = new HashSet<Channel>();
            removedChannels.addAll(currentMemberGroup.getChannels());
            removedChannels.removeAll(memberGroup.getChannels());

            final List<MemberGroup> viewProfile = new ArrayList<MemberGroup>();
            if (currentMemberGroup.getCanViewProfileOfGroups() != null) {
                viewProfile.addAll(currentMemberGroup.getCanViewProfileOfGroups());
            }
            memberGroup.setCanViewProfileOfGroups(viewProfile);

            final List<AccountType> canViewInformationOf = new ArrayList<AccountType>();
            if (currentMemberGroup.getCanViewInformationOf() != null) {
                canViewInformationOf.addAll(currentMemberGroup.getCanViewInformationOf());
            }
            memberGroup.setCanViewInformationOf(canViewInformationOf);

            final List<MemberGroup> viewAds = new ArrayList<MemberGroup>();
            if (currentMemberGroup.getCanViewAdsOfGroups() != null) {
                viewAds.addAll(currentMemberGroup.getCanViewAdsOfGroups());
            }
            memberGroup.setCanViewAdsOfGroups(viewAds);

            final List<AdminGroup> managedByGroups = new ArrayList<AdminGroup>();
            if (currentMemberGroup.getManagedByGroups() != null) {
                managedByGroups.addAll(currentMemberGroup.getManagedByGroups());
            }
            memberGroup.setManagedByGroups(managedByGroups);

            // "defaultMailMessages" is updated at edit group screen, so it doesn't need to be copied
            // "smsMessages" is updated at edit group screen, so it doesn't need to be copied
            // "defaultSmsMessages" is updated at edit group screen, so it doesn't need to be copied
            // "channels" is updated at edit group screen, so it doesn't need to be copied
            // "defaultChannels" is updated at edit group screen, so it doesn't need to be copied

            // Add the main web access to default and accessible channels.
            final Channel webChannel = channelService.loadByInternalName(Channel.WEB);
            memberGroup.setChannels(
                    CollectionUtils.union(memberGroup.getChannels(), Collections.singleton(webChannel)));
            memberGroup.setDefaultChannels(
                    CollectionUtils.union(memberGroup.getDefaultChannels(), Collections.singleton(webChannel)));

            final List<Channel> requestPaymentByChannels = new ArrayList<Channel>();
            if (currentMemberGroup.getRequestPaymentByChannels() != null) {
                requestPaymentByChannels.addAll(currentMemberGroup.getRequestPaymentByChannels());
            }
            memberGroup.setRequestPaymentByChannels(requestPaymentByChannels);

            final MemberGroupSettings memberSettings = memberGroup.getMemberSettings();
            memberSettings
                    .setGroupAfterExpiration(fetchService.fetch(memberSettings.getGroupAfterExpiration()));

            // Update the basic settings of operator groups for members in this group
            final GroupQuery operatorQuery = new GroupQuery();
            operatorQuery.setNature(Group.Nature.OPERATOR);
            operatorQuery.fetch(
                    RelationshipHelper.nested(OperatorGroup.Relationships.MEMBER, Element.Relationships.GROUP));
            final List<OperatorGroup> operatorGroups = (List<OperatorGroup>) groupDao.search(operatorQuery);
            for (final OperatorGroup operatorGroup : operatorGroups) {
                if (operatorGroup.getMember().getGroup().equals(memberGroup)) {
                    groupDao.update(operatorGroup);
                }
            }
            final List<MemberGroup> canIssueCertificationToGroups = new ArrayList<MemberGroup>();
            if (currentMemberGroup.getCanIssueCertificationToGroups() != null) {
                canIssueCertificationToGroups.addAll(currentMemberGroup.getCanIssueCertificationToGroups());
            }
            memberGroup.setCanIssueCertificationToGroups(canIssueCertificationToGroups);

            final List<MemberGroup> canBuyWithPaymentObligationsFromGroups = new ArrayList<MemberGroup>();
            if (currentMemberGroup.getCanBuyWithPaymentObligationsFromGroups() != null) {
                canBuyWithPaymentObligationsFromGroups
                        .addAll(currentMemberGroup.getCanBuyWithPaymentObligationsFromGroups());
            }
            memberGroup.setCanBuyWithPaymentObligationsFromGroups(canBuyWithPaymentObligationsFromGroups);

            // Ensure the message notification types are not present on the group for SMS
            final Collection<Message.Type> smsMessages = memberGroup.getSmsMessages();
            if (smsMessages != null) {
                smsMessages.remove(Message.Type.FROM_MEMBER);
                smsMessages.remove(Message.Type.FROM_ADMIN_TO_GROUP);
                smsMessages.remove(Message.Type.FROM_ADMIN_TO_MEMBER);
            }
            final Collection<Type> defaultSmsMessages = memberGroup.getDefaultSmsMessages();
            if (defaultSmsMessages != null) {
                defaultSmsMessages.remove(Message.Type.FROM_MEMBER);
                defaultSmsMessages.remove(Message.Type.FROM_ADMIN_TO_GROUP);
                defaultSmsMessages.remove(Message.Type.FROM_ADMIN_TO_MEMBER);
            }

            // Remove from all members channels which are no longer accessible
            elementDao.removeChannelsFromMembers(memberGroup, removedChannels);

            // ensure activation status
            if (memberGroup.isRemoved()) {
                memberGroup.setActive(false);
            }
        }
        if (group instanceof OperatorGroup) {
            final OperatorGroup operatorGroup = (OperatorGroup) group;
            final OperatorGroup currentOperatorGroup = (OperatorGroup) currentGroup;

            // Check the account types
            final List<AccountType> canViewInformationOf = new ArrayList<AccountType>();
            if (currentOperatorGroup.getCanViewInformationOf() != null) {
                canViewInformationOf.addAll(currentOperatorGroup.getCanViewInformationOf());
            }
            operatorGroup.setCanViewInformationOf(canViewInformationOf);
        }
        group = groupDao.update(group);
    }
    // Ensure the permissions cache for this group is evicted
    permissionService.evictCache(group);
    return group;
}