/**
*
* 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.user;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.qi4j.api.injection.scope.This;
import org.qi4j.api.mixin.Mixins;
import se.streamsource.streamflow.web.domain.Removable;
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.Members;
import se.streamsource.streamflow.web.domain.structure.project.Memberships;
import se.streamsource.streamflow.web.domain.structure.project.Project;
/**
* JAVADOC
*/
@Mixins(ProjectQueries.Mixin.class)
public interface ProjectQueries
{
/**
* Return all projects that this participant has access to.
* This includes projects that this participant is transitively
* a member of through groups.
*
* @return all projects that this participant is a member of
*/
Iterable<Project> allProjects();
class Mixin
implements ProjectQueries
{
@This
Memberships.Data memberships;
@This
Participant participant;
public Iterable<Project> allProjects()
{
List<Project> projects = new ArrayList<Project>();
// List my own
for (Members members : memberships.projects())
{
if (!projects.contains( members )
&& !((Removable.Data) members).removed().get())
projects.add( (Project) members );
}
// Get group projects
for (Participants group : participant.allGroups())
{
ProjectQueries groupProjects = (ProjectQueries) group;
for (Project groupProject : groupProjects.allProjects())
{
if (!projects.contains( groupProject )
&& !((Removable.Data) groupProject).removed().get())
projects.add( groupProject );
}
}
Collections.sort( projects, new Comparator<Project>() {
public int compare(Project o1, Project o2)
{
return o1.getDescription().compareToIgnoreCase( o2.getDescription() );
}} );
return projects;
}
}
}