Package com.sun.faban.harness.webclient

Source Code of com.sun.faban.harness.webclient.Uploader

/* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://www.sun.com/cddl/cddl.html or
* install_dir/legal/LICENSE
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at install_dir/legal/LICENSE.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id$
*
* Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved
*/
package com.sun.faban.harness.webclient;

import com.sun.faban.harness.common.Config;
import com.sun.faban.harness.common.RunId;

import com.sun.faban.harness.util.FileHelper;
import java.util.logging.Level;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.io.File;
import java.util.ArrayList;
import java.util.logging.Logger;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import static com.sun.faban.harness.util.FileHelper.*;

/**
* This is a controller class.
*
* @author Sheetal Patil
*/

public class Uploader {
  private static Logger logger = Logger.getLogger(ResultAction.class.getName());

  /**
   * Checks the existence of the runs on the repository.
   * @param request
   * @param response
   * @return String
   * @throws java.io.IOException
   * @throws javax.servlet.ServletException
   */
  public String checkRuns(HttpServletRequest request, HttpServletResponse
                                response) throws IOException, ServletException {
            HashSet<String> duplicateSet = new HashSet<String>();
            String host = request.getParameter("host");
            String[] runIds = request.getParameterValues("runId");
            String[] ts = request.getParameterValues("ts");
            for (int r=0; r< runIds.length ; r++){
                String runId = runIds[r];
                if (checkIfArchived(host+"."+runId)){
                    //check for runId timestamp
                    String reposTs =
                          getRunIdTimestamp(host + "." + runId, Config.OUT_DIR);
                    if (ts[r].equals(reposTs)) {
                        duplicateSet.add(runId);
                    }
                }
                response.setStatus(HttpServletResponse.SC_OK);
            }
            request.setAttribute("duplicates", duplicateSet);
            return "/duplicates.jsp";
        }

        private String getRunIdTimestamp(String runId,  String dir) {
            char[] cBuf = null;
            String[] status = new String[2];
            int length = -1;
            try {
               FileReader reader = new FileReader(dir + runId + '/'
                                                         + Config.RESULT_INFO);
               cBuf = new char[128];
               length = reader.read(cBuf);
               reader.close();
            } catch (IOException e) {
               // Do nothing, length = -1.
            }
            String content = new String(cBuf, 0, length);
            int idx = content.indexOf('\t');
            if (idx != -1) {
               status[0] = content.substring(0, idx).trim();
               status[1] = content.substring(++idx).trim();
            } else {
               status[0] = content.trim();
            }
            return status[1];
        }

        private String getNextRunId(String runId) {
            RunId current = new RunId(runId);
            String seq = current.getRunSeq(); // Say "1A1"
            int i = 0;
            for (; i < seq.length(); i++) {
                if (Character.isLetter(seq.charAt(i)))
                    break;
            } // i now points to 'A'
            String origSeq = seq.substring(0, i + 1); // origSeq = "1A"
            String cDup = seq.substring(i + 1);       // cDup = "1"
            String nDup = null;
            if (cDup.length() == 0) {
                nDup = "0";
            } else {
                int x = Integer.parseInt(cDup, 16)// x = (int) 1
                nDup = Integer.toHexString(++x).toUpperCase(); // nDup - "2"
            }
            RunId next = new RunId(current.getHostName(),
                    current.getBenchName(), origSeq + nDup);
            return next.toString();
        }
       
        private boolean checkIfArchived(String runId) {
            boolean found = false;
            File file = new File(Config.OUT_DIR + runId + '/' +
                                                            Config.RESULT_INFO);
            found = file.exists();
            return found;
        }

