/*******************************************************************************
* Copyright (c) 2008 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
*******************************************************************************/
package org.eclipse.cdt.internal.ui.wizards.settingswizards;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URI;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.eclipse.cdt.core.resources.ResourcesUtil;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICFolderDescription;
import org.eclipse.cdt.ui.CUIPlugin;
/**
* Custom behavior for the Export wizard.
*
* @author Mike Kucera
* @since 5.1
*
*/
public class ProjectSettingsExportStrategy implements IProjectSettingsWizardPageStrategy {
public static final String ROOT_ELEMENT = "cdtprojectproperties"; //$NON-NLS-1$
public static final String SECTION_ELEMENT = "section"; //$NON-NLS-1$
public static final String SECTION_NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
private static final String NONE = ""; //$NON-NLS-1$
private static final String CDATA = "CDATA"; //$NON-NLS-1$
public String getMessage(MessageType type) {
switch(type) {
case TITLE: return Messages.ProjectSettingsWizardPage_Export_title;
case MESSAGE: return Messages.ProjectSettingsWizardPage_Export_message;
case CHECKBOX: return Messages.ProjectSettingsWizardPage_Export_checkBox;
case FILE: return Messages.ProjectSettingsWizardPage_Export_file;
case SETTINGS: return Messages.ProjectSettingsWizardPage_Export_selectSettings;
default: return null;
}
}
public void pageCreated(IProjectSettingsWizardPage page) {
// do nothing
}
public void fileSelected(IProjectSettingsWizardPage page) {
// do nothing
}
private Writer getWriter(IProjectSettingsWizardPage page) throws IOException {
IPath path = new Path(page.getDestinationFilePath());
if(!IProjectSettingsWizardPage.FILENAME_EXTENSION.equals(path.getFileExtension()))
path.addFileExtension(IProjectSettingsWizardPage.FILENAME_EXTENSION);
return new FileWriter(path.toFile());
}
/**
* Exports the selected project settings to an XML file.
*/
public boolean finish(IProjectSettingsWizardPage page) {
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler handler = null;
try {
handler = factory.newTransformerHandler();
} catch (TransformerConfigurationException e) {
CUIPlugin.log(e);
page.showErrorDialog(Messages.ProjectSettingsExportStrategy_exportError,
Messages.ProjectSettingsExportStrategy_exportFailed);
return false;
}
// gets a writer for the file that was selected by the user
Writer writer;
try {
writer = getWriter(page);
} catch(IOException e) {
page.showErrorDialog(Messages.ProjectSettingsExportStrategy_fileOpenError,
Messages.ProjectSettingsExportStrategy_couldNotOpen);
return false;
}
// stream the results to the writer as text
handler.setResult(new StreamResult(writer));
// write out the XML header
Transformer transformer = handler.getTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
List<ISettingsProcessor> exporters = page.getSelectedSettingsProcessors();
ICConfigurationDescription config = page.getSelectedConfiguration();
ICFolderDescription projectRoot = config.getRootFolderDescription();
boolean result = false;
try {
AttributesImpl attributes = new AttributesImpl();
handler.startDocument();
newline(handler);
handler.startElement(NONE, NONE, ROOT_ELEMENT, null);
newline(handler);
for(ISettingsProcessor exporter : exporters) {
attributes.clear();
attributes.addAttribute(NONE, NONE, SECTION_NAME_ATTRIBUTE, CDATA, exporter.getSectionName());
handler.startElement(NONE, NONE, SECTION_ELEMENT, attributes);
newline(handler);
// each exporter is responsible for writing out its own section of the file
exporter.writeSectionXML(projectRoot, handler);
handler.endElement(NONE, NONE, SECTION_ELEMENT);
newline(handler);
}
handler.endElement(NONE, NONE, ROOT_ELEMENT);
newline(handler);
handler.endDocument();
newline(handler);
result = true;
} catch (SAXException e) {
CUIPlugin.log(e);
page.showErrorDialog(Messages.ProjectSettingsExportStrategy_exportError,
Messages.ProjectSettingsExportStrategy_xmlError);
result = false;
} catch(SettingsImportExportException e) {
CUIPlugin.log(e);
page.showErrorDialog(Messages.ProjectSettingsExportStrategy_fileOpenError,
Messages.ProjectSettingsExportStrategy_couldNotOpen);
result = false;
}
URI uri = URIUtil.toURI(page.getDestinationFilePath());
ResourcesUtil.refreshWorkspaceFiles(uri);
return result;
}
/**
* Outputs a newline (\n) to the given ContentHandler.
*/
private static void newline(ContentHandler handler) throws SAXException {
handler.ignorableWhitespace("\n".toCharArray(), 0, 1); //$NON-NLS-1$
}
}