/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * 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: * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.ui.builder; import java.util.Collections; import java.util.List; import org.cloudsmith.geppetto.pp.dsl.PPDSLConstants; import org.cloudsmith.geppetto.pp.dsl.adapters.ResourcePropertiesAdapter; import org.cloudsmith.geppetto.pp.dsl.adapters.ResourcePropertiesAdapterFactory; import org.cloudsmith.geppetto.pp.dsl.linking.PPTask; import org.cloudsmith.geppetto.pp.dsl.ui.PPUiConstants; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.builder.IXtextBuilderParticipant; import org.eclipse.xtext.resource.IResourceDescription; /** * An XtextBuilderParticipant for Puppet. * */ public class PPBuilderParticipant implements IXtextBuilderParticipant { private static List<PPTask> getTaskList(Resource r) { ResourcePropertiesAdapter adapter = ResourcePropertiesAdapterFactory.eINSTANCE.adapt(r); @SuppressWarnings("unchecked") List<PPTask> tasks = (List<PPTask>) adapter.get(PPDSLConstants.RESOURCE_PROPERTY__TASK_LIST); if(tasks == null) return Collections.emptyList(); return tasks; } private static void syncTasks(List<PPTask> taskList, URI uri) { IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true))); // Remove all previous tasks try { file.deleteMarkers(PPUiConstants.PUPPET_TASK_MARKER_TYPE, false, IResource.DEPTH_ZERO); } catch(CoreException e) { System.err.println("Could not delete task markers"); } // Add all tasks try { for(PPTask task : taskList) { IMarker m = file.createMarker(PPUiConstants.PUPPET_TASK_MARKER_TYPE); int prio = task.isImportant() ? IMarker.PRIORITY_HIGH : IMarker.PRIORITY_NORMAL; m.setAttribute(IMarker.MESSAGE, task.getMsg()); m.setAttribute(IMarker.PRIORITY, prio); m.setAttribute(IMarker.LINE_NUMBER, task.getLine()); m.setAttribute(IMarker.CHAR_START, task.getOffset()); m.setAttribute(IMarker.CHAR_END, task.getOffset() + task.getLength()); m.setAttribute(IMarker.USER_EDITABLE, false); } } catch(CoreException e) { // TODO System.err.println("Could not create puppet task marker"); } } /* * (non-Javadoc) * * @see org.eclipse.xtext.builder.IXtextBuilderParticipant#build(org.eclipse.xtext.builder.IXtextBuilderParticipant.IBuildContext, * org.eclipse.core.runtime.IProgressMonitor) */ @Override public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException { for(IResourceDescription.Delta delta : context.getDeltas()) { IResourceDescription resourceDescription = delta.getNew(); if(resourceDescription != null) { URI uri = resourceDescription.getURI(); if(uri != null) { if("pp".equals(uri.fileExtension())) { Resource r = context.getResourceSet().getResource(uri, true); List<PPTask> taskList = getTaskList(r); syncTasks(taskList, uri); } } } } } }