package com.collabnet.ce.webservices; import com.collabnet.ce.soap50.webservices.cemain.ProjectMemberSoapRow; import com.collabnet.ce.soap50.webservices.cemain.ProjectSoapDO; import com.collabnet.ce.soap50.webservices.cemain.ProjectSoapRow; import com.collabnet.ce.soap50.webservices.cemain.UserSoapRow; import com.collabnet.ce.soap50.webservices.docman.DocumentFolderSoapList; import com.collabnet.ce.soap50.webservices.docman.DocumentFolderSoapRow; import com.collabnet.ce.soap50.webservices.frs.PackageSoapRow; import com.collabnet.ce.soap50.webservices.rbac.RoleSoapList; import com.collabnet.ce.soap50.webservices.rbac.RoleSoapRow; import com.collabnet.ce.soap50.webservices.scm.RepositorySoapRow; import com.collabnet.ce.soap50.webservices.tracker.TrackerSoapRow; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; /** * A project in TeamForge. * * @author Kohsuke Kawaguchi */ public class CTFProject extends CTFObject implements ObjectWithTitle { private final String title; CTFProject(CollabNetApp app, ProjectSoapDO data) { super(app,data.getId()); this.title = data.getTitle(); } CTFProject(CollabNetApp app, ProjectSoapRow data) { super(app,data.getId()); this.title = data.getTitle(); } public String getTitle() { return title; } /** * @param title * Package title. * @param description * Package description. * @param isPublished * Whether the package should be published */ public CTFPackage createPackage(String title, String description, boolean isPublished) throws RemoteException { return new CTFPackage(this, app.getFrsAppSoap().createPackage(app.getSessionId(), getId(), title, description, isPublished)); } public CTFList<CTFPackage> getPackages() throws RemoteException { CTFList<CTFPackage> r = new CTFList<CTFPackage>(); for (PackageSoapRow row : app.getFrsAppSoap().getPackageList(app.getSessionId(), getId()).getDataRows()) { r.add(new CTFPackage(this,row)); } return r; } public CTFList<CTFTracker> getTrackers() throws RemoteException { CTFList<CTFTracker> r = new CTFList<CTFTracker>(); for (TrackerSoapRow row : app.getTrackerSoap().getTrackerList(app.getSessionId(), getId()).getDataRows()) { r.add(new CTFTracker(this,row)); } return r; } public CTFTracker createTracker(String name, String title, String description) throws RemoteException { return new CTFTracker(this, app.getTrackerSoap().createTracker(app.getSessionId(), getId(), name, title, description)); } public CTFList<CTFScmRepository> getScmRepositories() throws RemoteException { CTFList<CTFScmRepository> r = new CTFList<CTFScmRepository>(); for (RepositorySoapRow row : app.getScmAppSoap().getRepositoryList(app.getSessionId(), getId()).getDataRows()) { r.add(new CTFScmRepository(this,row)); } return r; } public List<CTFUser> getMembers() throws RemoteException { List<CTFUser> r = new ArrayList<CTFUser>(); for (ProjectMemberSoapRow row : app.icns.getProjectMemberList(app.getSessionId(),getId()).getDataRows()) r.add(new CTFUser(app,row)); return r; } /** * Gets the administrators of this project. */ public List<CTFUser> getAdmins() throws RemoteException { List<CTFUser> r = new ArrayList<CTFUser>(); for (UserSoapRow row : app.icns.listProjectAdmins(app.getSessionId(),getId()).getDataRows()) r.add(new CTFUser(app,row)); return r; } public void addMember(String userName) throws RemoteException { app.icns.addProjectMember(app.getSessionId(),getId(),userName); } public void addMember(CTFUser u) throws RemoteException { addMember(u.getUserName()); } public boolean hasMember(String username) throws RemoteException { for (CTFUser u : getMembers()) { if (u.getUserName().equals(username)) return true; } return false; } /** * Roles in this project. */ public CTFList<CTFRole> getRoles() throws RemoteException { return toRoleList(app.getRbacAppSoap().getRoleList(app.getSessionId(), getId())); } public CTFRole createRole(String title, String description) throws RemoteException { return new CTFRole(this,app.getRbacAppSoap().createRole(app.getSessionId(),getId(),title,description)); } public CTFList<CTFRole> getUserRoles(CTFUser u) throws RemoteException { return getUserRoles(u.getUserName()); } /** * Gets all the roles that the given user has in this project. */ public CTFList<CTFRole> getUserRoles(String username) throws RemoteException { return toRoleList(app.getRbacAppSoap().getUserRoleList(app.getSessionId(),getId(),username)); } private CTFList<CTFRole> toRoleList(RoleSoapList roles) { CTFList<CTFRole> r = new CTFList<CTFRole>(); for (RoleSoapRow row : roles.getDataRows()) { r.add(new CTFRole(this,row)); } return r; } public CTFDocumentFolder getRootFolder() throws RemoteException { DocumentFolderSoapList dfsList = app.getDocumentAppSoap().getDocumentFolderList(app.getSessionId(), getId(),false); switch (dfsList.getDataRows().length) { case 0: throw new CollabNetApp. CollabNetAppException("getRootFolder for projectId " + title + " failed to find any folders"); case 1: return new CTFDocumentFolder(this,dfsList.getDataRows()[0]); default: StringBuilder rowNames = new StringBuilder(); for (DocumentFolderSoapRow row: dfsList.getDataRows()) { rowNames.append(row.getTitle() + ", "); } throw new CollabNetApp. CollabNetAppException("getRootFolder returned unexpected " + "number of folders: " + rowNames.toString()); } } /** * Gets to the folder from a path string like "foo/bar/zot", if necessary by creating intermediate directories. */ public CTFDocumentFolder getOrCreateDocumentFolder(String documentPath) throws RemoteException { String[] folderNames = documentPath.split("/"); int i = 0; // find the root folder since the first document path may or may not // match this. CTFDocumentFolder cur = getRootFolder(); if (cur.getTitle().equals(folderNames[i])) { i++; } for (; i < folderNames.length; i++) { CTFDocumentFolder next = cur.getFolders().byTitle(folderNames[i]); if (next==null) break; cur = next; } // create any missing folders for (; i < folderNames.length; i++) { cur = cur.createFolder(folderNames[i], folderNames[i]); } return cur; } /** * Verify a document folder path. If at any point the folder * is missing, return the name of the first missing folder. * * @param documentPath string with folders separated by '/'. * @return the first missing folder, or null if all are found. * @throws RemoteException */ public String verifyPath(String documentPath) throws RemoteException { String[] folderNames = documentPath.split("/"); int i = 0; CTFDocumentFolder cur = getRootFolder(); if (cur.getTitle().equals(folderNames[i])) { i++; } for (; i < folderNames.length; i++) { CTFDocumentFolder next = cur.getFolders().byTitle(folderNames[i]); if (next == null) { return folderNames[i]; } else { cur = next; } } return null; } }