// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBO.java
// public interface GroupBO
// {
//     /**
//      * @return userRef of owner
//      */
//     String getOwner();
// 
//     /**
//      * Removes the group
//      */
//     void remove();
// 
//     /**
//      * @return name of group
//      */
//     String getName();
// 
//     /**
//      * Create member for given user
//      * @param userRef
//      * @param name of member in side of the group
//      * @return
//      */
//     MemberBO createMember(String userRef, String name);
// 
//     /**
//      * @return members of the group (owner is one member)
//      */
//     Collection<MemberBO> getMembers();
// 
//     /**
//      * @return identifier of group
//      */
//     String getID();
// 
//     /**
//      * @param userRef
//      * @return the member instance of the given user.
//      */
//     MemberBO getMember(String userRef);
// 
//     /**
//      * @param userRef
//      * @return true in case user is member of this group
//      */
//     boolean isMember(String userRef);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBORepository.java
// public interface GroupBORepository
// {
//     /**
//      * Creates a new group
//      * @param name of group
//      * @param ownerName member name of owner for this group
//      * @return created group
//      */
//     GroupBO createGroup(String name, String ownerName);
// 
//     /**
//      * @return list of owned groups
//      */
//     List<GroupBO> getGroups();
// 
//     /**
//      * Removes all groups of this repository
//      */
//     void clear();
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBusinessFactory.java
// public interface GroupBusinessFactory
// {
//     GroupBO findGroupBOByName(String name);
// 
//     GroupBO getGroupBO(GroupPO groupPO);
// 
//     GroupBORepository getGroupBORepository(String ownerRef);
// 
//     MemberBO getMemberBO(MemberPO memberPO);
// 
//     List<GroupBO> getGroupBOsByUser(String userRef);
// 
//     GroupBO getGroupBOByID(String groupID);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/dao/MemberDao.java
// public interface MemberDao extends Dao<MemberPO>
// {
//     /**
//      * Add member to group
//      * @param groupPO
//      * @param userRef
//      * @return
//      */
//     public MemberPO createAndInsert(GroupPO groupPO, String userRef, String name);
// 
//     /**
//      * @param userRef
//      *            any userRef
//      * @return list of members
//      */
//     List<MemberPO> getByUser(String userRef);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/entities/GroupPO.java
// @Entity
// @NamedQueries(value = {
//                 @NamedQuery(name = "GroupPO.findByName", query = "select a from GroupPO a where a.name = :name"),
//                 @NamedQuery(name = "GroupPO.findByOwnerRef", query = "select a from GroupPO a where a.ownerRef = :ownerRef")
// })
// public class GroupPO implements Serializable, IdentifiableEntity
// {
//     private static final long serialVersionUID = 1L;
// 
//     @Id
//     @XmlTransient
//     private String id;
// 
//     @NotNull
//     private String name;
// 
//     @NotNull
//     private String ownerRef;
// 
//     @OneToMany(mappedBy = "groupPO", cascade = CascadeType.ALL)
//     @XmlElement(name = "member")
//     private List<MemberPO> members = new ArrayList<>();
// 
//     public GroupPO()
//     {
//     }
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         GroupPO other = (GroupPO)obj;
//         if (id == null)
//         {
//             if (other.id != null)
//                 return false;
//         }
//         else if (!id.equals(other.id))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String getId()
//     {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id)
//     {
//         this.id = id;
//     }
// 
//     public String getName()
//     {
//         return name;
//     }
// 
//     public void setName(String name)
//     {
//         this.name = name;
//     }
// 
//     public List<MemberPO> getMembers()
//     {
//         return members;
//     }
// 
//     public void setMembers(List<MemberPO> members)
//     {
//         this.members = members;
//     }
// 
//     public String getOwnerRef()
//     {
//         return ownerRef;
//     }
// 
//     public void setOwnerRef(String ownerRef)
//     {
//         this.ownerRef = ownerRef;
//     }
// }


import java.util.List;
import java.util.stream.Collectors;
import de.hatoka.group.capi.business.GroupBO;
import de.hatoka.group.capi.business.GroupBORepository;
import de.hatoka.group.capi.business.GroupBusinessFactory;
import de.hatoka.group.capi.dao.GroupDao;
import de.hatoka.group.capi.dao.MemberDao;
import de.hatoka.group.capi.entities.GroupPO;
package de.hatoka.group.internal.business;



public class GroupBORepositoryImpl implements GroupBORepository
{
    private final String ownerRef;

    private final GroupBusinessFactory factory;
    private final GroupDao groupDao;

    public GroupBORepositoryImpl(String ownerRef, GroupDao groupDao, MemberDao memberDao, GroupBusinessFactory factory)
    {
        this.ownerRef = ownerRef;
        this.factory = factory;
        this.groupDao = groupDao;
    }

