From 0d82e7808541ed486f6027a28038d44d2d93711a Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Thu, 20 Apr 2017 10:40:09 +0300 Subject: [PATCH] Some fileimport enhancements - Add support for Excel import Removed e.printStackTrace() method calls refs #7154 Change-Id: Ic70c24330683b3477b928daf966fd44fa30ac363 --- .../scl/Dropins/Core.scl | 8 + .../fileimport/FileImportService.java | 145 ++++++++++++------ .../fileimport/FileReferenceFileImport.java | 5 + .../fileimport/IGenericFileImport.java | 4 + .../fileimport/LibraryFolderFileImport.java | 5 + .../SimanticsResourceFileImport.java | 3 +- .../META-INF/MANIFEST.MF | 4 +- .../fileimport/ExcelFileImport.java | 9 +- .../spreadsheet/graph/ExcelImport.java | 25 ++- 9 files changed, 151 insertions(+), 57 deletions(-) diff --git a/bundles/org.simantics.fileimport/scl/Dropins/Core.scl b/bundles/org.simantics.fileimport/scl/Dropins/Core.scl index 878326ba1..b795abbcc 100644 --- a/bundles/org.simantics.fileimport/scl/Dropins/Core.scl +++ b/bundles/org.simantics.fileimport/scl/Dropins/Core.scl @@ -1,3 +1,4 @@ +import "Simantics/DB" import "MMap" as MMap importJava "org.simantics.fileimport.scl.DropinsSCL" where @@ -10,6 +11,13 @@ importJava "org.simantics.fileimport.scl.DropinsSCL" where importJava "org.simantics.fileimport.FileImportService" where performFileImport :: String -> String -> String + importGenericFileWithExtension :: String -> String -> String + importGenericFileWithExtensionAndParent :: Resource -> String -> String -> Resource + +importGenericFileToResource :: String -> String -> Resource +importGenericFileToResource path extension = do + resourceId = importGenericFileWithExtension path extension + syncRead (\_ -> resourceFromId (read resourceId :: Long)) getUploadedDropinFiles :: () -> [Long] getUploadedDropinFiles dummy = do diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileImportService.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileImportService.java index ddb9dabae..15612d5fb 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileImportService.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileImportService.java @@ -13,13 +13,15 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Properties; +import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Collectors; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.simantics.databoard.util.Base64; +import org.simantics.db.Resource; import org.simantics.fileimport.dropins.FileImportDropins; -import org.simantics.utils.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -108,9 +110,8 @@ public class FileImportService { return null; } String result = "Import failed"; - Optional serviceOp = findServiceForFileExtension(file); - if (serviceOp.isPresent()) { - IGenericFileImport service = serviceOp.get(); + IGenericFileImport service = findServiceForFileExtension(file); + if (service != null) { try { Optional resource = service.perform(file); saveResourceForPath(file, resource); @@ -138,22 +139,25 @@ public class FileImportService { * @param callback Optional callback to catch Throwables thrown during the deletion process */ public static void removeResourceForFile(Path file, Optional> callback) { - Optional serviceOp = findServiceForFileExtension(file); - serviceOp.ifPresent(service -> { - try { - Optional resource = getResourceForPath(file); - if (!resource.isPresent()) - return; - service.remove(resource.get()); - removeResourceForPath(file); - } catch (Throwable t) { - if (callback.isPresent()) { - callback.get().accept(t); - } else { - t.printStackTrace(); - } + try { + Optional resource = getResourceForPath(file); + if (!resource.isPresent()) + return; + IGenericFileImport service = findServiceForFileExtension(file); + if (service == null) { + LOGGER.warn("Could not find service for importing file " + file); + if (callback.isPresent()) + callback.get().accept(new Exception("Could not find IGenericFileImport service for file " + file)); } - }); + service.remove(resource.get()); + removeResourceForPath(file); + } catch (Throwable t) { + if (callback.isPresent()) { + callback.get().accept(t); + } else { + LOGGER.error("Could not remove resource for file " + file.toAbsolutePath(), t); + } + } } public static void removeFileForResource(long id, Optional> callback) { @@ -161,33 +165,37 @@ public class FileImportService { try { fileOp = findPathForId(id); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error("Could not remove file for resource id " + id, e); return; } if (!fileOp.isPresent()) return; Path file = fileOp.get(); - Optional serviceOp = findServiceForFileExtension(file); - serviceOp.ifPresent(service -> { + + try { + Optional resource = getResourceForPath(file); + if (!resource.isPresent()) + return; + IGenericFileImport service = findServiceForFileExtension(file); + if (service == null) { + LOGGER.warn("Could not find service for importing file " + file); + if (callback.isPresent()) + callback.get().accept(new Exception("Could not find IGenericFileImport service for file " + file)); + } + service.remove(resource.get()); + removeResourceForPath(file); try { - Optional resource = getResourceForPath(file); - if (!resource.isPresent()) - return; - service.remove(resource.get()); - removeResourceForPath(file); - try { - Files.delete(file); - } catch (IOException e) { - Files.delete(file); - } - } catch (Throwable t) { - if (callback.isPresent()) { - callback.get().accept(t); - } else { - t.printStackTrace(); - } + Files.delete(file); + } catch (IOException e) { + Files.delete(file); } - }); + } catch (Throwable t) { + if (callback.isPresent()) { + callback.get().accept(t); + } else { + LOGGER.error("Could not remove file for resource " + id, t); + } + } } private static Optional findPathForId(long id) throws IOException { @@ -214,9 +222,9 @@ public class FileImportService { * Method for finding a File Import service for the given file based on the file extension * * @param file Path file for which the import service is looked for - * @return Optiona IGenerigFileImport service which is able to handle the import of this type of file + * @return Optional IGenerigFileImport service which is able to handle the import of this type of file */ - public static Optional findServiceForFileExtension(Path file) { + public static IGenericFileImport findServiceForFileExtension(Path file) { String extension = ""; int i = file.getFileName().toString().lastIndexOf('.'); @@ -228,7 +236,30 @@ public class FileImportService { extension = FOLDER; } } + return findServiceForExtension(extension); + } + + public static List filterSupportedExtensions(String filter) { + return getFileImportServices().stream().filter(s -> s.allowedExtensionsWithFilters().keySet().contains(filter)).map(s -> s.allowedExtensionsWithFilters().keySet()).flatMap(Set::stream).collect(Collectors.toList()); + } + public static IGenericFileImport findServiceForExtension(String extension) { + List services = findServicesForExtension(extension); + IGenericFileImport service = null; + if (services.size() == 1) { + service = services.get(0); + } else { + for (IGenericFileImport servicee : services) { + service = servicee; + if (isPerfectMatch(servicee.allowedExtensionsWithFilters().keySet(), extension)) + break; + } + } + return service; + } + + public static List findServicesForExtension(String extension) { + List result = new ArrayList<>(); List services = getFileImportServices(); for (IGenericFileImport service : services) { for (Map.Entry entry : service.allowedExtensionsWithFilters().entrySet()) { @@ -237,14 +268,14 @@ public class FileImportService { possibleExtensions = possibleExtensions.substring(1); if (possibleExtensions.equals(extension) || possibleExtensions.isEmpty()) { if (extension.equals(FOLDER) && possibleExtensions.equals(FOLDER)) { - return Optional.of(service); + result.add(service); } else if (!extension.isEmpty() && !extension.equals(FOLDER)){ - return Optional.of(service); + result.add(service); } } } } - return Optional.empty(); + return result; } /** @@ -269,7 +300,7 @@ public class FileImportService { } return map; } catch (IOException e) { - e.printStackTrace(); + LOGGER.error("Could not get current paths and resources!", e); return Collections.emptyMap(); } } @@ -289,7 +320,7 @@ public class FileImportService { props.store(stream, null); } } catch (IOException e) { - e.printStackTrace(); + LOGGER.error("Could not save resource for path " + file.toAbsolutePath() + " and resource " + resource.get(), e); } }); } @@ -321,4 +352,26 @@ public class FileImportService { return Optional.empty(); return Optional.of(value); } + + public static String importGenericFileWithExtension(String path, String extension) throws Exception { + IGenericFileImport service = findServiceForExtension(extension); + Optional result = service.perform(Paths.get(path)); + return result.get(); + } + + public static Resource importGenericFileWithExtensionAndParent(Resource parent, String path, String extension) throws Exception { + IGenericFileImport service = findServiceForExtension(extension); + Optional result = service.perform(parent, Paths.get(path)); + return result.get(); + } + + private static boolean isPerfectMatch(Set candidates, String extension) { + for (String ext : candidates) { + if (ext.startsWith(".")) + ext = ext.substring(1); + if (ext.equals(extension)) + return true; + } + return false; + } } diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileReferenceFileImport.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileReferenceFileImport.java index aa3671781..492eb3bc4 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileReferenceFileImport.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/FileReferenceFileImport.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.Map; import java.util.Optional; +import org.simantics.Simantics; import org.simantics.db.Resource; import org.simantics.graphfile.util.GraphFileUtil; @@ -22,4 +23,8 @@ public class FileReferenceFileImport extends SimanticsResourceFileImport { return ALLOWED_EXTENSIONS; } + @Override + public Resource defaultParentResource() { + return Simantics.getProjectResource(); + } } diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/IGenericFileImport.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/IGenericFileImport.java index cba016f42..a8bb132c9 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/IGenericFileImport.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/IGenericFileImport.java @@ -4,6 +4,8 @@ import java.nio.file.Path; import java.util.Map; import java.util.Optional; +import org.simantics.db.Resource; + /** * Base interface for performing file imports. * @@ -24,6 +26,8 @@ public interface IGenericFileImport { */ Optional perform(Path file) throws Exception; + Optional perform(Resource parent, Path file) throws Exception; + /** * Remove the entity * diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/LibraryFolderFileImport.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/LibraryFolderFileImport.java index 012c757c2..b453e07d6 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/LibraryFolderFileImport.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/LibraryFolderFileImport.java @@ -32,4 +32,9 @@ public class LibraryFolderFileImport extends SimanticsResourceFileImport { } })); } + + @Override + public Resource defaultParentResource() { + return Simantics.getProjectResource(); + } } diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java index fed7b292f..4d2bcbe69 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/SimanticsResourceFileImport.java @@ -59,7 +59,6 @@ public abstract class SimanticsResourceFileImport implements IGenericFileImport * @return Optional Resource of the imported entity in Simantics database * @throws Exception */ - public abstract Optional perform(Resource parent, Path file) throws Exception; @Override public void remove(String resourceId) throws Exception { @@ -129,5 +128,7 @@ public abstract class SimanticsResourceFileImport implements IGenericFileImport return null; } } + + public abstract Resource defaultParentResource(); } diff --git a/bundles/org.simantics.spreadsheet.fileimport/META-INF/MANIFEST.MF b/bundles/org.simantics.spreadsheet.fileimport/META-INF/MANIFEST.MF index 2c2e5c144..1e92738ee 100644 --- a/bundles/org.simantics.spreadsheet.fileimport/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.spreadsheet.fileimport/META-INF/MANIFEST.MF @@ -6,7 +6,9 @@ Bundle-Version: 1.0.0.qualifier Bundle-Activator: org.simantics.spreadsheet.fileimport.Activator Require-Bundle: org.eclipse.core.runtime, org.simantics.fileimport, - org.simantics.db + org.simantics.db, + org.simantics.spreadsheet.graph, + org.simantics Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Service-Component: OSGI-INF/component.xml diff --git a/bundles/org.simantics.spreadsheet.fileimport/src/org/simantics/spreadsheet/fileimport/ExcelFileImport.java b/bundles/org.simantics.spreadsheet.fileimport/src/org/simantics/spreadsheet/fileimport/ExcelFileImport.java index 6719f5913..c3a84f7a4 100644 --- a/bundles/org.simantics.spreadsheet.fileimport/src/org/simantics/spreadsheet/fileimport/ExcelFileImport.java +++ b/bundles/org.simantics.spreadsheet.fileimport/src/org/simantics/spreadsheet/fileimport/ExcelFileImport.java @@ -5,8 +5,10 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.simantics.Simantics; import org.simantics.db.Resource; import org.simantics.fileimport.SimanticsResourceFileImport; +import org.simantics.spreadsheet.graph.ExcelImport; public class ExcelFileImport extends SimanticsResourceFileImport { @@ -19,7 +21,7 @@ public class ExcelFileImport extends SimanticsResourceFileImport { @Override public Optional perform(Resource parent, Path file) throws Exception { - throw new UnsupportedOperationException("Excel import is not yet supported"); + return Optional.ofNullable(ExcelImport.importBookR(parent, file.toFile())); } @Override @@ -27,4 +29,9 @@ public class ExcelFileImport extends SimanticsResourceFileImport { return ALLOWED_EXTENSIONS; } + @Override + public Resource defaultParentResource() { + return Simantics.getSession().getRootLibrary(); + } + } diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/ExcelImport.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/ExcelImport.java index 246f38edf..81fd2cfd4 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/ExcelImport.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/ExcelImport.java @@ -28,7 +28,7 @@ import org.simantics.datatypes.utils.BTree; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.DelayedWriteRequest; -import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.request.WriteResultRequest; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.BindingException; import org.simantics.db.exception.DatabaseException; @@ -46,12 +46,20 @@ import org.simantics.spreadsheet.graph.parser.ast.AstValue; import org.simantics.spreadsheet.resource.SpreadsheetResource; import org.simantics.spreadsheet.util.SpreadsheetUtils; import org.simantics.utils.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ExcelImport { - + + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelImport.class); + private static final double POINT_TO_PIXEL_RATIO = 1.33; - public static void importBook(Resource container, File file) { + public static void importBook(Resource container, File file) { + importBook(container, file); + } + + public static Resource importBookR(Resource container, File file) { try { @@ -254,7 +262,7 @@ public class ExcelImport { btreeContainer.set(result); bookContainer.set(book); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("Could not import book " + file.getAbsolutePath(), e); btreeContainer.add(Collections.emptyList()); } } @@ -269,20 +277,21 @@ public class ExcelImport { } }); - Simantics.getSession().sync(new WriteRequest() { + return Simantics.getSession().sync(new WriteResultRequest() { @Override - public void perform(WriteGraph graph) throws DatabaseException { + public Resource perform(WriteGraph graph) throws DatabaseException { Resource delayedBook = bookContainer.get(); XSupport support = graph.getService(XSupport.class); Resource book = support.convertDelayedResourceToResource(delayedBook); SpreadsheetGraphUtils.constructAndInitializeRunVariable(graph, book); + return book; } }); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("Could not import book " + file.getAbsolutePath(), e); + return null; } - } private static Resource assignStyles(WriteGraph graph, SpreadsheetResource SR, Cell cell, Resource book, Map existingStyles, Map existingStyles2, String styleName) throws DatabaseException { -- 2.43.2