com.amalto.workbench.editors.xsdeditor.XSDEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.amalto.workbench.editors.xsdeditor.XSDEditor.java

Source

// ============================================================================
//
// Copyright (C) 2006-2017 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 com.amalto.workbench.editors.xsdeditor;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.part.MultiPageSelectionProvider;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xsd.ui.internal.adapters.CategoryAdapter;
import org.eclipse.wst.xsd.ui.internal.adapters.RedefineCategoryAdapter;
import org.eclipse.wst.xsd.ui.internal.adapters.XSDBaseAdapter;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDDirectivesManager;
import org.eclipse.wst.xsd.ui.internal.editor.XSDTabbedPropertySheetPage;
import org.eclipse.wst.xsd.ui.internal.text.XSDModelAdapter;
import org.eclipse.xsd.XSDAnnotation;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDDiagnostic;
import org.eclipse.xsd.XSDDiagnosticSeverity;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDIdentityConstraintDefinition;
import org.eclipse.xsd.XSDModelGroup;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDTerm;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.XSDXPathDefinition;
import org.talend.mdm.commmon.util.core.CommonUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXParseException;

import com.amalto.workbench.dialogs.ErrorExceptionDialog;
import com.amalto.workbench.editors.DataModelMainPage;
import com.amalto.workbench.editors.IServerObjectEditorState;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.providers.datamodel.SchemaTreeContentProvider;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.views.MDMPerspective;
import com.amalto.workbench.webservices.WSDataModel;

