/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/agpl.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package se.streamsource.streamflow.web.domain.entity.project;
import java.util.ArrayList;
import java.util.List;
import org.qi4j.api.injection.scope.This;
import org.qi4j.api.mixin.Mixins;
import se.streamsource.streamflow.web.domain.interaction.gtd.Assignee;
import se.streamsource.streamflow.web.domain.structure.group.Group;
import se.streamsource.streamflow.web.domain.structure.group.Participant;
import se.streamsource.streamflow.web.domain.structure.group.Participants;
import se.streamsource.streamflow.web.domain.structure.project.Member;
import se.streamsource.streamflow.web.domain.structure.project.Members;
import se.streamsource.streamflow.web.domain.structure.project.Project;
@Mixins(ProjectMembersQueries.Mixin.class)
public interface ProjectMembersQueries
{
List<Assignee> possibleAssignees( );
class Mixin
implements ProjectMembersQueries
{
@This
Project project;
public List<Assignee> possibleAssignees()
{
return resolveProjectMembers( ((Members.Data)project).members().toList() );
}
private List<Assignee> resolveProjectMembers(List<Member> members)
{
List<Assignee> assignees = new ArrayList<Assignee>();
for (Member member : members)
{
if (member instanceof Group){
assignees.addAll( resolveGroupMembers( ((Participants.Data) member).participants().toList()) );
} else {
assignees.add((Assignee) member);
}
}
return assignees;
}
private List<Assignee> resolveGroupMembers(List<Participant> participants)
{
List<Assignee> assignees = new ArrayList<Assignee>();
for (Participant participant : participants)
{
if (participant instanceof Participants) {
assignees.addAll(resolveGroupMembers( ((Participants.Data ) participant).participants().toList()));
}
assignees.add( (Assignee) participant );
}
return assignees;
}
}
}