package com.perforce.spark.artifact.gem; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spark.Request; import spark.Response; import com.perforce.p4java.exception.P4JavaException; import com.perforce.p4java.server.IOptionsServer; import com.perforce.spark.artifact.DefaultArtifact; import com.perforce.spark.artifact.ArtifactInterface; import com.perforce.spark.depot.DepotFactory; import com.perforce.spark.depot.DepotModel; public class GemArtifact extends DefaultArtifact implements ArtifactInterface { private static Logger logger = LoggerFactory.getLogger(GemArtifact.class); private String gemID; private String version; private List<FileItem> fileItems = new ArrayList<>(); public GemArtifact(Request request, Response response) throws P4JavaException, FileUploadException { super(request, response); } public GemArtifact(IOptionsServer p4, String repoID) { super(p4); this.repoID = repoID; } @Override public void processForm(Request request) throws FileUploadException { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload up = new ServletFileUpload(factory); List<FileItem> items = up.parseRequest(request.raw()); for (FileItem item : items) { if (item.isFormField()) { String fieldname = item.getFieldName(); String fieldvalue = item.getString(); switch (fieldname) { case "repoID": repoID = fieldvalue; break; case "gemID": gemID = fieldvalue; break; case "version": version = fieldvalue; break; } } else { fileItems.add(item); } } } @Override public Path getPath() { Path depotPath = Paths.get(repoID, "gems"); return depotPath; } @Override public DepotModel getDepot() throws P4JavaException { DepotModel depot = DepotFactory.getByName(p4, repoID); return depot; } @Override public List<String> populateWorkspace(File root) throws Exception { List<String> list = new ArrayList<>(); for (FileItem item : fileItems) { String fileName = FilenameUtils.getName(item.getName()); String gemName = gemID + "-" + version + ".gem"; if (!gemName.equals(fileName)) { throw new P4JavaException( "Gem name and file name do not match: " + gemName); } File file = new File(root, fileName); item.write(file); list.add(file.getPath()); logger.info("uploading: " + fileName); } return list; } @Override public void index() throws Exception { versionIndex(); } @Override public void buildIndex() throws Exception { logger.info("running: gem generate_index"); CommandLine cmdLine = new CommandLine("gem"); cmdLine.addArgument("generate_index"); File root = new File("index", repoID); DefaultExecutor executor = new DefaultExecutor(); executor.setWorkingDirectory(root); executor.execute(cmdLine); } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 15801 | Paul Allen | Experimental copy of PAM. | ||
//guest/paul_allen/p4am/src/main/java/com/perforce/spark/artifact/gem/GemArtifact.java | |||||
#5 | 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. |
||
#4 | 15232 | Paul Allen | Fix on Artifact indexing | ||
#3 | 15221 | Paul Allen | Generate Gem index and submit after a deploy or proxy fetch event. | ||
#2 | 15218 | Paul Allen |
Index/catalog for Ruby. Plus depot names must be lower-case. |
||
#1 | 15215 | Paul Allen | Added RubyGem pages and tidy up. |