/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.doc;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.hibernate.criterion.Restrictions;
import org.projectforge.access.AccessDao;
import org.projectforge.access.GroupTaskAccessDO;
import org.projectforge.core.BaseDO;
import org.projectforge.core.BaseDao;
import org.projectforge.core.QueryFilter;
import org.projectforge.task.TaskDO;
import org.projectforge.task.TaskDao;
import org.projectforge.task.TaskTree;
import org.projectforge.user.GroupDO;
import org.projectforge.user.GroupDao;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.ProjectForgeGroup;
import org.projectforge.user.UserDao;
import org.projectforge.user.UserGroupCache;
import org.projectforge.web.access.AccessEditPage;
import org.projectforge.web.task.TaskEditPage;
import org.projectforge.web.user.GroupEditPage;
import org.projectforge.web.user.UserEditPage;
import org.projectforge.web.wicket.AbstractEditPage;
import org.projectforge.web.wicket.AbstractSecuredPage;
import org.projectforge.web.wicket.MessagePage;
import org.projectforge.web.wicket.WicketUtils;
/**
* Standard error page should be shown in production mode.
*
* @author Kai Reinhard (k.reinhard@micromata.de)
*
*/
public class TutorialPage extends AbstractSecuredPage
{
private static final long serialVersionUID = 6326263860561990911L;
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TutorialPage.class);
private static final String KEY_TYPE = "type";
private static final String KEY_REF = "ref";
private static final String TYPE_CREATE_ACCESS = "createAccess";
private static final String TYPE_CREATE_GROUP = "createGroup";
private static final String TYPE_CREATE_USER = "createUser";
private static final String TYPE_CREATE_TASK = "createTask";
private static final String REF_TASK_JAVA_GURUS = "JavaGurus";
private static final String REF_TASK_ACME_WEBPORTAL = "ACME-WebPortal";
private static final String REF_GROUP_JAVA_GURUS = "JavaGurusEmployees";
private static final String REF_GROUP_ACME_WEBPORTAL = "ACME-WebPortal-Team";
private static final String ACCESS_TEMPLATE_EMPLOYEE = "employee";
private final String type;
private final String reference;
@SpringBean(name = "accessDao")
private AccessDao accessDao;
@SpringBean(name = "groupDao")
private GroupDao groupDao;
@SpringBean(name = "userDao")
private UserDao userDao;
@SpringBean(name = "userGroupCache")
private UserGroupCache userGroupCache;
@SpringBean(name = "taskDao")
private TaskDao taskDao;
@SpringBean(name = "taskTree")
private TaskTree taskTree;
public TutorialPage(final PageParameters params)
{
super(params);
type = WicketUtils.getAsString(params, KEY_TYPE);
reference = WicketUtils.getAsString(params, KEY_REF);
if (TYPE_CREATE_USER.equals(type) == true) {
createUser();
} else if (TYPE_CREATE_GROUP.equals(type) == true) {
createGroup();
} else if (TYPE_CREATE_TASK.equals(type) == true) {
createTask();
} else if (TYPE_CREATE_ACCESS.equals(type) == true) {
createAccess();
} else {
log.warn("Unknown tutorial request: type=" + type);
setResponsePage(new MessagePage("tutorial.unknown").setWarning(true));
}
}
private void createUser()
{
final String tutorialReference = getTutorialReference(reference);
if (doesEntryAlreadyExist(userDao, tutorialReference) == true) {
return;
}
final PFUserDO user;
List<Integer> groupsToAdd = null;
if ("linda".equals(reference) == true) {
user = createUser("linda", "Evans", "Linda", "l.evans@javagurus.com", addTutorialReference("Project manager", tutorialReference));
groupsToAdd = addGroups(user, ProjectForgeGroup.PROJECT_MANAGER);
} else if ("dave".equals(reference) == true) {
user = createUser("dave", "Jones", "Dave", "d.jones@javagurus.com", addTutorialReference("Developer", tutorialReference));
} else if ("betty".equals(reference) == true) {
user = createUser("betty", "Brown", "Betty", "b.brown@javagurus.com", addTutorialReference("Developer", tutorialReference));
} else {
log.warn("Unknown tutorial request: user=" + reference);
setResponsePage(new MessagePage("tutorial.unknown").setWarning(true));
return;
}
final UserEditPage userEditPage = new UserEditPage(user, groupsToAdd);
setResponsePage(userEditPage);
}
private String getTutorialReference(final String reference)
{
return "{tutorial-ref:" + reference + "}";
}
private String addTutorialReference(final String text, final String tutorialReference)
{
if (StringUtils.isEmpty(text) == true) {
return tutorialReference;
} else {
return text + "\n" + tutorialReference;
}
}
private PFUserDO createUser(final String userName, final String lastName, final String firstName, final String email,
final String description)
{
final PFUserDO user = new PFUserDO();
user.setUsername(userName);
user.setEmail(email);
user.setLastname(lastName);
user.setFirstname(firstName);
user.setDescription(description);
return user;
}
private List<Integer> addGroups(final PFUserDO user, final ProjectForgeGroup... groups)
{
final List<Integer> groupsToAssign = new ArrayList<Integer>();
final GroupDO group = userGroupCache.getGroup(ProjectForgeGroup.PROJECT_MANAGER);
groupsToAssign.add(group.getId());
return groupsToAssign;
}
private void createTask()
{
final String tutorialReference = getTutorialReference(reference);
if (doesEntryAlreadyExist(taskDao, tutorialReference) == true) {
return;
}
final TaskDO task;
if (REF_TASK_JAVA_GURUS.equals(reference) == true) {
task = createTask(taskTree.getRootTaskNode().getTask(), "Java Gurus inc.", tutorialReference);
} else if (REF_TASK_ACME_WEBPORTAL.equals(reference) == true) {
task = createTask(taskTree.getRootTaskNode().getTask(), "ACME web portal", tutorialReference);
} else {
log.warn("Unknown tutorial request: task=" + reference);
setResponsePage(new MessagePage("tutorial.unknown").setWarning(true));
return;
}
final TaskEditPage taskEditPage = new TaskEditPage(task);
setResponsePage(taskEditPage);
}
private TaskDO createTask(final TaskDO parentTask, final String title, final String description)
{
final TaskDO task = new TaskDO();
task.setParentTask(parentTask);
task.setTitle(title);
task.setDescription(description);
return task;
}
private void createGroup()
{
final String tutorialReference = getTutorialReference(reference);
if (doesEntryAlreadyExist(groupDao, tutorialReference) == true) {
return;
}
final GroupDO group;
if (REF_GROUP_JAVA_GURUS.equals(reference) == true) {
group = createGroup("JavaGurus employees", "linda", "dave", "betty");
} else if (REF_GROUP_ACME_WEBPORTAL.equals(reference) == true) {
group = createGroup("ACME web portal team", "linda", "dave", "betty");
} else {
log.warn("Unknown tutorial request: group=" + reference);
setResponsePage(new MessagePage("tutorial.unknown").setWarning(true));
return;
}
if (group != null) {
group.setDescription(tutorialReference);
final GroupEditPage groupEditPage = new GroupEditPage(group);
setResponsePage(groupEditPage);
}
}
private GroupDO createGroup(final String name, final String... usernames)
{
final GroupDO group = new GroupDO();
group.setName(name);
if (usernames != null) {
for (final String username : usernames) {
final PFUserDO user = getRequiredUser(username);
if (user == null) {
return null;
}
group.addUser(user);
}
}
return group;
}
private void createAccess()
{
final String tutorialReference = getTutorialReference(reference);
if (doesEntryAlreadyExist(accessDao, tutorialReference) == true) {
return;
}
final GroupTaskAccessDO access;
TaskDO task = null;
GroupDO group = null;
if ("JavaGurusEmployees".equals(reference) == true) {
task = getRequiredTask(REF_TASK_JAVA_GURUS);
group = getRequiredGroup(REF_GROUP_JAVA_GURUS);
access = createAccess(task, group, ACCESS_TEMPLATE_EMPLOYEE, tutorialReference);
} else if ("ACME-WebPortal".equals(reference) == true) {
task = getRequiredTask(REF_TASK_ACME_WEBPORTAL);
group = getRequiredGroup(REF_GROUP_ACME_WEBPORTAL);
access = createAccess(task, group, ACCESS_TEMPLATE_EMPLOYEE, tutorialReference);
} else {
log.warn("Unknown tutorial request: task=" + reference);
setResponsePage(new MessagePage("tutorial.unknown").setWarning(true));
return;
}
if (task == null || group == null) {
return;
}
final AccessEditPage accessEditPage = new AccessEditPage(access);
setResponsePage(accessEditPage);
}
private GroupTaskAccessDO createAccess(final TaskDO task, final GroupDO group, final String template, final String description)
{
final GroupTaskAccessDO access = new GroupTaskAccessDO();
access.setTask(task);
access.setGroup(group);
if (ACCESS_TEMPLATE_EMPLOYEE.equals(template) == true) {
access.employee();
}
access.setDescription(description);
return access;
}
private boolean doesEntryAlreadyExist(final BaseDao< ? > dao, final String tutorialReference)
{
final BaseDO< ? > obj = getEntry(dao, tutorialReference);
if (obj != null) {
if (obj instanceof PFUserDO) {
setResponsePage(new UserEditPage(createEditPageParameters(obj)));
} else if (obj instanceof GroupDO) {
setResponsePage(new GroupEditPage(createEditPageParameters(obj)));
} else if (obj instanceof TaskDO) {
setResponsePage(new TaskEditPage(createEditPageParameters(obj)));
} else if (obj instanceof GroupTaskAccessDO) {
setResponsePage(new AccessEditPage(createEditPageParameters(obj)));
} else {
setResponsePage(new MessagePage("tutorial.objectAlreadyCreated", tutorialReference).setWarning(true));
}
return true;
}
return false;
}
private PageParameters createEditPageParameters(final BaseDO< ? > obj)
{
final PageParameters params = new PageParameters();
params.add(AbstractEditPage.PARAMETER_KEY_ID, obj.getId());
return params;
}
private BaseDO< ? > getEntry(final BaseDao< ? > dao, final String tutorialReference)
{
final QueryFilter filter = new QueryFilter();
filter.add(Restrictions.ilike("description", "%" + tutorialReference + "%"));
final List< ? > list = dao.internalGetList(filter);
if (CollectionUtils.isNotEmpty(dao.internalGetList(filter)) == true) {
return (BaseDO< ? >) list.get(0);
}
return null;
}
private GroupDO getRequiredGroup(final String reference)
{
final GroupDO group = (GroupDO) getEntry(groupDao, getTutorialReference(reference));
if (group == null) {
setResponsePage(new MessagePage("tutorial.expectedGroupNotFound", reference).setWarning(true));
}
return group;
}
private PFUserDO getRequiredUser(final String reference)
{
final PFUserDO user = (PFUserDO) getEntry(userDao, getTutorialReference(reference));
if (user == null) {
setResponsePage(new MessagePage("tutorial.expectedUserNotFound", reference).setWarning(true));
}
return user;
}
private TaskDO getRequiredTask(final String reference)
{
final TaskDO task = (TaskDO) getEntry(taskDao, getTutorialReference(reference));
if (task == null) {
setResponsePage(new MessagePage("tutorial.expectedTaskNotFound", reference).setWarning(true));
}
return task;
}
@Override
protected String getTitle()
{
return "TutorialRedirectPage";
}
}