diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/model/FileModel.java b/src/main/java/org/gcube/portlets/user/workspace/client/model/FileModel.java index 6761791..281a0d8 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/model/FileModel.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/model/FileModel.java @@ -25,6 +25,8 @@ public class FileModel extends BaseModelData implements Serializable { protected GXTFolderItemTypeEnum test; //TODO remove? protected InfoContactModel infoContacts; protected boolean isRoot = false; + protected boolean isVreFolder; + protected FileModel(){ } @@ -311,25 +313,27 @@ public class FileModel extends BaseModelData implements Serializable { public GXTFolderItemTypeEnum getGXTFolderItemType(){ return (GXTFolderItemTypeEnum) get(ConstantsExplorer.FOLDERITEMTYPE); } + + public boolean isVreFolder() { + return isVreFolder; + } + + public void setVreFolder(boolean isVreFolder) { + this.isVreFolder = isVreFolder; + } @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("FileModel [isShareable()="); - builder.append(isShareable()); - builder.append(", isShared()="); - builder.append(isShared()); - builder.append(", getIdentifier()="); - builder.append(getIdentifier()); - builder.append(", getName()="); - builder.append(getName()); - builder.append(", getParentFileModel()="); - builder.append(getParentFileModel()); - builder.append(", isDirectory()="); - builder.append(isDirectory()); + builder.append("FileModel [test="); + builder.append(test); + builder.append(", infoContacts="); + builder.append(infoContacts); + builder.append(", isRoot="); + builder.append(isRoot); + builder.append(", isVreFolder="); + builder.append(isVreFolder); builder.append("]"); return builder.toString(); } - - } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderGridModel.java b/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderGridModel.java index 06e4fda..067b535 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderGridModel.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderGridModel.java @@ -16,12 +16,14 @@ public class FolderGridModel extends FileGridModel { protected FolderGridModel() { } - public FolderGridModel(String identifier, String name, String path, Date creationDate, FileModel parent, long size, boolean isDirectory, boolean isShared) { + public FolderGridModel(String identifier, String name, String path, Date creationDate, FileModel parent, long size, boolean isDirectory, boolean isShared, boolean isVREFolder) { super(identifier, name, path, creationDate, parent, size, isDirectory, isShared); + super.setVreFolder(isVREFolder); } - public FolderGridModel(String identifier, String name, Date creationDate, FileModel parent, long size, boolean isDirectory, boolean isShared) { + public FolderGridModel(String identifier, String name, Date creationDate, FileModel parent, long size, boolean isDirectory, boolean isShared, boolean isVREFolder) { super(identifier, name, creationDate, parent, size, isDirectory, isShared); + super.setVreFolder(isVREFolder); } } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderModel.java b/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderModel.java index 92ba480..d5ff63d 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderModel.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/model/FolderModel.java @@ -11,14 +11,15 @@ public class FolderModel extends FileModel { */ private static final long serialVersionUID = 1L; + protected FolderModel() { } - public FolderModel(String identifier, String name, FileModel parent, boolean isDirectory, boolean isShared) { + public FolderModel(String identifier, String name, FileModel parent, boolean isDirectory, boolean isShared, boolean isVreFolder) { super(identifier, name, parent, isDirectory, isShared); } - public FolderModel(String identifier, String name, boolean isDirectory) { + public FolderModel(String identifier, String name, boolean isDirectory, boolean isVreFolder) { super(identifier, name, isDirectory); } @@ -27,4 +28,5 @@ public class FolderModel extends FileModel { return super.toString(); } + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/sharing/PanelTogglePermission.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/sharing/PanelTogglePermission.java new file mode 100644 index 0000000..5792444 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/sharing/PanelTogglePermission.java @@ -0,0 +1,128 @@ +package org.gcube.portlets.user.workspace.client.view.sharing; + +import java.util.List; + +import org.gcube.portlets.user.workspace.client.resources.Resources; +import org.gcube.portlets.user.workspace.shared.WorkspaceACL; +import org.gcube.portlets.user.workspace.shared.WorkspaceACL.USER_TYPE; + +import com.extjs.gxt.ui.client.Style.ButtonScale; +import com.extjs.gxt.ui.client.Style.IconAlign; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.button.ToggleButton; +import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig; +import com.google.gwt.core.shared.GWT; + +public class PanelTogglePermission extends LayoutContainer { + + protected static final String WORKSPACEACLGROUP = "WORKSPACEACLGROUP"; +// private ButtonGroup buttonGroup; + + private HorizontalPanel hp = new HorizontalPanel(); + + private WorkspaceACL selectedAcl = null; + + public PanelTogglePermission(List acls) { + + setStyleAttribute("margin-top", "10px"); + setStyleAttribute("margin-bottom", "10px"); + setSize(350, 30); + +// buttonGroup = new ButtonGroup(acls.size()); + +// buttonGroup.mask("Loading ACLs"); + hp.mask("Loading ACLs"); + + for (WorkspaceACL acl : acls) { + + if(acl.getUserType().equals(USER_TYPE.OTHER)){ + ToggleButton toggle = createToggle(acl); + toggle.setToggleGroup(WORKSPACEACLGROUP); + toggle.setStyleAttribute("margin-right", "5px"); +// buttonGroup.add(toggle); + hp.add(toggle); + } + } + + hp.unmask(); +// buttonGroup.unmask(); + add(hp); + } + + private ToggleButton createToggle(final WorkspaceACL acl) { + + final ToggleButton bToggle = new ToggleButton(acl.getLabel()); + bToggle.setScale(ButtonScale.LARGE); + bToggle.setId(acl.getId()); + bToggle.toggle(acl.getDefaultValue()); + bToggle.setIconAlign(IconAlign.BOTTOM); + bToggle.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + if(bToggle.isPressed()){ + selectedAcl = acl; + } + + } + }); + bToggle.setToolTip(new ToolTipConfig(acl.getDescription())); + setIcon(bToggle, acl.getId()); + return bToggle; + + } + + private void setIcon(ToggleButton bToggle, String id){ + + if(id.compareTo("ADMINISTRATOR")==0){ + + }else if(id.compareTo("READ_ONLY")==0){ + bToggle.setIcon(Resources.getIconReadOnly()); + }else if(id.compareTo("WRITE_OWNER")==0){ + bToggle.setIcon(Resources.getIconWriteOwn()); + }else if(id.compareTo("WRITE_ALL")==0){ + bToggle.setIcon(Resources.getIconWriteAll()); + } + + } + + public WorkspaceACL getSelectedACL() { + GWT.log("Selected ACL is: "+selectedAcl); + return selectedAcl; + } + + /* + public List getCheckedGroupList() { + + List listDS = new ArrayList(); + + List values = new ArrayList(); + + if (radioGroup.getValue()!=null){ + Radio radio = radioGroup.getValue(); + values.add((Radio) radio); + } + else { + List> listChecks = radioGroup.getAll(); + for (Field field : listChecks) { + values.add((Radio) field); + } + } + + for (Radio radio : values) { + if (radio.isEnabled()){ + WorkspaceACL acl = (WorkspaceACL) radio.getData(WORKSPACEACL); + listDS.add(acl); + } + } + + if (listDS.size() == 0) + return null; + + return listDS; + } + */ +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java index 80e975e..e88a8a1 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java @@ -603,8 +603,6 @@ public class ContextMenuTree { printSelected(); - - if(targetFileModel!=null){ if(targetFileModel.getParentFileModel()==null){ @@ -712,6 +710,18 @@ public class ContextMenuTree { contextMenu.getItemByItemId(WorkspaceOperation.SHARE_LINK.getId()).setVisible(true); } + /* + if(selectedItem.isBaseVREFolder()){ + + contextMenu.getItemByItemId(WorkspaceOperation.SHARE.getId()).setVisible(false); //SHARE + contextMenu.getItemByItemId(WorkspaceOperation.INSERT_SHARED_FOLDER.getId()).setVisible(false); //insert shared folder + contextMenu.getItemByItemId(WorkspaceOperation.UNSHARE.getId()).setVisible(false); //UNSHARE + contextMenu.getItemByItemId(WorkspaceOperation.RENAME.getId()).setVisible(false); //UNSHARE + contextMenu.getItemByItemId(WorkspaceOperation.REMOVE.getId()).setVisible(false); //UNSHARE + return; + }*/ + + //CASE DIRECTORY if(selectedItem.isDirectory()){ contextMenu.getItemByItemId(WorkspaceOperation.SHARE.getId()).setVisible(true); //SHARE contextMenu.getItemByItemId(WorkspaceOperation.SHOW.getId()).setVisible(false); //show diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java index 4faae7e..ee50ed5 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java @@ -19,6 +19,7 @@ import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.Properties; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceSmartFolder; import org.gcube.common.homelibrary.home.workspace.accounting.AccountingEntry; import org.gcube.common.homelibrary.home.workspace.accounting.AccountingEntryAdd; @@ -789,7 +790,7 @@ public class GWTWorkspaceBuilder { logger.trace("workspace name: "+ workspaceRoot.getName()); logger.trace("workspace path "+ workspaceRoot.getPath()); - FolderModel root = new FolderModel(workspaceRoot.getId(),workspaceRoot.getName(),null, true, workspaceRoot.isShared()); + FolderModel root = new FolderModel(workspaceRoot.getId(),workspaceRoot.getName(),null, true, workspaceRoot.isShared(), false); root.setIsRoot(true); // root.setShareable(true); @@ -847,7 +848,7 @@ public class GWTWorkspaceBuilder { switch (item.getType()) { - case FOLDER: fileModel = new FolderModel(item.getId(), item.getName(), true); + case FOLDER: fileModel = new FolderModel(item.getId(), item.getName(), true, false); fileModel.setType(GXTFolderItemTypeEnum.FOLDER.toString()); break; @@ -859,13 +860,11 @@ public class GWTWorkspaceBuilder { case SHARED_FOLDER: - fileModel = new FolderModel(item.getId(), item.getName(), true); + WorkspaceSharedFolder sharedFolder = (WorkspaceSharedFolder) item; + fileModel = new FolderModel(item.getId(), item.getName(), true, sharedFolder.isVreFolder()); fileModel.setShared(true); fileModel.setType(GXTFolderItemTypeEnum.SHARED_FOLDER.toString()); - -// WorkspaceSharedFolder sharedFolder = (WorkspaceSharedFolder) item; -// fileModel.setListShareUser(buildGxtInfoContactFromPortalLogin(sharedFolder.getUsers())); - + break; default: logger.error("gxt conversion return null for item "+item.getName()); @@ -933,15 +932,16 @@ public class GWTWorkspaceBuilder { case FOLDER: - fileModel = new FolderModel(item.getId(), item.getName(), (FolderModel) parentFolderModel, true, false); + fileModel = new FolderModel(item.getId(), item.getName(), (FolderModel) parentFolderModel, true, false, false); fileModel.setType(GXTFolderItemTypeEnum.FOLDER.toString()); fileModel.setShareable(true); fileModel.setDescription(item.getDescription()); -// WorkspaceFolder folder = (WorkspaceFolder) +// WorkspaceFolder folder = (WorkspaceFolder) item; break; case FOLDER_ITEM: + // fileModel = new FileModel(item.getId(), item.getName(), item.getPath(), (FolderModel) parentFolderModel, false); fileModel = new FileModel(item.getId(), item.getName(), (FolderModel) parentFolderModel, false, false); FolderItem folderItem = (FolderItem) item; @@ -950,8 +950,9 @@ public class GWTWorkspaceBuilder { break; case SHARED_FOLDER: - - fileModel = new FolderModel(item.getId(), item.getName(), (FolderModel) parentFolderModel, true, true); + WorkspaceSharedFolder shared = (WorkspaceSharedFolder) item; + String name = shared.isVreFolder()?shared.getDisplayName():item.getName(); + fileModel = new FolderModel(item.getId(), name, (FolderModel) parentFolderModel, true, true,shared.isVreFolder()); fileModel.setType(GXTFolderItemTypeEnum.SHARED_FOLDER.toString()); fileModel.setShareable(true); fileModel.setDescription(item.getDescription()); @@ -1007,7 +1008,7 @@ public class GWTWorkspaceBuilder { case FOLDER: // fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getCreationDate()), parentFileModel, -1, true, false); - fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModified()), parentFileModel, -1, true, false); + fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModified()), parentFileModel, -1, true, false,false); fileGridModel.setType(GXTFolderItemTypeEnum.FOLDER.toString()); fileGridModel.setShortcutCategory(GXTCategoryItemInterface.SMF_DOCUMENTS); fileGridModel.setShareable(true); @@ -1023,8 +1024,10 @@ public class GWTWorkspaceBuilder { case SHARED_FOLDER: + WorkspaceSharedFolder shared = (WorkspaceSharedFolder) item; + String name = shared.isVreFolder()?shared.getDisplayName():item.getName(); // fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getCreationDate()), parentFileModel, -1, true, false); - fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModified()), parentFileModel, -1, true, true); + fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), name, toDate(item.getLastModified()), parentFileModel, -1, true, true,shared.isVreFolder()); fileGridModel.setType(GXTFolderItemTypeEnum.SHARED_FOLDER.toString()); fileGridModel.setShortcutCategory(GXTCategoryItemInterface.SMF_DOCUMENTS); fileGridModel.setShareable(true); @@ -1096,7 +1099,7 @@ public class GWTWorkspaceBuilder { case FOLDER: // fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getCreationTime()), parentFileModel, -1, true, false); - fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModificationTime()), parentFileModel, -1, true, false); + fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModificationTime()), parentFileModel, -1, true, false,false); fileGridModel.setType(GXTFolderItemTypeEnum.FOLDER.toString()); fileGridModel.setShortcutCategory(GXTCategoryItemInterface.SMF_DOCUMENTS); fileGridModel.setShareable(true); @@ -1112,8 +1115,9 @@ public class GWTWorkspaceBuilder { break; case SHARED_FOLDER: -// fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getCreationTime()), parentFileModel, -1, true, true); - fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), item.getName(), toDate(item.getLastModificationTime()), parentFileModel, -1, true, true); + WorkspaceSharedFolder shared = (WorkspaceSharedFolder) item; + String name = shared.isVreFolder()?shared.getDisplayName():item.getName(); + fileGridModel = (FolderGridModel) new FolderGridModel(item.getId(), name, toDate(item.getLastModificationTime()), parentFileModel, -1, true, true, shared.isVreFolder()); fileGridModel.setType(GXTFolderItemTypeEnum.SHARED_FOLDER.toString()); fileGridModel.setShortcutCategory(GXTCategoryItemInterface.SMF_DOCUMENTS); fileGridModel.setShareable(true); @@ -1421,7 +1425,7 @@ public class GWTWorkspaceBuilder { */ public FolderModel buildGXTFolderModelItem(WorkspaceFolder wsFolder, FileModel parent) throws InternalErrorException { - FolderModel folder = new FolderModel(wsFolder.getId(),wsFolder.getName(), parent, true, wsFolder.isShared()); + FolderModel folder = new FolderModel(wsFolder.getId(),wsFolder.getName(), parent, true, wsFolder.isShared(), false); folder.setShareable(true); folder.setDescription(wsFolder.getDescription()); // folder.setOwner(wsFolder.getOwner()); diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 4f4f78e..3ac66b4 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -45,6 +45,7 @@ import org.gcube.portlets.user.workspace.client.model.MessageModel; import org.gcube.portlets.user.workspace.client.model.ScopeModel; import org.gcube.portlets.user.workspace.client.model.SmartFolderModel; import org.gcube.portlets.user.workspace.client.model.SubTree; +import org.gcube.portlets.user.workspace.client.resources.Resources; import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.server.notifications.NotificationsProducer; @@ -944,7 +945,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return; } - FolderModel parentModel = new FolderModel(item.getParent().getId(), item.getParent().getName(), null, true, item.getParent().isShared()); //Create parent model + FolderModel parentModel = new FolderModel(item.getParent().getId(), item.getParent().getName(), null, true, item.getParent().isShared(), false); //Create parent model List childrenList = getFolderChildren(parentModel); //create children list @@ -2509,7 +2510,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT switch (acl) { case ADMINISTRATOR: - acls.add(new WorkspaceACL(acl.toString(), acl.toString(), false, USER_TYPE.ADMINISTRATOR,"")); + acls.add(new WorkspaceACL(acl.toString(), acl.toString(), false, USER_TYPE.ADMINISTRATOR, "")); break; case READ_ONLY: acls.add(new WorkspaceACL(acl.toString(), "Read Only", false, USER_TYPE.OTHER, "Users can read any file but cannot update/delete")); diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java b/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java index bd127ba..c9295b5 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java @@ -28,7 +28,7 @@ public class UserUtil { public static String getUserFullName(String portalLogin){ // return user.getPortalLogin(); //for testing in eclipse - logger.trace("Finding full name for: "+portalLogin); +// logger.trace("Finding full name for: "+portalLogin); if(portalLogin==null) return ""; @@ -58,7 +58,7 @@ public class UserUtil { if (curr != null){ - logger.trace("Return "+curr.getFullname() +" full name for: "+portalLogin); +// logger.trace("Return "+curr.getFullname() +" full name for: "+portalLogin); return curr.getFullname(); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java b/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java index bec085b..f03106a 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java @@ -74,10 +74,10 @@ public class WsUtil { /*USE ANOTHER ACCOUNT (OTHERWHISE BY TEST_USER) FOR RUNNING * COMMENT THIS IN DEVELOP ENVIROMENT (UNCOMMENT IN PRODUCTION)*/ - user=TEST_USER; +// user=TEST_USER; //UNCOMMENT THIS IN DEVELOP ENVIROMENT -// user = "francesco.mangiacrapa"; + user = "francesco.mangiacrapa"; logger.warn("WORKSPACE PORTLET STARTING IN TEST MODE - NO USER FOUND - PORTLETS STARTING WITH FOLLOWING SETTINGS:"); logger.warn("session id: "+sessionID); @@ -105,10 +105,10 @@ public class WsUtil { withoutPortal = true; //COMMENT THIS IN PRODUCTION ENVIROMENT -// }else if(user.compareToIgnoreCase("francesco.mangiacrapa")==0){ -// -// withoutPortal = true; -// //END UNCOMMENT + }else if(user.compareToIgnoreCase("francesco.mangiacrapa")==0){ + + withoutPortal = true; + //END UNCOMMENT }else{ withoutPortal = false; diff --git a/src/main/java/org/gcube/portlets/user/workspace/shared/WorkspaceACL.java b/src/main/java/org/gcube/portlets/user/workspace/shared/WorkspaceACL.java index 5ef4b7b..7b4d265 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/shared/WorkspaceACL.java +++ b/src/main/java/org/gcube/portlets/user/workspace/shared/WorkspaceACL.java @@ -20,7 +20,8 @@ public class WorkspaceACL implements Serializable{ private USER_TYPE userType; private String description; - + + public enum USER_TYPE{ADMINISTRATOR, GROUP, OWNER, OTHER}; public WorkspaceACL(String id, String label, boolean defaultValue, USER_TYPE userType, String description) { @@ -32,10 +33,8 @@ public class WorkspaceACL implements Serializable{ this.description = description; } - public WorkspaceACL() { - // TODO Auto-generated constructor stub } public String getId() { @@ -78,24 +77,5 @@ public class WorkspaceACL implements Serializable{ public void setDescription(String description) { this.description = description; } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("WorkspaceACL [id="); - builder.append(id); - builder.append(", label="); - builder.append(label); - builder.append(", defaultValue="); - builder.append(defaultValue); - builder.append(", userType="); - builder.append(userType); - builder.append(", description="); - builder.append(description); - builder.append("]"); - return builder.toString(); - } - - }