com.nokia.testfw.codegen.ui.preferences.TESTFWTemplatePreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.testfw.codegen.ui.preferences.TESTFWTemplatePreferencePage.java

Source

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */
package com.nokia.testfw.codegen.ui.preferences;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.Collator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.cdt.internal.ui.editor.CSourceViewer;
import org.eclipse.cdt.internal.ui.preferences.CSourcePreviewerUpdater;
import org.eclipse.cdt.internal.ui.preferences.CodeTemplateSourceViewerConfiguration;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.template.TemplateVariableProcessor;
import org.eclipse.cdt.internal.ui.util.PixelConverter;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.internal.texteditor.NLSUtility;
import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.nokia.testfw.codegen.ui.CodegenUIPlugin;
import com.nokia.testfw.codegen.templates.TemplateLoader;
import com.nokia.testfw.codegen.ui.Messages;
import com.nokia.testfw.codegen.ui.util.PathNode;
import com.nokia.testfw.codegen.ui.util.PathNodeConverter;

/**
 * This class represents a preference page that is contributed to the
 * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>, we
 * can use the field support built into JFace that allows us to create a page
 * that is small and knows how to save, restore and apply itself.
 * <p>
 * This page is used to modify preferences only. They are stored in the
 * preference store that belongs to the main plug-in class. That way,
 * preferences can be accessed directly via the preference store.
 */

@SuppressWarnings("restriction")
public class TESTFWTemplatePreferencePage extends TemplatePreferencePage implements IWorkbenchPreferencePage {

    private class TESTFWTemplateAdapter
            implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {

        private final Object NO_CHILDREN[];

        TESTFWTemplateAdapter() {
            super();
            NO_CHILDREN = new Object[0];
        }

        public Object[] getChildren(Object obj) {
            if (obj instanceof PathNode)
                return ((PathNode) obj).getChildren();
            else
                return NO_CHILDREN;
        }

        public Object getParent(Object obj) {
            if (obj instanceof PathNode)
                return ((PathNode) obj).getParent();
            else
                return null;
        }

        public boolean hasChildren(Object obj) {
            if (obj instanceof PathNode)
                return ((PathNode) obj).getChildren().length > 0;
            else
                return false;
        }

        public Object[] getElements(Object obj) {
            if (obj instanceof TemplateStore) {
                return convertToPathTree((TemplateStore) obj).getChildren();
            }
            return NO_CHILDREN;
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object obj, Object obj1) {
        }

        public void selectionChanged(SelectionChangedEvent selectionchangedevent) {
            updateButtons();
            updateViewerInput();
        }

        public void doubleClick(DoubleClickEvent doubleclickevent) {
            if (canEdit()) {
                edit();
            }
        }
    }

    private static class TESTFWTemplateLabelProvider extends LabelProvider {

        @SuppressWarnings("deprecation")
        public Image getImage(Object obj) {
            if (obj instanceof PathNode) {
                PathNode node = (PathNode) obj;
                if (node.getData() != null) {
                    return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
                }
                if (node.getParent().getParent() == null) {
                    return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_PROJECT);
                } else {
                    return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
                }
            }
            return null;
        }

