package org.korsakow.ide; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.xpath.XPathExpressionException; import org.dsrg.service.IdTableUniqueIdFactory; import org.dsrg.soenea.domain.MapperException; import org.dsrg.soenea.environment.CreationException; import org.dsrg.soenea.environment.KeyNotFoundException; import org.dsrg.soenea.service.ConnectionFactory; import org.dsrg.soenea.service.UniqueIdFactory; import org.dsrg.soenea.service.threadLocal.DbRegistry; import org.dsrg.soenea.uow.MapperFactory; import org.dsrg.soenea.uow.UoW; import org.korsakow.domain.Event; import org.korsakow.domain.Image; import org.korsakow.domain.Interface; import org.korsakow.domain.Pattern; import org.korsakow.domain.Predicate; import org.korsakow.domain.Project; import org.korsakow.domain.Rule; import org.korsakow.domain.RuntimeDomainException; import org.korsakow.domain.Settings; import org.korsakow.domain.Snu; import org.korsakow.domain.Sound; import org.korsakow.domain.Text; import org.korsakow.domain.Trigger; import org.korsakow.domain.Video; import org.korsakow.domain.Widget; import org.korsakow.domain.mapper.output.EventOutputMapper; import org.korsakow.domain.mapper.output.ImageOutputMapper; import org.korsakow.domain.mapper.output.InterfaceOutputMapper; import org.korsakow.domain.mapper.output.PatternOutputMapper; import org.korsakow.domain.mapper.output.PredicateOutputMapper; import org.korsakow.domain.mapper.output.ProjectOutputMapper; import org.korsakow.domain.mapper.output.RuleOutputMapper; import org.korsakow.domain.mapper.output.SettingsOutputMapper; import org.korsakow.domain.mapper.output.SnuOutputMapper; import org.korsakow.domain.mapper.output.SoundOutputMapper; import org.korsakow.domain.mapper.output.TextOutputMapper; import org.korsakow.domain.mapper.output.TriggerOutputMapper; import org.korsakow.domain.mapper.output.VideoOutputMapper; import org.korsakow.domain.mapper.output.WidgetOutputMapper; import org.korsakow.ide.util.DomUtil; import org.korsakow.ide.util.ResourceManager; import org.korsakow.ide.util.Util; import org.korsakow.services.tdg.ImageTDG; import org.korsakow.services.tdg.InterfaceTDG; import org.korsakow.services.tdg.PatternTDG; import org.korsakow.services.tdg.ProjectTDG; import org.korsakow.services.tdg.SettingsTDG; import org.korsakow.services.tdg.SnuTDG; import org.korsakow.services.tdg.SoundTDG; import org.korsakow.services.tdg.TextTDG; import org.korsakow.services.tdg.VideoTDG; import org.w3c.dom.Document; import org.xml.sax.SAXException; public class DataRegistry { public static class Factory extends ConnectionFactory { @Override public void defaultInitialization() throws SQLException { } @Override public Connection getConnection() throws SQLException { return DataRegistry.getConnection(); } } private static DomSessionConnection conn; private static DomSession dom; private static File file; private static IdTableUniqueIdFactory idFactory; private static ThreadLocal<DomHelper> localDomHelper = new ThreadLocal<DomHelper>(); private DataRegistry() { } /** * Advances the max id by the specified amount, effectively reserving that many ids in the range [return-value, return-value+delta) * By simply advancing and not setting, we avoid the possibility of race conditions. * @return the old max id, the base of the reserved id range */ public static synchronized long advanceMaxId(long delta) { return idFactory.advanceMaxId(delta); } public static synchronized Long getMaxId() { try { return UniqueIdFactory.getMaxId("", ""); } catch (SQLException e) { throw new RuntimeDomainException(e); } } public static synchronized void initialize(Document document, File file) throws SQLException, XPathExpressionException, KeyNotFoundException, CreationException, MapperException { try { DbRegistry.closeDbConnection(); } catch (NullPointerException e) { // implementation detail } UoW.newCurrent(); localDomHelper = new ThreadLocal<DomHelper>(); dom = new DomSession(document); conn = new DomSessionConnection(); DataRegistry.file = file; initTDG(); initUoW(); UniqueIdFactory.setFactory(idFactory = new IdTableUniqueIdFactory("id", "id")); UoW.getCurrent().commit(); } public static synchronized File getFile() { return file; } public static synchronized void setFile(File file) { DataRegistry.file = file; } public static synchronized void flush() throws IOException, TransformerException { DomUtil.writeDomXML(getDocument(), getFile()); } // public static synchronized DomSession getDomSession() // { // return dom; // } public static synchronized Document getHeadDocument() { return dom.getHeadDocument(); } public static synchronized Document getDocument() { return dom.getDocument(); } public static synchronized void setDocument(Document document) { dom.setDocument(document); } public static synchronized DomSession getDomSession() { return dom; } public static synchronized long getHeadVersion() { return dom.getHeadVersion(); } public static synchronized void commit() { dom.commit(); } public static synchronized void rollback() { dom.rollbackToHead(); } public static synchronized void safeRollback() { if (!dom.tryRollbackToHead()) throw new IllegalArgumentException(); } public static synchronized DomHelper getHelper() { Document document = dom.getDocument(); DomHelper helper = localDomHelper.get(); // helper's document is out of date if it is not the same one we get from DomSession if (helper == null || helper.getDocument() != document) { helper = new DomHelper(document); localDomHelper.set(helper); } return helper; } public static synchronized Connection getConnection() { return conn; } /** * This is out of place in this class.? * @return * @throws SAXException * @throws ParserConfigurationException * @throws IOException */ public static synchronized Document createDefaultDocument() throws ParserConfigurationException, SAXException, IOException { Document document = DomUtil.parseXML(ResourceManager.getResourceStream("defaultdocument.xml")); document.getDocumentElement().setAttribute("versionMajor", Build.getVersion()); document.getDocumentElement().setAttribute("versionMinor", ""+Build.getRelease()); return document; } public static synchronized Document createDefaultEmptyDocument() throws ParserConfigurationException, SAXException, IOException { Document document = DomUtil.createDocument(); document.appendChild(document.createElement("korsakow")); document.getDocumentElement().setAttribute("versionMajor", Build.getVersion()); document.getDocumentElement().setAttribute("versionMinor", ""+Build.getRelease()); return document; } public static synchronized String debugDump() { try { return DomUtil.toXMLString(getDocument()); } catch (Exception e) { return Util.getStackTraceString(e); } } public static synchronized String debugDumpHead() { try { return DomUtil.toXMLString(dom.getHeadDocument()); } catch (Exception e) { return Util.getStackTraceString(e); } } public static synchronized void initUoW() { MapperFactory myDomain2MapperMapper = new MapperFactory(); myDomain2MapperMapper.addMapping(Widget.class, WidgetOutputMapper.class); myDomain2MapperMapper.addMapping(Interface.class, InterfaceOutputMapper.class); myDomain2MapperMapper.addMapping(Video.class, VideoOutputMapper.class); myDomain2MapperMapper.addMapping(Sound.class, SoundOutputMapper.class); myDomain2MapperMapper.addMapping(Image.class, ImageOutputMapper.class); myDomain2MapperMapper.addMapping(Snu.class, SnuOutputMapper.class); myDomain2MapperMapper.addMapping(Project.class, ProjectOutputMapper.class); myDomain2MapperMapper.addMapping(Rule.class, RuleOutputMapper.class); myDomain2MapperMapper.addMapping(Predicate.class, PredicateOutputMapper.class); myDomain2MapperMapper.addMapping(Trigger.class, TriggerOutputMapper.class); myDomain2MapperMapper.addMapping(Event.class, EventOutputMapper.class); myDomain2MapperMapper.addMapping(Pattern.class, PatternOutputMapper.class); myDomain2MapperMapper.addMapping(Text.class, TextOutputMapper.class); myDomain2MapperMapper.addMapping(Settings.class, SettingsOutputMapper.class); UoW.initMapperFactory(myDomain2MapperMapper); UoW.newCurrent(); } public static synchronized void initTDG() throws XPathExpressionException { DbRegistry.setConFactory(new DataRegistry.Factory()); InterfaceTDG.createInterfaceTable(); VideoTDG.createVideoTable(); SoundTDG.createSoundTable(); ImageTDG.createImageTable(); SnuTDG.createSnuTable(); ProjectTDG.createProjectTable(); PatternTDG.createPatternTable(); TextTDG.createTextTable(); SettingsTDG.createSettingsTable(); } }