package hu.sch.web.kp.group;
import hu.sch.domain.user.User;
import hu.sch.domain.*;
import hu.sch.util.PatternHolder;
import hu.sch.web.kp.KorokPage;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.io.IClusterable;
import org.apache.wicket.util.string.StringValueConversionException;
import org.apache.wicket.validation.validator.PatternValidator;
import org.apache.wicket.validation.validator.StringValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author aldaris
*/
public final class ChangePost extends KorokPage {
private static Logger log = LoggerFactory.getLogger(ChangePost.class);
private String postName;
private Boolean isDelegatedPost;
public ChangePost(final PageParameters params) {
Long memberId;
try {
memberId = params.get("memberid").toLong();
} catch (StringValueConversionException svce) {
error("Hibás paraméter!");
throw new RestartResponseException(getApplication().getHomePage());
}
final Membership ms = membershipManager.findMembership(memberId);
if (ms == null) {
error("Hibás paraméter!");
throw new RestartResponseException(getApplication().getHomePage());
}
setHeaderLabelText("Jog megadása");
//kell, hogy a csoporttagságok is betöltődjenek
Group group = ms.getGroup();
membershipManager.fetchMembershipsFor(group);
User user = ms.getUser();
if (!isUserGroupLeader(group) && !hasUserDelegatedPostInGroup(group)) {
getSession().error("Nincs jogod a megadott művelethez");
throw new RestartResponseException(getApplication().getHomePage());
}
if (user == null) {
getSession().error("Hibás adatok");
throw new RestartResponseException(ShowGroup.class, new PageParameters().add("id", group.getId()));
}
add(new Label("groupname", group.getName()));
add(new Label("username", user.getFullName()));
final Input input = new Input(ms);
setDefaultModel(new CompoundPropertyModel<Input>(input));
Form form = new Form("changePost") {
@Override
protected void onSubmit() {
//A formon bevitt adatok
List<PostType> newRights = input.getChoices();
//Az eltávolítandó posztok
List<Post> removedPosts = new ArrayList<Post>();
//A körtag eredeti posztjai
Set<Post> posts = ms.getPosts();
Iterator<Post> iterator = posts.iterator();
while (iterator.hasNext()) {
Post temp = iterator.next();
if (newRights.contains(temp.getPostType())) {
newRights.remove(temp.getPostType());
} else {
if (temp.getPostType().getPostName().equals(PostType.KORVEZETO)) {
getSession().error("A körvezetői posztot nem szüntetheted meg, azt csak átruházni lehet egy másik körtagra.");
throw new RestartResponseException(ShowGroup.class, new PageParameters().add("id", ms.getGroup().getId()));
}
removedPosts.add(temp);
}
}
Iterator<PostType> it = newRights.iterator();
while (it.hasNext()) {
PostType temp = it.next();
if (temp.getPostName().equals(PostType.KORVEZETO)) {
it.remove();
if (isUserGroupLeader(ms.getGroup())) {
try {
postManager.changeGroupLeader(ms, temp);
} catch (Exception ex) {
getSession().error(ex.getCause().getMessage());
throw new RestartResponseException(ChangePost.class, new PageParameters().add("memberid", ms.getId()));
}
} else {
log.warn("A következő felhasználó: " + getUser().getId() + " megpróbált a delegált posztjával körvezetővé válni, "
+ "vagy a körvezető személyét valaki másra megváltoztatni! A kezdeményezett fél: " + ms.getUser().getId());
getSession().error("Ez most nem volt szép Tőled, nemsokára jön is érted a fekete kocsi");
throw new RestartResponseException(ShowGroup.class, new PageParameters().add("id", ms.getGroup().getId()));
}
break;
}
}
postManager.setPostsForMembership(ms, removedPosts, newRights);
getSession().info("A beállítások sikeresen mentésre kerültek");
setResponsePage(ShowGroup.class, new PageParameters().add("id", ms.getGroup().getId()));
}
};
List<PostType> postTypes = postManager.getAvailablePostTypesForGroup(group);
CheckBoxMultipleChoice<PostType> multipleChoice =
new CheckBoxMultipleChoice<PostType>("choices", postTypes);
multipleChoice.setChoiceRenderer(new IChoiceRenderer<PostType>() {
@Override
public Object getDisplayValue(PostType object) {
if (object.getDelegatedPost()) {
return object.toString() + " (delegált)";
} else {
return object.toString();
}
}
@Override
public String getIdValue(PostType object, int index) {
return object.toString();
}
});
form.add(multipleChoice);
add(form);
Form<Void> createPostTypeForm = new Form<Void>("postTypeForm") {
@Override
protected void onSubmit() {
if (log.isDebugEnabled()) {
log.debug("Creating new posttype (" + postName + ") for group: " + ms.getGroup());
}
if (postManager.createPostType(postName, ms.getGroup(), isDelegatedPost)) {
getSession().info("Az új poszt sikeresen elkészült.");
setResponsePage(ChangePost.class, params);
} else {
getSession().error("Az új poszt létrehozása közben hiba lépett fel, "
+ "valószínűleg egy már létező posztot szerettél volna újra felvenni.");
}
}
};
RequiredTextField<String> postNameTF =
new RequiredTextField<String>("postNameTF", new PropertyModel<String>(this, "postName"));
postNameTF.add(StringValidator.lengthBetween(2, 30));
postNameTF.add(new PatternValidator(PatternHolder.GROUP_NAME_OR_POSTTYPE_PATTERN));
CheckBox delegatedBox = new CheckBox("delegatedBox", new PropertyModel<Boolean>(this, "isDelegatedPost"));
createPostTypeForm.add(delegatedBox);
createPostTypeForm.add(postNameTF);
add(createPostTypeForm);
}
private class Input implements IClusterable {
List<PostType> choices = new ArrayList<PostType>();
Membership cst = null;
public Input(Membership ms) {
List<Post> posts = postManager.getCurrentPostsForGroup(ms);
for (Post post : posts) {
choices.add(post.getPostType());
}
}
public List<PostType> getChoices() {
return choices;
}
public void setChoices(List<PostType> temp) {
choices = temp;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (PostType postType : choices) {
sb.append(postType.toString());
}
return sb.toString();
}
}
}