package com.perforce.spark.common; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.pool.BasePoolableObjectFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.perforce.p4java.client.IClient; import com.perforce.p4java.core.IChangelist; import com.perforce.p4java.core.IChangelistSummary; import com.perforce.p4java.core.file.FileSpecBuilder; import com.perforce.p4java.core.file.IFileSpec; import com.perforce.p4java.exception.P4JavaException; import com.perforce.p4java.impl.mapbased.client.Client; import com.perforce.p4java.option.client.RevertFilesOptions; import com.perforce.p4java.option.server.GetChangelistsOptions; import com.perforce.p4java.server.IOptionsServer; import com.perforce.spark.connection.ConnectionConfig; import com.perforce.spark.connection.ConnectionSession; public class ClientFactory extends BasePoolableObjectFactory<IClient> { private static Logger logger = LoggerFactory.getLogger(ClientFactory.class); private static int id = 0; private IOptionsServer p4; public ClientFactory() { String user = ConnectionConfig.getProxyUser(); String ticket = ConnectionConfig.getProxyTicket(); try { p4 = ConnectionSession.getP4(user, ticket); } catch (P4JavaException e) { logger.error("Unable to create pool, invalid Perforce connection."); e.printStackTrace(); } } @Override public IClient makeObject() throws Exception { // generate unique name id++; String prefix = ConnectionConfig.getClientPrefix(); String user = p4.getUserName(); String clientName = prefix + user + "." + id; logger.info("make: " + clientName); // create client Client implClient = new Client(p4); implClient.setName(clientName); p4.createClient(implClient); IClient iclient = p4.getClient(clientName); iclient.setOwnerName(user); // set root File root = new File("upload", clientName); iclient.setRoot(root.getAbsolutePath()); iclient.update(); return iclient; } @Override public void activateObject(IClient client) throws Exception { File root = new File(client.getRoot()); if (root.exists()) { FileUtils.deleteDirectory(root); } if (!root.exists() && !root.mkdirs()) { logger.warn("Failed to create upload directory."); } logger.info("active: " + client.getName()); } @Override public void passivateObject(IClient client) throws Exception { logger.info("passive: " + client.getName()); clean(p4, client); File root = new File(client.getRoot()); if (root.exists()) { FileUtils.deleteDirectory(root); } } @Override public void destroyObject(IClient client) throws Exception { logger.info("destroy: " + client.getName()); clean(p4, client); p4.deleteClient(client.getName(), false); } public static void clean(IOptionsServer p4, IClient client) throws P4JavaException { if (client != null) { p4.setCurrentClient(client); // revert all opened files RevertFilesOptions rOpts = new RevertFilesOptions(); String path = client.getRoot() + "/..."; List<IFileSpec> files = FileSpecBuilder.makeFileSpecList(path); client.revertFiles(files, rOpts); // list pending changes List<IFileSpec> empty = new ArrayList<>(); GetChangelistsOptions opts = new GetChangelistsOptions(); opts.setType(IChangelist.Type.PENDING); opts.setUserName(client.getOwnerName()); opts.setClientName(client.getName()); List<IChangelistSummary> pending = p4.getChangelists(empty, opts); // deletes pending changes for (IChangelistSummary p : pending) { p4.deletePendingChangelist(p.getId()); } } } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 15801 | Paul Allen | Experimental copy of PAM. | ||
//guest/paul_allen/p4am/src/main/java/com/perforce/spark/common/ClientFactory.java | |||||
#1 | 15313 | Paul Allen |
Added Client Workspace pool to manage parallel upload requests by the proxy (configuration set to 50). User uploads are restricted to only one per user. |