content: /*
   * This library is part of OpenCms -
   * the Open Source Content Management System
   *
   * Copyright (c) Alkacon Software GmbH & Co. KG (https://www.alkacon.com)
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * Lesser General Public License for more details.
   *
   * For further information about Alkacon Software GmbH & Co. KG, please see the
   * company website: https://www.alkacon.com
   *
   * For further information about OpenCms, please see the
   * project website: https://www.opencms.org
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  package org.opencms.workplace.administration;
  
  import org.opencms.file.CmsResource;
  import org.opencms.jsp.CmsJspActionElement;
  import org.opencms.main.CmsException;
  import org.opencms.main.CmsIllegalArgumentException;
  import org.opencms.main.OpenCms;
  import org.opencms.util.CmsRfsException;
  import org.opencms.util.CmsStringUtil;
  import org.opencms.workplace.CmsDialog;
  import org.opencms.workplace.CmsWorkplaceSettings;
  
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Iterator;
  
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.jsp.JspException;
  import javax.servlet.jsp.JspWriter;
  import javax.servlet.jsp.PageContext;
  
  import org.apache.commons.fileupload.FileItem;
  
  /**
   * Abstract class to upload a zip file containing VFS resources with HTTP upload.<p>
   *
   * @since 6.0.0
   */
  public abstract class A_CmsImportFromHttp extends CmsDialog {
  
      /** The dialog type. */
      public static final String DIALOG_TYPE = "ImportHttp";
  
      /** Import file request parameter. */
      public static final String PARAM_IMPORTFILE = "importfile";
  
      /** The exception thrown if an error occurs. */
      private CmsException m_exception;
  
      /** The import file name that is uploaded. */
      private String m_paramImportfile;
  
      /**
       * Public constructor with JSP action element.<p>
       *
       * @param jsp an initialized JSP action element
       */
      public A_CmsImportFromHttp(CmsJspActionElement jsp) {
  
          super(jsp);
      }
  
      /**
       * Public constructor with JSP variables.<p>
       *
       * @param context the JSP page context
       * @param req the JSP request
       * @param res the JSP response
       */
      public A_CmsImportFromHttp(PageContext context, HttpServletRequest req, HttpServletResponse res) {
  
          this(new CmsJspActionElement(context, req, res));
      }
  
      /**
       * Performs the import operation after "OK" has been pressed.<p>
       *
       * @throws IOException in case of errors forwarding to the required result page
       * @throws ServletException in case of errors forwarding to the required result page
       */
      public abstract void actionCommit() throws IOException, ServletException;
  
      /**
       * Performs the dialog actions depending on the initialized action and displays the dialog form.<p>
       *
       * @throws JspException if dialog actions fail
       * @throws IOException if writing to the JSP out fails, or in case of errors forwarding to the required result page
       * @throws ServletException in case of errors forwarding to the required result page
       */
      public void displayDialog() throws IOException, JspException, ServletException {
  
          switch (getAction()) {
  
              case ACTION_CANCEL:
                  // ACTION: cancel button pressed
                  actionCloseDialog();
                  break;
  
              case ACTION_OK:
                  // ACTION: ok button pressed
                  setParamAction(DIALOG_OK);
                  actionCommit();
                  if (getException() == null) {
                      // file successfully copied to server
                      break;
                  }
  
                  //$FALL-THROUGH$
              case ACTION_DEFAULT:
              default:
                  // ACTION: show dialog (default)
                  setParamAction(DIALOG_OK);
                  JspWriter out = getJsp().getJspContext().getOut();
                  out.print(defaultActionHtml());
          }
      }
  
      /**
       * Gets the return uri for this dialog.<p>
       *
       * @return return uri for this dialog
       */
      public abstract String getDialogReturnUri();
  
      /**
       * Gets the localized import message text for the input form.<p>
       *
       * @return localized import message text  for the input form
       */
      public abstract String getImportMessage();
  
      /**
       * Returns the import file name that is uploaded.<p>
       *
       * @return the import file name that is uploaded
       */
      public String getParamImportfile() {
  
          return m_paramImportfile;
      }
  
      /**
       * Gets the localized start text for the input form.<p>
       *
       * @return localized start text for the input form
       */
      public abstract String getStarttext();
  
      /**
       * Sets the import file name that is uploaded.<p>
       *
       * @param importfile the import file name that is uploaded
       */
      public void setParamImportfile(String importfile) {
  
          m_paramImportfile = importfile;
      }
  
      /**
       * Html code for the additional parameters.<p>
       *
       * @return html code
       */
      protected String getAdditionalParameters() {
  
          // do nothing
          return "";
      }
  
      /**
       * Gets a database import file from the client and copies it to the server.<p>
       *
       * @param destination the destination of the file on the server
       *
       * @return the name of the file or null if something went wrong when importing the file
       *
       * @throws CmsIllegalArgumentException if the specified file name is invalid
       * @throws CmsRfsException if generating folders or files on the server fails
       */
      protected String copyFileToServer(String destination) throws CmsIllegalArgumentException, CmsRfsException {
  
          // get the file item from the multipart request
          Iterator<FileItem> i = getMultiPartFileItems().iterator();
          FileItem fi = null;
          while (i.hasNext()) {
              fi = i.next();
              if (fi.getName() != null) {
                  // found the file object, leave iteration
                  break;
              } else {
                  // this is no file object, check next item
                  continue;
              }
          }
  
          String fileName = null;
  
          if ((fi != null) && CmsStringUtil.isNotEmptyOrWhitespaceOnly(fi.getName())) {
              // file name has been specified, upload the file
              fileName = fi.getName();
              byte[] content = fi.get();
              fi.delete();
              // get the file name without folder information
              fileName = CmsResource.getName(fileName.replace('\\', '/'));
              // first create the folder if it does not exist
              File discFolder = new File(
                  OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(
                      OpenCms.getSystemInfo().getPackagesRfsPath() + File.separator));
              if (!discFolder.exists()) {
                  if (!discFolder.mkdir()) {
                      throw new CmsRfsException(Messages.get().container(Messages.ERR_FOLDER_NOT_CREATED_0));
                  }
              }
              // write the file into the packages folder of the OpenCms server
              File discFile = new File(
                  OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(destination + File.separator + fileName));
              try {
                  // write the new file to disk
                  OutputStream s = new FileOutputStream(discFile);
                  s.write(content);
                  s.close();
              } catch (FileNotFoundException e) {
                  throw new CmsRfsException(Messages.get().container(Messages.ERR_FILE_NOT_FOUND_1, fileName, e));
              } catch (IOException e) {
                  throw new CmsRfsException(Messages.get().container(Messages.ERR_FILE_NOT_WRITTEN_0, e));
              }
          } else {
              // no file name has been specified, throw exception
              throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_FILE_NOT_SPECIFIED_0));
          }
          // set the request parameter to the name of the import file
          setParamImportfile(fileName);
          return fileName;
      }
  
      /**
       * Creates the HTML for the error message if validation errors were found.<p>
       *
       * @return the HTML for the error message if validation errors were found
       */
      protected String createDialogErrorMessage() {
  
          if (getException() != null) {
              StringBuffer result = new StringBuffer(8);
              result.append(dialogBlockStart(""));
              result.append("<table border=\"0\">\n");
              result.append("<tr><td><img src=\"");
              result.append(getSkinUri()).append("commons/");
              result.append("error.png");
              result.append("\" border=\"0\" alt=\"\"></td><td class=\"xmlTdError maxwidth\">");
              Throwable t = getException();
              while (t != null) {
                  result.append(t.getLocalizedMessage());
                  t = t.getCause();
                  if (t != null) {
                      result.append("<br>");
                  }
              }
              result.append("</table>\n");
              result.append(dialogBlockEnd());
              return result.toString();
          }
          return "";
      }
  
      /**
       * Returns the HTML to build the input form of the upload dialog.<p>
       *
       * @return the HTML to build the input form of the upload dialog
       */
      protected String defaultActionHtml() {
  
          StringBuffer result = new StringBuffer(32);
  
          result.append(htmlStart());
          result.append(bodyStart(null));
          result.append(dialogStart());
          result.append(dialogContentStart(""));
          result.append("<form name=\"main\" class=\"nomargin\" action=\"");
          result.append(getJsp().link(getDialogReturnUri()));
          result.append("\" method=\"post\" onsubmit=\"submitAction('");
          result.append(DIALOG_OK);
          result.append("', null, 'main');\" enctype=\"multipart/form-data\">\n");
          result.append(paramsAsHidden());
          if (getParamFramename() == null) {
              result.append("<input type=\"hidden\" name=\"");
              result.append(PARAM_FRAMENAME);
              result.append("\" value=\"\">");
          }
          result.append(createDialogErrorMessage());
          result.append(dialogBlockStart(getStarttext()));
          result.append("<table border=\"0\" width=\"100%\">\n");
          result.append("<tr>\n\t<td style=\"white-space: nowrap;\" unselectable=\"on\">");
          result.append(getImportMessage());
          result.append(":</td>\n");
          result.append("\t<td class=\"maxwidth\">");
          result.append("<input type=\"file\" name=\"");
          result.append(PARAM_IMPORTFILE);
          result.append("\" class=\"maxwidth\" accept=\"application/zip\">");
          result.append("</td>\n</tr>");
          result.append(getAdditionalParameters());
          result.append("</table>\n");
          result.append(dialogBlockEnd());
  
          result.append(dialogContentEnd());
          result.append(dialogButtonsOkCancel());
          result.append("</form>\n");
          result.append(dialogEnd());
          result.append(bodyEnd());
          result.append(htmlEnd());
          return result.toString();
      }
  
      /**
       * Returns the dialog exception.<p>
       *
       * @return the dialog exception
       */
      protected CmsException getException() {
  
          return m_exception;
      }
  
      /**
       * @see org.opencms.workplace.CmsWorkplace#initMessages()
       */
      @Override
      protected abstract void initMessages();
  
      /**
       * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest)
       */
      @Override
      protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) {
  
          // set the dialog type
          setParamDialogtype(getClass().getName());
  
          // fill the parameter values in the get/set methods
          fillParamValues(request);
  
          // set the action for the JSP switch
          if (DIALOG_OK.equals(getParamAction())) {
              // ok button pressed
              setAction(ACTION_OK);
          } else if (DIALOG_CANCEL.equals(getParamAction())) {
              // cancel button pressed
              setAction(ACTION_CANCEL);
          } else {
              // first dialog call, set the default action
              setAction(ACTION_DEFAULT);
          }
      }
  
      /**
       * Sets the dialog exception.<p>
       *
       * @param exception the dialog exception
       */
      protected void setException(CmsException exception) {
  
          m_exception = exception;
      }
  }