package com.idega.builder.presentation; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import com.idega.builder.business.BuilderLogic; import com.idega.core.accesscontrol.business.AccessControl; import com.idega.core.accesscontrol.business.AccessController; import com.idega.builder.business.BuilderConstants; import com.idega.core.component.business.ICObjectBusiness; import com.idega.core.data.GenericGroup; import com.idega.core.user.business.UserGroupBusiness; import com.idega.idegaweb.IWConstants; import com.idega.idegaweb.IWResourceBundle; import com.idega.presentation.Block; import com.idega.presentation.IWContext; import com.idega.presentation.Table; import com.idega.presentation.text.Text; import com.idega.presentation.ui.DropdownMenu; import com.idega.presentation.ui.Form; import com.idega.presentation.ui.HiddenInput; import com.idega.presentation.ui.SelectionBox; import com.idega.presentation.ui.SelectionDoubleBox; import com.idega.presentation.ui.SubmitButton; /** * Title: idegaclasses * Description: * Copyright: Copyright (c) 2001 * Company: idega * @author <a href="mailto:gummi@idega.is">Gu�mundur �g�st S�mundsson</a> * @version 1.0 */ public class IBPermissionWindow extends IBAdminWindow{ private static final String ic_object_id_parameter = BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER; private static final String ib_page_parameter = BuilderConstants.IB_PAGE_PARAMETER; public static final String _PARAMETERSTRING_IDENTIFIER = AccessController._PARAMETERSTRING_IDENTIFIER; public static final String _PARAMETERSTRING_PERMISSION_CATEGORY = AccessController._PARAMETERSTRING_PERMISSION_CATEGORY; private static final String permissionKeyParameterString = "permission_type"; private static final String lastPermissionKeyParameterString = "last_permission_key"; private static final String permissionGroupParameterString = "permission_groups"; private static final String SessionAddressPermissionMap = "ib_permission_hashtable"; private static final String SessionAddressPermissionMapOldValue = "ib_permission_hashtable_old_value"; private boolean collectOld = false; private IWResourceBundle iwrb; public IBPermissionWindow() { setWidth(330); setHeight(210); setScrollbar(false); } private Table lineUpElements(IWContext iwc,String permissionType) throws Exception{ String identifier = iwc.getParameter(_PARAMETERSTRING_IDENTIFIER); String category = iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY); Table frameTable = new Table(1,4); if(identifier != null && category != null){ int intPermissionCategory = Integer.parseInt(category); frameTable.setWidth("100%"); frameTable.setAlignment(1,1,"left"); frameTable.setAlignment(1,2,"center"); frameTable.setAlignment(1,3,"right"); frameTable.setCellspacing(4); // PermissionString Text permissionKeyText = new Text(this.iwrb.getLocalizedString("permission_key","Permission Key")+":"+Text.NON_BREAKING_SPACE+Text.NON_BREAKING_SPACE); permissionKeyText.setFontStyle(IWConstants.BUILDER_FONT_STYLE_LARGE); DropdownMenu permissionTypes = new DropdownMenu(permissionKeyParameterString); permissionTypes.keepStatusOnAction(); permissionTypes.setOnChange("selectAllInSelectionBox(this.form."+permissionGroupParameterString+"_left);selectAllInSelectionBox(this.form."+permissionGroupParameterString+")"); permissionTypes.setToSubmit(); permissionTypes.setStyleAttribute(IWConstants.BUILDER_FONT_STYLE_INTERFACE); String[] keys = null; Class objectClass = null; switch (intPermissionCategory) { case AccessController.CATEGORY_OBJECT_INSTANCE : objectClass = ICObjectBusiness.getInstance().getICObjectClassForInstance(Integer.parseInt(identifier)); keys = iwc.getAccessController().getICObjectPermissionKeys(objectClass); break; case AccessController.CATEGORY_OBJECT : objectClass = ICObjectBusiness.getInstance().getICObjectClass(Integer.parseInt(identifier)); keys = iwc.getAccessController().getICObjectPermissionKeys(objectClass); break; case AccessController.CATEGORY_BUNDLE : keys = iwc.getAccessController().getBundlePermissionKeys(identifier); break; case AccessController.CATEGORY_PAGE_INSTANCE : keys = iwc.getAccessController().getPagePermissionKeys(); break; case AccessController.CATEGORY_PAGE : keys = iwc.getAccessController().getPagePermissionKeys(); break; case AccessController.CATEGORY_JSP_PAGE : keys = new String[0]; break; } for (int i = 0; i < keys.length; i++) { permissionTypes.addMenuElement(keys[i],keys[i]); } if(objectClass !=null){ Object o = objectClass.newInstance(); if(o instanceof Block){ String[] blockKeys = ( (Block) o ).getPermissionKeys(); if(blockKeys !=null){ for (int i = 0; i < blockKeys.length; i++) { permissionTypes.addMenuElement(blockKeys[i],blockKeys[i]); } } } } if(permissionType != null){ permissionTypes.setSelectedElement(permissionType); } else if(keys.length > 0){ permissionType = keys[0]; } //PermissionGroups SelectionDoubleBox permissionBox = new SelectionDoubleBox(permissionGroupParameterString,"Unspecified","Allowed"); SelectionBox left = permissionBox.getLeftBox(); Text leftText = new Text("Unspecified"); leftText.setFontStyle(IWConstants.BUILDER_FONT_STYLE_SMALL); left.setTextHeading(leftText); left.setHeight(8); left.selectAllOnSubmit(); left.setStyleAttribute(IWConstants.BUILDER_FONT_STYLE_INTERFACE+"width:130px"); SelectionBox right = permissionBox.getRightBox(); Text rightText = new Text("Allowed"); rightText.setFontStyle(IWConstants.BUILDER_FONT_STYLE_SMALL); right.setTextHeading(rightText); right.setHeight(8); right.selectAllOnSubmit(); right.setStyleAttribute(IWConstants.BUILDER_FONT_STYLE_INTERFACE+"width:130px"); Map hash = (Map)iwc.getSessionAttribute(IBPermissionWindow.SessionAddressPermissionMap); List directGroups = null; if(hash != null && hash.get(permissionType)!=null){ directGroups = UserGroupBusiness.getGroups((String[])hash.get(permissionType)); this.collectOld = false; } else { directGroups = iwc.getAccessController().getAllowedGroups(intPermissionCategory, identifier,permissionType); this.collectOld = true; } Iterator iter = null; if(directGroups != null){ iter = directGroups.iterator(); if(this.collectOld){ List oldValueIDs = new Vector(); while (iter.hasNext()) { Object item = iter.next(); String groupId = Integer.toString(((GenericGroup)item).getID()); right.addElement(groupId,((GenericGroup)item).getName()); oldValueIDs.add(groupId); } this.collectOldValues(iwc,oldValueIDs, permissionType); } else { while (iter.hasNext()) { Object item = iter.next(); String groupId = Integer.toString(((GenericGroup)item).getID()); right.addElement(groupId,((GenericGroup)item).getName()); } } } List notDirectGroups = iwc.getAccessController().getAllPermissionGroups(); if(notDirectGroups != null){ if(directGroups != null){ notDirectGroups.removeAll(directGroups); } iter = notDirectGroups.iterator(); while (iter.hasNext()) { Object item = iter.next(); left.addElement(Integer.toString(((GenericGroup)item).getID()),((GenericGroup)item).getName()); } } // Submit SubmitButton submit = new SubmitButton(this.iwrb.getLocalizedImageButton("ok","OK"),"submit"); SubmitButton cancel = new SubmitButton(this.iwrb.getLocalizedImageButton("cancel","Cancel"),"cancel"); frameTable.add(permissionKeyText,1,1); frameTable.add(permissionTypes,1,1); frameTable.add(permissionBox,1,2); frameTable.add(submit,1,3); frameTable.add(Text.getNonBrakingSpace(),1,3); frameTable.add(cancel,1,3); frameTable.add(new HiddenInput(lastPermissionKeyParameterString, permissionType )); } return frameTable; } public void main(IWContext iwc)throws Exception{ boolean submit = iwc.isParameterSet("submit"); boolean cancel = iwc.isParameterSet("cancel"); Form myForm = new Form(); myForm.setToShowLoadingOnSubmit(false); myForm.maintainParameter(_PARAMETERSTRING_IDENTIFIER); myForm.maintainParameter(_PARAMETERSTRING_PERMISSION_CATEGORY); this.iwrb = iwc.getIWMainApplication().getBundle(BuilderLogic.IW_BUNDLE_IDENTIFIER).getResourceBundle(iwc); super.addTitle(this.iwrb.getLocalizedString("ib_permission_window","Permissions"),IWConstants.BUILDER_FONT_STYLE_TITLE); //System.out.println("_PARAMETERSTRING_PERMISSION_CATEGORY: "+iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)+" and _PARAMETERSTRING_IDENTIFIER: "+iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)); if(submit){ String permissionType = iwc.getParameter(permissionKeyParameterString); if(permissionType != null){ this.collect(iwc); this.store(iwc); this.dispose(iwc); this.close(); } else { this.add("ERROR: nothing to save"); } //this.setParentToReload(); } else if(cancel){ this.dispose(iwc); this.close(); } else { String permissionType = iwc.getParameter(permissionKeyParameterString); if(permissionType != null){ collect(iwc); } myForm.add(this.lineUpElements(iwc,permissionType)); } this.add(myForm); } private void collect(IWContext iwc){ Object obj = iwc.getSessionAttribute(SessionAddressPermissionMap); Map hash = null; if(obj != null){ hash = (Map)obj; if(!hash.get(_PARAMETERSTRING_IDENTIFIER).equals(iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)) && !hash.get(_PARAMETERSTRING_PERMISSION_CATEGORY).equals(iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY))){ hash = new Hashtable(); hash.put(_PARAMETERSTRING_IDENTIFIER,iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)); hash.put(_PARAMETERSTRING_PERMISSION_CATEGORY,iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)); iwc.setSessionAttribute(SessionAddressPermissionMap,hash); } }else{ hash = new Hashtable(); hash.put(_PARAMETERSTRING_IDENTIFIER,iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)); hash.put(_PARAMETERSTRING_PERMISSION_CATEGORY,iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)); iwc.setSessionAttribute(SessionAddressPermissionMap,hash); } String[] groups = iwc.getParameterValues(permissionGroupParameterString); if(groups != null){ hash.put(iwc.getParameter(lastPermissionKeyParameterString),groups); } else{ hash.put(iwc.getParameter(lastPermissionKeyParameterString),new String[0]); } } private void collectOldValues(IWContext iwc, List groups, String permissionKey){ Object obj = iwc.getSessionAttribute(SessionAddressPermissionMapOldValue); Map hash = null; if(obj != null){ hash = (Map)obj; if(!hash.get(_PARAMETERSTRING_IDENTIFIER).equals(iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)) && !hash.get(_PARAMETERSTRING_PERMISSION_CATEGORY).equals(iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY))){ hash = new Hashtable(); hash.put(_PARAMETERSTRING_IDENTIFIER,iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)); hash.put(_PARAMETERSTRING_PERMISSION_CATEGORY,iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)); iwc.setSessionAttribute(SessionAddressPermissionMapOldValue,hash); } }else{ hash = new Hashtable(); hash.put(_PARAMETERSTRING_IDENTIFIER,iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)); hash.put(_PARAMETERSTRING_PERMISSION_CATEGORY,iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)); iwc.setSessionAttribute(SessionAddressPermissionMapOldValue,hash); } if(hash.get(permissionKey) == null){ if(groups != null){ hash.put(permissionKey,groups); } else{ hash.put(permissionKey,new Vector()); } } } private void store(IWContext iwc) throws Exception { Object obj = iwc.getSessionAttribute(SessionAddressPermissionMap); Object oldObj= iwc.getSessionAttribute(SessionAddressPermissionMapOldValue); if(obj != null && oldObj != null){ Map map = (Map)obj; Map oldMap = (Map)oldObj; String instanceId = (String)map.remove(_PARAMETERSTRING_IDENTIFIER); String category = (String)map.remove(_PARAMETERSTRING_PERMISSION_CATEGORY); if((instanceId != null && instanceId.equals(iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)) && instanceId.equals(oldMap.get(_PARAMETERSTRING_IDENTIFIER)))&&(category != null && category.equals(iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY)) && category.equals(oldMap.get(_PARAMETERSTRING_PERMISSION_CATEGORY)))){ Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object item = iter.next(); String[] groups = (String[])map.get(item); List oldGroups = (List)oldMap.get(item); if(oldGroups == null){ oldGroups = new Vector(); } int intCategory = Integer.parseInt(category); for (int i = 0; i < groups.length; i++) { oldGroups.remove(groups[i]); iwc.getAccessController().setPermission(intCategory, iwc, groups[i],instanceId,(String)item,Boolean.TRUE); } if(oldGroups.size()>0){ String[] groupsToRemove = new String[oldGroups.size()]; Iterator iter2 = oldGroups.iterator(); int index2 = 0; while (iter2.hasNext()) { groupsToRemove[index2++] = (String)iter2.next(); } AccessControl.removePermissionRecords(intCategory,iwc, instanceId,(String)item, groupsToRemove); } } }else{ dispose(iwc); throw new RuntimeException("identifier or permissionCategory not set or does not match"); } } } private void dispose(IWContext iwc){ try { iwc.removeSessionAttribute(SessionAddressPermissionMap); } catch (Exception ex) { } try { iwc.removeSessionAttribute(SessionAddressPermissionMapOldValue); } catch (Exception ex) { } } }