| /******************************************************************************* |
| * Copyright (c) 2001, 2007 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.core.internal.modelquery; |
| |
| |
| |
| import java.io.File; |
| import java.net.URI; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver; |
| import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory; |
| import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener; |
| 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.sse.core.internal.provisional.IStructuredModel; |
| import org.eclipse.wst.sse.core.internal.util.Debug; |
| import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager; |
| import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; |
| import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; |
| import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter; |
| import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapterImpl; |
| |
| |
| public class ModelQueryAdapterFactoryForXML extends AbstractAdapterFactory { |
| |
| protected ModelQueryAdapterImpl modelQueryAdapterImpl; |
| IStructuredModel stateNotifier = null; |
| private InternalModelStateListener internalModelStateListener; |
| |
| /** |
| * ModelQueryAdapterFactoryForXML constructor comment. |
| */ |
| public ModelQueryAdapterFactoryForXML() { |
| this(ModelQueryAdapter.class, true); |
| } |
| |
| /** |
| * ModelQueryAdapterFactoryForXML constructor comment. |
| * |
| * @param adapterKey |
| * java.lang.Object |
| * @param registerAdapters |
| * boolean |
| */ |
| protected ModelQueryAdapterFactoryForXML(Object adapterKey, boolean registerAdapters) { |
| super(adapterKey, registerAdapters); |
| } |
| |
| class InternalModelStateListener implements IModelStateListener { |
| |
| /** |
| * @see IModelStateListener#modelAboutToBeChanged(IStructuredModel) |
| */ |
| public void modelAboutToBeChanged(IStructuredModel model) { |
| } |
| |
| /** |
| * @see IModelStateListener#modelChanged(IStructuredModel) |
| */ |
| public void modelChanged(IStructuredModel model) { |
| } |
| |
| /** |
| * @see IModelStateListener#modelDirtyStateChanged(IStructuredModel, |
| * boolean) |
| */ |
| public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) { |
| } |
| |
| /** |
| * @see IModelStateListener#modelResourceDeleted(IStructuredModel) |
| */ |
| public void modelResourceDeleted(IStructuredModel model) { |
| } |
| |
| /** |
| * @see IModelStateListener#modelResourceMoved(IStructuredModel, |
| * IStructuredModel) |
| */ |
| public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) { |
| stateNotifier.removeModelStateListener(this); |
| stateNotifier = newModel; |
| updateResolver(stateNotifier); |
| stateNotifier.addModelStateListener(this); |
| } |
| |
| public void modelAboutToBeReinitialized(IStructuredModel structuredModel) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| public void modelReinitialized(IStructuredModel structuredModel) { |
| updateResolver(structuredModel); |
| |
| } |
| |
| |
| } |
| |
| protected boolean autoLoadCM() { |
| // until the existence of a CMDocumentRequesterFactory to create the |
| // load requests, |
| // return true |
| return true; |
| } |
| |
| protected void configureDocumentManager(CMDocumentManager mgr) { |
| // this depends on there being a CMDocumentRequesterFactory installed |
| mgr.setPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD, autoLoadCM()); |
| } |
| |
| public INodeAdapterFactory copy() { |
| |
| return new ModelQueryAdapterFactoryForXML(getAdapterKey(), isShouldRegisterAdapter()); |
| } |
| |
| /** |
| * createAdapter method comment. |
| */ |
| protected INodeAdapter createAdapter(INodeNotifier target) { |
| |
| if (org.eclipse.wst.sse.core.internal.util.Debug.displayInfo) |
| System.out.println("-----------------------ModelQueryAdapterFactoryForXML.createAdapter" + target); //$NON-NLS-1$ |
| if (modelQueryAdapterImpl == null) { |
| if (target instanceof IDOMNode) { |
| IDOMNode xmlNode = (IDOMNode) target; |
| IStructuredModel model = xmlNode.getModel(); |
| stateNotifier = xmlNode.getModel(); |
| stateNotifier.addModelStateListener(getInternalModelStateListener()); |
| |
| org.eclipse.wst.sse.core.internal.util.URIResolver resolver = model.getResolver(); |
| if (Debug.displayInfo) |
| System.out.println("----------------ModelQueryAdapterFactoryForXML... baseLocation : " + resolver.getFileBaseLocation()); //$NON-NLS-1$ |
| |
| /** |
| * XMLCatalogIdResolver currently requires a filesystem |
| * location string. Customarily this will be what is in the |
| * deprecated SSE URIResolver and required by the Common URI |
| * Resolver. |
| */ |
| URIResolver idResolver = null; |
| if (resolver != null) { |
| idResolver = new XMLCatalogIdResolver(resolver.getFileBaseLocation(), resolver); |
| } |
| else { |
| /* |
| * 203649 - this block may be necessary due to ordering of |
| * setting the resolver into the model |
| */ |
| String baseLocation = null; |
| String modelsBaseLocation = model.getBaseLocation(); |
| if (modelsBaseLocation != null) { |
| File file = new Path(modelsBaseLocation).toFile(); |
| if (file.exists()) { |
| baseLocation = file.getAbsolutePath(); |
| } |
| else { |
| IPath basePath = new Path(model.getBaseLocation()); |
| IResource derivedResource = null; |
| if (basePath.segmentCount() > 1) |
| derivedResource = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath); |
| else |
| derivedResource = ResourcesPlugin.getWorkspace().getRoot().getProject(basePath.segment(0)); |
| IPath derivedPath = derivedResource.getLocation(); |
| if (derivedPath != null) { |
| baseLocation = derivedPath.toString(); |
| } |
| else { |
| URI uri = derivedResource.getLocationURI(); |
| if (uri != null) { |
| baseLocation = uri.toString(); |
| } |
| } |
| } |
| if(baseLocation == null) { |
| baseLocation = modelsBaseLocation; |
| } |
| } |
| idResolver = new XMLCatalogIdResolver(baseLocation, null); |
| } |
| |
| CMDocumentCache cmDocumentCache = new CMDocumentCache(); |
| ModelQuery modelQuery = new XMLModelQueryImpl(cmDocumentCache, idResolver); |
| |
| // cs todo... |
| // for now we create a CMDocumentCache on a 'per editor' basis |
| // in the future we need to support a CMDocumentCache that is |
| // shared between editors |
| // nsd comment: may not be appropriate depending on |
| CMDocumentManager documentManager = modelQuery.getCMDocumentManager(); |
| if (documentManager != null) { |
| configureDocumentManager(documentManager); |
| } |
| modelQueryAdapterImpl = new ModelQueryAdapterImpl(cmDocumentCache, modelQuery, idResolver); |
| } |
| } |
| return modelQueryAdapterImpl; |
| } |
| |
| public void release() { |
| super.release(); |
| if (stateNotifier != null) |
| stateNotifier.removeModelStateListener(getInternalModelStateListener()); |
| stateNotifier = null; |
| if (modelQueryAdapterImpl != null) |
| modelQueryAdapterImpl.release(); |
| } |
| |
| protected void updateResolver(IStructuredModel model) { |
| |
| String baseLocation = model.getBaseLocation(); |
| IFile baseFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation())); |
| if (baseFile != null) { |
| if (baseFile.getLocation() != null) { |
| baseLocation = baseFile.getLocation().toString(); |
| } |
| if (baseLocation == null && baseFile.getLocationURI() != null) { |
| baseLocation = baseFile.getLocationURI().toString(); |
| } |
| if (baseLocation == null) { |
| baseLocation = baseFile.getFullPath().toString(); |
| } |
| } |
| else { |
| baseLocation = model.getBaseLocation(); |
| } |
| modelQueryAdapterImpl.setIdResolver(new XMLCatalogIdResolver(baseLocation, model.getResolver())); |
| } |
| |
| private final InternalModelStateListener getInternalModelStateListener() { |
| if (internalModelStateListener == null) { |
| internalModelStateListener = new InternalModelStateListener(); |
| } |
| return internalModelStateListener; |
| } |
| } |