/**
*
* 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.context.workspace;
import static org.qi4j.api.query.QueryExpressions.eq;
import static org.qi4j.api.query.QueryExpressions.templateFor;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.query.Query;
import org.qi4j.api.query.QueryBuilder;
import org.qi4j.api.query.QueryExpressions;
import org.qi4j.api.structure.Module;
import org.qi4j.api.value.ValueBuilder;
import se.streamsource.dci.api.RoleMap;
import se.streamsource.dci.value.link.LinksValue;
import se.streamsource.dci.value.table.TableQuery;
import se.streamsource.streamflow.api.administration.priority.PriorityValue;
import se.streamsource.streamflow.web.application.defaults.SystemDefaultsService;
import se.streamsource.streamflow.web.context.LinksBuilder;
import se.streamsource.streamflow.web.context.util.TableQueryConverter;
import se.streamsource.streamflow.web.domain.Describable;
import se.streamsource.streamflow.web.domain.Removable;
import se.streamsource.streamflow.web.domain.entity.casetype.CaseTypeEntity;
import se.streamsource.streamflow.web.domain.entity.organization.OrganizationsEntity;
import se.streamsource.streamflow.web.domain.entity.project.ProjectEntity;
import se.streamsource.streamflow.web.domain.entity.user.SearchCaseQueries;
import se.streamsource.streamflow.web.domain.entity.user.UserEntity;
import se.streamsource.streamflow.web.domain.interaction.gtd.Ownable;
import se.streamsource.streamflow.web.domain.interaction.gtd.Owner;
import se.streamsource.streamflow.web.domain.structure.caze.Case;
import se.streamsource.streamflow.web.domain.structure.label.Label;
import se.streamsource.streamflow.web.domain.structure.label.Labels;
import se.streamsource.streamflow.web.domain.structure.organization.Organization;
import se.streamsource.streamflow.web.domain.structure.organization.Organizations;
import se.streamsource.streamflow.web.domain.structure.organization.Priorities;
import se.streamsource.streamflow.web.domain.structure.organization.Priority;
import se.streamsource.streamflow.web.domain.structure.organization.PrioritySettings;
import se.streamsource.streamflow.web.domain.structure.user.UserAuthentication;
import com.google.common.collect.Lists;
/**
* JAVADOC
*/
public class SearchContext
{
@Structure
Module module;
@Service
SystemDefaultsService systemConfig;
public CaseSearchResult cases(TableQuery tableQuery)
{
SearchCaseQueries caseQueries = RoleMap.role(SearchCaseQueries.class);
Query<Case> caseQuery = caseQueries.search(tableQuery.where(), systemConfig.config().configuration().includeNotesInSearch().get() );
List<Case> rawResults = Lists.newArrayList(caseQuery);
int unlimitedResultCount = rawResults.size();
TableQueryConverter tableQueryConverter = module.objectBuilderFactory().newObjectBuilder(TableQueryConverter.class).use(tableQuery).newInstance();
Iterable<Case> results = tableQueryConverter.convert(rawResults);
return new CaseSearchResult(results, unlimitedResultCount);
}
public LinksValue possibleLabels()
{
Query<Labels> labelsList = module.queryBuilderFactory().newQueryBuilder( Labels.class )
.where( QueryExpressions.eq( QueryExpressions.templateFor( Removable.Data.class ).removed(), false ) )
.newQuery( module.unitOfWorkFactory().currentUnitOfWork() );
LinksBuilder builder = new LinksBuilder( module.valueBuilderFactory() );
for( Labels labels : labelsList )
{
for( Label label : ((Labels.Data)labels).labels() )
{
builder.addDescribable( (Describable) label, ((Describable) labels).getDescription() );
}
}
return builder.newLinks();
}
public LinksValue possibleCaseTypes()
{
QueryBuilder<CaseTypeEntity> queryBuilder = module.queryBuilderFactory().newQueryBuilder(CaseTypeEntity.class);
queryBuilder = queryBuilder.where(
eq(templateFor(Removable.Data.class).removed(), false));
Query<CaseTypeEntity> query = queryBuilder.newQuery(module.unitOfWorkFactory().currentUnitOfWork()).
orderBy(QueryExpressions.orderBy(templateFor(Describable.Data.class).description()));
LinksBuilder linksBuilder = new LinksBuilder( module.valueBuilderFactory() );
for( CaseTypeEntity caseTypeEntity : query )
{
Owner owner = ((Ownable.Data)caseTypeEntity).owner().get();
String title = owner != null ? ((Describable)owner).getDescription() : "";
linksBuilder.addLink( caseTypeEntity.getDescription(), caseTypeEntity.identity().get(),"","","", title );
}
return linksBuilder.newLinks();
}
public Query<UserEntity> possibleAssignees()
{
QueryBuilder<UserEntity> queryBuilder = module.queryBuilderFactory().newQueryBuilder(UserEntity.class);
queryBuilder = queryBuilder.where(
eq(templateFor(UserAuthentication.Data.class).disabled(), false));
return queryBuilder.newQuery(module.unitOfWorkFactory().currentUnitOfWork()).
orderBy(QueryExpressions.orderBy(templateFor(Describable.Data.class).description()));
}
public LinksValue possibleProjects()
{
QueryBuilder<ProjectEntity> queryBuilder = module.queryBuilderFactory().newQueryBuilder(ProjectEntity.class);
queryBuilder = queryBuilder.where(
eq(templateFor(Removable.Data.class).removed(), false));
Query<ProjectEntity> query = queryBuilder.newQuery(module.unitOfWorkFactory().currentUnitOfWork()).
orderBy(QueryExpressions.orderBy(templateFor(Describable.Data.class).description()));
LinksBuilder linksBuilder = new LinksBuilder(module.valueBuilderFactory());
for (ProjectEntity project : query)
{
linksBuilder.addLink(project.getDescription(), project.identity().get(), "", "", "", ((Describable) ((Ownable.Data) project).owner().get()).getDescription());
}
return linksBuilder.newLinks();
}
public Query<UserEntity> possibleCreatedBy()
{
QueryBuilder<UserEntity> queryBuilder = module.queryBuilderFactory().newQueryBuilder(UserEntity.class);
return queryBuilder.newQuery(module.unitOfWorkFactory().currentUnitOfWork()).
orderBy(QueryExpressions.orderBy(templateFor(Describable.Data.class).description()));
}
/**
* Convenience method to be able to tell the gui that Status has to be rendered visible in the Perspective filter.
*
* @return
*/
public LinksValue possibleStatus()
{
return new LinksBuilder(module.valueBuilderFactory()).newLinks();
}
public LinksValue priorities()
{
Organizations.Data orgs = module.unitOfWorkFactory().currentUnitOfWork().get( OrganizationsEntity.class, OrganizationsEntity.ORGANIZATIONS_ID );
Organization org = orgs.organization().get();
RoleMap.current().set( org );
Priorities.Data priorities = RoleMap.role( Priorities.Data.class );
se.streamsource.streamflow.web.context.LinksBuilder builder = new se.streamsource.streamflow.web.context.LinksBuilder( module.valueBuilderFactory() );
ValueBuilder<PriorityValue> linkBuilder = module.valueBuilderFactory().newValueBuilder( PriorityValue.class );
List<Priority> sortedList = priorities.prioritys().toList();
Collections.sort( sortedList, new Comparator<Priority>()
{
public int compare( Priority o1, Priority o2 )
{
return ((PrioritySettings.Data) o1).priority().get().compareTo( ((PrioritySettings.Data) o2).priority().get() );
}
} );
for(Priority priority : sortedList )
{
linkBuilder.prototype().id().set( EntityReference.getEntityReference( priority ).identity() );
linkBuilder.prototype().color().set( ((PrioritySettings.Data)priority).color().get() );
linkBuilder.prototype().priority().set( ((PrioritySettings.Data)priority).priority().get() );
linkBuilder.prototype().href().set( "na" );
linkBuilder.prototype().text().set( priority.getDescription() );
builder.addLink( linkBuilder.newInstance() );
}
return builder.newLinks();
}
}