Search code examples
javaperforcep4java

Appending perforce permission table through java results in blank permission table


I am trying to grant permission to a group on a folder in Perforce. However, the permission table that is created/updated from Java in Perforce is empty.

Following are the steps that I do -

//Get the server object.
IOptionsServer server = ServerFactory.getOptionsServer("p4java://<ip>:1666", null);
server.connect();
server.setUserName("<username>"); // this is a super user
server.login("<password>");

//Create a user group and add users.
IUserGroup ug = new UserGroup();
String groupName = "<usergroup_somename>;
ug.setName(groupName);
List<String> userList = new ArrayList<>();
userList.add("<username1>");
userList.add("<username2>");
userList.add("<username3>");
ug.setUsers(userList);
server.createUserGroup(ug);

//Get the permission table.
GetProtectionEntriesOptions gpo = new GetProtectionEntriesOptions();
gpo.setAllUsers(true);
List<IProtectionEntry> peList = server.getProtectionEntries(null, gpo);

//Create a new Protection entry
IProtectionEntry pe = new ProtectionEntry();
pe.setGroup(true);
pe.setName(groupName);
depotFilePath = "//depottest/Level1/Level2/..."; // the folders exist in Perforce
pe.setPath(depotFilePath);
pe.setMode("write");
pe.setHost("*");
pe.setPathExcluded(false);
pe.setOrder(peList.size());
pe.setType(EntryType.INCLUDE);

//Add the new created permission into the fetched Permission table list.
peList.add(pe);

//Create/Update the Permission table using either of the following methods separately or in combination creates a blank permission table.

server.createProtectionEntries(peList);
server.updateProtectionEntries(peList);

According to the documentation the methods in the end should create/replace/update the Permission table, however, this does not happen and instead the permission table in the Perforce server is deleted/blank.

I may be missing something. Can someone please give some suggestions on how to fix this?

P.S. I have tried using only the updateProtectionEntries(peList) method or the server.createProtectionEntries(peList) method and both together and still the pemission table in the Perforce server is blank.


Solution

  • Perforce has forums where you can ask questions: forums.perforce.com

    At one time (depends on P4Java and server versions) incorrect order values could lose data. There's also a spaces-in-path problem.

    This works for me:

    peList.add(pe);
    
    // fix order values and spaces-in-path quoting
    int i = 0;
    for (IProtectionEntry pe : peList) {
    
        pe.setOrder(i++);
    
        if (pe.getPath().indexOf(" ") >= 0) {
            // this bug should be fixed in 2014.X (no promises) 
            if (pe.isPathExcluded()) {
                pe.setPath("\"-" + pe.getPath() + "\"");
                pe.setPathExcluded(false);
            } else {
                pe.setPath("\"" + pe.getPath() + "\"");
            }
        }
    }
    
    try {
        String createProtectionEntries = server.createProtectionEntries(peList);