/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.io.exporter.impl; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import org.gephi.io.exporter.api.ExportController; import org.gephi.io.exporter.api.FileType; import org.gephi.io.exporter.spi.ByteExporter; import org.gephi.io.exporter.spi.Exporter; import org.gephi.io.exporter.spi.ExporterUI; import org.gephi.io.exporter.spi.CharacterExporter; import org.gephi.io.exporter.spi.FileExporterBuilder; import org.gephi.io.exporter.spi.GraphFileExporterBuilder; import org.gephi.io.exporter.spi.VectorFileExporterBuilder; import org.gephi.project.api.ProjectController; import org.gephi.project.api.Workspace; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; /** * * @author Mathieu Bastian */ @ServiceProvider(service = ExportController.class) public class ExportControllerImpl implements ExportController { private final FileExporterBuilder[] fileExporterBuilders; private final ExporterUI[] uis; public ExportControllerImpl() { Lookup.getDefault().lookupAll(GraphFileExporterBuilder.class); Lookup.getDefault().lookupAll(VectorFileExporterBuilder.class); fileExporterBuilders = Lookup.getDefault().lookupAll(FileExporterBuilder.class).toArray(new FileExporterBuilder[0]); uis = Lookup.getDefault().lookupAll(ExporterUI.class).toArray(new ExporterUI[0]); } public void exportFile(File file) throws IOException { Exporter fileExporter = getFileExporter(file); if (fileExporter == null) { throw new RuntimeException(NbBundle.getMessage(ExportControllerImpl.class, "ExportControllerImpl.error.nomatchingexporter")); } exportFile(file, fileExporter); } public void exportFile(File file, Workspace workspace) throws IOException { Exporter fileExporter = getFileExporter(file); if (fileExporter == null) { throw new RuntimeException(NbBundle.getMessage(ExportControllerImpl.class, "ExportControllerImpl.error.nomatchingexporter")); } fileExporter.setWorkspace(workspace); exportFile(file, fileExporter); } public void exportFile(File file, Exporter fileExporter) throws IOException { if (fileExporter.getWorkspace() == null) { ProjectController projectController = Lookup.getDefault().lookup(ProjectController.class); Workspace workspace = projectController.getCurrentWorkspace(); fileExporter.setWorkspace(workspace); } if (fileExporter instanceof ByteExporter) { OutputStream stream = new BufferedOutputStream(new FileOutputStream(file)); ((ByteExporter) fileExporter).setOutputStream(stream); try { fileExporter.execute(); } catch (Exception ex) { try { stream.flush(); stream.close(); } catch (IOException exe) { } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } throw new RuntimeException(ex); } try { stream.flush(); stream.close(); } catch (IOException ex) { } } else if (fileExporter instanceof CharacterExporter) { Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); ((CharacterExporter) fileExporter).setWriter(writer); try { fileExporter.execute(); } catch (Exception ex) { try { writer.flush(); writer.close(); } catch (IOException exe) { } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } throw new RuntimeException(ex); } try { writer.flush(); writer.close(); } catch (IOException ex) { } } } public void exportStream(OutputStream stream, ByteExporter byteExporter) { if (byteExporter.getWorkspace() == null) { ProjectController projectController = Lookup.getDefault().lookup(ProjectController.class); Workspace workspace = projectController.getCurrentWorkspace(); byteExporter.setWorkspace(workspace); } byteExporter.setOutputStream(stream); try { byteExporter.execute(); } catch (Exception ex) { try { stream.flush(); stream.close(); } catch (IOException exe) { } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } throw new RuntimeException(ex); } try { stream.flush(); stream.close(); } catch (IOException ex) { } } public void exportWriter(Writer writer, CharacterExporter characterExporter) { if (characterExporter.getWorkspace() == null) { ProjectController projectController = Lookup.getDefault().lookup(ProjectController.class); Workspace workspace = projectController.getCurrentWorkspace(); characterExporter.setWorkspace(workspace); } characterExporter.setWriter(writer); try { characterExporter.execute(); } catch (Exception ex) { try { writer.flush(); writer.close(); } catch (IOException exe) { } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } throw new RuntimeException(ex); } try { writer.flush(); writer.close(); } catch (IOException ex) { } } public Exporter getFileExporter(File file) { for (FileExporterBuilder im : fileExporterBuilders) { for (FileType ft : im.getFileTypes()) { for (String ex : ft.getExtensions()) { if (hasExt(file, ex)) { return im.buildExporter(); } } } } return null; } public Exporter getExporter(String exporterName) { for (FileExporterBuilder im : fileExporterBuilders) { if (im.getName().equalsIgnoreCase(exporterName)) { return im.buildExporter(); } } for (FileExporterBuilder im : fileExporterBuilders) { for (FileType ft : im.getFileTypes()) { for (String ex : ft.getExtensions()) { if (ex.equalsIgnoreCase(exporterName)) { return im.buildExporter(); } } } } return null; } public ExporterUI getUI(Exporter exporter) { for (ExporterUI ui : uis) { if (ui.isUIForExporter(exporter)) { return ui; } } return null; } private boolean hasExt(File file, String ext) { if (ext == null || ext.isEmpty()) { return false; } /** period at first position is not considered as extension-separator */ if ((file.getName().length() - ext.length()) <= 1) { return false; } boolean ret = file.getName().endsWith(ext); if (!ret) { return false; } return true; } }