    @Override
    public GroupBO createGroup(String name, String ownerName)
    {
        GroupPO groupPO = groupDao.createAndInsert(ownerRef, name);
        GroupBO groupBO = factory.getGroupBO(groupPO);
        groupBO.createMember(ownerRef, ownerName);
        return groupBO;
    }

// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBO.java
// public interface GroupBO
// {
//     /**
//      * @return userRef of owner
//      */
//     String getOwner();
// 
//     /**
//      * Removes the group
//      */
//     void remove();
// 
//     /**
//      * @return name of group
//      */
//     String getName();
// 
//     /**
//      * Create member for given user
//      * @param userRef
//      * @param name of member in side of the group
//      * @return
//      */
//     MemberBO createMember(String userRef, String name);
// 
//     /**
//      * @return members of the group (owner is one member)
//      */
//     Collection<MemberBO> getMembers();
// 
//     /**
//      * @return identifier of group
//      */
//     String getID();
// 
//     /**
//      * @param userRef
//      * @return the member instance of the given user.
//      */
//     MemberBO getMember(String userRef);
// 
//     /**
//      * @param userRef
//      * @return true in case user is member of this group
//      */
//     boolean isMember(String userRef);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBORepository.java
// public interface GroupBORepository
// {
//     /**
//      * Creates a new group
//      * @param name of group
//      * @param ownerName member name of owner for this group
//      * @return created group
//      */
//     GroupBO createGroup(String name, String ownerName);
// 
//     /**
//      * @return list of owned groups
//      */
//     List<GroupBO> getGroups();
// 
//     /**
//      * Removes all groups of this repository
//      */
//     void clear();
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/business/GroupBusinessFactory.java
// public interface GroupBusinessFactory
// {
//     GroupBO findGroupBOByName(String name);
// 
//     GroupBO getGroupBO(GroupPO groupPO);
// 
//     GroupBORepository getGroupBORepository(String ownerRef);
// 
//     MemberBO getMemberBO(MemberPO memberPO);
// 
//     List<GroupBO> getGroupBOsByUser(String userRef);
// 
//     GroupBO getGroupBOByID(String groupID);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/dao/MemberDao.java
// public interface MemberDao extends Dao<MemberPO>
// {
//     /**
//      * Add member to group
//      * @param groupPO
//      * @param userRef
//      * @return
//      */
//     public MemberPO createAndInsert(GroupPO groupPO, String userRef, String name);
// 
//     /**
//      * @param userRef
//      *            any userRef
//      * @return list of members
//      */
//     List<MemberPO> getByUser(String userRef);
// }
// 
// Path: de.hatoka.group/src/main/java/de/hatoka/group/capi/entities/GroupPO.java
// @Entity
// @NamedQueries(value = {
//                 @NamedQuery(name = "GroupPO.findByName", query = "select a from GroupPO a where a.name = :name"),
//                 @NamedQuery(name = "GroupPO.findByOwnerRef", query = "select a from GroupPO a where a.ownerRef = :ownerRef")
// })
// public class GroupPO implements Serializable, IdentifiableEntity
// {
//     private static final long serialVersionUID = 1L;
// 
//     @Id
//     @XmlTransient
//     private String id;
// 
//     @NotNull
//     private String name;
// 
//     @NotNull
//     private String ownerRef;
// 
//     @OneToMany(mappedBy = "groupPO", cascade = CascadeType.ALL)
//     @XmlElement(name = "member")
//     private List<MemberPO> members = new ArrayList<>();
// 
//     public GroupPO()
//     {
//     }
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         GroupPO other = (GroupPO)obj;
//         if (id == null)
//         {
//             if (other.id != null)
//                 return false;
//         }
//         else if (!id.equals(other.id))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String getId()
//     {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id)
//     {
//         this.id = id;
//     }
// 
//     public String getName()
//     {
//         return name;
//     }
// 
//     public void setName(String name)
//     {
//         this.name = name;
//     }
// 
//     public List<MemberPO> getMembers()
//     {
//         return members;
//     }
// 
//     public void setMembers(List<MemberPO> members)
//     {
//         this.members = members;
//     }
// 
//     public String getOwnerRef()
//     {
//         return ownerRef;
//     }
// 
//     public void setOwnerRef(String ownerRef)
//     {
//         this.ownerRef = ownerRef;
//     }
// }


// Path: de.hatoka.group/src/main/java/de/hatoka/group/internal/business/GroupBORepositoryImpl.java
import java.util.List;
import java.util.stream.Collectors;
import de.hatoka.group.capi.business.GroupBO;
import de.hatoka.group.capi.business.GroupBORepository;
import de.hatoka.group.capi.business.GroupBusinessFactory;
import de.hatoka.group.capi.dao.GroupDao;
import de.hatoka.group.capi.dao.MemberDao;
import de.hatoka.group.capi.entities.GroupPO;

package de.hatoka.group.internal.business;



public class GroupBORepositoryImpl implements GroupBORepository
{
    private final String ownerRef;

    private final GroupBusinessFactory factory;
    private final GroupDao groupDao;

    public GroupBORepositoryImpl(String ownerRef, GroupDao groupDao, MemberDao memberDao, GroupBusinessFactory factory)
    {
        this.ownerRef = ownerRef;
        this.factory = factory;
        this.groupDao = groupDao;
    }

    @Override
    public GroupBO createGroup(String name, String ownerName)
    {
        GroupPO groupPO = groupDao.createAndInsert(ownerRef, name);
        GroupBO groupBO = factory.getGroupBO(groupPO);
        groupBO.createMember(ownerRef, ownerName);
        return groupBO;
    }

    @Override