package org.simantics.xml.sax.base; import java.io.File; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.DelayedWriteRequest; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.service.XSupport; import org.simantics.message.ILogger; import org.simantics.message.MessageService; public abstract class AbstractImporter { private Session session; private File file; private ILogger logger; private XMLParser parser; private static final boolean USE_DELAYED = true; public AbstractImporter(Session session, File file) { this.session = session; this.file = file; } public AbstractImporter(Session session, File file, XMLParser parser) { this.session = session; this.file = file; this.parser = parser; } public Resource doImport() throws DatabaseException { return doImport(MessageService.getDefault()); } public Resource doImport(ILogger logger) throws DatabaseException { this.logger = logger; if (USE_DELAYED) { ImportDelayedRequest req = new ImportDelayedRequest(); session.syncRequest(req); Resource dr = req.getResult(); XSupport xs = session.getService(XSupport.class); Resource result = xs.convertDelayedResourceToResource(dr); return result; } else { ImportRequest req = new ImportRequest(); session.syncRequest(req); return req.getResult(); } } public File getFile() { return file; } public void configure(XMLParser parser){}; private class ImportRequest extends WriteRequest { private Resource result; public ImportRequest() { super(); } @Override public void perform(WriteGraph graph) throws DatabaseException { Layer0Utils.addCommentMetadata(graph, "Import file " + file.getName()); graph.markUndoPoint(); result = doImport(graph); } public Resource getResult() { return result; } } private class ImportDelayedRequest extends DelayedWriteRequest { private Resource result; public ImportDelayedRequest() { super(); } @Override public void perform(WriteGraph graph) throws DatabaseException { result = doImport(graph); } public Resource getResult() { return result; } } private Resource doImport(WriteGraph graph) throws DatabaseException { Layer0Utils.setDependenciesIndexingDisabled(graph, true); try { if (parser == null) { parser = new XMLParser(); parser.setGraph(graph); configure(parser); } else { parser.setGraph(graph); } parser.parse(file, logger); System.out.println(file.getAbsolutePath() + " imported"); Resource root = parser.getRoot(); if (root == null) { throw new DatabaseException(file.getAbsolutePath() + " import failed. File is corrupted, or is not given type"); } return root; } catch (DatabaseException e) { throw e; } catch (Exception e) { throw new DatabaseException(e); } } }