package org.qi4j.library.struts2.support.add; import com.opensymphony.xwork2.ActionSupport; import org.qi4j.api.entity.EntityBuilder; import org.qi4j.api.injection.scope.Structure; import org.qi4j.api.injection.scope.This; import org.qi4j.api.unitofwork.UnitOfWork; import org.qi4j.api.unitofwork.UnitOfWorkFactory; import static org.qi4j.library.struts2.util.ClassNames.classNameInDotNotation; import static org.qi4j.library.struts2.util.ParameterizedTypes.findTypeVariables; public abstract class ProvidesAddingOfMixin<T> extends ActionSupport implements ProvidesAddingOf<T> { @This private ProvidesAddingOf<T> action; @Structure private UnitOfWorkFactory uowf; private EntityBuilder<T> builder; @Override public T getState() { return builder.instance(); } @Override public void prepare() throws Exception { prepareEntityBuilder(); } @Override public String input() { return INPUT; } @Override public String execute() throws Exception { addSuccessMessage(); return SUCCESS; } @SuppressWarnings( "unchecked" ) protected Class<T> typeToAdd() { return (Class<T>) findTypeVariables( action.getClass(), ProvidesAddingOf.class )[ 0 ]; } protected void addSuccessMessage() { addActionMessage( getText( classNameInDotNotation( typeToAdd() ) + ".successfully.added" ) ); } protected void prepareEntityBuilder() throws Exception { UnitOfWork uow = uowf.currentUnitOfWork(); builder = uow.newEntityBuilder( typeToAdd() ); } }