/**
  * Creates a WidgetGrid
  *
  * <p>After creating an instance of this class <CODE>validate</CODE> should be called.
  *
  * @param type The type of the widget, currently only TYPE_DIAL is supported
  * @param definitionPath The path and name of the XML definition of the dial
  * @param widgetWidth The width of the image to be created
  * @param widgetHeight The height of the image to be created
  * @param urlFactory The urlFactory for the content
  * @param messages The messages list for any logger messages
  */
 public WidgetGridComponent(
     final String definitionPath, final IPentahoUrlFactory urlFactory, final List messages) {
   super(urlFactory, messages, null);
   this.definitionPath = definitionPath;
   ActionInfo info = ActionInfo.parseActionString(definitionPath);
   if (info != null) {
     setSourcePath(info.getSolutionName() + File.separator + info.getPath());
   }
   setXsl("text/html", "DialWidget.xsl"); // $NON-NLS-1$ //$NON-NLS-2$
 }
 public FilterPanelComponent(
     final String definitionPath,
     String xslName,
     final IPentahoUrlFactory urlFactory,
     final List messages) {
   super(urlFactory, messages, null);
   this.definitionPath = definitionPath;
   if (xslName == null) {
     // use a default XSL
     xslName = "FilterPanelDefault.xsl"; // $NON-NLS-1$
   }
   ActionInfo info = ActionInfo.parseActionString(definitionPath);
   if (info != null) {
     setSourcePath(info.getSolutionName() + File.separator + info.getPath());
   }
   this.xslName = xslName;
   defaultValues = new HashMap();
 }
 /**
  * Creates a DashboardWidgetComponent.
  *
  * <p>After creating an instance of this class <CODE>validate</CODE> should be called.
  *
  * @param type The type of the widget, currently only TYPE_DIAL is supported
  * @param definitionPath The path and name of the XML definition of the dial
  * @param width The width of the image to be created
  * @param height The height of the image to be created
  * @param urlFactory The urlFactory for the content
  * @param messages The messages list for any logger messages
  */
 public DashboardWidgetComponent(
     final int type,
     final String definitionPath,
     final int width,
     final int height,
     final IPentahoUrlFactory urlFactory,
     final List messages) {
   super(urlFactory, messages, null);
   this.type = type;
   this.definitionPath = definitionPath;
   this.width = width;
   this.height = height;
   ActionInfo info = ActionInfo.parseActionString(definitionPath);
   if (info != null) {
     setSourcePath(info.getSolutionName() + File.separator + info.getPath());
   }
   // Set the XSL file to be used to generate the HTML
   setXsl("text/html", "DialWidget.xsl"); // $NON-NLS-1$ //$NON-NLS-2$
 }
  public static int saveAnalysis(
      final IPentahoSession session,
      final HashMap props,
      final String path,
      String fileName,
      final boolean overwrite) {

    if ("true"
        .equals(
            PentahoSystem.getSystemSetting(
                "kiosk-mode", "false"))) { // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
      throw new RuntimeException(
          Messages.getInstance()
              .getErrorString("ANALYSISSAVER.ERROR_0006_SAVE_IS_DISABLED")); // $NON-NLS-1$
    }

    int result = 0;
    try {
      AnalysisSaver.logger = LogFactory.getLog(AnalysisSaver.class);
      String baseUrl = PentahoSystem.getApplicationContext().getSolutionPath(""); // $NON-NLS-1$
      ISolutionRepository solutionRepository =
          PentahoSystem.get(ISolutionRepository.class, session);

      // We will (at this point in time) always have an original action sequence to start from...
      String originalActionReference = (String) props.get("actionreference"); // $NON-NLS-1$

      if (originalActionReference == null) {
        throw new MissingParameterException(
            Messages.getInstance()
                .getErrorString(
                    "ANALYSISSAVER.ERROR_0001_MISSING_ACTION_REFERENCE")); //$NON-NLS-1$
      }

      Document document = null;
      try {
        org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();
        reader.setEntityResolver(new SolutionURIResolver());
        document =
            reader.read(
                ActionSequenceResource.getInputStream(
                    originalActionReference, LocaleHelper.getLocale()));
      } catch (Throwable t) {
        // XML document can't be read. We'll just return a null document.
      }

      // Update the document with the stuff we passed in on the props
      document = AnalysisSaver.updateDocument(document, props);
      fileName =
          fileName.endsWith(AnalysisSaver.SUFFIX) ? fileName : fileName + AnalysisSaver.SUFFIX;
      result =
          solutionRepository.publish(
              baseUrl,
              path,
              fileName,
              document.asXML().getBytes(document.getXMLEncoding()),
              overwrite);

      // Now save the resource files
      ActionInfo actionInfo = ActionInfo.parseActionString(originalActionReference);
      String originalPath =
          actionInfo.getSolutionName() + "/" + actionInfo.getPath(); // $NON-NLS-1$
      String originalFileName = actionInfo.getActionName();
      originalFileName =
          originalFileName.substring(0, originalFileName.lastIndexOf(AnalysisSaver.SUFFIX));
      ISolutionFile[] parentFiles =
          solutionRepository
              .getSolutionFile(originalPath, ISolutionRepository.ACTION_EXECUTE)
              .listFiles();
      String baseFileName = fileName.substring(0, fileName.lastIndexOf(AnalysisSaver.SUFFIX));
      for (ISolutionFile aSolutionFile : parentFiles) {
        if (!aSolutionFile.isDirectory()
            && aSolutionFile.getFileName().startsWith(originalFileName)
            && aSolutionFile
                .getFileName()
                .toLowerCase()
                .endsWith(AnalysisSaver.PROPERTIES_SUFFIX)) {
          String newFileName =
              aSolutionFile.getFileName().replaceFirst(originalFileName, baseFileName);
          result =
              result
                  & solutionRepository.publish(
                      baseUrl, path, newFileName, aSolutionFile.getData(), overwrite);
        }
      }

      solutionRepository.resetRepository();
    } catch (Exception e) {
      AnalysisSaver.logger.error(
          Messages.getInstance().getErrorString("ANALYSISSAVER.ERROR_0000_UNKNOWN"),
          e); //$NON-NLS-1$
      result = ISolutionRepository.FILE_ADD_FAILED;
    }

    return result;
  }