@SuppressWarnings("restriction")
public class XSDEditor extends MultiPageEditorPart
        implements IServerObjectEditorState, ITabbedPropertySheetPageContributor, IPropertyListener {

    public static final String MSG_OMIT[] = {
            "XSD: The value '1' of attribute 'maxOccurs' must be one of  as constrained by 'http://www.w3.org/2001/XMLSchema#maxOccurs_._type'", //$NON-NLS-1$
            "XSD: The attribute may not have duplicate name and target namespace", //$NON-NLS-1$
            "XSD: The type may not have duplicate name and target namespace", //$NON-NLS-1$
            "XSD: The attribute group may not have duplicate name and target namespace", //$NON-NLS-1$
            "The complex type may not have duplicate name", //$NON-NLS-1$
            "XSD: An element reference may only have an id, minOccurs, or maxOccurs" }; //$NON-NLS-1$

    private static Log log = LogFactory.getLog(XSDEditor.class);

    public static final String CONTRUIBUTIONID_DATAMODELPAGE = "org.talend.mdm.workbench.propertyContributor.datamodel";//$NON-NLS-1$

    protected static int MODEL_PAGE_INDEX = -1;

    public static int SOURCE_PAGE_INDEX = 0;

    private TreeExpandHelper expandHelper = new TreeExpandHelper();

    protected int preActivePageIndex = -1;

    protected TreeObject xobject;

    private XSDSelectionManagerSelectionListener fXSDSelectionListener;

    private byte[] fileContents = null;

    boolean hasXSDErrors = false;

    public void setXObject(TreeObject xobject) {
        this.xobject = xobject;
        InputStreamReader reader = null;
        try {// temporarily store the file data for restore
            IFile file = getXSDFile(xobject);
            reader = new InputStreamReader(file.getContents());
            fileContents = IOUtils.toByteArray(reader, "utf-8"); //$NON-NLS-1$
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            if (reader != null) {
                IOUtils.closeQuietly(reader);
            }
        }
    }

    @Override
    public void doSave(IProgressMonitor monitor) {
        XSDDirectivesManager.removeUnusedXSDImports(getXSDSchema());
        structuredTextEditor.doSave(monitor);
        InputStream stream = null;
        try {
            EditorPart part = (EditorPart) getSelectedPage();
            String xsd = null;
            if (null != part) {
                if (part instanceof StructuredTextEditor) {
                    xsd = ((StructuredTextEditor) part).getTextViewer().getDocument().get();
                } else {
                    // main page or er editor
                    DataModelMainPage dmp = getdMainPage();
                    xsd = dmp.getXSDSchemaString();
                }
            }
            if (null != xsd) {
                DataModelMainPage mainPage = getdMainPage();
                WSDataModel wsDataModel = (WSDataModel) xobject.getWsObject();
                wsDataModel.setXsdSchema(xsd);
                if (mainPage != null) {
                    mainPage.save(xsd);
                }
                fileContents = xsd.getBytes("utf-8"); //$NON-NLS-1$
            }
            getDataModelEditorPage().setDirty(false);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            IOUtils.closeQuietly(stream);
            if (null != monitor) {
                monitor.done();
            }
        }
    }

    protected IFile getXSDFile(TreeObject object) throws Exception {
        return XSDEditorUtil.createFile(object);
    }

    boolean doUpdateSourceLocation = false;

    private int lastPageIndex = -1;

    private StructuredTextEditor structuredTextEditor;

    private XSDSchema xsdSchema;

    private ISelectionProvider editorSelectionProvider;

    private XSDEditorContentOutline contentOutline;

    @Override
    protected void pageChange(int newPageIndex) {
        resetTreeSelection(newPageIndex);

        super.pageChange(newPageIndex);
        doUpdateSourceLocation = newPageIndex == SOURCE_PAGE_INDEX;
        if (doUpdateSourceLocation && fXSDSelectionListener != null) {
            fXSDSelectionListener.doSetSelection();
        }
        doPageChanged(newPageIndex, lastPageIndex);
        refreshPropertyView();
        updateContentOutlinePage();
        setFocus();
        lastPageIndex = newPageIndex;
    }

    protected void doPageChanged(int newPageIndex, int lastPageIndex) {
        if (xobject == null) {
            return;
        }
        try {
            if (newPageIndex == MODEL_PAGE_INDEX) {
                DataModelMainPage mainPage = getDataModelEditorPage();
                if (mainPage != null) {
                    if (lastPageIndex == SOURCE_PAGE_INDEX) {
                        validateXsdSourceEditor();
                        if (!hasXSDErrors) {
                            String xsd = getSourcePageDocument();
                            XSDSchema schema = Util.createXsdSchema(xsd, xobject);
                            mainPage.setXsdSchema(schema);
                        }
                    }
                    mainPage.refresh();
                    //
                    expandHelper.recoverExpandState(mainPage);
                }
            } else if (newPageIndex == SOURCE_PAGE_INDEX) {
                if (hasXSDErrors) {
                    return;
                }
                // save DataModelMainPage's contents to file
                DataModelMainPage mainPage = getDataModelEditorPage();
                expandHelper.recordExpandState(mainPage);
                if (mainPage != null && this.isDirty()) {
                    String xsd = mainPage.getXSDSchemaString();
                    xsd = Util.formatXsdSource(xsd);
                    WSDataModel wsDataModel = (WSDataModel) xobject.getWsObject();
                    wsDataModel.setXsdSchema(xsd);
                    IFile file = getXSDFile(xobject);
                    file.setCharset("utf-8", null);//$NON-NLS-1$
                    file.setContents(new ByteArrayInputStream(xsd.getBytes("utf-8")), IFile.FORCE, null);//$NON-NLS-1$
                }
            }
        } catch (SAXParseException ex) {
            // do nothing
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

    public boolean hasXSDErrors() {
        return this.hasXSDErrors;
    }

    private void updateContentOutlinePage() {
        IContentOutlinePage outlinePage = (IContentOutlinePage) getActiveEditor()
                .getAdapter(IContentOutlinePage.class);
        contentOutline.setActiveOutlinePage(outlinePage);
    }

    private DataModelMainPage getDataModelEditorPage() {

        return (DataModelMainPage) getEditor(MODEL_PAGE_INDEX);
    }

    private class XSDSelectionManagerSelectionListener implements ISelectionChangedListener {

        private Map<XSDElementDeclaration, XSDElementDeclaration> declarMap = new HashMap<XSDElementDeclaration, XSDElementDeclaration>();

        /**
         * Determines DOM node based on object (xsd node)
         * 
         * @param object
         * @return
         */
        private Object getObjectForOtherModel(Object object) {
            Node node = null;
            if (object instanceof Node) {
                node = (Node) object;
            } else if (object instanceof XSDComponent) {
                if (object instanceof XSDElementDeclaration) {
                    XSDElementDeclaration selected = (XSDElementDeclaration) object;
                    String name = selected.getName();

                    EList<XSDElementDeclaration> elementDeclarations = getXSDSchema().getElementDeclarations();

                    for (XSDElementDeclaration elem : elementDeclarations) {
                        if (elem.getName().equals(name)) {
                            node = elem.getElement();
                            break;
                        }
                    }
                } else if (object instanceof XSDParticle) {
                    XSDTerm term = ((XSDParticle) object).getTerm();
                    if (term instanceof XSDElementDeclaration) {
                        XSDElementDeclaration declar = (XSDElementDeclaration) term;
                        XSDElementDeclaration[] xsdDeclarations = getAllMarkableDeclarationOfParticle();
                        if (xsdDeclarations != null) {
                            XSDElementDeclaration content = (XSDElementDeclaration) ((XSDParticle) object)
                                    .getContent();
                            boolean isReference = content.isElementDeclarationReference();
                            String name = declar.getName();
                            for (XSDElementDeclaration elem : xsdDeclarations) {
                                if (name.equals(elem.getName())) {
                                    if (isUnderSameComplexType(declar, isReference, elem)) {
                                        if (isReference) {
                                            node = declarMap.get(elem).getElement();
                                        } else {
                                            node = elem.getElement();
                                        }

                                        break;
                                    }
                                }
                            }
                        }
                    }
                } else {
                    node = ((XSDComponent) object).getElement();
                }
            } else if (object instanceof RedefineCategoryAdapter) {
                RedefineCategoryAdapter category = (RedefineCategoryAdapter) object;
                node = category.getXSDRedefine().getElement();
            } else if (object instanceof CategoryAdapter) {
                node = ((CategoryAdapter) object).getXSDSchema().getElement();
            } else if (object instanceof XSDBaseAdapter) {
                if (((XSDBaseAdapter) object).getTarget() instanceof XSDConcreteComponent) {
                    node = ((XSDConcreteComponent) ((XSDBaseAdapter) object).getTarget()).getElement();
                }
            } else if (object instanceof String) {
                // This case was added to make the F3/hyperlink navigation work
                // when an
                // inline schema from a WSDL document is opened in the schema
                // editor.
                // The string is expected to be a URI fragment used to identify
                // an XSD
                // component in the context of the enclosing WSDL resource.

                String uriFragment = (String) object;
                Resource resource = getXSDSchema().eResource();
                EObject modelObject = resource.getEObject(uriFragment);

                if (modelObject != null && modelObject instanceof XSDComponent) {
                    XSDComponent component = (XSDComponent) modelObject;
                    node = component.getElement();
                }
            }

            // the text editor can only accept sed nodes!
            //
            if (!(node instanceof IDOMNode)) {
                node = null;
            }
            return node;
        }

        private XSDElementDeclaration[] getAllMarkableDeclarationOfParticle() {
            declarMap.clear();
            // find all entities and record their name
            List<String> concepts = new ArrayList<String>();
            SchemaTreeContentProvider schemaContentProvider = (SchemaTreeContentProvider) getDataModelEditorPage()
                    .getSchemaContentProvider();
            Object[] elementDeclarations = schemaContentProvider
                    .getElements(getDataModelEditorPage().getXSDSchema());
            for (Object dec : elementDeclarations) {
                if (dec instanceof XSDElementDeclaration) {
                    concepts.add(((XSDElementDeclaration) dec).getName());
                }
            }

            Set<XSDTypeDefinition> visited = new HashSet<XSDTypeDefinition>();

            // add from entity
            List<XSDElementDeclaration> particles = new ArrayList<XSDElementDeclaration>();
            EList<XSDElementDeclaration> declarations = getXSDSchema().getElementDeclarations();
            for (XSDElementDeclaration dec : declarations) {
                if (concepts.contains(dec.getName())) {
                    XSDTypeDefinition typeDefinition = dec.getTypeDefinition();
                    addChildParticles(particles, typeDefinition, visited);
                }
            }

            // add from complex type
            EList<XSDTypeDefinition> typeDefinitions = getXSDSchema().getTypeDefinitions();
            for (XSDTypeDefinition definition : typeDefinitions) {
                if ((definition instanceof XSDComplexTypeDefinition) && !visited.contains(definition)) {
                    addChildParticles(particles, definition, visited);
                }
            }

            return particles.toArray(new XSDElementDeclaration[0]);
        }

        private void addChildParticles(List<XSDElementDeclaration> particles, XSDTypeDefinition typeDefinition,
                Set<XSDTypeDefinition> visited) {
            if (typeDefinition instanceof XSDComplexTypeDefinition && !visited.contains(typeDefinition)) {
                visited.add(typeDefinition);

                XSDComplexTypeDefinition complexDefinition = (XSDComplexTypeDefinition) typeDefinition;

                XSDParticle particle = (XSDParticle) complexDefinition.getContent();
                if (particle != null) {
                    XSDModelGroup content = (XSDModelGroup) particle.getTerm();
                    EList<XSDParticle> contents = content.getContents();

                    for (XSDParticle xsdParticle : contents) {
                        if (xsdParticle.getTerm() instanceof XSDElementDeclaration) {
                            XSDElementDeclaration contt = (XSDElementDeclaration) xsdParticle.getContent();
                            boolean isDeclarRef = contt.isElementDeclarationReference();
                            if (isDeclarRef) {
                                declarMap.put((XSDElementDeclaration) xsdParticle.getTerm(), contt);
                            }

                            particles.add((XSDElementDeclaration) xsdParticle.getTerm());
                            addChildParticles(particles,
                                    ((XSDElementDeclaration) xsdParticle.getTerm()).getTypeDefinition(), visited);
                        }
                    }
                }
            }
        }

        private boolean isUnderSameComplexType(XSDElementDeclaration elemOnTree,
                boolean isElemOnTreeBeReferenceType, XSDElementDeclaration elemInSource) {
            try {
                if (isElemOnTreeBeReferenceType) {
                    boolean isDeclarationReference = declarMap.get(elemInSource).isElementDeclarationReference();
                    if (isDeclarationReference && (elemOnTree.getContainer() instanceof XSDSchema)
                            && (elemInSource.getContainer() instanceof XSDSchema)) {
                        return true;
                    }

                    return false;
                } else {
                    XSDComplexTypeDefinition selContainer = (XSDComplexTypeDefinition) elemOnTree.getContainer()
                            .getContainer().getContainer().getContainer();
                    XSDComplexTypeDefinition tarContainer = (XSDComplexTypeDefinition) elemInSource.getContainer()
                            .getContainer().getContainer().getContainer();
                    if (selContainer.getContainer().getClass().equals(tarContainer.getContainer().getClass())) {
                        if (selContainer.getContainer() instanceof XSDSchema) {
                            if (selContainer.getName().equals(tarContainer.getName())) {
                                return true;
                            }
                        } else if (selContainer.getContainer() instanceof XSDElementDeclaration) {
                            XSDElementDeclaration selDec = (XSDElementDeclaration) selContainer.getContainer();
                            XSDElementDeclaration tarDec = (XSDElementDeclaration) tarContainer.getContainer();
                            if (selDec.getName().equals(tarDec.getName())) {
                                return true;
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }

            return false;
        }

        public void selectionChanged(SelectionChangedEvent event) {
            // do not fire selection in source editor if the current active page
            // is the InternalXSDMultiPageEditor
            // (source)
            // We only want to make source selections if the active page is
            // either the outline or properties (a modify
            // has been done via the outline or properties and not the source
            // view). We don't want to be selecting
            // and unselecting things in the source when editing in the source!!
            boolean isSourcePage = false;
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            if (window != null && window.getActivePage() != null) {
                IWorkbenchPage page = window.getActivePage();
                if (page.getActivePart() instanceof XSDEditor) {
                    if (getActiveEditor() instanceof StructuredTextEditor) {
                        isSourcePage = true;
                    }
                } else {
                    return;
                }

            }

            // do not fire selection in source editor if selection event came

            if (isSourcePage) {
                ISelection selection = getDataModelEditorPage().getSelectionProvider().getSelection();
                if (selection instanceof IStructuredSelection) {
                    List otherModelObjectList = new ArrayList();
                    for (Iterator i = ((IStructuredSelection) selection).iterator(); i.hasNext();) {
                        Object modelObject = i.next();
                        Object otherModelObject = getObjectForOtherModel(modelObject);
                        if (otherModelObject != null) {
                            otherModelObjectList.add(otherModelObject);
                        }
                    }
                    if (!otherModelObjectList.isEmpty()) {
                        StructuredSelection nodeSelection = new StructuredSelection(otherModelObjectList);
                        getTextEditor().getSelectionProvider().setSelection(nodeSelection);
                    }
                }
            }
        }

        public void doSetSelection() {
            ISelection iSelection = getSelectionManager().getSelection();
            if (iSelection != null) {
                Object firstElement = ((IStructuredSelection) iSelection).getFirstElement();
                Object otherModelObject = getObjectForOtherModel(firstElement);
                if (otherModelObject != null) {
                    StructuredSelection nodeSelection = new StructuredSelection(otherModelObject);
                    getTextEditor().getSelectionProvider().setSelection(nodeSelection);
                }
            }
        }
    }

    @Override
    protected void createPages() {
        createSourcePage();
        buildSchema();

        fXSDSelectionListener = new XSDSelectionManagerSelectionListener();
        getSelectionManager().addSelectionChangedListener(fXSDSelectionListener);

        // init content outline
        this.contentOutline = new XSDEditorContentOutline(this);

    }

    public ISelectionProvider getSelectionManager() {
        if (editorSelectionProvider == null) {
            editorSelectionProvider = new MultiPageSelectionProvider(this);
            getSite().setSelectionProvider(editorSelectionProvider);
        }
        return editorSelectionProvider;
    }

    protected void createSourcePage() {
        this.structuredTextEditor = new StructuredTextEditor() {

            @Override
            public boolean isEditable() {
                if (isReadOnly()) {
                    return false;
                }
                return super.isEditable();
            }

        };
        try {
            int index = addPage(this.structuredTextEditor, getEditorInput());
            setPageText(index, org.eclipse.wst.xsd.ui.internal.adt.editor.Messages._UI_LABEL_SOURCE);
            this.structuredTextEditor.update();
            this.structuredTextEditor.setEditorPart(this);
            this.structuredTextEditor.addPropertyListener(this);

            /*
             * **please don't remove this annotation util the problem is really resolve.
             * 
             * Here add a property listener to source editor to achieve a effect that when source editor is modified by
             * user, notify the model editor that it should be in dirty state.
             * 
             * this is not a perfect resolution of issue TMDM-6403, because we have not find the real reason that lead
             * to that result. the more detailed thing is the variable 'fSynchronizationStamp' in class
             * 'ResourceTextFileBuffer' is updated in some place and this variable finally affect the variable
             * 'fCanBeSaved' (see documentChanged method of the inner class DocumentListener)which indicated the source
             * editor's dirty state, so affect combined editor's dirty state,then affect the combined editor's property
             * listener's execution, then lead to the editor's save and model validation.
             */

            firePropertyChange(1);
        } catch (PartInitException e) {
            ErrorDialog.openError(getSite().getShell(), Messages.XSDEditor_ErrorMessage, null, e.getStatus());
        }
    }

    public void validateXsdSourceEditor() {
        String xsd = getSourcePageDocument();
        Exception ex = null;
        try {
            XSDSchema xsdSchema = Util.createXsdSchema(xsd, xobject);
            String error = validateDiagnoses(xsdSchema);
            if (!"".equals(error)) { //$NON-NLS-1$
                ex = new IllegalAccessException(error);
            }

        } catch (SAXParseException e) {
            ex = e;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            ex = e;
        }

        if (ex != null) {
            hasXSDErrors = true;

            ErrorExceptionDialog.openError(getSite().getShell(), Messages.XSDEditor_ChangedPageErrorTitle,
                    CommonUtil.getErrMsgFromException(ex));
            Display.getDefault().asyncExec(new Runnable() {

                public void run() {
                    setActivePage(SOURCE_PAGE_INDEX);
                }
            });

            return;
        }
        hasXSDErrors = false;
        return;
    }

    public String getSourcePageDocument() {
        return getTextEditor().getTextViewer().getDocument().get();
    }

    protected StructuredTextEditor getTextEditor() {
        return structuredTextEditor;
    }

    /**
     * DOC talend-mdm Comment method "validateDiagnoses".
     * 
     * @param xsdSchema
     * @return
     */
    private String validateDiagnoses(XSDSchema xsdSchema) {
        xsdSchema.clearDiagnostics();
        xsdSchema.getAllDiagnostics().clear();
        xsdSchema.validate();
        EList<XSDDiagnostic> diagnoses = xsdSchema.getAllDiagnostics();
        String error = "";//$NON-NLS-1$
        Set<String> errors = new HashSet<String>();
        for (int i = 0; i < diagnoses.size(); i++) {
            XSDDiagnostic dia = diagnoses.get(i);
            XSDDiagnosticSeverity servity = dia.getSeverity();
            if (servity == XSDDiagnosticSeverity.ERROR_LITERAL || servity == XSDDiagnosticSeverity.FATAL_LITERAL) {
                boolean omit = false;
                for (String msg : MSG_OMIT) {
                    if (dia.getMessage().indexOf(msg) != -1) {
                        omit = true;
                        break;
                    }
                }
                if (!omit && !errors.contains(dia.getMessage())) {
                    error += dia.getMessage() + "\n";//$NON-NLS-1$
                    errors.add(dia.getMessage());
                }
            }
        }
        return error;
    }

    public String getContributorId() {

        int activePageIndex = getActivePage();
        if (activePageIndex == SOURCE_PAGE_INDEX) {
            return "org.eclipse.wst.xsd.ui.internal.editor"; //$NON-NLS-1$;
        }

        return CONTRUIBUTIONID_DATAMODELPAGE;

    }

    @Override
    public Object getAdapter(Class type) {
        if (type == IPropertySheetPage.class) {
            int activePageIndex = getActivePage();
            if (activePageIndex == SOURCE_PAGE_INDEX) {
                return new XSDTabbedPropertySheetPage(this);
            }
            if (activePageIndex == MODEL_PAGE_INDEX) {
                return new TabbedPropertySheetPage(this) {

                    @Override
                    public String getTitleText(ISelection selection) {
                        String text = super.getTitleText(selection);
                        text = isReadOnly() ? NLS.bind(Messages.XSDEditor_SheetPageTitle, text) : text;
                        return text;
                    }
                };
            }
        }

        if (type == DataModelMainPage.class) {
            for (int i = 0; i < getPageCount(); i++) {
                if (getEditor(i) instanceof DataModelMainPage) {
                    return getEditor(i);
                }
            }
        }
        if (Boolean.class == type) {
            return new Boolean(isReadOnly());
        }
        // Add this for enable false the properties view while this editor is
        // readOnly.
        if (XSDSchema.class == type && isReadOnly()) {
            return null;
        }
        if (IContentOutlinePage.class == type) {
            return contentOutline;
        }
        return super.getAdapter(type);

    }

    private void refreshPropertyView() {
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        IViewPart propView = page.findView(MDMPerspective.VIEWID_PROPERTYVIEW);
        if (propView != null) {
            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().hideView(propView);
        }
        try {
            page.showView(MDMPerspective.VIEWID_PROPERTYVIEW);
        } catch (PartInitException e) {
            e.printStackTrace();
        }
    }

    private void resetTreeSelection(int newPageIndex) {
        DataModelMainPage dataModelEditorPage = getDataModelEditorPage();
        if (dataModelEditorPage != null) {
            TreeViewer treeViewer = dataModelEditorPage.getTreeViewer();
            if (newPageIndex == MODEL_PAGE_INDEX) {
                treeViewer.setSelection(null);
            } else if (newPageIndex == SOURCE_PAGE_INDEX) {
                IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
                if (!selection.isEmpty()) {
                    Object firstElement = selection.getFirstElement();
                    if ((firstElement instanceof XSDIdentityConstraintDefinition)) {
                        XSDIdentityConstraintDefinition cdf = (XSDIdentityConstraintDefinition) firstElement;
                        XSDConcreteComponent container = cdf.getContainer();
                        treeViewer.setSelection(new StructuredSelection(container));
                    } else if ((firstElement instanceof XSDXPathDefinition)) {
                        XSDXPathDefinition pathdef = (XSDXPathDefinition) firstElement;
                        XSDConcreteComponent container = pathdef.getContainer().getContainer();
                        treeViewer.setSelection(new StructuredSelection(container));
                    } else if (firstElement instanceof XSDAnnotation) {
                        XSDAnnotation annotation = (XSDAnnotation) firstElement;
                        XSDConcreteComponent container = annotation.getContainer();
                        treeViewer.setSelection(new StructuredSelection(container));
                    }
                }
            }
        }
    }

    @Override
    public void setFocus() {
        Object selectedPage = getSelectedPage();
        if (selectedPage instanceof IEditorPart) {
            ((IEditorPart) selectedPage).setFocus();
        } else {
            super.setFocus();
        }
    }

    public boolean isLocalInput() {
        return false;
    }

    public void setName(String name) {
        setPartName(name);
    }

    @Override
    public void dispose() {
        try {
            if (isDirty()) {
                IFile file = getXSDFile(xobject);
                file.setCharset("utf-8", null);//$NON-NLS-1$
                file.setContents(new ByteArrayInputStream(fileContents), IFile.FORCE, null);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            try {

                IEditorInput input = getEditorInput();
                if (input != null && input instanceof XSDEditorInput) {
                    XSDEditorInput editorInput = (XSDEditorInput) input;
                    editorInput.dispose();
                }
                System.gc();
            } catch (Throwable e) {
                log.error(e.getMessage(), e);
            }
        }

        super.dispose();
    }

    public DataModelMainPage getdMainPage() {
        return null;
    }

    public boolean isReadOnly() {
        return false;
    }

    @Override
    public void doSaveAs() {
        // do nothing
    }

    @Override
    public boolean isSaveAsAllowed() {
        return false;
    }

    protected void buildSchema() {
        try {
            IEditorInput editorInput = getEditorInput();

            Document document = null;
            IDocument doc = structuredTextEditor.getDocumentProvider().getDocument(getEditorInput());
            if (doc instanceof IStructuredDocument) {
                IStructuredModel model = null;
                try {
                    // TODO: for StorageEditorInputs, should be forRead
                    model = StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
                    if (model == null) {
                        model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) doc);
                    }
                    document = ((IDOMModel) model).getDocument();
                } finally {
                    if (model != null) {
                        model.releaseFromEdit();
                    }
                }
            }
            Assert.isNotNull(document);

            xsdSchema = XSDModelAdapter.lookupOrCreateSchema(document);
        } catch (Exception e) {

        }

    }

    public XSDSchema getXSDSchema() {
        return this.xsdSchema;
    }

    public void propertyChanged(Object source, int propId) {
        if (source == structuredTextEditor && propId == PROP_DIRTY) {
            boolean dirty = structuredTextEditor.isDirty();
            if (dirty) {
                DataModelMainPage dMainPage = getdMainPage();
                if (dMainPage != null) {
                    dMainPage.setDirty(dirty);
                }
            }
        }

    }

    public void gotoMarker(IMarker marker) {
        setActivePage(SOURCE_PAGE_INDEX);
        IDE.gotoMarker(structuredTextEditor, marker);
    }

}