/**
   * Construct a {@link SubProcessHeavy SubProcessHeavy} instance which when executed will fulfill
   * the given action agenda.
   *
   * <p>
   *
   * @param agenda The agenda to be accomplished by the action.
   * @param outFile The file to which all STDOUT output is redirected.
   * @param errFile The file to which all STDERR output is redirected.
   * @return The SubProcess which will fulfill the agenda.
   * @throws PipelineException If unable to prepare a SubProcess due to illegal, missing or
   *     imcompatable information in the action agenda or a general failure of the prep method code.
   */
  public SubProcessHeavy prep(ActionAgenda agenda, File outFile, File errFile)
      throws PipelineException {
    NodeID nodeID = agenda.getNodeID();

    /* sanity checks */
    String opname = null;
    File source = null;
    File preRender = null;
    File postRender = null;
    File preFrame = null;
    File postFrame = null;
    {
      {
        FileSeq fseq = agenda.getPrimaryTarget();
        if (!fseq.hasFrameNumbers())
          throw new PipelineException(
              "The HfsComposite Action requires that the output images have frame numbers.");
      }

      /* generate the filename of the Houdini scene to load */
      {
        String sname = (String) getSingleParamValue("HoudiniScene");
        if (sname != null) {
          FileSeq fseq = agenda.getPrimarySource(sname);
          if (fseq == null)
            throw new PipelineException(
                "Somehow the Houdini Scene node ("
                    + sname
                    + ") was not one of the source "
                    + "nodes!");

          String suffix = fseq.getFilePattern().getSuffix();
          if (!fseq.isSingle() || (suffix == null) || !suffix.equals("hip"))
            throw new PipelineException(
                "The HfsComposite Action requires that the source node specified by the "
                    + "Houdini Scene parameter ("
                    + sname
                    + ") must have a single Houdini scene "
                    + "file (.hip) as its primary file sequence!");

          NodeID snodeID = new NodeID(nodeID, sname);
          source =
              new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0));
        } else {
          throw new PipelineException(
              "The HfsComposite Action requires the Houdini Scene parameter to be set!");
        }
      }

      /* the full name of the geometry output operator */
      {
        String name = (String) getSingleParamValue("OutputOperator");
        if ((name == null) || (name.length() == 0))
          throw new PipelineException(
              "The HfsComposite Action requires a valid Output Operator name!");

        opname = ("/out/" + name);
      }

      /* command script files */
      {
        String sname = (String) getSingleParamValue("PreRenderScript");
        if (sname != null) {
          FileSeq fseq = agenda.getPrimarySource(sname);
          if (fseq == null)
            throw new PipelineException(
                "Somehow the Pre Render Script node ("
                    + sname
                    + ") was not one of the "
                    + "source nodes!");

          String suffix = fseq.getFilePattern().getSuffix();
          if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd")))
            throw new PipelineException(
                "The HfsComposite Action requires that the source node specified by the Pre "
                    + "Render Script parameter ("
                    + sname
                    + ") must have a single command script "
                    + "(.cmd) as its primary file sequence!");

          NodeID snodeID = new NodeID(nodeID, sname);
          preRender =
              new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0));
        }
      }

      {
        String sname = (String) getSingleParamValue("PostRenderScript");
        if (sname != null) {
          FileSeq fseq = agenda.getPrimarySource(sname);
          if (fseq == null)
            throw new PipelineException(
                "Somehow the Post Render Script node ("
                    + sname
                    + ") was not one of the "
                    + "source nodes!");

          String suffix = fseq.getFilePattern().getSuffix();
          if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd")))
            throw new PipelineException(
                "The HfsComposite Action requires that the source node specified by the "
                    + "Post Render Script parameter ("
                    + sname
                    + ") must have a single command "
                    + "script (.cmd) as its primary file sequence!");

          NodeID snodeID = new NodeID(nodeID, sname);
          postRender =
              new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0));
        }
      }

      {
        String sname = (String) getSingleParamValue("PreFrameScript");
        if (sname != null) {
          FileSeq fseq = agenda.getPrimarySource(sname);
          if (fseq == null)
            throw new PipelineException(
                "Somehow the Pre Frame Script node ("
                    + sname
                    + ") was not one of the "
                    + "source nodes!");

          String suffix = fseq.getFilePattern().getSuffix();
          if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd")))
            throw new PipelineException(
                "The HfsComposite Action requires that the source node specified by the Pre "
                    + "Frame Script parameter ("
                    + sname
                    + ") must have a single command script "
                    + "(.cmd) as its primary file sequence!");

          NodeID snodeID = new NodeID(nodeID, sname);
          preFrame =
              new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0));
        }
      }

      {
        String sname = (String) getSingleParamValue("PostFrameScript");
        if (sname != null) {
          FileSeq fseq = agenda.getPrimarySource(sname);
          if (fseq == null)
            throw new PipelineException(
                "Somehow the Post Frame Script node ("
                    + sname
                    + ") was not one of the "
                    + "source nodes!");

          String suffix = fseq.getFilePattern().getSuffix();
          if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd")))
            throw new PipelineException(
                "The HfsComposite Action requires that the source node specified by the "
                    + "Post Frame Script parameter ("
                    + sname
                    + ") must have a single command "
                    + "script (.cmd) as its primary file sequence!");

          NodeID snodeID = new NodeID(nodeID, sname);
          postFrame =
              new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0));
        }
      }
    }

    /* create the temporary Houdini command script */
    File hscript = createTemp(agenda, 0644, "cmd");
    try {
      FileWriter out = new FileWriter(hscript);

      FileSeq fseq =
          new FileSeq(
              PackageInfo.sProdDir.getPath() + nodeID.getWorkingParent(),
              agenda.getPrimaryTarget());
      if (fseq.hasFrameNumbers()) {
        FilePattern fpat = fseq.getFilePattern();
        FrameRange frange = fseq.getFrameRange();
        out.write(
            "opparm "
                + opname
                + " trange on\n"
                + "opparm "
                + opname
                + " f1 "
                + frange.getStart()
                + "\n"
                + "opparm "
                + opname
                + " f2 "
                + frange.getEnd()
                + "\n"
                + "opparm "
                + opname
                + " f3 "
                + frange.getBy()
                + "\n"
                + "opparm "
                + opname
                + " copoutput '"
                + fpat.getPrefix()
                + ".$F");

        if (fpat.getPadding() > 1) out.write(String.valueOf(fpat.getPadding()));

        out.write("." + fpat.getSuffix() + "'\n");
      } else {
        out.write("opparm " + opname + " trange off\n" + "opparm " + opname + " " + fseq + "\n");
      }

      if (preRender != null) out.write("opparm " + opname + " prerender '" + preRender + "'\n");

      if (postRender != null) out.write("opparm " + opname + " postrender '" + postRender + "'\n");

      if (preFrame != null) out.write("opparm " + opname + " preframe '" + preFrame + "'\n");

      if (postFrame != null) out.write("opparm " + opname + " postframe '" + postFrame + "'\n");

      out.write("opparm -c " + opname + " execute\n");

      out.close();
    } catch (IOException ex) {
      throw new PipelineException(
          "Unable to write temporary script file ("
              + hscript
              + ") for Job "
              + "("
              + agenda.getJobID()
              + ")!\n"
              + ex.getMessage());
    }

    /* create the wrapper shell script */
    File script = createTemp(agenda, 0755, "bash");
    try {
      FileWriter out = new FileWriter(script);
      out.write("#!/bin/bash\n\n" + "cat " + hscript + " | hscript -v " + source);
      out.close();
    } catch (IOException ex) {
      throw new PipelineException(
          "Unable to write temporary script file ("
              + script
              + ") for Job "
              + "("
              + agenda.getJobID()
              + ")!\n"
              + ex.getMessage());
    }

    try {
      return new SubProcessHeavy(
          agenda.getNodeID().getAuthor(),
          getName() + "-" + agenda.getJobID(),
          script.getPath(),
          new ArrayList<String>(),
          agenda.getEnvironment(),
          agenda.getWorkingDir(),
          outFile,
          errFile);
    } catch (Exception ex) {
      throw new PipelineException(
          "Unable to generate the SubProcess to perform this Action!\n" + ex.getMessage());
    }
  }
