/******************************************************************************* * Copyright (c) 2012 Pivotal Software, Inc. * 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: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.grails.ide.eclipse.editor.gsp.model; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jst.jsp.core.internal.Logger; import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter; import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent; import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.grails.ide.eclipse.core.internal.GrailsNature; import org.grails.ide.eclipse.core.internal.plugins.GrailsCore; import org.grails.ide.eclipse.editor.gsp.tags.PerProjectTagProvider; import org.grails.ide.eclipse.editor.gsp.translation.GSPTranslationAdapterFactory; /** * Make {@link GSPTranslation} create .groovy compilation units instead of .java. * @author Andrew Eisenberg * @author Nieraj Singh * @created Nov 6, 2009 */ public class GSPStructuredModel extends DOMModelForJSP implements IStructuredModel { public GSPStructuredModel() { if (getFactoryRegistry().getFactoryFor(PageDirectiveAdapter.class) == null) { getFactoryRegistry().addFactory(new GSPTranslationAdapterFactory()); } } public IProject getProject() { IProject project = null; try { String baseLocation = this.getBaseLocation(); if (baseLocation == null) { return null; } IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IPath filePath = new Path(baseLocation); if (filePath.segmentCount() > 0) { project = root.getProject(filePath.segment(0)); } } catch (Exception ex) { if (this != null) { Logger.logException( "(GSPModelQueryCMProvider) problem getting java project from the XMLModel's baseLocation > " + this.getBaseLocation(), ex); //$NON-NLS-1$ } else { Logger.logException( "(GSPModelQueryCMProvider) problem getting java project because model is null", ex); //$NON-NLS-1$ } } return project; } @Override public void nodesReplaced(StructuredDocumentRegionsReplacedEvent event) { super.nodesReplaced(event); ensureTagTrackersReinitialized(); } @Override public void regionsReplaced(RegionsReplacedEvent event) { super.regionsReplaced(event); ensureTagTrackersReinitialized(); } private void ensureTagTrackersReinitialized() { // also ensure that the taglib trackers are properly updated IProject project = getProject(); if (project != null && GrailsNature.isGrailsProject(project)) { PerProjectTagProvider tagProvider = GrailsCore.get().getInfo(project, PerProjectTagProvider.class); if (tagProvider != null) { tagProvider.maybeReinitializeTagTrackers(this); } } } @Override public void setStructuredDocument(IStructuredDocument structuredDocument) { super.setStructuredDocument(structuredDocument); // also ensure that TagMarkers are set in the tokenizer IProject project = this.getProject(); if (project != null) { PerProjectTagProvider provider = GrailsCore.get().getInfo(project, PerProjectTagProvider.class); if (provider != null && provider.isConnected(this)) { provider.addTagMarkers(this); } } } }