/**
*
* 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.administration;
import org.qi4j.api.constraint.Name;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.NoSuchEntityException;
import org.qi4j.api.value.ValueBuilder;
import se.streamsource.dci.api.IndexContext;
import se.streamsource.dci.api.RoleMap;
import se.streamsource.dci.value.link.LinkValue;
import se.streamsource.dci.value.link.LinksValue;
import se.streamsource.streamflow.web.context.LinksBuilder;
import se.streamsource.streamflow.web.domain.Removable;
import se.streamsource.streamflow.web.domain.entity.user.UserEntity;
import se.streamsource.streamflow.web.domain.interaction.gtd.Ownable;
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.organization.Organization;
import se.streamsource.streamflow.web.domain.structure.organization.OrganizationParticipations;
import se.streamsource.streamflow.web.domain.structure.organization.OrganizationalUnit;
import se.streamsource.streamflow.web.domain.structure.organization.OrganizationalUnits;
/**
* JAVADOC
*/
public class AdministrationContext
implements IndexContext<LinksValue>
{
@Structure
Module module;
public LinksValue index()
{
// TODO This needs to consider roles for server+org
LinksBuilder linksBuilder = new LinksBuilder(module.valueBuilderFactory());
// Add server admin link as root
ValueBuilder<LinkValue> linkBuilder = module.valueBuilderFactory().newValueBuilder(LinkValue.class);
// Add organizations
Participant participant = RoleMap.role( Participant.class );
OrganizationParticipations.Data participations = RoleMap.role(OrganizationParticipations.Data.class);
for (Organization organization : participations.organizations())
{
if (((Removable.Data)organization).removed().get())
continue; // Skip this one
boolean enabled = organization.hasRoles( participant ) || participant.toString().equals( UserEntity.ADMINISTRATOR_USERNAME );
linkBuilder = module.valueBuilderFactory().newValueBuilder(LinkValue.class);
linkBuilder.prototype().text().set( organization.getDescription() );
linkBuilder.prototype().id().set( organization.toString() );
linkBuilder.prototype().rel().set( "organization" );
linkBuilder.prototype().href().set( "organizations/" + organization.toString() + "/" );
linkBuilder.prototype().classes().set("server" + ( enabled ? "" : " disabled" ) );
linksBuilder.addLink(linkBuilder.newInstance());
OrganizationalUnits.Data units = (OrganizationalUnits.Data) organization;
for (OrganizationalUnit organizationalUnit : units.organizationalUnits())
{
addOrganizationalUnit( organizationalUnit, organization, linksBuilder, participant );
}
}
return linksBuilder.newLinks();
}
private void addOrganizationalUnit(OrganizationalUnit ou, Object parent, LinksBuilder linksBuilder, Participant participant)
{
if (ou.hasRoles( participant ) || participant.toString().equals( UserEntity.ADMINISTRATOR_USERNAME ))
{
ValueBuilder<LinkValue> linkBuilder = module.valueBuilderFactory().newValueBuilder(LinkValue.class);
linkBuilder.prototype().text().set( ou.getDescription() );
linkBuilder.prototype().id().set( ou.toString() );
linkBuilder.prototype().rel().set( "organizationalunit" );
linkBuilder.prototype().classes().set(parent.toString());
linkBuilder.prototype().href().set( "organizationalunits/" + ou.toString() + "/" );
LinkValue link = linkBuilder.newInstance();
linksBuilder.addLink( link );
ensureParentPathExists( participant, link, parent, linkBuilder, linksBuilder );
OrganizationalUnits.Data units = (OrganizationalUnits.Data) ou;
for (OrganizationalUnit organizationalUnit : units.organizationalUnits())
{
addOrganizationalUnit( organizationalUnit, ou, linksBuilder, participant );
}
} else
{
OrganizationalUnits.Data units = (OrganizationalUnits.Data) ou;
for (OrganizationalUnit organizationalUnit : units.organizationalUnits())
{
addOrganizationalUnit( organizationalUnit, ou, linksBuilder, participant );
}
}
}
private void ensureParentPathExists(Participant participant, LinkValue existing, Object parent , ValueBuilder<LinkValue> linkBuilder, LinksBuilder linksBuilder )
{
boolean isOu = parent instanceof OrganizationalUnit;
if( isOu )
{
OrganizationalUnit ou = (OrganizationalUnit)parent;
boolean enabled = ou.hasRoles( participant ) || participant.toString().equals( UserEntity.ADMINISTRATOR_USERNAME );
linkBuilder.prototype().text().set( ou.getDescription() );
linkBuilder.prototype().id().set( ou.toString() );
linkBuilder.prototype().rel().set( "organizationalunit" );
linkBuilder.prototype().classes().set(((Ownable.Data)ou).owner().get().toString() + ( enabled ? "" : " disabled" ));
linkBuilder.prototype().href().set( "organizationalunits/" + ou.toString() + "/" );
LinkValue link = linkBuilder.newInstance();
if( ! linksBuilder.contains( link ))
{
linksBuilder.addLinkBefore( existing, link );
}
ensureParentPathExists( participant, link, ((Ownable.Data)ou).owner().get(), linkBuilder, linksBuilder );
}
}
public boolean isparticipantingroup( @Name( "groupid" )String groupId, @Name("participantid") String participantId )
{
Group group = null;
try
{
group = module.unitOfWorkFactory().currentUnitOfWork().get( Group.class, groupId );
} catch( NoSuchEntityException ne )
{
// do nothing - there is no entity with this id.
} catch (ClassCastException cce )
{
// do nothing - the found entity is not a group.
}
return group == null ? false : group.isParticipant( module.unitOfWorkFactory().currentUnitOfWork().get( Participant.class, participantId ) );
}
}