org.apache.directory.studio.ldifeditor.editor.LdifOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.ldifeditor.editor.LdifOutlinePage.java

Source

/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *  
 *    http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License. 
 *  
 */

package org.apache.directory.studio.ldifeditor.editor;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
import org.apache.directory.studio.ldapbrowser.common.widgets.browser.BrowserLabelProvider;
import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
import org.apache.directory.studio.ldifeditor.LdifEditorActivator;
import org.apache.directory.studio.ldifeditor.LdifEditorConstants;
import org.apache.directory.studio.ldifparser.model.LdifFile;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeAddRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeDeleteRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeModDnRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeModifyRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifContentRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifModSpec;
import org.apache.directory.studio.ldifparser.model.container.LdifRecord;
import org.apache.directory.studio.ldifparser.model.lines.LdifAttrValLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifDnLine;
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.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

/**
 * This class implements the Outline Page for LDIF. 
 * It used to display LDIF files and records.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class LdifOutlinePage extends ContentOutlinePage {
    /** The editor it is attached to */
    private LdifEditor ldifEditor;

    /** Whether or not the outline page is linked to an entry in the LDAP Browser view*/
    private boolean isLinkedToLdapBrowser = false;

    /**
     * Creates a new instance of LdifOutlinePage.
     *
     * @param ldifEditor
     *      the editor the Outline page is attached to
     */
    public LdifOutlinePage(LdifEditor ldifEditor) {
        this.ldifEditor = ldifEditor;
    }

    /**
     * Creates a new instance of LdifOutlinePage.
     *
     * @param ldifEditor
     *      the editor the Outline page is attached to
     */
    public LdifOutlinePage(LdifEditor ldifEditor, boolean isLinkedToLdapBrowser) {
        this.ldifEditor = ldifEditor;
        this.isLinkedToLdapBrowser = isLinkedToLdapBrowser;
    }

    /**
     * {@inheritDoc}
     */
    public void createControl(Composite parent) {
        super.createControl(parent);

        final TreeViewer treeViewer = getTreeViewer();
        treeViewer.setLabelProvider(new LdifLabelProvider(ldifEditor, isLinkedToLdapBrowser));
        treeViewer.setContentProvider(new LdifContentProvider());

        if (isLinkedToLdapBrowser) {
            treeViewer.setAutoExpandLevel(2);
        }

        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (!event.getSelection().isEmpty() && event.getSelection() instanceof IStructuredSelection) {
                    Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();

                    if (element instanceof LdifRecord) {
                        LdifRecord ldifRecord = (LdifRecord) element;
                        ldifEditor.selectAndReveal(ldifRecord.getDnLine().getOffset(),
                                ldifRecord.getDnLine().getLength());
                    } else if (element instanceof List) {
                        List<?> list = (List<?>) element;

                        if (!list.isEmpty() && list.get(0) instanceof LdifAttrValLine) {
                            LdifAttrValLine line = (LdifAttrValLine) list.get(0);
                            ldifEditor.selectAndReveal(line.getOffset(),
                                    line.getRawAttributeDescription().length());
                        }
                    } else if (element instanceof LdifAttrValLine) {
                        LdifAttrValLine line = (LdifAttrValLine) element;
                        ldifEditor.selectAndReveal(line.getOffset() + line.getRawAttributeDescription().length()
                                + line.getRawValueType().length(), line.getRawValue().length());
                    } else if (element instanceof LdifModSpec) {
                        LdifModSpec modSpec = (LdifModSpec) element;
                        ldifEditor.selectAndReveal(modSpec.getOffset(), modSpec.getModSpecType().getLength());
                    }
                }
            }
        });

        treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    Object obj = ((IStructuredSelection) event.getSelection()).getFirstElement();
                    if (treeViewer.getExpandedState(obj))
                        treeViewer.collapseToLevel(obj, 1);
                    else if (((ITreeContentProvider) treeViewer.getContentProvider()).hasChildren(obj))
                        treeViewer.expandToLevel(obj, 1);
                }
            }
        });

        this.refresh();
    }

    /**
     * Refreshes this viewer starting with the given element.
     *
     * @param element
     *      the element
     */
    public void refresh(Object element) {
        final TreeViewer treeViewer = getTreeViewer();
        if (treeViewer != null && treeViewer.getTree() != null && !treeViewer.getTree().isDisposed()) {
            treeViewer.refresh(element);
        }
    }

    /**
     * Refreshes this viewer completely with information freshly obtained from this viewer's model.
     */
    public void refresh() {
        final TreeViewer treeViewer = getTreeViewer();

        if (treeViewer != null && treeViewer.getTree() != null && !treeViewer.getTree().isDisposed()) {
            // ISelection selection = treeViewer.getSelection();
            // Object[] expandedElements = treeViewer.getExpandedElements();

            if (!treeViewer.getTree().isEnabled()) {
                treeViewer.getTree().setEnabled(true);
            }

            if (ldifEditor != null) {
                if (treeViewer.getInput() != ldifEditor.getLdifModel()) {
                    treeViewer.setInput(ldifEditor.getLdifModel());
                }
            }

            treeViewer.refresh();

            if (isLinkedToLdapBrowser) {
                treeViewer.setAutoExpandLevel(2);
            }

            // treeViewer.setSelection(selection);
            // treeViewer.setExpandedElements(expandedElements);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void dispose() {
        super.dispose();
        if (ldifEditor != null) {
            ldifEditor.outlinePageClosed();
            ldifEditor = null;
        }
    }

    /**
     * This class implements the ContentProvider used for the LDIF Outline View
     *
     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
     */
    private static class LdifContentProvider implements ITreeContentProvider {
        /**
         * {@inheritDoc}
         */
        public Object[] getChildren(Object element) {
            // file --> records
            if (element instanceof LdifFile) {
                LdifFile ldifFile = (LdifFile) element;
                return ldifFile.getRecords();
            }

            // record --> Array of List of AttrValLine
            else if (element instanceof LdifContentRecord) {
                LdifContentRecord record = (LdifContentRecord) element;
                return getUniqueAttrValLineArray(record.getAttrVals());
            } else if (element instanceof LdifChangeAddRecord) {
                LdifChangeAddRecord record = (LdifChangeAddRecord) element;
                return getUniqueAttrValLineArray(record.getAttrVals());
            } else if (element instanceof LdifChangeModifyRecord) {
                LdifChangeModifyRecord record = (LdifChangeModifyRecord) element;
                return record.getModSpecs();
            } else if (element instanceof LdifChangeModDnRecord) {
                return new Object[0];
            } else if (element instanceof LdifChangeDeleteRecord) {
                return new Object[0];
            }

            // List of AttrValLine --> Array of AttrValLine
            else if (element instanceof List && ((List<?>) element).get(0) instanceof LdifAttrValLine) {
                List<?> list = (List<?>) element;
                return list.toArray();
            } else if (element instanceof LdifModSpec) {
                LdifModSpec modSpec = (LdifModSpec) element;
                return modSpec.getAttrVals();
            }

            else {
                return new Object[0];
            }
        }

        /**
         * Returns a unique line of attribute values from an array of attribute value lines
         *
         * @param lines the attribute value lines
         * @return a unique line of attribute values from an array of attribute values lines
         */
        private Object[] getUniqueAttrValLineArray(LdifAttrValLine[] lines) {
            Map<String, List<LdifAttrValLine>> uniqueAttrMap = new LinkedHashMap<String, List<LdifAttrValLine>>();

            for (LdifAttrValLine ldifAttrValLine : lines) {
                String key = ldifAttrValLine.getUnfoldedAttributeDescription();
                List<LdifAttrValLine> listLdifAttrValLine = uniqueAttrMap.get(key);

                if (listLdifAttrValLine == null) {
                    listLdifAttrValLine = new ArrayList<LdifAttrValLine>();
                    uniqueAttrMap.put(key, listLdifAttrValLine);
                }

                listLdifAttrValLine.add(ldifAttrValLine);
            }

            return uniqueAttrMap.values().toArray();
        }

        /**
         * {@inheritDoc}
         */
        public Object getParent(Object element) {
            return null;
        }

        /**
         * {@inheritDoc}
         */
        public boolean hasChildren(Object element) {
            return getChildren(element) != null && getChildren(element).length > 0;
        }

        /**
         * {@inheritDoc}
         */
        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        /**
         * {@inheritDoc}
         */
        public void dispose() {
        }

        /**
         * {@inheritDoc}
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /**
     * This class implements the LabelProvider used for the LDIF Outline View
     *
     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
     */
    private static class LdifLabelProvider extends LabelProvider {
        /** The editor it is attached to */
        private LdifEditor ldifEditor;

        /** Whether or not the outline page is linked to an entry in the LDAP Browser view*/
        private boolean isLinkedToLdapBrowser = false;

        public LdifLabelProvider(LdifEditor ldifEditor, boolean isLinkedToLdapBrowser) {
            super();
            this.ldifEditor = ldifEditor;
            this.isLinkedToLdapBrowser = isLinkedToLdapBrowser;
        }

        /**
         * {@inheritDoc}
         */
        public String getText(Object element) {
            // Record
            if (element instanceof LdifRecord) {
                LdifRecord ldifRecord = (LdifRecord) element;
                return ldifRecord.getDnLine().getValueAsString();
            }

            // List of AttrValLine
            else if (element instanceof List && ((List<?>) element).get(0) instanceof LdifAttrValLine) {
                List<?> list = (List<?>) element;
                return ((LdifAttrValLine) list.get(0)).getUnfoldedAttributeDescription() + " (" + list.size() //$NON-NLS-1$
                        + ")"; //$NON-NLS-1$
            } else if (element instanceof LdifModSpec) {
                LdifModSpec modSpec = (LdifModSpec) element;
                return modSpec.getModSpecType().getUnfoldedAttributeDescription() + " (" //$NON-NLS-1$
                        + modSpec.getAttrVals().length + ")"; //$NON-NLS-1$
            }

            // AttrValLine
            else if (element instanceof LdifAttrValLine) {
                LdifAttrValLine line = (LdifAttrValLine) element;
                return Utils.getShortenedString(line.getValueAsString(), 20);
            }

            else {
                return ""; //$NON-NLS-1$
            }
        }

        /**
         * {@inheritDoc}
         */
        public Image getImage(Object element) {

            // Record
            if (element instanceof LdifContentRecord) {
                if (isLinkedToLdapBrowser) {
                    LdifContentRecord record = (LdifContentRecord) element;

                    LdifDnLine dnLine = record.getDnLine();

                    if (dnLine != null) {
                        String dn = dnLine.getUnfoldedDn();

                        if ((dn != null) && (dn.length() == 0)) //$NON-NLS-1$
                        {
                            // Root DSE
                            return BrowserCommonActivator.getDefault()
                                    .getImage(BrowserCommonConstants.IMG_ENTRY_ROOT);
                        } else {
                            // Any other case
                            try {
                                return BrowserLabelProvider.getImageByObjectClass(
                                        ldifEditor.getConnection().getEntryFromCache(new Dn(dn)));
                            } catch (LdapInvalidDnException e) {
                                // Will never occur
                            }
                        }
                    }
                }

                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_ENTRY);
            } else if (element instanceof LdifChangeAddRecord) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_ADD);
            } else if (element instanceof LdifChangeModifyRecord) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_MODIFY);
            } else if (element instanceof LdifChangeDeleteRecord) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_DELETE);
            } else if (element instanceof LdifChangeModDnRecord) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_RENAME);
            }
            // List of AttrValLine
            else if (element instanceof List && ((List) element).get(0) instanceof LdifAttrValLine) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_ATTRIBUTE);
            } else if (element instanceof LdifModSpec) {
                LdifModSpec modSpec = (LdifModSpec) element;

                if (modSpec.isAdd()) {
                    return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_MOD_ADD);
                } else if (modSpec.isReplace()) {
                    return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_MOD_REPLACE);
                } else if (modSpec.isDelete()) {
                    return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_MOD_DELETE);
                } else {
                    return null;
                }
            }

            // AttrValLine
            else if (element instanceof LdifAttrValLine) {
                return LdifEditorActivator.getDefault().getImage(LdifEditorConstants.IMG_LDIF_VALUE);
            } else {
                return null;
            }
        }
    }
}