        /**
         * Updates the tags file.
         * @param req
         * @param resp
         * @throws java.io.IOException
         */
        public void updateTagsFile(HttpServletRequest req,
            HttpServletResponse resp) throws IOException{
            String tags = req.getParameter("tags");
            String runId = req.getParameter("runId");
            RunResult result = RunResult.getInstance(new RunId(runId));
            StringBuilder formattedTags = new StringBuilder();
            File runTagFile = new File(Config.OUT_DIR + runId + "/META-INF/tags");
            if (tags != null && !"".equals(tags)) {
                StringTokenizer t = new StringTokenizer(tags," \n,");
                ArrayList<String> tagList = new ArrayList<String>(t.countTokens());
                while (t.hasMoreTokens()) {
                    String nextT = t.nextToken().trim();
                    if( nextT != null && !"".equals(nextT) ){
                        formattedTags.append(nextT + "\n");
                        tagList.add(nextT);
                    }
                }
                FileHelper.writeContentToFile(formattedTags.toString(), runTagFile);
                result.tags = tagList.toArray(new String[tagList.size()]);
            }
            try {
                uploadTags(runId);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Uploader.class.getName()).log(Level.SEVERE, null, ex);
            }
            Writer w = resp.getWriter();
            w.write("Tags updating completed");
            w.flush();
            w.close();
        }

        /**
         * Updates the run description.
         * @param req
         * @param resp
         * @throws java.io.IOException
         */
        public void updateRunDesc(HttpServletRequest req,
            HttpServletResponse resp) throws IOException{
            String runId = req.getParameter("runId");
            RunResult result = RunResult.getInstance(new RunId(runId));
            result.description = req.getParameter("desc");
            ResultAction.editXML(result);
            Writer w = resp.getWriter();
            w.write("Tags updating completed");
            w.flush();
            w.close();
        }


        private void uploadTags(String runId) throws IOException, ClassNotFoundException {
            File file = new File(Config.OUT_DIR + runId + "/META-INF/tags");
            String tags = FileHelper.readContentFromFile(file);
            TagEngine te = TagEngine.getInstance();
            String[] tagsArray;
            if (tags != null && !"".equals(tags)) {
                StringTokenizer tok = new StringTokenizer(tags," ");
                tagsArray = new String[tok.countTokens()];
                int count = tok.countTokens();
                int i=0;
                while(i < count){
                    String nextT = tok.nextToken().trim();
                    tagsArray[i] = nextT;
                    i++;
                }
                te.add(runId, tagsArray);
            }else{
                te.add(runId, new String[0]);
            }
            te.save();
        }

        /**
         * Responsible for uploading the runs.
         * @param request
         * @param response
         * @return String
         * @throws java.io.IOException
         * @throws javax.servlet.ServletException
         * @throws java.lang.ClassNotFoundException
         */
        public String uploadRuns(HttpServletRequest request, HttpServletResponse
                                response) throws IOException, ServletException, ClassNotFoundException {
            // 3. Upload the run
            HashSet<String> duplicateSet = new HashSet<String>();
            HashSet<String> replaceSet = new HashSet<String>();
            String host = null;
            String key = null;
            boolean origin = false; // Whether the upload is to the original
            // run requestor. If so, key is needed.
            DiskFileUpload fu = new DiskFileUpload();
            // No maximum size
            fu.setSizeMax(-1);
            // maximum size that will be stored in memory
            fu.setSizeThreshold(4096);
            // the location for saving data that is larger than
            // getSizeThreshold()
            fu.setRepositoryPath(Config.TMP_DIR);

            List fileItems = null;
            try {
                fileItems = fu.parseRequest(request);
            } catch (FileUploadException e) {
                throw new ServletException(e);
            }
            // assume we know there are two files. The first file is a small
            // text file, the second is unknown and is written to a file on
            // the server
            for (Iterator i = fileItems.iterator(); i.hasNext();) {
                FileItem item = (FileItem) i.next();
                String fieldName = item.getFieldName();
                if (item.isFormField()) {
                    if ("host".equals(fieldName)) {
                        host = item.getString();
                    } else if ("replace".equals(fieldName)) {
                        replaceSet.add(item.getString());
                    } else if ("key".equals(fieldName)) {
                        key = item.getString();
                    } else if ("origin".equals(fieldName)) {
                        String value = item.getString();
                        origin = Boolean.parseBoolean(value);
                    }
                    continue;
                }

                if (host == null) {
                    logger.warning("Host not received on upload request!");
                    response.sendError(HttpServletResponse.SC_FORBIDDEN);
                    break;
                }

                // The host, origin, key info must be here before we receive
                // any file.
                if (origin) {
                    if (Config.daemonMode != Config.DaemonModes.POLLEE) {
                        logger.warning("Origin upload requested. Not pollee!");
                        response.sendError(HttpServletResponse.SC_FORBIDDEN);
                        break;
                    }
                    if (key == null) {
                        logger.warning("Origin upload requested. No key!");
                        response.sendError(HttpServletResponse.SC_FORBIDDEN);
                        break;
                    }
                    if (!RunRetriever.authenticate(host, key)) {
                        logger.warning("Origin upload requested. " +
                                "Host/key mismatch: " +host + '/' + key + "!");
                        response.sendError(HttpServletResponse.SC_FORBIDDEN);
                        break;
                    }
                }

                if (!"jarfile".equals(fieldName)) // ignore
                    continue;

                String fileName = item.getName();

                if (fileName == null) // We don't process files without names
                    continue;

                // Now, this name may have a path attached, dependent on the
                // source browser. We need to cover all possible clients...
                char[] pathSeparators = {'/', '\\'};
                // Well, if there is another separator we did not account for,
                // just add it above.

                for (int j = 0; j < pathSeparators.length; j++) {
                    int idx = fileName.lastIndexOf(pathSeparators[j]);
                    if (idx != -1) {
                        fileName = fileName.substring(idx + 1);
                        break;
                    }
                }

                // Ignore all non-jarfiles.
                if (!fileName.toLowerCase().endsWith(".jar"))
                    continue;
                File uploadFile = new File(Config.TMP_DIR, host + '.' +
                                                                     fileName);
                try {
                    item.write(uploadFile);
                } catch (Exception e) {
                    throw new ServletException(e);
                }
                int runIdx = fileName.lastIndexOf(".");
                String runName = host + '.' + fileName.substring(0, runIdx);
                File runTmp = unjarTmp(uploadFile);
                //Check if archived recently
                if (checkIfArchived(runName) &&
                       !(replaceSet.contains(fileName.substring(0, runIdx)))) {
                    //Now check if timestamps are same
                    //Get the timestamp of run being uploaded at this point
                    //ts is timestamp of run being uploaded
                    String ts = getRunIdTimestamp(runName,Config.TMP_DIR);
                    l1: while (true) {                     
                        //reposTs is timestamp of run being compared in the
                        //repository
                        String reposTs =
                                getRunIdTimestamp(runName,Config.OUT_DIR);
                        if (reposTs.equals(ts)){
                            duplicateSet.add(fileName.substring(0, runIdx));
                        }else{
                            runName = getNextRunId(runName);
                            if (checkIfArchived(runName))
                                continue l1;
                            File newRunNameFile = new File(Config.OUT_DIR,
                                    runName);
                            if (newRunNameFile.exists()) {
                                recursiveDelete(newRunNameFile);
                            }
                            if (recursiveCopy(runTmp, newRunNameFile)) {
                                newRunNameFile.setLastModified(runTmp.lastModified());
                                uploadTags(runName);
                                uploadFile.delete();
                                recursiveDelete(runTmp);
                            } else {
                                logger.warning("Origin upload requested. " +
                                                                "Copy error!");
                                response.sendError(
                                        HttpServletResponse.SC_NOT_ACCEPTABLE);
                                break;
                            }
                            response.setStatus(HttpServletResponse.SC_CREATED);
                        }
                        break;
                    }
                }else{
                    //File runTmp = unjarTmp(uploadFile);

                    String runId = null;

                    if (origin) {
                        // Change origin file to know where this run came from.
                        File metaInf = new File(runTmp, "META-INF");
                        File originFile = new File(metaInf, "origin");
                        if (!originFile.exists()) {
                            logger.warning("Origin upload requested. " +
                                           "Origin file does not exist!");
                            response.sendError(
                                    HttpServletResponse.SC_NOT_ACCEPTABLE,
                                    "Origin file does not exist!");
                            break;
                        }

                        RunId origRun;
                        try {
                            origRun = new RunId(
                                    readStringFromFile(originFile).trim());
                        } catch (IndexOutOfBoundsException e) {
                            response.sendError(
                                    HttpServletResponse.SC_NOT_ACCEPTABLE,
                                    "Origin file error. " + e.getMessage());
                            break;
                        }

                        runId = origRun.getBenchName() + '.' +
                                                           origRun.getRunSeq();
                        String localHost = origRun.getHostName();
                        if (!localHost.equals(Config.FABAN_HOST)) {
                            logger.warning("Origin upload requested. Origin " +
                            "host" + localHost + " does not match this host " +
                                           Config.FABAN_HOST + '!');
                            response.sendError(
                                    HttpServletResponse.SC_FORBIDDEN);
                            break;
                        }
                        writeStringToFile(runTmp.getName(), originFile);
                    else {
                        runId = runTmp.getName();
                    }
                    File newRunFile = new File(Config.OUT_DIR, runId);
                    if(newRunFile.exists()){
                        recursiveDelete(newRunFile);
                    }
                    if (recursiveCopy(runTmp, newRunFile)){
                        newRunFile.setLastModified(runTmp.lastModified());
                        uploadFile.delete();
                        uploadTags(runId);
                        recursiveDelete(runTmp);
                    } else {
                        logger.warning("Origin upload requested. Copy error!");
                        response.sendError(
                                HttpServletResponse.SC_NOT_ACCEPTABLE);
                        break;
                    }
                }
                response.setStatus(HttpServletResponse.SC_CREATED);
                //break;
            }
            request.setAttribute("duplicates", duplicateSet);
            return "/duplicates.jsp";
        }
}
TOP

Related Classes of com.sun.faban.harness.webclient.Uploader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.