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.BuilderConstants;
import com.idega.builder.business.BuilderLogic;
import com.idega.core.accesscontrol.business.AccessControl;
import com.idega.core.accesscontrol.business.AccessController;
import com.idega.core.builder.business.ICBuilderConstants;
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.Heading3;
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;
import com.idega.presentation.ui.Window;
import com.idega.util.CoreConstants;
import com.idega.util.PresentationUtil;
/**
* 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 Window {
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;
private boolean needCancelButton = true;
private boolean componentIsInLightBox;
public IBPermissionWindow() {
setWidth(370);
setHeight(260);
setScrollbar(false);
}
private Table lineUpElements(IWContext iwc, String permissionType) throws Exception {
String componentId = iwc.getParameter(_PARAMETERSTRING_IDENTIFIER);
String category = iwc.getParameter(_PARAMETERSTRING_PERMISSION_CATEGORY);
//if componentid is a uuid then convert it to icobjectid.
String identifier = null;
Table frameTable = new Table(1, 4);
if (componentId != 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:
int icObjectInstanceId = getBuilderLogic().getIBXMLReader().getICObjectInstanceIdFromComponentId(componentId, null, null);
identifier = String.valueOf(icObjectInstanceId);
objectClass = ICObjectBusiness.getInstance().getICObjectClassForInstance(icObjectInstanceId);
keys = iwc.getAccessController().getICObjectPermissionKeys(objectClass);
break;
case AccessController.CATEGORY_OBJECT:
icObjectInstanceId = getBuilderLogic().getIBXMLReader().getICObjectInstanceIdFromComponentId(componentId, null, null);
identifier = String.valueOf(icObjectInstanceId);
objectClass = ICObjectBusiness.getInstance().getICObjectClass(icObjectInstanceId);
keys = iwc.getAccessController().getICObjectPermissionKeys(objectClass);
break;
case AccessController.CATEGORY_BUNDLE:
keys = iwc.getAccessController().getBundlePermissionKeys(componentId);
identifier = componentId;
break;
case AccessController.CATEGORY_PAGE_INSTANCE:
keys = iwc.getAccessController().getPagePermissionKeys();
identifier = componentId;
break;
case AccessController.CATEGORY_PAGE:
keys = iwc.getAccessController().getPagePermissionKeys();
identifier = componentId;
break;
case AccessController.CATEGORY_JSP_PAGE:
keys = new String[0];
identifier = componentId;
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");
if (componentIsInLightBox) {
cancel.setOnClick("window.parent.tb_remove(); return false;");
}
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);
if (needCancelButton) {
frameTable.add(cancel, 1, 3);
}
frameTable.add(new HiddenInput(lastPermissionKeyParameterString, permissionType));
}
return frameTable;
}
@Override
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);
if (iwc.isParameterSet(ICBuilderConstants.UI_COMPONENT_IS_IN_LIGHTBOX)) {
myForm.maintainParameter(ICBuilderConstants.UI_COMPONENT_IS_IN_LIGHTBOX);
componentIsInLightBox = Boolean.valueOf(iwc.getParameter(ICBuilderConstants.UI_COMPONENT_IS_IN_LIGHTBOX));
}
boolean isComponentInFrame = false;
String componentInFrame = iwc.getParameter(BuilderConstants.CURRENT_COMPONENT_IS_IN_FRAME);
if (componentInFrame != null && Boolean.TRUE.toString().equals(componentInFrame)) {
myForm.maintainParameter(BuilderConstants.CURRENT_COMPONENT_IS_IN_FRAME);
isComponentInFrame = true;
PresentationUtil.addStyleSheetToHeader(iwc, iwc.getIWMainApplication().getBundle(CoreConstants.WORKSPACE_BUNDLE_IDENTIFIER).getVirtualPathWithFileNameString("style/workspace.css"));
}
needCancelButton = !isComponentInFrame;
this.iwrb = iwc.getIWMainApplication().getBundle(BuilderConstants.IW_BUNDLE_IDENTIFIER).getResourceBundle(iwc);
setTitle(this.iwrb.getLocalizedString("ib_permission_window", "Permissions"));
// 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);
boolean error = false;
if (permissionType != null) {
this.collect(iwc);
try {
this.store(iwc);
} catch(Exception e) {
e.printStackTrace();
myForm.add(new Heading3(iwrb.getLocalizedString("can_not_save_permissions", "Error: can not save permissions.")));
error = true;
}
this.dispose(iwc);
if (isComponentInFrame || componentIsInLightBox) {
if (!error) {
myForm.add(new Heading3(iwrb.getLocalizedString("permissions_saved_successfully", "Permissions were saved successfully")));
}
myForm.add(this.lineUpElements(iwc, permissionType));
}
else {
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 componentId = (String) map.remove(_PARAMETERSTRING_IDENTIFIER);
String instanceID = String.valueOf(getBuilderLogic().getIBXMLReader().getICObjectInstanceIdFromComponentId(componentId, null, null));
String category = (String) map.remove(_PARAMETERSTRING_PERMISSION_CATEGORY);
if ((componentId != null && componentId.equals(iwc.getParameter(_PARAMETERSTRING_IDENTIFIER)) && componentId.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 BuilderLogic getBuilderLogic() {
return BuilderLogic.getInstance();
}
private void dispose(IWContext iwc) {
try {
iwc.removeSessionAttribute(SessionAddressPermissionMap);
}
catch (Exception ex) {
}
try {
iwc.removeSessionAttribute(SessionAddressPermissionMapOldValue);
}
catch (Exception ex) {
}
}
}