org.talend.designer.maven.ui.setting.repository.page.FolderMavenSettingPage.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.designer.maven.ui.setting.repository.page.FolderMavenSettingPage.java

Source

// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.maven.ui.setting.repository.page;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
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.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.core.runtime.projectsetting.AbstractProjectSettingPage;
import org.talend.core.runtime.projectsetting.IProjectSettingContainer;
import org.talend.core.runtime.projectsetting.ProjectPreferenceManager;
import org.talend.designer.maven.ui.i18n.Messages;
import org.talend.designer.maven.ui.setting.repository.RepositoryMavenSettingDialog;
import org.talend.designer.maven.ui.utils.DesignerMavenUiHelper;
import org.talend.repository.ProjectManager;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryService;
import org.talend.repository.model.RepositoryNode;

/**
 * DOC ggu class global comment. Detailled comment
 */
@SuppressWarnings("rawtypes")
public abstract class FolderMavenSettingPage extends AbstractProjectSettingPage {

    private RepositoryNode node;

    protected static final String ID_MAVEN_PROJECT_SETTING = "projectsetting.Maven"; //$NON-NLS-1$

    private Link messageLink, noteLink;

    protected Button createBtn, deleteBtn;

    private Text pathTxt;

    private Composite pathComposite, noteComposite;

    private boolean readonly = false;

    private SelectionAdapter linkListener = new SelectionAdapter() {

        @Override
        public void widgetSelected(SelectionEvent e) {
            processLinkId(e);
        }
    };

    public FolderMavenSettingPage(RepositoryNode node) {
        super();
        this.node = node;

        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        if (factory.isUserReadOnlyOnCurrentProject()
                || !ProjectManager.getInstance().isInCurrentMainProject(this.getNode())) {
            readonly = true;
        }
        noDefaultAndApplyButton();
    }

    protected RepositoryNode getNode() {
        return node;
    }

    @Override
    protected IPreferenceStore doGetPreferenceStore() {
        // because no filename to set, so won't save and load it.
        return new PreferenceStore() {

            @Override
            public void load() throws IOException {
                // super.load();
            }

            @Override
            public void save() throws IOException {
                // super.save();
            }

        };
    }