        public String getText(Object obj) {
            if (obj instanceof PathNode)
                return ((PathNode) obj).getName();
            return null;
        }
    }

    /** The tree presenting the templates. */
    public TreeViewer iTreeViewer;

    /* buttons */
    public Button iAddButton;
    public Button iEditButton;
    public Button iImportButton;
    public Button iExportButton;
    public Button iRemoveButton;
    public Button iRestoreButton;
    public Button iRevertButton;

    private SourceViewer iPatternViewer;
    private TemplateVariableProcessor iTemplateProcessor;

    public TESTFWTemplatePreferencePage() {
        setPreferenceStore(CodegenUIPlugin.getDefault().getPreferenceStore());
        setTemplateStore(CodegenUIPlugin.getDefault().getTemplateStore());
        setContextTypeRegistry(CodegenUIPlugin.getDefault().getContextTypeRegistry());
        iTemplateProcessor = new TemplateVariableProcessor();
    }

    protected boolean isShowFormatterSetting() {
        return false;
    }

    public boolean performOk() {

        boolean ok = super.performOk();

        //CodegenUIPlugin.getDefault().savePluginPreferences();

        return ok;
    }

    protected Control createContents(Composite ancestor) {
        Composite parent = new Composite(ancestor, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);

        Composite innerParent = new Composite(parent, SWT.NONE);
        GridLayout innerLayout = new GridLayout();
        innerLayout.numColumns = 2;
        innerLayout.marginHeight = 0;
        innerLayout.marginWidth = 0;
        innerParent.setLayout(innerLayout);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 2;
        innerParent.setLayoutData(gd);

        Composite treeComposite = new Composite(innerParent, SWT.NONE);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = 360;
        data.heightHint = convertHeightInCharsToPixels(10);
        treeComposite.setLayoutData(data);

        FillLayout treeLayout = new FillLayout();
        treeComposite.setLayout(treeLayout);

        TESTFWTemplateAdapter adapter = new TESTFWTemplateAdapter();

        iTreeViewer = new TreeViewer(treeComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        iTreeViewer.setLabelProvider(new TESTFWTemplateLabelProvider());
        iTreeViewer.setContentProvider(adapter);
        iTreeViewer.addSelectionChangedListener(adapter);
        iTreeViewer.addDoubleClickListener(adapter);

        iTreeViewer.setComparator(new ViewerComparator() {
            public int compare(Viewer viewer, Object object1, Object object2) {
                if ((object1 instanceof PathNode) && (object2 instanceof PathNode)) {
                    String leftName = ((PathNode) object1).getName();
                    String rightName = ((PathNode) object2).getName();
                    int result = Collator.getInstance().compare(leftName, rightName);
                    return result;
                }
                return super.compare(viewer, object1, object2);
            }

            public boolean isSorterProperty(Object element, String property) {
                return true;
            }
        });

        Composite buttons = new Composite(innerParent, SWT.NONE);
        buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        buttons.setLayout(layout);

        iAddButton = new Button(buttons, SWT.PUSH);
        iAddButton.setText(Messages.getString("TemplatePreferencePage_new"));
        iAddButton.setLayoutData(new GridData(768));
        iAddButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                add();
            }
        });

        iEditButton = new Button(buttons, SWT.PUSH);
        iEditButton.setText(Messages.getString("TemplatePreferencePage_edit"));
        iEditButton.setLayoutData(new GridData(768));
        iEditButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                edit();
            }
        });

        iRemoveButton = new Button(buttons, SWT.PUSH);
        iRemoveButton.setText(Messages.getString("TemplatePreferencePage_remove"));
        iRemoveButton.setLayoutData(new GridData(768));
        iRemoveButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                remove();
            }
        });

        createSeparator(buttons);

        iRestoreButton = new Button(buttons, SWT.PUSH);
        iRestoreButton.setText(Messages.getString("TemplatePreferencePage_restore"));
        iRestoreButton.setLayoutData(new GridData(768));
        iRestoreButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                restoreDeleted();
            }
        });

        iRevertButton = new Button(buttons, SWT.PUSH);
        iRevertButton.setText(Messages.getString("TemplatePreferencePage_revert"));
        iRevertButton.setLayoutData(new GridData(768));
        iRevertButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                revert();
            }
        });

        createSeparator(buttons);

        iImportButton = new Button(buttons, SWT.PUSH);
        iImportButton.setText(Messages.getString("TemplatePreferencePage_import"));
        iImportButton.setLayoutData(new GridData(768));
        iImportButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                import_();
            }
        });

        iExportButton = new Button(buttons, SWT.PUSH);
        iExportButton.setText(Messages.getString("TemplatePreferencePage_export"));
        iExportButton.setLayoutData(new GridData(768));
        iExportButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                export();
            }
        });

        iPatternViewer = createViewer(parent, 2);

        iTreeViewer.setInput(getTemplateStore());

        updateButtons();
        Dialog.applyDialogFont(parent);
        innerParent.layout();

        return parent;
    }

    private Label createSeparator(Composite parent) {
        Label separator = new Label(parent, 0);
        separator.setVisible(false);
        GridData gd = new GridData();
        gd.horizontalAlignment = 4;
        gd.verticalAlignment = 1;
        gd.heightHint = 4;
        separator.setLayoutData(gd);
        return separator;
    }

    private void add() {

        Iterator<?> it = getContextTypeRegistry().contextTypes();
        if (it.hasNext()) {
            Template template = new Template("", "", ((TemplateContextType) it.next()).getId(), "", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

            Template newTemplate = editTemplate(template, false, true);
            if (newTemplate != null) {
                TemplatePersistenceData data = new TemplatePersistenceData(newTemplate, true);
                getTemplateStore().add(data);
                iTreeViewer.refresh();
                iTreeViewer.setSelection(new StructuredSelection(data));
            }
        }
    }

    protected boolean canEdit() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        return (selection.size() == 1 && (((PathNode) selection.getFirstElement()).getData() != null));
    }

    private void edit() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        Object[] objects = selection.toArray();
        if ((objects == null) || (objects.length != 1))
            return;

        TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection.getFirstElement()).getData();
        if (data != null)
            edit(data);
    }

    private void edit(TemplatePersistenceData data) {
        Template oldTemplate = data.getTemplate();
        Template newTemplate = editTemplate(new Template(oldTemplate), true, true);
        if (newTemplate != null) {

            if (!newTemplate.getName().equals(oldTemplate.getName()) && MessageDialog.openQuestion(getShell(),
                    Messages.getString("TemplatePreferencePage_question_create_new_title"),
                    Messages.getString("TemplatePreferencePage_question_create_new_message"))) {
                data = new TemplatePersistenceData(newTemplate, true);
                getTemplateStore().add(data);
                iTreeViewer.refresh();
            } else {
                data.setTemplate(newTemplate);
                iTreeViewer.refresh(data);
            }
            selectionChanged();
            iTreeViewer.setSelection(new StructuredSelection(data));
        }
    }

    protected boolean canRemove() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        if (selection.size() == 1 && (((PathNode) selection.getFirstElement()).getData() != null)) {
            TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection.getFirstElement())
                    .getData();
            return data.isUserAdded();
        } else {
            return false;
        }
    }

    private void remove() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        Iterator<?> elements = selection.iterator();
        while (elements.hasNext()) {
            TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) elements.next()).getData();
            getTemplateStore().delete(data);
        }

        iTreeViewer.refresh();
    }

    private void restoreDeleted() {
        getTemplateStore().restoreDeleted();
        iTreeViewer.refresh();
        updateButtons();
    }

    private void revert() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        Iterator<?> elements = selection.iterator();
        while (elements.hasNext()) {
            TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) elements.next()).getData();
            data.revert();
        }

        selectionChanged();
        iTreeViewer.refresh();
    }

    private void import_() {
        FileDialog dialog = new FileDialog(getShell());
        dialog.setText(Messages.getString("TemplatePreferencePage_import_title"));
        dialog.setFilterExtensions(new String[] { Messages.getString("TemplatePreferencePage_import_extension") });
        String path = dialog.open();

        if (path == null)
            return;

        try {
            TemplateReaderWriter reader = new TemplateReaderWriter();
            File file = new File(path);
            if (file.exists()) {
                InputStream input = new BufferedInputStream(new FileInputStream(file));
                try {
                    TemplatePersistenceData[] datas = reader.read(input, null);
                    for (int i = 0; i < datas.length; i++) {
                        TemplatePersistenceData data = datas[i];
                        getTemplateStore().add(data);
                    }
                } finally {
                    try {
                        input.close();
                    } catch (IOException x) {
                        // ignore
                    }
                }
            }

            iTreeViewer.refresh();

        } catch (FileNotFoundException e) {
            openReadErrorDialog();
        } catch (IOException e) {
            openReadErrorDialog();
        }
    }

    private void export() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();
        Object[] nodes = selection.toArray();

        Set<TemplatePersistenceData> dataSet = new HashSet<TemplatePersistenceData>();
        for (int i = 0; i != nodes.length; i++) {
            dataSet.addAll(getChildrenTemplate((PathNode) nodes[i]));
        }
        export(dataSet.toArray(new TemplatePersistenceData[0]));
    }

    private void export(TemplatePersistenceData[] templates) {
        FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
        dialog.setText(Messages.getString("TemplatePreferencePage_export_title"));
        dialog.setFilterExtensions(new String[] { Messages.getString("TemplatePreferencePage_export_extension") });
        dialog.setFileName(Messages.getString("TemplatePreferencePage_export_filename"));
        String path = dialog.open();

        if (path == null)
            return;

        File file = new File(path);

        if (file.isHidden()) {
            String title = Messages.getString("TemplatePreferencePage_export_error_title");
            String message = NLSUtility.format(Messages.getString("TemplatePreferencePage_export_error_hidden"),
                    file.getAbsolutePath());
            MessageDialog.openError(getShell(), title, message);
            return;
        }

        if (file.exists() && !file.canWrite()) {
            String title = Messages.getString("TemplatePreferencePage_export_error_title");
            String message = NLSUtility.format(
                    Messages.getString("TemplatePreferencePage_export_error_canNotWrite"), file.getAbsolutePath());
            MessageDialog.openError(getShell(), title, message);
            return;
        }

        if (!file.exists() || confirmOverwrite(file)) {
            OutputStream output = null;
            try {
                output = new BufferedOutputStream(new FileOutputStream(file));
                TemplateReaderWriter writer = new TemplateReaderWriter();
                writer.save(templates, output);
            } catch (IOException e) {
                openWriteErrorDialog();
            } finally {
                if (output != null) {
                    try {
                        output.close();
                    } catch (IOException e) {
                        // ignore
                    }
                }
            }
        }
    }

    private boolean confirmOverwrite(File file) {
        return MessageDialog.openQuestion(getShell(),
                Messages.getString("TemplatePreferencePage_export_exists_title"),
                NLSUtility.format(Messages.getString("TemplatePreferencePage_export_exists_message"),
                        file.getAbsolutePath()));
    }

    private void openReadErrorDialog() {
        String title = Messages.getString("TemplatePreferencePage_error_read_title");
        String message = Messages.getString("TemplatePreferencePage_error_read_message");
        MessageDialog.openError(getShell(), title, message);
    }

    /*
     * @since 3.2
     */
    private void openWriteErrorDialog() {
        String title = Messages.getString("TemplatePreferencePage_error_write_title");
        String message = Messages.getString("TemplatePreferencePage_error_write_message");
        MessageDialog.openError(getShell(), title, message);
    }

    private void selectionChanged() {
        updateViewerInput();
        updateButtons();
    }

    /**
     * Updates the pattern viewer.
     */
    protected void updateViewerInput() {
        if (iPatternViewer == null || iPatternViewer.getTextWidget().isDisposed())
            return;
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();

        if (selection.size() == 1 && (((PathNode) selection.getFirstElement()).getData() != null)) {
            TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection.getFirstElement())
                    .getData();
            Template template = data.getTemplate();
            TemplateContextType type = CUIPlugin.getDefault().getCodeTemplateContextRegistry()
                    .getContextType(template.getContextTypeId());
            if (type == null) {
                type = CodegenUIPlugin.getDefault().getContextTypeRegistry()
                        .getContextType(template.getContextTypeId());
            }
            iTemplateProcessor.setContextType(type);
            reconfigurePatternViewer();
            iPatternViewer.getDocument().set(template.getPattern());
        } else {
            iPatternViewer.getDocument().set("");
        }

    }

    private SourceViewer createViewer(Composite parent, int nColumns) {
        Label label = new Label(parent, 0);
        label.setText(Messages.getString("TemplatePreferencePage_preview"));
        GridData data = new GridData();
        data.horizontalSpan = nColumns;
        label.setLayoutData(data);
        IDocument document = new Document();
        CTextTools tools = CUIPlugin.getDefault().getTextTools();
        tools.setupCDocumentPartitioner(document, "___c_partitioning", null);
        org.eclipse.jface.preference.IPreferenceStore store = CUIPlugin.getDefault().getCombinedPreferenceStore();
        SourceViewer viewer = new CSourceViewer(parent, null, null, false, 2816, store);
        CodeTemplateSourceViewerConfiguration configuration = new CodeTemplateSourceViewerConfiguration(
                tools.getColorManager(), store, null, iTemplateProcessor);
        viewer.configure(configuration);
        viewer.setEditable(false);
        viewer.setDocument(document);
        org.eclipse.swt.graphics.Font font = JFaceResources.getFont("org.eclipse.cdt.ui.editors.textfont");
        viewer.getTextWidget().setFont(font);
        new CSourcePreviewerUpdater(viewer, configuration, store);
        Control control = viewer.getControl();
        data = new GridData(1296);
        data.horizontalSpan = nColumns;
        data.heightHint = new PixelConverter(parent).convertHeightInCharsToPixels(5);
        control.setLayoutData(data);
        return viewer;
    }

    private void reconfigurePatternViewer() {
        if (iPatternViewer == null) {
            return;
        } else {
            CTextTools tools = CUIPlugin.getDefault().getTextTools();
            org.eclipse.jface.preference.IPreferenceStore store = CUIPlugin.getDefault()
                    .getCombinedPreferenceStore();
            CodeTemplateSourceViewerConfiguration configuration = new CodeTemplateSourceViewerConfiguration(
                    tools.getColorManager(), store, null, iTemplateProcessor);
            iPatternViewer.unconfigure();
            iPatternViewer.configure(configuration);
            iPatternViewer.invalidateTextPresentation();
            return;
        }
    }

    /**
     * Updates the buttons.
     */
    protected void updateButtons() {
        IStructuredSelection selection = (IStructuredSelection) iTreeViewer.getSelection();
        int selectionCount = selection.size();
        boolean canRestore = getTemplateStore().getTemplateData(true).length != getTemplateStore()
                .getTemplateData(false).length;
        boolean canRevert = false;
        TemplatePersistenceData data = null;
        for (Iterator<?> it = selection.iterator(); it.hasNext();) {
            data = (TemplatePersistenceData) ((PathNode) it.next()).getData();
            if (data != null && data.isModified()) {
                canRevert = true;
                break;
            }
        }

        iEditButton.setEnabled(selectionCount == 1 && data != null);
        iExportButton.setEnabled(selectionCount > 0);
        iRemoveButton.setEnabled(selectionCount > 0);
        iRestoreButton.setEnabled(canRestore);
        iRevertButton.setEnabled(canRevert);
    }

    private PathNode convertToPathTree(TemplateStore aTemplateStore) {
        PathNode root = new PathNode(TemplateLoader.TEMPLATES_DIR);
        TemplatePersistenceData[] lTemplateDataArray = aTemplateStore.getTemplateData(false);

        for (TemplatePersistenceData data : lTemplateDataArray) {
            String path = data.getTemplate().getDescription();
            PathNode node = PathNodeConverter.pathToNode(root, path);
            node.setData(data);
        }
        return root;
    }

    private Set<TemplatePersistenceData> getChildrenTemplate(PathNode parent) {
        Set<TemplatePersistenceData> templates = new HashSet<TemplatePersistenceData>();
        if (parent.getData() != null) {
            templates.add((TemplatePersistenceData) parent.getData());
        } else {
            for (PathNode child : parent.getChildren()) {
                if (child.getData() != null) {
                    templates.add((TemplatePersistenceData) child.getData());
                } else {
                    templates.addAll(getChildrenTemplate(child));
                }
            }
        }
        return templates;
    }
}