/** {@inheritDoc} */
  public String generate(Object argument) {
    final StringBuffer stringBuffer = new StringBuffer();

    TemplateParameter templ = (TemplateParameter) argument;
    ImplementationSettings implSettings = templ.getImplSettings();
    Implementation impl = templ.getImpl();
    SoftPkg softPkg = (SoftPkg) impl.eContainer();
    String PREFIX =
        gov.redhawk.ide.codegen.util.CodegenFileHelper.getPreferredFilePrefix(
            softPkg, implSettings);
    boolean hasSddsPort = false;
    Date date = new Date(System.currentTimeMillis());
    EList<Provides> provides =
        softPkg.getDescriptor().getComponent().getComponentFeatures().getPorts().getProvides();

    for (Provides entry : provides) {
      if (entry.getRepID().contains("BULKIO/dataSDDS")) {
        hasSddsPort = true;
      }
    }

    stringBuffer.append(TEXT_1);
    stringBuffer.append(ModelUtil.getSpdFileName(softPkg));
    stringBuffer.append(TEXT_2);
    stringBuffer.append(date.toString());

    String[] output;
    IProduct product = Platform.getProduct();
    if (product != null) {
      output = product.getProperty("aboutText").split("\n");

      stringBuffer.append(TEXT_3);
      stringBuffer.append(output[0]);
      stringBuffer.append(TEXT_4);
      stringBuffer.append(output[1]);
      stringBuffer.append(TEXT_5);
      stringBuffer.append(output[2]);
    }

    stringBuffer.append(TEXT_6);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_7);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_8);
    if (!templ.isDevice()) {
      stringBuffer.append(TEXT_9);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_10);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_11);
      stringBuffer.append(TEXT_12);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_13);
    } else {
      stringBuffer.append(TEXT_14);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_15);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_16);
      stringBuffer.append(TEXT_17);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_18);
      stringBuffer.append(TEXT_19);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_20);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_21);
      stringBuffer.append(TEXT_22);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_23);
      stringBuffer.append(TEXT_24);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_25);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_26);
      stringBuffer.append(TEXT_27);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_28);
      stringBuffer.append(TEXT_29);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_30);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_31);
      stringBuffer.append(TEXT_32);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_33);
    }
    stringBuffer.append(TEXT_34);
    stringBuffer.append(TEXT_35);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_36);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_37);
    if (hasSddsPort) {
      stringBuffer.append(TEXT_38);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_39);
      stringBuffer.append(PREFIX);
      stringBuffer.append(TEXT_40);
    }
    stringBuffer.append(TEXT_41);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_42);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_43);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_44);
    stringBuffer.append(TEXT_45);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_46);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_47);
    stringBuffer.append(TEXT_48);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_49);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_50);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_51);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_52);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_53);
    stringBuffer.append(PREFIX);
    stringBuffer.append(TEXT_54);
    stringBuffer.append(TEXT_55);
    return stringBuffer.toString();
  }
  public String generate(Object argument) throws CoreException {
    final StringBuffer stringBuffer = new StringBuffer();

    final TemplateParameter param = (TemplateParameter) argument;
    final EMap<String, ImplementationSettings> settings =
        ((WaveDevSettings) param.getImplSettings().eContainer().eContainer()).getImplSettings();
    final String name = param.getSoftPkg().getName();
    final String version;
    if (param.getSoftPkg().getVersion() != null
        && param.getSoftPkg().getVersion().trim().length() != 0) {
      version = param.getSoftPkg().getVersion();
    } else {
      version = "1.0.0";
    }

    // Interfaces
    final Set<String> interfaceNamespaces = new HashSet<String>();
    final List<Interface> interfaces =
        param.getSoftPkg().getDescriptor().getComponent().getInterfaces().getInterface();
    final Pattern idlPattern = Pattern.compile("^IDL:(\\w+)/");
    for (Interface iface : interfaces) {
      final Matcher match = idlPattern.matcher(iface.getRepid());
      if (match.find()) {
        if (!"CF".equals(match.group(1))) {
          interfaceNamespaces.add(match.group(1));
        }
      }
    }

    // Language
    boolean hasCpp = false, hasJava = false, hasPython = false;
    for (final Implementation impl : param.getSoftPkg().getImplementation()) {
      final String language = impl.getProgrammingLanguage().getName();
      if ("C++".equals(language)) {
        hasCpp = true;
      } else if ("Java".equals(language)) {
        hasJava = true;
      } else if ("Python".equals(language)) {
        hasPython = true;
      }
    }

    // Strings that depend on project type
    final String sdrrootFolder;
    final String projectType;
    final SoftwareComponent scd = param.getSoftPkg().getDescriptor().getComponent();
    final ComponentType componentType = SoftwareComponent.Util.getWellKnownComponentType(scd);
    switch (componentType) {
      case RESOURCE:
        sdrrootFolder = "dom/components";
        projectType = "Component";
        break;
      case DEVICE:
        sdrrootFolder = "dev/devices";
        projectType = "Device";
        break;
      case SERVICE:
        sdrrootFolder = "dev/services";
        projectType = "Service";
        break;
      default:
        // For backwards compatibility, support non-spec strings the IDE used to generate
        try {
          if (scd != null && scd.getComponentType() != null) {
            final String compTypeStr = scd.getComponentType();
            if (compTypeStr.equals("executabledevice") || compTypeStr.equals("loadabledevice")) {
              sdrrootFolder = "dev/devices";
              projectType = "Device";
              break;
            }
          }
        } catch (NullPointerException e) {
          // PASS
        }
        throw new CoreException(
            new Status(
                IStatus.ERROR,
                Activator.PLUGIN_ID,
                "Template file does not support the specified project type"));
    }

    stringBuffer.append(TEXT_1);
    stringBuffer.append(name);
    stringBuffer.append(TEXT_2);
    stringBuffer.append(projectType);
    stringBuffer.append(TEXT_3);

    if (param.getSoftPkg().getTitle() != null
        && param.getSoftPkg().getTitle().trim().length() > 0) {

      stringBuffer.append(TEXT_4);
      stringBuffer.append(param.getSoftPkg().getTitle());
      stringBuffer.append(TEXT_5);
    }
    stringBuffer.append(TEXT_6);
    stringBuffer.append(version);
    stringBuffer.append(TEXT_7);
    stringBuffer.append(projectType);
    stringBuffer.append(TEXT_8);

    if (interfaceNamespaces.size() > 0) {
      boolean foundOther = false;
      // these interfaces are available through the redhawk install
      //  so no additional rpms are needed
      for (String ifaceNamespace : interfaceNamespaces) {
        if ((!ifaceNamespace.equals("CF"))
            && (!ifaceNamespace.equals("PortTypes"))
            && (!ifaceNamespace.equals("ExtendedEvent"))
            && (!ifaceNamespace.equals("ExtendedCF"))
            && (!ifaceNamespace.equals("StandardEvent"))
            && (!ifaceNamespace.equals("WKP"))) {
          foundOther = true;
          break;
        }
      }
      if (foundOther) {

        stringBuffer.append(TEXT_9);

        for (String ifaceNamespace : interfaceNamespaces) {
          if ((!ifaceNamespace.equals("CF"))
              && (!ifaceNamespace.equals("PortTypes"))
              && (!ifaceNamespace.equals("ExtendedEvent"))
              && (!ifaceNamespace.equals("ExtendedCF"))
              && (!ifaceNamespace.equals("StandardEvent"))
              && (!ifaceNamespace.equals("WKP"))) {

            stringBuffer.append(TEXT_10);
            stringBuffer.append(ifaceNamespace.toLowerCase());
            stringBuffer.append(TEXT_11);
          }
        }

        stringBuffer.append(TEXT_12);

        for (String ifaceNamespace : interfaceNamespaces) {
          if ((!ifaceNamespace.equals("CF"))
              && (!ifaceNamespace.equals("PortTypes"))
              && (!ifaceNamespace.equals("ExtendedEvent"))
              && (!ifaceNamespace.equals("ExtendedCF"))
              && (!ifaceNamespace.equals("StandardEvent"))
              && (!ifaceNamespace.equals("WKP"))) {

            stringBuffer.append(TEXT_13);
            stringBuffer.append(ifaceNamespace.toLowerCase());
            stringBuffer.append(TEXT_14);
          }
        }

        stringBuffer.append(TEXT_15);
      }
    }
    if (!hasCpp && (hasJava | hasPython)) {

      stringBuffer.append(TEXT_16);
    }
    if (hasCpp) {

      stringBuffer.append(TEXT_17);
    }
    if (hasJava) {

      stringBuffer.append(TEXT_18);
    }
    if (hasPython) {

      stringBuffer.append(TEXT_19);
    }

    stringBuffer.append(TEXT_20);

    if (param.getSoftPkg().getDescription() != null) {

      stringBuffer.append(TEXT_21);
      stringBuffer.append(param.getSoftPkg().getDescription());

    } else {

      stringBuffer.append(TEXT_22);
      stringBuffer.append(projectType);
      stringBuffer.append(TEXT_23);
    }

    stringBuffer.append(TEXT_24);

    for (final Implementation impl : param.getSoftPkg().getImplementation()) {
      final ImplementationSettings implSettings = settings.get(impl.getId());
      if (implSettings == null) {
        continue;
      }

      stringBuffer.append(TEXT_25);
      stringBuffer.append(impl.getId());
      stringBuffer.append(TEXT_26);
      stringBuffer.append(implSettings.getOutputDir());
      stringBuffer.append(TEXT_27);
      stringBuffer.append(sdrrootFolder);
      stringBuffer.append(TEXT_28);
      stringBuffer.append(name);
      stringBuffer.append(TEXT_29);
      stringBuffer.append(implSettings.getOutputDir());
      stringBuffer.append(TEXT_30);
    }

    stringBuffer.append(TEXT_31);

    for (final Implementation impl : param.getSoftPkg().getImplementation()) {
      final ImplementationSettings implSettings = settings.get(impl.getId());
      if (implSettings == null) {
        continue;
      }

      stringBuffer.append(TEXT_32);
      stringBuffer.append(impl.getId());
      stringBuffer.append(TEXT_33);
      stringBuffer.append(implSettings.getOutputDir());
      stringBuffer.append(TEXT_34);
      stringBuffer.append(sdrrootFolder);
      stringBuffer.append(TEXT_35);
      stringBuffer.append(name);
      stringBuffer.append(TEXT_36);
      stringBuffer.append(implSettings.getOutputDir());
      stringBuffer.append(TEXT_37);
    }

    stringBuffer.append(TEXT_38);
    stringBuffer.append(sdrrootFolder);
    stringBuffer.append(TEXT_39);
    stringBuffer.append(sdrrootFolder);
    stringBuffer.append(TEXT_40);
    stringBuffer.append(ModelUtil.getSpdFileName(param.getSoftPkg()));

    if (param.getSoftPkg().getPropertyFile() != null) {

      stringBuffer.append(TEXT_41);
      stringBuffer.append(sdrrootFolder);
      stringBuffer.append(TEXT_42);
      stringBuffer.append(ModelUtil.getPrfFileName(param.getSoftPkg().getPropertyFile()));
    }

    stringBuffer.append(TEXT_43);
    stringBuffer.append(sdrrootFolder);
    stringBuffer.append(TEXT_44);
    stringBuffer.append(ModelUtil.getScdFileName(param.getSoftPkg()));

    for (final Implementation impl : param.getSoftPkg().getImplementation()) {
      final ImplementationSettings implSettings = settings.get(impl.getId());
      if (implSettings == null) {
        continue;
      }

      stringBuffer.append(TEXT_45);
      stringBuffer.append(sdrrootFolder);
      stringBuffer.append(TEXT_46);
      stringBuffer.append(implSettings.getOutputDir());
    }

    return stringBuffer.toString();
  }