package is.idega.idegaweb.member.presentation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import com.idega.event.IWLinkEvent;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.idegaweb.help.presentation.Help;
import com.idega.presentation.IWContext;
import com.idega.presentation.Image;
import com.idega.presentation.text.Text;
import com.idega.presentation.ui.IFrame;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.GroupRelation;
import com.idega.user.data.GroupRelationHome;
import com.idega.user.data.User;
import com.idega.user.data.UserStatus;
import com.idega.user.data.UserStatusHome;
import com.idega.user.presentation.UserGroupList;
import com.idega.user.presentation.UserTab;
/**
* @author Laddi
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class UserHistoryTab extends UserTab {
private static final String IW_BUNDLE_IDENTIFIER = "is.idega.idegaweb.member";
private static final String TAB_NAME = "usr_his_tab_name";
private static final String DEFAULT_TAB_NAME = "History";
private static final String MEMBER_HELP_BUNDLE_IDENTIFIER = "is.idega.idegaweb.member.isi";
private static final String HELP_TEXT_KEY = "user_history_tab";
private IFrame memberofFrame;
public static final String PARAMETER_USER_ID = "ic_user_id";
public static final String SESSIONADDRESS_USERGROUPS_HISTORY =
"ic_user_ic_group_history";
public static final String SESSIONADDRESS_USERGROUPS_STATUS =
"ic_user_ic_group_status";
protected Text memberof;
public UserHistoryTab() {
super();
IWContext iwc = IWContext.getInstance();
IWResourceBundle iwrb = getResourceBundle(iwc);
setName(iwrb.getLocalizedString(TAB_NAME, DEFAULT_TAB_NAME));
}
public void initFieldContents() {
updateFieldsDisplayStatus();
}
public void updateFieldsDisplayStatus() {
}
public void initializeFields() {
this.memberofFrame = new IFrame("ic_user_history", UserHistoryList.class);
this.memberofFrame.setHeight(280);
this.memberofFrame.setWidth("100%");
this.memberofFrame.setStyleAttribute("border", "1px #bbbbbb solid;");
this.memberofFrame.setScrolling(IFrame.SCROLLING_YES);
}
public void actionPerformed(IWLinkEvent e) {
this.collect(e.getIWContext());
}
public void initializeTexts() {
IWContext iwc = IWContext.getInstance();
IWResourceBundle iwrb = getResourceBundle(iwc);
// memberof = this.getTextObject();
this.memberof = new Text(iwrb.getLocalizedString("usr_history","History"));
this.memberof.setBold();
}
public boolean store(IWContext iwc) {
return true;
}
public void lineUpFields() {
this.resize(1, 1);
setCellpadding(5);
setCellspacing(0);
this.add(this.memberof, 1, 1);
add(Text.getBreak(), 1, 1);
this.add(this.memberofFrame, 1, 1);
}
public boolean collect(IWContext iwc) {
return true;
}
public void initializeFieldNames() {
}
public void initializeFieldValues() {
updateFieldsDisplayStatus();
}
public void dispose(IWContext iwc) {
iwc.removeSessionAttribute(
UserGroupList.SESSIONADDRESS_USERGROUPS_DIRECTLY_RELATED);
}
public void main(IWContext iwc) throws Exception {
if (getPanel() != null) {
getPanel().addHelpButton(getHelpButton());
}
User viewedUser = getUser();
User viewingUser = iwc.getCurrentUser();
boolean isAdmin = iwc.isSuperAdmin();
boolean isSameUser = viewedUser.getPrimaryKey().equals(viewingUser.getPrimaryKey());
boolean checkNeeded = !(isAdmin || isSameUser);
System.out.println("User " + viewingUser.getName() + " is viewing user " + viewedUser.getName() + ", checkNeede=" + checkNeeded);
Collection groupRelations = ((GroupRelationHome) com.idega.data.IDOLookup.getHome(GroupRelation.class)).findAllGroupsRelationshipsByRelatedGroupOrderedByInitiationDate(getUserId(),"GROUP_PARENT");
if(checkNeeded) {
groupRelations = getFilteredGroupRelations(iwc, Collections.unmodifiableCollection(groupRelations), viewingUser);
}
if (groupRelations != null) {
iwc.setSessionAttribute(
UserHistoryTab.SESSIONADDRESS_USERGROUPS_HISTORY,
groupRelations);
}
else {
iwc.removeSessionAttribute(
UserHistoryTab.SESSIONADDRESS_USERGROUPS_HISTORY);
}
Collection statuses = ((UserStatusHome) com.idega.data.IDOLookup.getHome(UserStatus.class)).findAllByUserId(getUserId());
if(checkNeeded) {
statuses = getFilteredStatuses(iwc, Collections.unmodifiableCollection(statuses), viewingUser);
}
if (statuses != null) {
iwc.setSessionAttribute(
UserHistoryTab.SESSIONADDRESS_USERGROUPS_STATUS,
statuses);
}
else {
iwc.removeSessionAttribute(
UserHistoryTab.SESSIONADDRESS_USERGROUPS_STATUS);
}
}
/**
* Filters Statuses by users persmission to see groups. Only statuses pertaining to a groups that are descendants of one of users top group
* nodes are returned
* @param iwc IWContext
* @param statuses The Statuses to filter
* @param user The user whos top groups nodes are used for the filtering
* @return All the Statuses in <code>statuses</code> that are for a group that is a descendant of one of <code>user</code> top groups
*/
private Collection getFilteredStatuses(IWContext iwc, Collection statuses, User user) {
Collection result = new ArrayList();
UserBusiness userBusiness = this.getUserBusiness(iwc);
Iterator statusIter = statuses.iterator();
while(statusIter.hasNext()) {
UserStatus status = (UserStatus) statusIter.next();
boolean ok = false;
if (status.getGroupId() != -1) {
ok = iwc.getAccessController().hasViewPermissionFor(status.getGroup(), iwc);
}
if(ok) {
result.add(status);
} else {
if (status.getGroupId() != -1) {
System.out.println("User status in group " + status.getGroup().getName() + " is filtered out");
} else {
System.out.println("User status: "+status.getStatus().getStatusKey()+" that was set: "+status.getDateFrom() + " is filtered out");
}
}
}
return result;
}
/**
* Filters GroupRelations by users persmission to see groups. Only GroupRelations pertaining to groups that are descendants of
* one of users top group nodes are returned
* @param iwc IWContext
* @param groupRelations The GroupRelations to filter
* @param user The user whos top groups nodes are used for the filtering
* @return All the GroupRelations in <code>groupRelations</code> that are for groups that are both descendants of one of <code>user</code> top groups
*/
private Collection getFilteredGroupRelations(IWContext iwc, Collection groupRelations, User user) {
Collection result = new ArrayList();
UserBusiness userBusiness = this.getUserBusiness(iwc);
Iterator groupRelationIter = groupRelations.iterator();
while(groupRelationIter.hasNext()) {
GroupRelation rel = (GroupRelation) groupRelationIter.next();
boolean ok = false;
ok = iwc.getAccessController().hasViewPermissionFor(rel.getGroup(), iwc);
if(ok) {
result.add(rel);
} else {
System.out.println("Group relation between " + rel.getGroup().getName() + " and " + rel.getRelatedGroup().getName() + " not shown");
}
}
return result;
}
public Help getHelpButton() {
IWContext iwc = IWContext.getInstance();
IWBundle iwb = getBundle(iwc);
Help help = new Help();
Image helpImage = iwb.getImage("help.gif");
help.setHelpTextBundle( MEMBER_HELP_BUNDLE_IDENTIFIER);
help.setHelpTextKey(HELP_TEXT_KEY);
help.setImage(helpImage);
return help;
}
public String getBundleIdentifier() {
return IW_BUNDLE_IDENTIFIER;
}
}