/******************************************************************************* * Copyright (c) 2008 Pierre-Antoine Grégoire. * 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: * Pierre-Antoine Grégoire - initial API and implementation *******************************************************************************/ package org.org.eclipse.helpers.core.internal.xml; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StaxProjectFileModifier implements IProjectFileModifier { public void modifyProjectFile(File file) throws IOException { File backupFile = new File(file.getAbsolutePath() + ".backup." + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date(System.currentTimeMillis()))); copy(file, backupFile); InputStream inputStream = new FileInputStream(backupFile); modifyProjectFile(inputStream, new FileOutputStream(file)); } private void copy(File file, File targetFile) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader(file); out = new FileWriter(targetFile); int c; while ((c = in.read()) != -1) out.write(c); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // do something clever here } } if (out != null) { try { out.close(); } catch (IOException e) { // do something clever here } } } } public void modifyProjectFile(InputStream inputStream, OutputStream outputStream) { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); XMLEventFactory eventFactory = XMLEventFactory.newInstance(); try { XMLEventReader eventReader = inputFactory.createXMLEventReader(inputStream); XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(outputStream); while (true) { XMLEvent event = eventReader.nextEvent(); if (event.isEndDocument()) { eventReader.close(); eventWriter.close(); break; } else { Boolean isPassThru = true; if (event.isStartElement()) { StartElement startElement = event.asStartElement(); if (startElement.getName().getLocalPart().equals(BUILDSPEC)) { isPassThru = false; while (true) { event = eventReader.nextEvent(); if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(BUILDSPEC)) { break; } } eventWriter.add(eventFactory.createStartElement(new QName(BUILDSPEC), null, null)); addBuildCommand(eventWriter, eventFactory, "org.eclipse.jdt.core.javabuilder"); addBuildCommand(eventWriter, eventFactory, "org.eclipse.wst.common.project.facet.core.builder"); addBuildCommand(eventWriter, eventFactory, "org.eclipse.wst.validation.validationbuilder"); eventWriter.add(eventFactory.createEndElement(new QName(BUILDSPEC), null)); } if (startElement.getName().getLocalPart().equals(NATURES)) { isPassThru = false; while (true) { event = eventReader.nextEvent(); if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(NATURES)) { break; } } eventWriter.add(eventFactory.createStartElement(new QName(NATURES), null, null)); addNature(eventWriter, eventFactory, "org.eclipse.wst.common.project.facet.core.nature"); addNature(eventWriter, eventFactory, "org.eclipse.jdt.core.javanature"); addNature(eventWriter, eventFactory, "org.eclipse.wst.common.modulecore.ModuleCoreNature"); addNature(eventWriter, eventFactory, "org.eclipse.jem.workbench.JavaEMFNature"); eventWriter.add(eventFactory.createEndElement(new QName(NATURES), null)); } } if (isPassThru) { eventWriter.add(event); } } } } catch (XMLStreamException e) { throw new RuntimeException("Impossible to handle XML file", e); } } private void addNature(XMLEventWriter eventWriter, XMLEventFactory eventFactory, String nature) throws XMLStreamException { eventWriter.add(eventFactory.createStartElement(new QName(NATURE), null, null)); eventWriter.add(eventFactory.createCharacters(nature)); eventWriter.add(eventFactory.createEndElement(new QName(NATURE), null)); } private void addBuildCommand(XMLEventWriter eventWriter, XMLEventFactory eventFactory, String buildCommandName) throws XMLStreamException { eventWriter.add(eventFactory.createStartElement(new QName(BUILDCOMMAND), null, null)); eventWriter.add(eventFactory.createStartElement(new QName(NAME), null, null)); eventWriter.add(eventFactory.createCharacters(buildCommandName)); eventWriter.add(eventFactory.createEndElement(new QName(NAME), null)); eventWriter.add(eventFactory.createStartElement(new QName(ARGUMENTS), null, null)); eventWriter.add(eventFactory.createCharacters("")); eventWriter.add(eventFactory.createEndElement(new QName(ARGUMENTS), null)); eventWriter.add(eventFactory.createEndElement(new QName(BUILDCOMMAND), null)); } public static void main(String[] args) { StaxProjectFileModifier staxProjectFileModifier = new StaxProjectFileModifier(); InputStream inputStream = new ByteArrayInputStream(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<projectDescription>" + "<name>essai</name>" + "<comment></comment>" + "<projects>" + "</projects>" + "<buildSpec>" + "<buildCommand>" + "<name>com.genuitec.eclipse.j2eedt.core.WebClasspathBuilder</name>" + "<arguments>" + "</arguments>" + "</buildCommand>" + "<buildCommand>" + "<name>org.eclipse.jdt.core.javabuilder</name>" + "<arguments>" + "</arguments>" + "</buildCommand>" + "<buildCommand>" + "<name>com.genuitec.eclipse.j2eedt.core.J2EEProjectValidator</name>" + "<arguments>" + "</arguments>" + "</buildCommand>" + "<buildCommand>" + "<name>com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator</name>" + "<arguments>" + "</arguments>" + "</buildCommand>" + "<buildCommand>" + "<name>org.eclipse.wst.validation.validationbuilder</name>" + "<arguments>" + "</arguments>" + "</buildCommand>" + "</buildSpec>" + "<natures>" + "<nature>com.genuitec.eclipse.j2eedt.core.webnature</nature>" + "<nature>org.eclipse.jdt.core.javanature</nature>" + "</natures>" + "</projectDescription>").getBytes()); staxProjectFileModifier.modifyProjectFile(inputStream, System.out); } }