/**
*
* 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.application.organization;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.mixin.Mixins;
import org.qi4j.api.object.ObjectBuilderFactory;
import org.qi4j.api.service.Activatable;
import org.qi4j.api.service.ServiceComposite;
import org.qi4j.api.structure.Application;
import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.value.ValueBuilder;
import se.streamsource.dci.api.RoleMap;
import se.streamsource.streamflow.api.administration.form.DateFieldValue;
import se.streamsource.streamflow.api.administration.form.NumberFieldValue;
import se.streamsource.streamflow.api.administration.form.OptionButtonsFieldValue;
import se.streamsource.streamflow.api.administration.form.TextFieldValue;
import se.streamsource.streamflow.api.workspace.cases.contact.ContactDTO;
import se.streamsource.streamflow.api.workspace.cases.contact.ContactEmailDTO;
import se.streamsource.streamflow.api.workspace.cases.conversation.MessageType;
import se.streamsource.streamflow.api.workspace.cases.general.FieldSubmissionDTO;
import se.streamsource.streamflow.api.workspace.cases.general.FormDraftDTO;
import se.streamsource.streamflow.api.workspace.cases.general.PageSubmissionDTO;
import se.streamsource.streamflow.web.application.security.UserPrincipal;
import se.streamsource.streamflow.web.context.administration.GroupsContext;
import se.streamsource.streamflow.web.domain.entity.caze.CaseEntity;
import se.streamsource.streamflow.web.domain.entity.conversation.ConversationEntity;
import se.streamsource.streamflow.web.domain.entity.organization.OrganizationEntity;
import se.streamsource.streamflow.web.domain.entity.organization.OrganizationsEntity;
import se.streamsource.streamflow.web.domain.entity.user.UserEntity;
import se.streamsource.streamflow.web.domain.entity.user.UsersEntity;
import se.streamsource.streamflow.web.domain.interaction.gtd.Owner;
import se.streamsource.streamflow.web.domain.structure.casetype.CaseType;
import se.streamsource.streamflow.web.domain.structure.casetype.Resolution;
import se.streamsource.streamflow.web.domain.structure.caze.Case;
import se.streamsource.streamflow.web.domain.structure.conversation.Conversation;
import se.streamsource.streamflow.web.domain.structure.form.Form;
import se.streamsource.streamflow.web.domain.structure.form.FormDraft;
import se.streamsource.streamflow.web.domain.structure.form.Page;
import se.streamsource.streamflow.web.domain.structure.form.Submitter;
import se.streamsource.streamflow.web.domain.structure.group.Group;
import se.streamsource.streamflow.web.domain.structure.label.Label;
import se.streamsource.streamflow.web.domain.structure.organization.OrganizationalUnit;
import se.streamsource.streamflow.web.domain.structure.organization.Organizations;
import se.streamsource.streamflow.web.domain.structure.project.Member;
import se.streamsource.streamflow.web.domain.structure.project.Project;
import se.streamsource.streamflow.web.domain.structure.project.ProjectRole;
import se.streamsource.streamflow.web.domain.structure.user.Contactable;
import se.streamsource.streamflow.web.domain.structure.user.User;
import se.streamsource.streamflow.web.domain.structure.user.Users;
import java.util.ArrayList;
import java.util.List;
import static org.qi4j.api.usecase.UsecaseBuilder.*;
/**
* Generates test data
*/
@Mixins(TestDataService.Mixin.class)
public interface TestDataService
extends ServiceComposite, Activatable
{
class Mixin
implements Activatable
{
@Structure
Application app;
@Structure
Module module;
public void activate() throws Exception
{
ObjectBuilderFactory obf = module.objectBuilderFactory();
/*
Subject subject = new Subject();
subject.getPrincipals().add( new UserPrincipal("administrator") );
*/
UnitOfWork uow = module.unitOfWorkFactory().newUnitOfWork(newUsecase("Test data"));
RoleMap.newCurrentRoleMap();
UserEntity user = uow.get( UserEntity.class, UserEntity.ADMINISTRATOR_USERNAME );
RoleMap.current().set( new UserPrincipal("administrator") );
Organizations orgs = uow.get( Organizations.class, OrganizationsEntity.ORGANIZATIONS_ID );
Users users = uow.get( Users.class, UsersEntity.USERS_ID );
User testUser = users.createUser( "testuser", "testuser" );
User someUser = users.createUser( "someuser", "someuser" );
User someUser2 = users.createUser( "someuser2", "someuser2" );
// contact info on someuser
ValueBuilder<ContactDTO> contact = module.valueBuilderFactory().newValueBuilder(ContactDTO.class);
ValueBuilder<ContactEmailDTO> email = module.valueBuilderFactory().newValueBuilder(ContactEmailDTO.class);
email.prototype().emailAddress().set( "streamsourceflow@gmail.com" );
email.prototype().contactType().set( ContactEmailDTO.ContactType.WORK );
List<ContactEmailDTO> list = new ArrayList<ContactEmailDTO>();
list.add( email.newInstance() );
contact.prototype().emailAddresses().set( list );
((Contactable) someUser).updateContact( contact.newInstance() );
OrganizationEntity organization = (OrganizationEntity) user.organizations().iterator().next();
organization.changeDescription( "WayGroup" );
testUser.join( organization );
someUser.join( organization );
someUser2.join( organization );
Label question = organization.createLabel( "Question" );
Label issueChase = organization.createLabel( "Issue chase" );
Label suggestion = organization.createLabel( "Suggestion" );
Label minor = organization.createLabel( "Minor" );
Label major = organization.createLabel( "Major" );
Label critical = organization.createLabel( "Critical" );
// Create case types
CaseType newFeature = organization.createCaseType( "New feature" );
CaseType bug = organization.createCaseType( "Bug" );
bug.addSelectedLabel( minor );
bug.addSelectedLabel( major );
bug.addSelectedLabel( critical );
Resolution fixed = bug.createResolution( "Fixed" );
Resolution wontFix = bug.createResolution( "Won't fix" );
bug.addSelectedResolution( fixed );
bug.addSelectedResolution( wontFix );
CaseType improvement = organization.createCaseType( "Improvement" );
improvement.addSelectedLabel( minor );
improvement.addSelectedLabel( major );
Resolution implemented = improvement.createResolution( "Implemented" );
Resolution rejected = improvement.createResolution( "Rejected" );
improvement.addSelectedResolution( implemented );
improvement.addSelectedResolution( rejected );
CaseType complaint = organization.createCaseType( "Complaint" );
CaseType passwordReset = organization.createCaseType( "Reset password" );
// Create suborganizations
OrganizationalUnit jayway = organization.createOrganizationalUnit( "Jayway" );
OrganizationalUnit streamSource = organization.createOrganizationalUnit( "StreamSource" );
OrganizationalUnit admin = organization.createOrganizationalUnit( "Administration" );
// Create groups
Group developers = obf.newObjectBuilder(GroupsContext.class).use(jayway).newInstance().create("Developers");
Group admins = obf.newObjectBuilder(GroupsContext.class).use(admin).newInstance().create( "Administrators" );
developers.addParticipant( user );
developers.addParticipant( someUser );
admins.addParticipant( testUser );
admins.addParticipant( someUser );
ProjectRole agent = organization.createProjectRole( "Agent" );
ProjectRole manager = organization.createProjectRole( "Manager" );
// Create draft cases
for (int i = 0; i < 30; i++)
{
CaseEntity aCase = user.createDraft();
aCase.changeDescription( "Ärende " + i );
if (i > 20)
{
aCase.assignTo( user );
Conversation conversation = aCase.createConversation( "Questions " + i, testUser );
ConversationEntity conversationEntity = (ConversationEntity) conversation;
conversationEntity.addParticipant( testUser );
conversationEntity.addParticipant( someUser );
conversationEntity.addParticipant( someUser2 );
conversation.createMessage( "Test message " + i, MessageType.PLAIN, testUser );
conversation.createMessage( "In reply " + i, MessageType.PLAIN, someUser );
}
}
// Create project
Project project = jayway.createProject( "Streamflow" );
project.addSelectedCaseType( newFeature );
project.addSelectedCaseType( bug );
project.addSelectedCaseType( improvement );
Form bugreport = bug.createForm();
bugreport.changeDescription( "Bug Report" );
bugreport.changeNote( "A form to capture a bug report" );
ValueBuilder<TextFieldValue> builder = module.valueBuilderFactory().newValueBuilder(TextFieldValue.class);
builder.prototype().width().set( 30 );
ValueBuilder<DateFieldValue> dateBuilder = module.valueBuilderFactory().newValueBuilder(DateFieldValue.class);
ValueBuilder<NumberFieldValue> numberBuilder = module.valueBuilderFactory().newValueBuilder(NumberFieldValue.class);
ValueBuilder<OptionButtonsFieldValue> selectionBuilder = module.valueBuilderFactory().newValueBuilder(OptionButtonsFieldValue.class);
List<String> values = new ArrayList<String>();
values.add( "Critical" );
values.add( "High" );
values.add( "Normal" );
values.add( "Low" );
selectionBuilder.prototype().values().set( values );
Page page = bugreport.createPage( "General Info" );
page.createField( "Bugname", builder.newInstance() ).changeMandatory( true );
numberBuilder.prototype().integer().set( true );
page.createField( "Bug ID", numberBuilder.newInstance() ).changeMandatory( true );
page.createField( "Description", builder.newInstance() );
page = bugreport.createPage( "Date Information" );
page.createField( "Discovered", dateBuilder.newInstance() ).changeMandatory( true );
page.createField( "Priority", selectionBuilder.newInstance() ).changeMandatory( true );
values.clear();
values.add( "Server" );
values.add( "Client" );
page.createField( "Bug Location", selectionBuilder.newInstance() ).changeNote( "Indicate what part of the application the bug is. Optional" );
bug.addSelectedForm( bugreport );
Form statusForm = bug.createForm();
statusForm.changeDescription( "StatusForm" );
statusForm.changeNote( "This is the Status form. \nWhen urgencies occur please upgrade the status of the current aCase" );
page = statusForm.createPage( "Status Form" );
page.createField( "Status", builder.newInstance() ).changeMandatory( true );
bug.addSelectedForm( statusForm );
Form emailForm = improvement.createForm();
emailForm.changeDescription( "Email form" );
emailForm.changeNote( "Form for entering and sending an email" );
page = emailForm.createPage( "Email Form" );
page.createField( "To", builder.newInstance() ).changeNote( "Enter address of receiver. Note it must be a valid email" );
page.createField( "Subject", builder.newInstance() ).changeNote( "Subject of the mail" );
page.createField( "Content", builder.newInstance() ).changeNote( "Mail content" );
improvement.addSelectedForm( emailForm );
Form resetPasswordForm = passwordReset.createForm();
resetPasswordForm.changeDescription( "Reset password" );
resetPasswordForm.changeNote( "Reset password for a user" );
page = resetPasswordForm.createPage( "Reset password form" );
page.createField( "Username", builder.newInstance() ).changeNote( "Username whose password should be reset" );
passwordReset.addSelectedForm( resetPasswordForm );
Form complaintForm = complaint.createForm();
complaintForm.changeDescription( "Complaint" );
complaintForm.changeNote( "This form is to file in a complaint" );
page = complaintForm.createPage( "Complaint" );
page.createField( "Name", builder.newInstance() );
page.createField( "Email", builder.newInstance() );
page.createField( "Complaint", builder.newInstance() );
complaint.addSelectedForm( complaintForm );
// Create labels
project.addSelectedLabel( question );
project.addSelectedLabel( issueChase );
project.addSelectedLabel( suggestion );
for (int i = 0; i < 50; i++)
{
Label label = organization.createLabel( "Label " + i );
project.addSelectedLabel( label );
}
project.addMember( user );
// Create project
Project info2 = jayway.createProject( "StreamForm" );
info2.addSelectedCaseType( newFeature );
info2.addSelectedCaseType( bug );
info2.addSelectedCaseType( improvement );
info2.addMember( (Member) developers );
info2.addMember( user );
Project itSupport = admin.createProject( "IT support" );
itSupport.addSelectedCaseType( passwordReset );
itSupport.addMember( user );
Project invoicing = admin.createProject( "Invoicing" );
invoicing.addSelectedCaseType( complaint );
invoicing.addMember( user );
// Create cases
CaseEntity aCase = user.createDraft();
aCase.changeDescription( "Ärende 0" );
aCase.changeOwner( (Owner) project );
aCase.changeCaseType( bug );
aCase.open();
FormDraft formSubmission = aCase.createFormDraft( statusForm );
submitStatus( aCase, formSubmission, "Progress is slow", (Submitter) testUser );
submitStatus( aCase, formSubmission, "Progress is getting better", (Submitter) someUser );
for (int i = 1; i < 30; i++)
{
CaseEntity caze = user.createDraft();
caze.changeDescription( "Ärende " + i );
caze.changeOwner( (Owner) project );
caze.open();
}
// Access test data
ArrayList<Label> labels = new ArrayList<Label>();
labels.add( question );
organization.createAccessPoint( "ComplaintAccess", invoicing, complaint, labels );
organization.createdProxyUser( null, "surface", "surface", "surface" );
uow.complete();
}
private void submitStatus( Case aCase, FormDraft formSubmission, String status, Submitter submitter )
{
FormDraftDTO submissionDTO = (FormDraftDTO) formSubmission.getFormDraftValue().buildWith().prototype();
for (PageSubmissionDTO pageDTO : submissionDTO.pages().get())
{
for (FieldSubmissionDTO DTO : pageDTO.fields().get())
{
DTO.value().set( status );
}
}
formSubmission.changeFormDraftValue(submissionDTO);
aCase.submitForm( formSubmission, submitter );
}
public void passivate() throws Exception
{
}
}
}