/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 */
package org.eclipse.osbp.preferences;

import org.eclipse.osbp.preferences.EnumDatabaseVendor;
import org.eclipse.osbp.preferences.ProductConfigurationPrefs;
import org.eclipse.osbp.preferences.ProductFileBase;
import org.eclipse.xtend2.lib.StringConcatenation;

/**
 * &lt;configurations&gt; dependencies for the OSBP product bundle <code>*.product</code> file.
 */
@SuppressWarnings("all")
public class ProductFileConfigurations extends ProductFileBase {
  public ProductFileConfigurations(final ProductConfigurationPrefs prefs) {
    super(prefs);
  }
  
  public ProductFileConfigurations(final ProductConfigurationPrefs prefs, final String... jndiNames) {
    super(prefs, jndiNames);
  }
  
  @Override
  public String getDeprecatedAsString() {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("${{UNNECESSARY_DATA_BASE_VENDOR_CONFIGURATIONS}}");
    _builder.newLine();
    _builder.append("\t\t");
    _builder.append("<plugin id=\"org.drools.api\" autoStart=\"true\" startLevel=\"4\" />");
    _builder.newLine();
    _builder.append("\t\t");
    _builder.append("<plugin id=\"org.eclipse.osbp.authentication.ui\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("\t\t");
    _builder.append("<plugin id=\"net.osbee.bpm\" autoStart=\"true\" startLevel=\"5\" />");
    _builder.newLine();
    _builder.append("\t\t");
    _builder.append("<plugin id=\"net.osbee.mobile.vaadin.ecview.servlet.mobile\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    return this.prepareSerialized(_builder.toString());
  }
  
  @Override
  public String getRequiredAsString() {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("${{NECESSARY_DATA_BASE_VENDOR_CONFIGURATIONS}}");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.core.runtime\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.e4.ui.services\" autoStart=\"false\" startLevel=\"1\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.equinox.common\" autoStart=\"true\" startLevel=\"2\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.equinox.coordinator\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.equinox.ds\" autoStart=\"true\" startLevel=\"1\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.equinox.event\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.gemini.naming\" autoStart=\"true\" startLevel=\"3\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.dsl.dto.lib\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.dsl.metadata.service\" autoStart=\"true\" startLevel=\"3\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.ecview.extension.strategy\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.ecview.jetty.manager\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.osgi.hybrid.api\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.runtime.ecore.bundlespace\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.runtime.event\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.runtime.jsr303.validation\" autoStart=\"true\" startLevel=\"4\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.runtime.typeprovider.bundlespace\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osbp.utils.entitymock.dbfill.ui\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    _builder.append("<plugin id=\"org.eclipse.osgi\" autoStart=\"true\" startLevel=\"-1\" />");
    _builder.newLine();
    return this.prepareSerialized(_builder.toString());
  }
  
  @Override
  public String getRecommendedAsString() {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("<plugin id=\"net.osbee.mobile.vaadin.ecview.servlet.mobile\" autoStart=\"true\" startLevel=\"0\" />");
    _builder.newLine();
    return this.prepareSerialized(_builder.toString());
  }
  
  @Override
  public String prepareSerialized(final String asString) {
    return this.removeDuplicates(
      asString.replace(
        "${{NECESSARY_DATA_BASE_VENDOR_CONFIGURATIONS}}", 
        EnumDatabaseVendor.getNecessaryConfigurations(this.dataBaseVendors)));
  }
}