    @Override
    protected void createFieldEditors() {

        Composite fieldEditorParent = getFieldEditorParent();
        fieldEditorParent.setLayout(new GridLayout());
        messageLink = new Link(fieldEditorParent, SWT.WRAP);
        messageLink.addSelectionListener(linkListener);

        pathComposite = createPathComposite(fieldEditorParent);
        // noteComposite = createNoteComposite(fieldEditorParent);

        createBtn = new Button(fieldEditorParent, SWT.PUSH);
        createBtn.setLayoutData(new GridData());
        createBtn.setText(Messages.getString("FolderMavenSettingPage_CreateButtonText"));//$NON-NLS-1$
        createBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                createMavenFiles();
            }

        });

        deleteBtn = new Button(fieldEditorParent, SWT.PUSH);
        deleteBtn.setLayoutData(new GridData());
        deleteBtn.setText(Messages.getString("FolderMavenSettingPage_DeleteButtonText"));//$NON-NLS-1$
        deleteBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                deleteMavenFiles();
            }

        });

        updateFields();
    }

    private Composite createPathComposite(Composite parent) {
        Composite composite = createLabelComposite(parent,
                Messages.getString("FolderMavenSettingPage_CreatingMavenSettingPath")); //$NON-NLS-1$

        pathTxt = new Text(composite, SWT.READ_ONLY);
        pathTxt.setBackground(composite.getBackground());
        pathTxt.setFont(parent.getFont());
        pathTxt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        return composite;
    }

    private Composite createNoteComposite(Composite parent) {
        Composite composite = createLabelComposite(parent,
                Messages.getString("FolderMavenSettingPage_CreatingMavenSettingNote")); //$NON-NLS-1$

        noteLink = new Link(composite, SWT.WRAP);
        noteLink.setFont(parent.getFont());
        noteLink.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        noteLink.addSelectionListener(linkListener);
        return composite;
    }

    protected void updateFields() {
        IFolder nodeFolder = DesignerMavenUiHelper.getNodeFolder(node);
        boolean created = checkMavenScriptsExisted(nodeFolder);

        messageLink.setText(createMessages(created));

        // path
        IPath projectRelativePath = nodeFolder.getProjectRelativePath();
        pathTxt.setText("<Project>/" + projectRelativePath.toString());//$NON-NLS-1$
        pathTxt.setToolTipText(projectRelativePath.toString());
        GridData pathTxtGridData = (GridData) pathTxt.getLayoutData();
        Point size = messageLink.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        pathTxtGridData.widthHint = size.x;

        // GridData pathCompGridData = (GridData) pathComposite.getLayoutData();
        // pathCompGridData.exclude = true; // hide path first.
        // pathComposite.setLayoutData(pathCompGridData);

        // // note
        //        String mvnProjectSettingLinkStr = "<a href=\"" + ID_MAVEN_PROJECT_SETTING + "\">Maven</a>";//$NON-NLS-1$ //$NON-NLS-2$
        //        noteLink.setText(Messages.getString("FolderMavenSettingPage_CreatingMavenSettingNoteMessage", //$NON-NLS-1$
        // mvnProjectSettingLinkStr));
        //
        // GridData noteCompGridData = (GridData) noteComposite.getLayoutData();
        // noteCompGridData.exclude = created;
        // noteComposite.setLayoutData(noteCompGridData);

        // FIXME, there are some problem for display, so don't hide it first.
        // createBtn.setEnabled(!readonly);
        // GridData createBtnGridData = (GridData) createBtn.getLayoutData();
        // createBtnGridData.exclude = created;
        //
        // deleteBtn.setEnabled(!readonly);
        // GridData deleteBtnGridData = (GridData) deleteBtn.getLayoutData();
        // deleteBtnGridData.exclude = !created;
        //
        // messageLink.getParent().layout();

        createBtn.setEnabled(!created && !readonly);
        deleteBtn.setEnabled(created && !readonly);

        deleteBtn.getParent().layout(true);
    }

    protected boolean checkMavenScriptsExisted(IFolder nodeFolder) {
        return DesignerMavenUiHelper.existMavenSetting(nodeFolder, getProcessFileNames());
    }

    protected abstract String createMessages(boolean created);

    protected String[] buildLinks(String... fileNames) {
        List<String> list = new ArrayList<String>();
        if (fileNames != null && fileNames.length > 0) {
            for (String name : fileNames) {
                list.add(buildLink(name));
            }
        }
        return list.toArray(new String[0]);
    }

    protected String buildLink(String fileWithExtension) {
        String name = fileWithExtension;
        String displayName = fileWithExtension;

        if (!DesignerMavenUiHelper.idWithExtension) {
            name = fileWithExtension.substring(0, fileWithExtension.lastIndexOf('.'));
        }

        if (!DesignerMavenUiHelper.displayWithExtension) {
            displayName = fileWithExtension.substring(0, fileWithExtension.lastIndexOf('.'));
        }
        return "<a href=\"" + name + '\"' + '>' //$NON-NLS-1$ 
                + displayName + "</a>";//$NON-NLS-1$ 
    }

    protected void processLinkId(SelectionEvent e) {
        String id = e.text;
        if (getDefaultProjectSettingId().equals(id)) {
            openProjectSettingDialog(id);
        }
        processLinkIdForFileNames(id, getProcessFileNames());
    }

    protected String getDefaultProjectSettingId() {
        return ID_MAVEN_PROJECT_SETTING;
    }

    protected void processLinkIdForFileNames(String id, String... fileNames) {
        if (fileNames != null) {
            for (String name : fileNames) {
                if (name.equals(id) || !DesignerMavenUiHelper.idWithExtension
                        && name.substring(0, name.lastIndexOf('.')).equals(id)) {
                    String childId = DesignerMavenUiHelper.buildRepositoryPreferenceNodeId(getPrefNodeId(), id);
                    openChildPage(childId);
                }
            }
        }
    }

    protected void openChildPage(String childId) {
        IPreferencePageContainer container = getContainer();
        if (container instanceof IWorkbenchPreferenceContainer) {
            ((IWorkbenchPreferenceContainer) container).openPage(childId, getNode());
        } else if (container instanceof IProjectSettingContainer) {
            ((IProjectSettingContainer) container).openPage(childId, getNode());
        }
    }

    protected void openProjectSettingDialog(String projectSettingId) {
        if (this.getContainer() instanceof IProjectSettingContainer
                && !(this.getContainer() instanceof RepositoryMavenSettingDialog)) {
            ((IProjectSettingContainer) this.getContainer()).openPage(projectSettingId, null);
        } else if (GlobalServiceRegister.getDefault().isServiceRegistered(IRepositoryService.class)) {
            IRepositoryService repositoryService = (IRepositoryService) GlobalServiceRegister.getDefault()
                    .getService(IRepositoryService.class);
            repositoryService.openProjectSettingDialog(projectSettingId);
        }
    }

    protected abstract ProjectPreferenceManager getProjectSettingManager();

    protected Map<String, String> getProjectSettingKeyWithFileNamesMap() {
        return Collections.emptyMap();
    }

    protected String[] getProcessFileNames() {
        Map<String, String> projectSettingKeyWithFileNamesMap = getProjectSettingKeyWithFileNamesMap();
        return projectSettingKeyWithFileNamesMap.values().toArray(new String[0]);
    }

    protected Map<String, IFile> buildProjectSettingKeyWithFilesMap(IFolder nodeFolder) {
        Map<String, IFile> projectSettingKeyWithFilesMap = new LinkedHashMap<String, IFile>();

        Map<String, String> projectSettingKeyWithFileNamesMap = getProjectSettingKeyWithFileNamesMap();

        for (String projectSettingKey : projectSettingKeyWithFileNamesMap.keySet()) {
            String fileName = projectSettingKeyWithFileNamesMap.get(projectSettingKey);
            if (fileName != null) {
                IFile mavenFile = nodeFolder.getFile(fileName);
                projectSettingKeyWithFilesMap.put(projectSettingKey, mavenFile);
            }
        }
        return projectSettingKeyWithFilesMap;
    }

    protected void createMavenFiles() {
        processFiles(new RepositoryWorkUnit(createBtn.getText()) {

            @Override
            protected void run() throws LoginException, PersistenceException {
                final IFolder nodeFolder = DesignerMavenUiHelper.getNodeFolder(getNode());

                Map<String, IFile> buildProjectSettingKeyWithFilesMap = buildProjectSettingKeyWithFilesMap(
                        nodeFolder);

                boolean success = true;
                for (String projectSettingKey : buildProjectSettingKeyWithFilesMap.keySet()) {
                    IFile mavenFile = buildProjectSettingKeyWithFilesMap.get(projectSettingKey);
                    boolean created = createFileFromProjectSetting(mavenFile, projectSettingKey);
                    if (!created) {
                        success = false;
                        break;
                    }
                }

                if (success) {
                    // update the tree view to add the new nodes
                    final Shell shell = FolderMavenSettingPage.this.getShell();
                    shell.getDisplay().syncExec(new Runnable() {

                        @Override
                        public void run() {
                            // have created,no need check again.
                            List<IPreferenceNode> childrenNodes = createMavenChildrenNodes(nodeFolder);

                            IPreferencePageContainer container = getContainer();
                            if (container instanceof IProjectSettingContainer) {
                                ((IProjectSettingContainer) container).addChildrenPreferenceNodes(getPrefNodeId(),
                                        childrenNodes);
                            }
                        }
                    });

                } else { // if failed, clean the created files.
                    for (String projectSettingKey : buildProjectSettingKeyWithFilesMap.keySet()) {
                        IFile mavenFile = buildProjectSettingKeyWithFilesMap.get(projectSettingKey);
                        File mFile = mavenFile.getLocation().toFile();
                        if (mFile.exists()) {
                            mFile.delete();
                        }
                    }
                    //
                    showErrorDialog(nodeFolder.getProjectRelativePath().toString());
                }

                // refresh
                try {
                    nodeFolder.refreshLocal(IResource.DEPTH_ONE, null);
                } catch (CoreException e) {
                    ExceptionHandler.process(e);
                }
            }

        });

    }

    protected boolean createFileFromProjectSetting(IFile targetFile, String projectSettingKey) {
        boolean ok = false;
        try {
            String pomContent = getProjectSettingManager().getValue(projectSettingKey);
            if (pomContent == null) { // use project setting always
                // pomContent =
                // MavenTemplateManager.getTemplateContent(MavenTemplateConstants.POM_JOB_TEMPLATE_FILE_NAME);
            }
            if (pomContent != null && pomContent.length() > 0) {
                writeContent(targetFile.getLocation().toFile(), pomContent);
                ok = true;
            }
        } catch (Exception e) {
            ExceptionHandler.process(e);
        }
        return ok;
    }

    protected void writeContent(File file, String contents) throws IOException {
        FileWriter pomWriter = new FileWriter(file);
        pomWriter.write(contents);
        pomWriter.close();
    }

    /**
     * 
     * Will create the maven scripts nodes, it same as the RepositoryMavenSetting to create.
     */
    protected abstract List<IPreferenceNode> createMavenChildrenNodes(IFolder nodeFolder);

    protected void deleteMavenFiles() {
        processFiles(new RepositoryWorkUnit(deleteBtn.getText()) {

            @Override
            protected void run() throws LoginException, PersistenceException {
                //
                try {
                    final IFolder nodeFolder = DesignerMavenUiHelper.getNodeFolder(getNode());
                    final Map<String, IFile> buildProjectSettingKeyWithFilesMap = buildProjectSettingKeyWithFilesMap(
                            nodeFolder);
                    // update the tree view to add the new nodes
                    final Shell shell = FolderMavenSettingPage.this.getShell();
                    shell.getDisplay().syncExec(new Runnable() {

                        @Override
                        public void run() {
                            List<String> childIds = new ArrayList<String>();

                            for (String projectSettingKey : buildProjectSettingKeyWithFilesMap.keySet()) {
                                IFile mavenFile = buildProjectSettingKeyWithFilesMap.get(projectSettingKey);
                                String nodeId = DesignerMavenUiHelper
                                        .buildRepositoryPreferenceNodeId(getPrefNodeId(), mavenFile);
                                childIds.add(nodeId);
                            }

                            IPreferencePageContainer container = getContainer();
                            if (container instanceof IProjectSettingContainer) {
                                ((IProjectSettingContainer) container)
                                        .removeChildrenPreferenceNodes(getPrefNodeId(), childIds);
                            }
                        }
                    });

                    for (String projectSettingKey : buildProjectSettingKeyWithFilesMap.keySet()) {
                        IFile mavenFile = buildProjectSettingKeyWithFilesMap.get(projectSettingKey);
                        if (mavenFile.exists()) {
                            mavenFile.delete(true, null);
                        }
                    }

                    nodeFolder.refreshLocal(IResource.DEPTH_ONE, null);
                } catch (CoreException e) {
                    ExceptionHandler.process(e);
                }
            }

        });
    }

    protected void processFiles(final RepositoryWorkUnit rwu) {

        final IWorkspaceRunnable op = new IWorkspaceRunnable() {

            @Override
            public void run(IProgressMonitor monitor) throws CoreException {
                final Shell shell = FolderMavenSettingPage.this.getShell();
                shell.getDisplay().syncExec(new Runnable() {

                    @Override
                    public void run() {
                        // don't commit it yet for remote
                        // CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().executeRepositoryWorkUnit(rwu);
                        rwu.executeRun();
                        updateFields();
                    }
                });
            };
        };
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        try {
            workspace.run(op, workspace.getRoot(), IWorkspace.AVOID_UPDATE, null);
        } catch (CoreException e) {
            ExceptionHandler.process(e);
        }
    }

    protected void showErrorDialog(final String addition) {
        final Shell shell = this.getShell();
        shell.getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                MessageDialog.openError(shell,
                        Messages.getString("FolderMavenSettingPage_CreatingMavenSettingErrorTitle"), //$NON-NLS-1$
                        Messages.getString("FolderMavenSettingPage_CreatingMavenSettingErrorMessage") //$NON-NLS-1$
                                + '\n' + addition);

            }
        });
    }
}