/* * Copyright (c) 2016, Alex Blewitt, Bandlem Ltd * Copyright (c) 2016, Packt Publishing Ltd * * 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 */ package com.packtpub.e4.minimark.ui; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IResourceProxy; import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; public class MinimarkVisitor implements IResourceProxyVisitor, IResourceDeltaVisitor { public boolean visit(IResourceDelta delta) throws CoreException { boolean deleted = (IResourceDelta.REMOVED & delta.getKind()) != 0; IResource resource = delta.getResource(); String name = resource.getName(); if (name.endsWith(".minimark")) { if (deleted) { String htmlName = name.replace(".minimark", ".html"); IFile htmlFile = resource.getParent().getFile(new Path(htmlName)); if (htmlFile.exists()) { htmlFile.delete(true, null); } } else { processResource(resource); } } else if (name.endsWith(".html")) { String minimarkName = name.replace(".html", ".minimark"); IFile minimarkFile = resource.getParent().getFile(new Path(minimarkName)); if (minimarkFile.exists()) { processResource(minimarkFile); } } return true; } public boolean visit(IResourceProxy proxy) throws CoreException { String name = proxy.getName(); if (name != null && name.endsWith(".minimark")) { // System.out.println("Processing " + name); processResource(proxy.requestResource()); } return true; } private void processResource(IResource resource) throws CoreException { if (resource instanceof IFile && resource.exists()) { try { resource.deleteMarkers("com.packtpub.e4.minimark.ui.MinimarkMarker", true, IResource.DEPTH_INFINITE); IFile file = (IFile) resource; InputStream in = file.getContents(); String htmlName = file.getName().replace(".minimark", ".html"); IContainer container = file.getParent(); IFile htmlFile = container.getFile(new Path(htmlName)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); MinimarkTranslator.convert(new InputStreamReader(in), new OutputStreamWriter(baos)); ByteArrayInputStream contents = new ByteArrayInputStream(baos.toByteArray()); if (baos.size() < 100) { // System.out.println("Minimark file is empty"); // IMarker marker = resource.createMarker(IMarker.PROBLEM); IMarker marker = resource.createMarker("com.packtpub.e4.minimark.ui.MinimarkMarker"); marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); marker.setAttribute(IMarker.MESSAGE, "Minimark file is empty"); marker.setAttribute(IMarker.LINE_NUMBER, 1); marker.setAttribute(IMarker.CHAR_START, 0); marker.setAttribute(IMarker.CHAR_END, 0); } if (htmlFile.exists()) { htmlFile.setContents(contents, true, false, null); } else { htmlFile.create(contents, true, null); } htmlFile.setDerived(true, null); } catch (IOException e) { throw new CoreException( new Status(Status.ERROR, Activator.PLUGIN_ID, "Failed to generate resource", e)); } } } }