Esempio n. 2
0
    @SuppressWarnings("unchecked")
    @Override
    public void validatePhase() throws PipelineException {
      /* the slate and format Nuke script nodes */
      String slatePrefix = null;
      {
        String script = getStringParamValue(new ParamMapping(aSlateScript), false);
        Path path = new Path(pProjectNamer.getSlateNukeScriptsParentPath(), script);
        pSlateNodeName = path.toString();
        slatePrefix = path.getName();
        pRequiredNodeNames.add(pSlateNodeName);
      }

      String formatPrefix = null;
      {
        String script = getStringParamValue(new ParamMapping(aFormatScript), false);
        Path path = new Path(pProjectNamer.getFormatNukeScriptsParentPath(), script);
        pFormatNodeName = path.toString();
        formatPrefix = path.getName();
        pRequiredNodeNames.add(pFormatNodeName);
      }

      /* the final QuickTime codec settings */
      String codecPrefix = null;
      {
        String settings = getStringParamValue(new ParamMapping(aCodecSettings), false);
        Path path = new Path(pProjectNamer.getQtCodecSettingsParentPath(), settings);
        pCodecNodeName = path.toString();
        codecPrefix = path.getName();
        pRequiredNodeNames.add(pCodecNodeName);
      }

      /* lookup the rest of the parameters */
      pDeliveryType = getStringParamValue(new ParamMapping(aDeliveryType));
      pDeliverable = getStringParamValue(new ParamMapping(DeliverNamer.aDeliverable), false);
      pClientVersion = getStringParamValue(new ParamMapping(aClientVersion));
      pClientShotName = getStringParamValue(new ParamMapping(aClientShotName));
      pLensInfo = getStringParamValue(new ParamMapping(aLensInfo), false);
      pTakeInfo = getStringParamValue(new ParamMapping(aTakeInfo), false);
      pNotes = getStringParamValue(new ParamMapping(aNotes));
      pSlateHold = getIntegerParamValue(new ParamMapping(aSlateHold), new Range<Integer>(0, null));

      /* compute the full frame range with slate holds added */
      FrameRange range = pSourceVersion.getPrimarySequence().getFrameRange();
      if (range.getBy() != 1)
        throw new PipelineException(
            "The source images node ("
                + pSourceVersion.getName()
                + " v"
                + pSourceVersion.getVersionID()
                + ") must have a frame step increment of (1)!");
      pFrameRange = new FrameRange(range.getStart(), range.getEnd() + pSlateHold, 1);

      /* initialize internal Deliver (Shot) namer */
      {
        pDeliverNamer = new DeliverNamer(pClient, pQueue, getBuilderInformation(), pStudioDefs);
        pShotNamer = pDeliverNamer;

        pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aProjectName), pProjectName);
        pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aSequenceName), pSeqName);
        pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aShotName), pShotName);
        pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aDeliverable), pDeliverable);
        pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aTaskType), pTaskType.toString());
        pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aSlatePrefix), slatePrefix);
        pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aFormatPrefix), formatPrefix);
        pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aCodecPrefix), codecPrefix);

        pDeliverNamer.generateNames();
      }
    }