blob: 729926af72ce8ceb237adb49ec01cb5a0a063c0e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2019 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.editor.xml;
import java.util.ArrayList;
import java.util.List;
import org.w3c.dom.Element;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceTable;
import org.eclipse.wst.xml.core.internal.modelhandler.ModelHandlerForXML;
import org.eclipse.wst.xml.core.internal.modelhandler.XMLModelLoader;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryAdapterFactoryForXML;
import org.eclipse.wst.xml.core.internal.modelquery.XMLModelQueryAssociationProvider;
import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapterImpl;
@SuppressWarnings("restriction")
public class PomModelHandler extends ModelHandlerForXML {
private static final String ASSOCIATED_CONTENT_TYPE_ID = "org.eclipse.m2e.pomFile"; //$NON-NLS-1$
private static final String POM_NAMESPACE = "http://maven.apache.org/POM/4.0.0"; //$NON-NLS-1$
private static final String POM_XSD = "http://maven.apache.org/xsd/maven-4.0.0.xsd"; //$NON-NLS-1$
public PomModelHandler() {
super();
setAssociatedContentTypeId(ASSOCIATED_CONTENT_TYPE_ID);
}
@Override
public IModelLoader getModelLoader() {
return new PomModelLoader();
}
private static class PomModelLoader extends XMLModelLoader {
@Override
public List<?> getAdapterFactories() {
List<Object> result = new ArrayList<>();
INodeAdapterFactory factory = new ModelQueryAdapterFactoryForPom();
result.add(factory);
return result;
}
}
static class ModelQueryAdapterFactoryForPom extends ModelQueryAdapterFactoryForXML {
protected ModelQueryAdapterImpl modelQueryAdapterImpl;
@Override
protected INodeAdapter createAdapter(INodeNotifier target) {
if(modelQueryAdapterImpl == null) {
ModelQueryAdapter mqa = (ModelQueryAdapter) super.createAdapter(target);
modelQueryAdapterImpl = new ModelQueryAdapterImpl(mqa.getCMDocumentCache(),
new PomModelQueryImpl(mqa.getCMDocumentCache(), mqa.getIdResolver()), mqa.getIdResolver());
}
return modelQueryAdapterImpl;
}
}
static class PomModelQueryImpl extends ModelQueryImpl {
public PomModelQueryImpl(CMDocumentCache cache, URIResolver idResolver) {
super(new PomModelQueryAssociationProvider(cache, idResolver));
}
}
static class PomModelQueryAssociationProvider extends XMLModelQueryAssociationProvider {
public PomModelQueryAssociationProvider(CMDocumentCache cache, URIResolver idResolver) {
super(cache, idResolver);
}
@Override
public CMDocument getCMDocument(String publicId, String systemId, String type) {
if("".equals(publicId) && "".equals(systemId)) { //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
return super.getCMDocument(publicId, systemId, type);
}
@Override
public CMElementDeclaration getCMElementDeclaration(Element element) {
CMElementDeclaration result = super.getCMElementDeclaration(element);
if(result == null) {
NamespaceTable namespaceTable = new NamespaceTable(element.getOwnerDocument());
List list = NamespaceTable.getElementLineage(element);
Element rootElement = (Element) list.get(0);
namespaceTable.addElement(rootElement);
documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_ASYNC_LOAD, false);
documentManager.addCMDocumentReference(POM_NAMESPACE, POM_XSD, "XSD"); //$NON-NLS-1$
namespaceTable.addNamespaceInfo("", POM_NAMESPACE, ""); //$NON-NLS-1$ //$NON-NLS-2$
if(namespaceTable.isNamespaceEncountered()) {
result = getCMElementDeclaration(element, list, namespaceTable);
}
}
return result;
}
}
}