<commit_before>package br.net.mirante.singular.showcase.component;

import br.net.mirante.singular.form.mform.MDicionario;
import br.net.mirante.singular.form.mform.MPacote;
import br.net.mirante.singular.form.mform.MTipo;
import br.net.mirante.singular.form.mform.SingularFormException;
import br.net.mirante.singular.showcase.view.page.ItemCasePanel;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Representa um exemplo de um componente ou solução junto com os respectivo
 * códigos e explicações.
 */
public class CaseBase implements Serializable {

    private final String componentName;
    private final String subCaseName;
    private String descriptionHtml;
    private final List<ItemCasePanel.ItemCaseButton> botoes = new ArrayList<>();
    private final List<ResourceRef> aditionalSources = new ArrayList<>();

    public CaseBase(String componentName) {
        this(componentName, null);
    }

    public CaseBase(String componentName, String subCaseName) {
        this.componentName = componentName;
        this.subCaseName = subCaseName;
    }

    public String getComponentName() {
        return componentName;
    }

    public String getSubCaseName() {
        return subCaseName;
    }

    public void setDescriptionHtml(String descriptionHtml) {
        this.descriptionHtml = descriptionHtml;
    }

    public Optional<String> getDescriptionHtml() {
        if (descriptionHtml != null) {
            return Optional.of(descriptionHtml);
        }
        return getDescriptionResourceName().map(ResourceRef::getContent);
    }

    @SuppressWarnings("unchecked")
    private Class<? extends MPacote> getPackage() {
        String target = getClass().getName() + "Package";
        try {
            Class<?> c = getClass().getClassLoader().loadClass(target);
            if (!MPacote.class.isAssignableFrom(c)) {
                throw new RuntimeException(target + " não extende " + MPacote.class.getName());
            }
            return (Class<? extends MPacote>) c;
        } catch (ClassNotFoundException e) {
            throw new SingularFormException("É esperado uma classe com o nome " + target + " como complemento de " + getClass().getName(),
                    e);
        }
    }

    public MTipo<?> getCaseType() {
        MDicionario dicionario = MDicionario.create();
        MPacote p = dicionario.carregarPacote(getPackage());

        return p.getTipoLocalOpcional("testForm")
                .orElseThrow(() -> new SingularFormException("O pacote " + p.getNome() + " não define o tipo para exibição 'testForm'"));
    }

    public Optional<ResourceRef> getDescriptionResourceName() {
        return ResourceRef.forClassWithExtension(getClass(), "html");<commit_msg>[FORM] Passando a guardar a instancia do Dicionário para evitar que o mesmo seja carregado várias vezes<commit_after>package br.net.mirante.singular.showcase.component;

import br.net.mirante.singular.form.mform.MDicionario;
import br.net.mirante.singular.form.mform.MPacote;
import br.net.mirante.singular.form.mform.MTipo;
import br.net.mirante.singular.form.mform.SingularFormException;
import br.net.mirante.singular.showcase.view.page.ItemCasePanel;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Representa um exemplo de um componente ou solução junto com os respectivo
 * códigos e explicações.
 */
public class CaseBase implements Serializable {

    private final String componentName;
    private final String subCaseName;
    private String descriptionHtml;
    private final List<ItemCasePanel.ItemCaseButton> botoes = new ArrayList<>();
    private final List<ResourceRef> aditionalSources = new ArrayList<>();

    private transient MTipo<?> caseType;
    
    public CaseBase(String componentName) {
        this(componentName, null);
    }

    public CaseBase(String componentName, String subCaseName) {
        this.componentName = componentName;
        this.subCaseName = subCaseName;
    }

    public String getComponentName() {
        return componentName;
    }

    public String getSubCaseName() {
        return subCaseName;
    }

    public void setDescriptionHtml(String descriptionHtml) {
        this.descriptionHtml = descriptionHtml;
    }

    public Optional<String> getDescriptionHtml() {
        if (descriptionHtml != null) {
            return Optional.of(descriptionHtml);
        }
        return getDescriptionResourceName().map(ResourceRef::getContent);
    }

    @SuppressWarnings("unchecked")
    private Class<? extends MPacote> getPackage() {
        String target = getClass().getName() + "Package";
        try {
            Class<?> c = getClass().getClassLoader().loadClass(target);
            if (!MPacote.class.isAssignableFrom(c)) {
                throw new RuntimeException(target + " não extende " + MPacote.class.getName());
            }
            return (Class<? extends MPacote>) c;
        } catch (ClassNotFoundException e) {
            throw new SingularFormException("É esperado uma classe com o nome " + target + " como complemento de " + getClass().getName(),
                    e);
        }
    }

    public MTipo<?> getCaseType() {
        if(caseType == null){
            MDicionario dicionario = MDicionario.create();
            MPacote p = dicionario.carregarPacote(getPackage());
            
            caseType = p.getTipoLocalOpcional("testForm")
                .orElseThrow(() -> new SingularFormException("O pacote " + p.getNome() + " não define o tipo para exibição 'testForm'"));
        }
        return caseType;
    }

    public Optional<ResourceRef> getDescriptionResourceName() {
        return ResourceRef.forClassWithExtension(getClass(), "html");
{'fraction_non_alphanumeric': 0.10160151541243327, 'fraction_numerical': 0.0, 'mean_word_length': 3.0815179198875615, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5531920', 'n_tokens_mistral': 1616, 'n_tokens_neox': 1585, 'n_words': 377}