/** * * 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.interaction.gtd; import java.util.Date; import org.qi4j.api.common.Optional; import org.qi4j.api.entity.association.Association; import org.qi4j.api.injection.scope.This; import org.qi4j.api.mixin.Mixins; import org.qi4j.api.property.Property; import se.streamsource.streamflow.infrastructure.event.domain.DomainEvent; /** * JAVADOC */ @Mixins(Delegatable.Mixin.class) public interface Delegatable { void delegateTo( Delegatee delegatee, Delegator delegator, Owner delegatedFrom ); void rejectDelegation(); void cancelDelegation(); boolean isDelegated(); boolean isDelegatedBy(Delegator delegator); boolean isDelegatedTo(Delegatee delegatee); interface Data { @Optional Association<Delegatee> delegatedTo(); @Optional Association<Delegator> delegatedBy(); @Optional Association<Owner> delegatedFrom(); @Optional Property<Date> delegatedOn(); void delegatedTo( @Optional DomainEvent create, Delegatee delegatee, Delegator delegator, Owner delegatedFrom ); void rejectedDelegation( @Optional DomainEvent event ); void cancelledDelegation( @Optional DomainEvent event ); } abstract class Mixin implements Delegatable, Data { @This Ownable ownable; @This Status status; public void delegateTo( Delegatee delegatee, Delegator delegator, Owner delegatedFrom ) { delegatedTo( null, delegatee, delegator, delegatedFrom ); } public void delegatedTo( @Optional DomainEvent event, Delegatee delegatee, Delegator delegator, Owner delegatedFrom ) { delegatedTo().set( delegatee ); delegatedBy().set( delegator ); delegatedOn().set( event.on().get() ); delegatedFrom().set( delegatedFrom ); // status.delegate(); } public void rejectDelegation() { if (delegatedTo().get() != null) { ownable.changeOwner( delegatedFrom().get() ); rejectedDelegation( null ); } } public void cancelDelegation() { if (delegatedTo().get() != null) { ownable.changeOwner( delegatedFrom().get() ); cancelledDelegation( null ); } } public boolean isDelegated() { return delegatedTo().get() != null; } public boolean isDelegatedBy( Delegator delegator ) { return delegator.equals( delegatedBy().get()); } public boolean isDelegatedTo( Delegatee delegatee ) { Delegatee delegatedTo = delegatedTo().get(); if (delegatedTo != null) { return delegatedTo.isDelegatedTo( delegatee ); } else return false; } public void rejectedDelegation( @Optional DomainEvent event ) { delegatedTo().set( null ); delegatedBy().set( null ); delegatedOn().set( null ); delegatedFrom().set( null ); status.reopen(); } public void cancelledDelegation( @Optional DomainEvent event ) { delegatedTo().set( null ); delegatedBy().set( null ); delegatedOn().set( null ); delegatedFrom().set( null ); } } }