sascha@982: package de.intevation.flys.artifacts.datacage; sascha@982: sascha@984: import java.sql.SQLException; sascha@984: sascha@982: import de.intevation.artifacts.GlobalContext; sascha@982: sascha@983: import de.intevation.artifactdatabase.db.SQL; sascha@983: import de.intevation.artifactdatabase.db.SQLExecutor; sascha@983: sascha@982: import de.intevation.artifactdatabase.LifetimeListener; sascha@982: sascha@984: import de.intevation.artifacts.Artifact; sascha@984: import de.intevation.artifacts.ArtifactDatabase; sascha@984: import de.intevation.artifacts.ArtifactDatabaseException; sascha@984: sascha@984: import de.intevation.flys.artifacts.FLYSArtifact; sascha@984: sascha@984: import de.intevation.artifacts.common.utils.LRUCache; sascha@984: sascha@982: import org.apache.log4j.Logger; sascha@982: sascha@982: import org.w3c.dom.Document; sascha@982: sascha@982: public class Datacage sascha@982: implements LifetimeListener sascha@982: { sascha@982: private static Logger log = Logger.getLogger(Datacage.class); sascha@982: sascha@984: public static final String ARTEFACT_DATABASE_KEY = sascha@984: "global.artifact.database"; sascha@984: sascha@987: private String SQL_DELETE_ALL_USERS = "delete.all.users"; sascha@987: private String SQL_USER_ID_NEXTVAL = "user.id.nextval"; sascha@987: private String SQL_USER_BY_GID = "user.by.gid"; sascha@987: private String SQL_INSERT_USER = "insert.user"; sascha@987: private String SQL_COLLECTION_BY_GID = "collection.by.gid"; sascha@987: private String SQL_COLLECTION_ID_NEXTVAL = "collection.id.nextval"; sascha@987: private String SQL_INSERT_COLLECTION = "insert.collection"; sascha@988: private String SQL_ARTIFACT_BY_GID = "artifact.by.gid"; sascha@988: private String SQL_COLLECTION_ITEM_ID_NEXTVAL = sascha@988: "collection.item.id.nextval"; sascha@988: private String SQL_INSERT_COLLECTION_ITEM = "insert.collection.item"; sascha@989: private String SQL_ARTIFACT_ID_NEXTVAL = "artifact.id.nextval"; sascha@989: private String SQL_INSERT_ARTIFACT = "insert.artifact"; sascha@988: sascha@984: sascha@983: protected SQLExecutor sqlExecutor; sascha@983: sascha@984: public class InitialScan sascha@984: implements ArtifactDatabase.ArtifactLoadedCallback sascha@984: { sascha@984: protected LRUCache users; sascha@986: protected LRUCache collections; sascha@988: protected LRUCache artifacts; sascha@984: sascha@984: public InitialScan() { sascha@986: users = new LRUCache(); sascha@986: collections = new LRUCache(); sascha@988: artifacts = new LRUCache(); sascha@984: } sascha@984: sascha@984: @Override sascha@984: public void artifactLoaded( sascha@984: String userId, sascha@984: String collectionId, sascha@984: String artifactId, sascha@984: Artifact artifact sascha@984: ) { sascha@984: if (!(artifact instanceof FLYSArtifact)) { sascha@984: log.warn("ignoring none FLYS artifacts"); sascha@984: return; sascha@984: } sascha@984: sascha@984: FLYSArtifact flysArtifact = (FLYSArtifact)artifact; sascha@986: sascha@986: Integer uId = getUserId(userId); sascha@987: // TODO: We need the name of the collection sascha@987: Integer cId = getCollectionId(collectionId, uId, "XXX"); sascha@987: sascha@988: storeArtifact(artifactId, cId, flysArtifact); sascha@984: } sascha@984: sascha@987: protected Integer getId( sascha@987: LRUCache cache, sascha@987: final String idString, sascha@987: final String selectById sascha@987: ) { sascha@987: Integer id = cache.get(idString); sascha@987: if (id != null) { sascha@987: return id; sascha@986: } sascha@986: sascha@986: final Integer [] res = new Integer[1]; sascha@986: sascha@986: SQLExecutor.Instance exec = sqlExecutor.new Instance() { sascha@986: @Override sascha@986: public boolean doIt() throws SQLException { sascha@987: prepareStatement(selectById); sascha@987: stmnt.setString(1, idString); sascha@986: result = stmnt.executeQuery(); sascha@986: if (!result.next()) { sascha@986: return false; sascha@986: } sascha@986: res[0] = result.getInt(1); sascha@986: return true; sascha@986: } sascha@986: }; sascha@986: sascha@986: if (exec.runRead()) { sascha@987: cache.put(idString, res[0]); sascha@986: return res[0]; sascha@986: } sascha@986: sascha@987: return null; sascha@987: } sascha@987: sascha@988: protected void storeArtifact( sascha@989: final String artifactId, sascha@989: Integer collectionId, sascha@989: final FLYSArtifact artifact sascha@988: ) { sascha@988: Integer aId = getId(artifacts, artifactId, SQL_ARTIFACT_BY_GID); sascha@988: sascha@988: if (aId != null) { sascha@988: // We've already stored it. Just create the collection item. sascha@988: storeCollectionItem(collectionId, aId); sascha@988: return; sascha@988: } sascha@988: // We need to write it to database sascha@989: sascha@989: final Integer [] res = new Integer[1]; sascha@989: sascha@989: SQLExecutor.Instance exec = sqlExecutor.new Instance() { sascha@989: @Override sascha@989: public boolean doIt() throws SQLException { sascha@989: prepareStatement(SQL_ARTIFACT_ID_NEXTVAL); sascha@989: result = stmnt.executeQuery(); sascha@989: if (!result.next()) { sascha@989: return false; sascha@989: } sascha@989: res[0] = result.getInt(1); sascha@989: reset(); sascha@989: prepareStatement(SQL_INSERT_ARTIFACT); sascha@989: stmnt.setInt (1, res[0]); sascha@989: stmnt.setString(2, artifactId); sascha@989: stmnt.setString(3, artifact.getCurrentStateId()); sascha@989: stmnt.execute(); sascha@989: return true; sascha@989: } sascha@989: }; sascha@989: sascha@989: if (!exec.runWrite()) { sascha@989: log.error("storing of artifact failed."); sascha@989: return; sascha@989: } sascha@989: sascha@989: artifacts.put(artifactId, aId = res[0]); sascha@989: sascha@989: storeCollectionItem(collectionId, aId); sascha@989: sascha@989: // store data, outs and facets sascha@988: // TODO: Implement me! sascha@988: } sascha@988: sascha@988: protected void storeCollectionItem( sascha@988: final Integer collectionId, sascha@988: final Integer artifactId sascha@988: ) { sascha@988: SQLExecutor.Instance exec = sqlExecutor.new Instance() { sascha@988: @Override sascha@988: public boolean doIt() throws SQLException { sascha@988: prepareStatement(SQL_COLLECTION_ITEM_ID_NEXTVAL); sascha@988: result = stmnt.executeQuery(); sascha@988: if (!result.next()) { sascha@988: return false; sascha@988: } sascha@988: int ciId = result.getInt(1); sascha@988: reset(); sascha@988: prepareStatement(SQL_INSERT_COLLECTION_ITEM); sascha@988: stmnt.setInt(1, ciId); sascha@988: stmnt.setInt(2, collectionId); sascha@988: stmnt.setInt(3, artifactId); sascha@988: stmnt.execute(); sascha@988: return true; sascha@988: } sascha@988: }; sascha@988: sascha@988: if (!exec.runWrite()) { sascha@988: log.error("storing of collection item failed."); sascha@988: } sascha@988: } sascha@987: sascha@987: protected Integer getCollectionId( sascha@987: final String collectionId, sascha@987: final Integer ownerId, sascha@987: final String collectionName sascha@987: ) { sascha@987: Integer c = getId(collections, collectionId, SQL_COLLECTION_BY_GID); sascha@987: sascha@987: if (c != null) { sascha@987: return c; sascha@987: } sascha@987: sascha@987: final Integer [] res = new Integer[1]; sascha@987: sascha@987: SQLExecutor.Instance exec = sqlExecutor.new Instance() { sascha@987: @Override sascha@987: public boolean doIt() throws SQLException { sascha@987: prepareStatement(SQL_COLLECTION_ID_NEXTVAL); sascha@987: result = stmnt.executeQuery(); sascha@987: if (!result.next()) { sascha@987: return false; sascha@987: } sascha@987: res[0] = result.getInt(1); sascha@987: reset(); sascha@987: prepareStatement(SQL_INSERT_COLLECTION); sascha@987: stmnt.setInt (1, res[0]); sascha@987: stmnt.setString(2, collectionId); sascha@987: stmnt.setInt (3, ownerId); sascha@987: stmnt.setString(4, collectionName); sascha@987: stmnt.execute(); sascha@987: return true; sascha@987: } sascha@987: }; sascha@987: sascha@987: if (exec.runWrite()) { sascha@987: collections.put(collectionId, res[0]); sascha@987: return res[0]; sascha@987: } sascha@987: sascha@987: return null; sascha@987: } sascha@987: sascha@987: protected Integer getUserId(final String userId) { sascha@987: sascha@987: Integer u = getId(users, userId, SQL_USER_BY_GID); sascha@987: sascha@987: if (u != null) { sascha@987: return u; sascha@987: } sascha@987: sascha@987: final Integer [] res = new Integer[1]; sascha@987: sascha@987: SQLExecutor.Instance exec = sqlExecutor.new Instance() { sascha@986: @Override sascha@986: public boolean doIt() throws SQLException { sascha@986: prepareStatement(SQL_USER_ID_NEXTVAL); sascha@986: result = stmnt.executeQuery(); sascha@986: if (!result.next()) { sascha@986: return false; sascha@986: } sascha@986: res[0] = result.getInt(1); sascha@986: reset(); sascha@986: prepareStatement(SQL_INSERT_USER); sascha@986: stmnt.setInt (1, res[0]); sascha@986: stmnt.setString(2, userId); sascha@986: stmnt.execute(); sascha@986: return true; sascha@986: } sascha@986: }; sascha@986: sascha@986: if (exec.runWrite()) { sascha@986: users.put(userId, res[0]); sascha@986: return res[0]; sascha@986: } sascha@986: sascha@986: return null; sascha@986: } sascha@986: sascha@984: public boolean scan(ArtifactDatabase adb) { sascha@984: try { sascha@984: adb.loadAllArtifacts(this); sascha@984: } sascha@984: catch (ArtifactDatabaseException ade) { sascha@984: log.error(ade); sascha@984: return false; sascha@984: } sascha@984: return true; sascha@984: } sascha@984: } // class InitialScan sascha@984: sascha@984: sascha@982: public Datacage() { sascha@982: } sascha@982: sascha@982: @Override sascha@982: public void setup(Document document) { sascha@982: log.debug("setup"); sascha@983: DBConfig config = DBConfig.getInstance(); sascha@983: setupSQL(config.getSQL()); sascha@983: sqlExecutor = new SQLExecutor(config.getDBConnection()); sascha@983: } sascha@983: sascha@983: protected void setupSQL(SQL sql) { sascha@987: SQL_DELETE_ALL_USERS = sql.get(SQL_DELETE_ALL_USERS); sascha@987: SQL_USER_ID_NEXTVAL = sql.get(SQL_USER_ID_NEXTVAL); sascha@987: SQL_USER_BY_GID = sql.get(SQL_USER_BY_GID); sascha@987: SQL_INSERT_USER = sql.get(SQL_INSERT_USER); sascha@987: SQL_COLLECTION_BY_GID = sql.get(SQL_COLLECTION_BY_GID); sascha@987: SQL_COLLECTION_ID_NEXTVAL = sql.get(SQL_COLLECTION_ID_NEXTVAL); sascha@987: SQL_INSERT_COLLECTION = sql.get(SQL_INSERT_COLLECTION); sascha@988: SQL_ARTIFACT_BY_GID = sql.get(SQL_ARTIFACT_BY_GID); sascha@988: SQL_COLLECTION_ITEM_ID_NEXTVAL = sascha@988: sql.get(SQL_COLLECTION_ITEM_ID_NEXTVAL); sascha@988: SQL_INSERT_COLLECTION_ITEM = sascha@988: sql.get(SQL_INSERT_COLLECTION_ITEM); sascha@989: SQL_ARTIFACT_ID_NEXTVAL = sql.get(SQL_ARTIFACT_ID_NEXTVAL); sascha@989: SQL_INSERT_ARTIFACT = sql.get(SQL_INSERT_ARTIFACT); sascha@982: } sascha@982: sascha@982: @Override sascha@982: public void systemUp(GlobalContext context) { sascha@982: log.debug("systemUp"); sascha@984: initialScan(context); sascha@982: } sascha@982: sascha@984: protected void initialScan(GlobalContext context) { sascha@984: log.debug("initialScan"); sascha@984: sascha@984: Object adbObject = context.get(ARTEFACT_DATABASE_KEY); sascha@984: sascha@984: if (!(adbObject instanceof ArtifactDatabase)) { sascha@984: log.error("missing artefact database. Cannot scan"); sascha@984: return; sascha@984: } sascha@984: sascha@984: ArtifactDatabase adb = (ArtifactDatabase)adbObject; sascha@984: sascha@984: if (!cleanDatabase()) { sascha@984: log.error("cleaning database failed"); sascha@984: return; sascha@984: } sascha@984: sascha@984: InitialScan is = new InitialScan(); sascha@984: sascha@984: if (!is.scan(adb)) { sascha@984: log.error("initial scan failed"); sascha@984: return; sascha@984: } sascha@984: sascha@984: } sascha@984: sascha@984: protected boolean cleanDatabase() { sascha@984: sascha@984: return sqlExecutor.new Instance() { sascha@984: @Override sascha@984: public boolean doIt() throws SQLException { sascha@984: prepareStatement(SQL_DELETE_ALL_USERS); sascha@984: stmnt.execute(); sascha@984: return true; sascha@984: } sascha@984: }.runWrite(); sascha@984: } sascha@984: sascha@984: sascha@982: @Override sascha@982: public void systemDown(GlobalContext context) { sascha@982: log.debug("systemDown"); sascha@982: } sascha@982: } sascha@982: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :