Example usage for org.springframework.jdbc.core ConnectionCallback ConnectionCallback

List of usage examples for org.springframework.jdbc.core ConnectionCallback ConnectionCallback

Introduction

In this page you can find the example usage for org.springframework.jdbc.core ConnectionCallback ConnectionCallback.

Prototype

ConnectionCallback

Source Link

Usage

From source file:org.apereo.portal.RDBMUserIdentityStore.java

protected boolean userHasSavedLayout(final int userId) throws Exception {
    return jdbcOperations.execute(new ConnectionCallback<Boolean>() {
        @Override/*from w  w w  . j av  a2  s . c o m*/
        public Boolean doInConnection(Connection con) throws SQLException, DataAccessException {

            boolean userHasSavedLayout = false;
            PreparedStatement pstmt = null;
            try {
                String query = "SELECT * FROM UP_USER_PROFILE WHERE USER_ID=? AND LAYOUT_ID IS NOT NULL AND LAYOUT_ID!=0";

                pstmt = con.prepareStatement(query);
                pstmt.setInt(1, userId);

                ResultSet rs = null;
                try {
                    if (log.isDebugEnabled())
                        log.debug("RDBMUserIdentityStore::getTemplateUser(userId=" + userId + "): " + query);
                    rs = pstmt.executeQuery();
                    if (rs.next()) {
                        userHasSavedLayout = true;
                    }
                } finally {
                    try {
                        rs.close();
                    } catch (Exception e) {
                    }
                }
            } finally {
                try {
                    pstmt.close();
                } catch (Exception e) {
                }
            }
            return userHasSavedLayout;

        }
    });
}

From source file:org.apereo.portal.RDBMUserIdentityStore.java

protected void updateUser(final int userId, final IPerson person, final TemplateUser templateUser)
        throws Exception {
    // Remove my existing group memberships
    IGroupMember me = GroupService.getGroupMember(person.getEntityIdentifier());
    for (IEntityGroup eg : me.getParentGroups()) {
        ILockableEntityGroup leg = getSafeLockableGroup(eg, me);
        if (leg != null) {
            removePersonFromGroup(person, me, leg);
        }//from   w ww.ja  v  a2s  . co  m
    }

    // Copy template user's groups memberships
    IGroupMember template = GroupService.getEntity(templateUser.getUserName(), IPerson.class);
    for (IEntityGroup eg : template.getParentGroups()) {
        ILockableEntityGroup leg = getSafeLockableGroup(eg, me);
        if (leg != null) {
            addPersonToGroup(person, me, leg);
        }
    }

    this.transactionOperations.execute(new TransactionCallback<Object>() {
        @Override
        public Object doInTransaction(TransactionStatus status) {
            return jdbcOperations.execute(new ConnectionCallback<Object>() {
                @Override
                public Object doInConnection(Connection con) throws SQLException, DataAccessException {

                    PreparedStatement deleteStmt = null;
                    PreparedStatement queryStmt = null;
                    PreparedStatement insertStmt = null;
                    try {
                        // Update UP_USER
                        String update = "UPDATE UP_USER " + "SET USER_DFLT_USR_ID=?, " + "USER_DFLT_LAY_ID=?, "
                                + "NEXT_STRUCT_ID=null " + "WHERE USER_ID=?";

                        insertStmt = con.prepareStatement(update);
                        insertStmt.setInt(1, templateUser.getUserId());
                        insertStmt.setInt(2, templateUser.getDefaultLayoutId());
                        insertStmt.setInt(3, userId);

                        if (log.isDebugEnabled())
                            log.debug("RDBMUserIdentityStore::addNewUser(): " + update);
                        insertStmt.executeUpdate();
                        insertStmt.close();

                        // Start copying...
                        ResultSet rs = null;
                        String delete = null;
                        String query = null;
                        String insert = null;
                        try {
                            // Update UP_USER_PROFILE
                            delete = "DELETE FROM UP_USER_PROFILE " + "WHERE USER_ID=?";
                            deleteStmt = con.prepareStatement(delete);
                            deleteStmt.setInt(1, userId);
                            if (log.isDebugEnabled())
                                log.debug(
                                        "RDBMUserIdentityStore::updateUser(USER_ID=" + userId + "): " + delete);
                            deleteStmt.executeUpdate();
                            deleteStmt.close();

                            query = "SELECT USER_ID, PROFILE_FNAME, PROFILE_NAME, DESCRIPTION, "
                                    + "STRUCTURE_SS_ID, THEME_SS_ID " + "FROM UP_USER_PROFILE "
                                    + "WHERE USER_ID=?";
                            queryStmt = con.prepareStatement(query);
                            queryStmt.setInt(1, templateUser.getUserId());
                            if (log.isDebugEnabled())
                                log.debug("RDBMUserIdentityStore::updateUser(USER_ID="
                                        + templateUser.getUserId() + "): " + query);
                            rs = queryStmt.executeQuery();

                            insert = "INSERT INTO UP_USER_PROFILE (USER_ID, PROFILE_ID, PROFILE_FNAME, PROFILE_NAME, DESCRIPTION, LAYOUT_ID, STRUCTURE_SS_ID, THEME_SS_ID) "
                                    + "VALUES(?, ?, ?, ?, ?, NULL, ?, ?)";
                            insertStmt = con.prepareStatement(insert);
                            while (rs.next()) {
                                int id = getNextKey();

                                String profileFname = rs.getString("PROFILE_FNAME");
                                String profileName = rs.getString("PROFILE_NAME");
                                String description = rs.getString("DESCRIPTION");
                                int structure = rs.getInt("STRUCTURE_SS_ID");
                                int theme = rs.getInt("THEME_SS_ID");

                                insertStmt.setInt(1, userId);
                                insertStmt.setInt(2, id);
                                insertStmt.setString(3, profileFname);
                                insertStmt.setString(4, profileName);
                                insertStmt.setString(5, description);
                                insertStmt.setInt(6, structure);
                                insertStmt.setInt(7, theme);

                                if (log.isDebugEnabled())
                                    log.debug("RDBMUserIdentityStore::updateUser(USER_ID=" + userId
                                            + ", PROFILE_FNAME=" + profileFname + ", PROFILE_NAME="
                                            + profileName + ", DESCRIPTION=" + description + "): " + insert);
                                insertStmt.executeUpdate();
                            }
                            rs.close();
                            queryStmt.close();
                            insertStmt.close();

                            // If we made it all the way though, commit the transaction
                            if (RDBMServices.getDbMetaData().supportsTransactions())
                                con.commit();

                        } finally {
                            try {
                                rs.close();
                            } catch (Exception e) {
                            }
                        }
                    } finally {
                        try {
                            deleteStmt.close();
                        } catch (Exception e) {
                        }
                        try {
                            queryStmt.close();
                        } catch (Exception e) {
                        }
                        try {
                            insertStmt.close();
                        } catch (Exception e) {
                        }
                    }

                    return null;
                }
            });
        }
    });
}

From source file:org.apereo.portal.RDBMUserIdentityStore.java

protected int addNewUser(final int newUID, final IPerson person, final TemplateUser templateUser)
        throws Exception {
    // Copy template user's groups memberships
    IGroupMember me = GroupService.getGroupMember(person.getEntityIdentifier());
    IGroupMember template = GroupService.getEntity(templateUser.getUserName(),
            Class.forName("org.apereo.portal.security.IPerson"));
    for (IEntityGroup eg : template.getParentGroups()) {
        ILockableEntityGroup leg = getSafeLockableGroup(eg, me);
        if (leg != null) {
            addPersonToGroup(person, me, leg);
        }/*from   www.j av  a2  s  .  c  o m*/
    }

    return this.transactionOperations.execute(new TransactionCallback<Integer>() {
        @Override
        public Integer doInTransaction(TransactionStatus status) {
            return jdbcOperations.execute(new ConnectionCallback<Integer>() {
                @Override
                public Integer doInConnection(Connection con) throws SQLException, DataAccessException {

                    int uPortalUID = -1;
                    PreparedStatement queryStmt = null;
                    PreparedStatement insertStmt = null;
                    try {
                        // Add to UP_USER
                        String insert = "INSERT INTO UP_USER (USER_ID, USER_NAME, USER_DFLT_USR_ID, USER_DFLT_LAY_ID, NEXT_STRUCT_ID, LST_CHAN_UPDT_DT)"
                                + "VALUES (?, ?, ?, ?, null, null)";

                        String userName = person.getUserName();

                        insertStmt = con.prepareStatement(insert);
                        insertStmt.setInt(1, newUID);
                        insertStmt.setString(2, userName);
                        insertStmt.setInt(3, templateUser.getUserId());
                        insertStmt.setInt(4, templateUser.getDefaultLayoutId());

                        if (log.isDebugEnabled())
                            log.debug("RDBMUserIdentityStore::addNewUser(USER_ID=" + newUID + ", USER_NAME="
                                    + userName + ", USER_DFLT_USR_ID=" + templateUser.getUserId()
                                    + ", USER_DFLT_LAY_ID=" + templateUser.getDefaultLayoutId() + "): "
                                    + insert);
                        insertStmt.executeUpdate();
                        insertStmt.close();
                        insertStmt = null;

                        // Start copying...
                        ResultSet rs = null;
                        String query = null;
                        try {
                            // Add to UP_USER_PROFILE
                            query = "SELECT USER_ID, PROFILE_FNAME, PROFILE_NAME, DESCRIPTION, "
                                    + "STRUCTURE_SS_ID, THEME_SS_ID " + "FROM UP_USER_PROFILE "
                                    + "WHERE USER_ID=?";
                            queryStmt = con.prepareStatement(query);
                            queryStmt.setInt(1, templateUser.getUserId());
                            if (log.isDebugEnabled())
                                log.debug("RDBMUserIdentityStore::addNewUser(USER_ID="
                                        + templateUser.getUserId() + "): " + query);
                            rs = queryStmt.executeQuery();

                            insert = "INSERT INTO UP_USER_PROFILE (USER_ID, PROFILE_ID, PROFILE_FNAME, PROFILE_NAME, DESCRIPTION, LAYOUT_ID, STRUCTURE_SS_ID, THEME_SS_ID) "
                                    + "VALUES(?, ?, ?, ?, ?, NULL, ?, ?)";
                            insertStmt = con.prepareStatement(insert);
                            while (rs.next()) {
                                int id = getNextKey();

                                String profileFname = rs.getString("PROFILE_FNAME");
                                String profileName = rs.getString("PROFILE_NAME");
                                String description = rs.getString("DESCRIPTION");
                                int structure = rs.getInt("STRUCTURE_SS_ID");
                                int theme = rs.getInt("THEME_SS_ID");

                                insertStmt.setInt(1, newUID);
                                insertStmt.setInt(2, id);
                                insertStmt.setString(3, profileFname);
                                insertStmt.setString(4, profileName);
                                insertStmt.setString(5, description);
                                insertStmt.setInt(6, structure);
                                insertStmt.setInt(7, theme);

                                if (log.isDebugEnabled())
                                    log.debug("RDBMUserIdentityStore::addNewUser(USER_ID=" + newUID
                                            + ", PROFILE_FNAME=" + profileFname + ", PROFILE_NAME="
                                            + profileName + ", DESCRIPTION=" + description + "): " + insert);
                                insertStmt.executeUpdate();
                            }
                            rs.close();
                            queryStmt.close();

                            if (insertStmt != null) {
                                insertStmt.close();
                                insertStmt = null;
                            }

                            // If we made it all the way though, commit the transaction
                            if (RDBMServices.getDbMetaData().supportsTransactions())
                                con.commit();

                            uPortalUID = newUID;

                        } finally {
                            try {
                                if (rs != null)
                                    rs.close();
                            } catch (Exception e) {
                            }
                        }
                    } finally {
                        try {
                            if (queryStmt != null)
                                queryStmt.close();
                        } catch (Exception e) {
                        }
                        try {
                            if (insertStmt != null)
                                insertStmt.close();
                        } catch (Exception e) {
                        }
                    }

                    return uPortalUID;

                }
            });
        }
    });
}

From source file:org.apereo.portal.tools.dbloader.DataSourceSchemaExport.java

@Override
public void update(boolean export, String outputFile, boolean append) {
    final String[] updateSQL = this.jdbcOperations.execute(new ConnectionCallback<String[]>() {
        @Override/*from ww  w . j a va2 s . c o  m*/
        public String[] doInConnection(Connection con) throws SQLException, DataAccessException {
            final FixedDatabaseMetadata databaseMetadata = new FixedDatabaseMetadata(con, dialect);
            return configuration.generateSchemaUpdateScript(dialect, databaseMetadata);
        }
    });

    perform(updateSQL, export, outputFile, append, true);
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

/**
 * Add a user profile//w  w  w .  j  av a2s.c  o m
 * @param person
 * @param profile
 * @return userProfile
 * @exception Exception
 */
public UserProfile addUserProfile(final IPerson person, final IUserProfile profile) {
    final int userId = person.getID();
    // generate an id for this profile

    return this.jdbcOperations.execute(new ConnectionCallback<UserProfile>() {
        @Override
        public UserProfile doInConnection(Connection con) throws SQLException, DataAccessException {
            String sQuery = null;
            PreparedStatement pstmt = con.prepareStatement("INSERT INTO UP_USER_PROFILE "
                    + "(USER_ID,PROFILE_ID,PROFILE_FNAME,PROFILE_NAME,STRUCTURE_SS_ID,THEME_SS_ID,"
                    + "DESCRIPTION, LAYOUT_ID) VALUES (?,?,?,?,?,?,?,?)");
            int profileId = getNextKey();
            pstmt.setInt(1, userId);
            pstmt.setInt(2, profileId);
            pstmt.setString(3, profile.getProfileFname());
            pstmt.setString(4, profile.getProfileName());
            pstmt.setInt(5, profile.getStructureStylesheetId());
            pstmt.setInt(6, profile.getThemeStylesheetId());
            pstmt.setString(7, profile.getProfileDescription());
            pstmt.setInt(8, profile.getLayoutId());
            sQuery = "INSERT INTO UP_USER_PROFILE (USER_ID,PROFILE_ID,PROFILE_FNAME,PROFILE_NAME,STRUCTURE_SS_ID,THEME_SS_ID,DESCRIPTION, LAYOUT_ID) VALUES ("
                    + userId + ",'" + profileId + ",'" + profile.getProfileFname() + "','"
                    + profile.getProfileName() + "'," + profile.getStructureStylesheetId() + ","
                    + profile.getThemeStylesheetId() + ",'" + profile.getProfileDescription() + "', "
                    + profile.getLayoutId() + ")";
            if (log.isDebugEnabled())
                log.debug("RDBMUserLayoutStore::addUserProfile(): " + sQuery);
            try {
                pstmt.executeUpdate();

                UserProfile newProfile = new UserProfile();
                newProfile.setProfileId(profileId);
                newProfile.setLayoutId(profile.getLayoutId());
                newProfile.setLocaleManager(profile.getLocaleManager());
                newProfile.setProfileDescription(profile.getProfileDescription());
                newProfile.setProfileFname(profile.getProfileFname());
                newProfile.setProfileName(profile.getProfileName());
                newProfile.setStructureStylesheetId(profile.getStructureStylesheetId());
                newProfile.setSystemProfile(false);
                newProfile.setThemeStylesheetId(profile.getThemeStylesheetId());

                return newProfile;

            } finally {
                pstmt.close();
            }
        }
    });
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

private void deleteUserProfile(final int userId, final int profileId) {
    this.jdbcOperations.execute(new ConnectionCallback<Object>() {
        @Override//from   w w w. j  a  va 2 s.co m
        public Object doInConnection(Connection con) throws SQLException, DataAccessException {
            Statement stmt = con.createStatement();
            try {
                String sQuery = "DELETE FROM UP_USER_PROFILE WHERE USER_ID=" + userId + " AND PROFILE_ID="
                        + Integer.toString(profileId);
                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::deleteUserProfile() : " + sQuery);
                stmt.executeUpdate(sQuery);

                // remove profile mappings
                sQuery = "DELETE FROM UP_USER_UA_MAP WHERE USER_ID=" + userId + " AND PROFILE_ID="
                        + Integer.toString(profileId);
                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::deleteUserProfile() : " + sQuery);
                stmt.executeUpdate(sQuery);

                // remove parameter information
                sQuery = "DELETE FROM UP_SS_USER_PARM WHERE USER_ID=" + userId + " AND PROFILE_ID="
                        + Integer.toString(profileId);
                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::deleteUserProfile() : " + sQuery);
                stmt.executeUpdate(sQuery);

                sQuery = "DELETE FROM UP_SS_USER_ATTS WHERE USER_ID=" + userId + " AND PROFILE_ID="
                        + Integer.toString(profileId);
                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::deleteUserProfile() : " + sQuery);
                stmt.executeUpdate(sQuery);

            } finally {
                stmt.close();
            }

            return null;
        }
    });
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

/**
 * Return the next available structure id for a user
 * @param person/*from w  w  w.  jav  a 2 s . c  om*/
 * @param prefix
 * @return next free structure ID
 * @exception Exception
 */
protected String getNextStructId(final IPerson person, final String prefix) {
    final int userId = person.getID();
    return this.nextStructTransactionOperations.execute(new TransactionCallback<String>() {
        @Override
        public String doInTransaction(TransactionStatus status) {
            return jdbcOperations.execute(new ConnectionCallback<String>() {
                @Override
                public String doInConnection(Connection con) throws SQLException, DataAccessException {

                    Statement stmt = con.createStatement();
                    try {
                        String sQuery = "SELECT NEXT_STRUCT_ID FROM UP_USER WHERE USER_ID=" + userId;
                        if (log.isDebugEnabled())
                            log.debug("RDBMUserLayoutStore::getNextStructId(): " + sQuery);
                        ResultSet rs = stmt.executeQuery(sQuery);
                        int currentStructId;
                        try {
                            if (rs.next()) {
                                currentStructId = rs.getInt(1);
                            } else {
                                throw new SQLException("no rows returned for query [" + sQuery + "]");
                            }
                        } finally {
                            rs.close();
                        }
                        int nextStructId = currentStructId + 1;
                        String sUpdate = "UPDATE UP_USER SET NEXT_STRUCT_ID=" + nextStructId + " WHERE USER_ID="
                                + userId + " AND NEXT_STRUCT_ID=" + currentStructId;
                        if (log.isDebugEnabled())
                            log.debug("RDBMUserLayoutStore::getNextStructId(): " + sUpdate);
                        stmt.executeUpdate(sUpdate);
                        return prefix + nextStructId;
                    } finally {
                        stmt.close();
                    }
                }
            });
        }
    });
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

/**
 *   UserPreferences/*from   ww  w . j ava2 s .  c  om*/
 */
private String getUserBrowserMapping(final IPerson person, final String userAgentArg) {
    final int userId = person.getID();
    return jdbcOperations.execute(new ConnectionCallback<String>() {
        @Override
        public String doInConnection(Connection con) throws SQLException, DataAccessException {
            final String userAgent;
            if (userAgentArg.length() > 255) {
                userAgent = userAgentArg.substring(0, 254);
                log.debug("userAgent trimmed to 255 characters. userAgent: " + userAgentArg);
            } else {
                userAgent = userAgentArg;
            }

            String sQuery = "SELECT PROFILE_FNAME " + "FROM UP_USER_UA_MAP LEFT JOIN UP_USER_PROFILE ON "
                    + "UP_USER_UA_MAP.PROFILE_ID=UP_USER_PROFILE.PROFILE_ID WHERE UP_USER_UA_MAP.USER_ID=? AND USER_AGENT=?";
            PreparedStatement pstmt = con.prepareStatement(sQuery);

            try {
                pstmt.setInt(1, userId);
                pstmt.setString(2, userAgent);

                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::getUserBrowserMapping(): '" + sQuery + "' userId: " + userId
                            + " userAgent: " + userAgent);
                ResultSet rs = pstmt.executeQuery();
                try {
                    if (rs.next()) {
                        return rs.getString("PROFILE_FNAME");
                    }
                } finally {
                    rs.close();
                }
            } finally {
                pstmt.close();
            }

            return null;
        }
    });
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

protected Document getPersonalUserLayout(final IPerson person, final IUserProfile profile) {
    final LocaleManager localeManager = profile.getLocaleManager();

    return jdbcOperations.execute(new ConnectionCallback<Document>() {
        @Override// w  w  w . j  av  a  2 s.  co  m
        public Document doInConnection(Connection con) throws SQLException, DataAccessException {

            ResultSet rs;
            int userId = person.getID();
            final int realUserId = userId;
            Document doc = DocumentFactory.getThreadDocument();
            Element root = doc.createElement("layout");
            final Statement stmt = con.createStatement();
            // A separate statement is needed so as not to interfere with ResultSet
            // of statements used for queries
            Statement insertStmt = con.createStatement();
            try {
                long startTime = System.currentTimeMillis();
                // eventually, we need to fix template layout implementations so you can just do this:
                //        int layoutId=profile.getLayoutId();
                // but for now:
                int layoutId = getLayoutID(userId, profile.getProfileId());

                if (layoutId == 0) { // First time, grab the default layout for this user
                    final Tuple<Integer, Integer> userLayoutIds = transactionOperations
                            .execute(new TransactionCallback<Tuple<Integer, Integer>>() {
                                @Override
                                public Tuple<Integer, Integer> doInTransaction(TransactionStatus status) {
                                    return jdbcOperations
                                            .execute(new ConnectionCallback<Tuple<Integer, Integer>>() {
                                                @Override
                                                public Tuple<Integer, Integer> doInConnection(Connection con)
                                                        throws SQLException, DataAccessException {

                                                    int newLayoutId;
                                                    int newUserId;

                                                    String sQuery = "SELECT USER_DFLT_USR_ID, USER_DFLT_LAY_ID FROM UP_USER WHERE USER_ID="
                                                            + realUserId;
                                                    if (log.isDebugEnabled())
                                                        log.debug("RDBMUserLayoutStore::getUserLayout(): "
                                                                + sQuery);
                                                    ResultSet rs = stmt.executeQuery(sQuery);
                                                    try {
                                                        boolean hasRow = rs.next();
                                                        newUserId = rs.getInt(1);
                                                        newLayoutId = rs.getInt(2);
                                                    } finally {
                                                        rs.close();
                                                    }

                                                    // Make sure the next struct id is set in case the user adds a channel
                                                    sQuery = "SELECT NEXT_STRUCT_ID FROM UP_USER WHERE USER_ID="
                                                            + newUserId;
                                                    if (log.isDebugEnabled())
                                                        log.debug("RDBMUserLayoutStore::getUserLayout(): "
                                                                + sQuery);
                                                    int nextStructId;
                                                    rs = stmt.executeQuery(sQuery);
                                                    try {
                                                        boolean hasRow = rs.next();
                                                        nextStructId = rs.getInt(1);
                                                    } finally {
                                                        rs.close();
                                                    }

                                                    int realNextStructId = 0;

                                                    if (realUserId != newUserId) {
                                                        // But never make the existing value SMALLER, change it only to make it LARGER
                                                        // (so, get existing value)
                                                        sQuery = "SELECT NEXT_STRUCT_ID FROM UP_USER WHERE USER_ID="
                                                                + realUserId;
                                                        if (log.isDebugEnabled())
                                                            log.debug("RDBMUserLayoutStore::getUserLayout(): "
                                                                    + sQuery);
                                                        rs = stmt.executeQuery(sQuery);
                                                        try {
                                                            boolean hasRow = rs.next();
                                                            realNextStructId = rs.getInt(1);
                                                        } finally {
                                                            rs.close();
                                                        }
                                                    }

                                                    if (nextStructId > realNextStructId) {
                                                        sQuery = "UPDATE UP_USER SET NEXT_STRUCT_ID="
                                                                + nextStructId + " WHERE USER_ID=" + realUserId;
                                                        if (log.isDebugEnabled())
                                                            log.debug("RDBMUserLayoutStore::getUserLayout(): "
                                                                    + sQuery);
                                                        stmt.executeUpdate(sQuery);
                                                    }

                                                    return new Tuple<Integer, Integer>(newUserId, newLayoutId);

                                                }
                                            });
                                }
                            });

                    userId = userLayoutIds.first;
                    layoutId = userLayoutIds.second;
                }

                int firstStructId = -1;

                //Flags to enable a default layout lookup if it's needed
                boolean foundLayout = false;
                boolean triedDefault = false;

                //This loop is used to ensure a layout is found for a user. It tries
                //looking up the layout for the current userID. If one isn't found
                //the userID is replaced with the template user ID for this user and
                //the layout is searched for again. This loop should only ever loop once.
                do {
                    String sQuery = "SELECT INIT_STRUCT_ID FROM UP_USER_LAYOUT WHERE USER_ID=" + userId
                            + " AND LAYOUT_ID = " + layoutId;
                    if (log.isDebugEnabled())
                        log.debug("RDBMUserLayoutStore::getUserLayout(): " + sQuery);
                    rs = stmt.executeQuery(sQuery);
                    try {
                        if (rs.next()) {
                            firstStructId = rs.getInt(1);
                        } else {
                            throw new RuntimeException(
                                    "RDBMUserLayoutStore::getUserLayout(): No INIT_STRUCT_ID in UP_USER_LAYOUT for USER_ID: "
                                            + userId + " and LAYOUT_ID: " + layoutId);
                        }
                    } finally {
                        rs.close();
                    }

                    String sql;
                    if (localeAware) {
                        // This needs to be changed to get the localized strings
                        sql = "SELECT ULS.STRUCT_ID,ULS.NEXT_STRUCT_ID,ULS.CHLD_STRUCT_ID,ULS.CHAN_ID,ULS.NAME,ULS.TYPE,ULS.HIDDEN,"
                                + "ULS.UNREMOVABLE,ULS.IMMUTABLE";
                    } else {
                        sql = "SELECT ULS.STRUCT_ID,ULS.NEXT_STRUCT_ID,ULS.CHLD_STRUCT_ID,ULS.CHAN_ID,ULS.NAME,ULS.TYPE,ULS.HIDDEN,"
                                + "ULS.UNREMOVABLE,ULS.IMMUTABLE";
                    }
                    if (databaseMetadata.supportsOuterJoins()) {
                        sql += ",USP.STRUCT_PARM_NM,USP.STRUCT_PARM_VAL FROM "
                                + databaseMetadata.getJoinQuery().getQuery("layout");
                    } else {
                        sql += " FROM UP_LAYOUT_STRUCT ULS WHERE ";
                    }
                    sql += " ULS.USER_ID=" + userId + " AND ULS.LAYOUT_ID=" + layoutId
                            + " ORDER BY ULS.STRUCT_ID";
                    if (log.isDebugEnabled())
                        log.debug("RDBMUserLayoutStore::getUserLayout(): " + sql);
                    rs = stmt.executeQuery(sql);

                    //check for rows in the result set
                    foundLayout = rs.next();

                    if (!foundLayout && !triedDefault && userId == realUserId) {
                        //If we didn't find any rows and we haven't tried the default user yet
                        triedDefault = true;
                        rs.close();

                        //Get the default user ID and layout ID
                        sQuery = "SELECT USER_DFLT_USR_ID, USER_DFLT_LAY_ID FROM UP_USER WHERE USER_ID="
                                + userId;
                        if (log.isDebugEnabled())
                            log.debug("RDBMUserLayoutStore::getUserLayout(): " + sQuery);
                        rs = stmt.executeQuery(sQuery);
                        try {
                            rs.next();
                            userId = rs.getInt(1);
                            layoutId = rs.getInt(2);
                        } finally {
                            rs.close();
                        }
                    } else {
                        //We tried the default or actually found a layout
                        break;
                    }
                } while (!foundLayout);

                HashMap layoutStructure = new HashMap();
                StringBuffer structChanIds = new StringBuffer();

                try {
                    int lastStructId = 0;
                    LayoutStructure ls = null;
                    String sepChar = "";
                    if (foundLayout) {
                        int structId = rs.getInt(1);
                        // Result Set returns 0 by default if structId was null
                        // Except if you are using poolman 2.0.4 in which case you get -1 back
                        if (rs.wasNull()) {
                            structId = 0;
                        }
                        readLayout: while (true) {

                            int nextId = rs.getInt(2);
                            if (rs.wasNull()) {
                                nextId = 0;
                            }
                            int childId = rs.getInt(3);
                            if (rs.wasNull()) {
                                childId = 0;
                            }
                            int chanId = rs.getInt(4);
                            if (rs.wasNull()) {
                                chanId = 0;
                            }
                            String temp5 = rs.getString(5); // Some JDBC drivers require columns accessed in order
                            String temp6 = rs.getString(6); // Access 5 and 6 now, save till needed.

                            // uPortal i18n
                            int name_index, value_index;
                            if (localeAware) {
                                Locale[] locales = localeManager.getLocales();
                                String locale = locales[0].toString();
                                ls = new LayoutStructure(structId, nextId, childId, chanId, rs.getString(7),
                                        rs.getString(8), rs.getString(9), locale);
                                name_index = 10;
                                value_index = 11;
                            } else {
                                ls = new LayoutStructure(structId, nextId, childId, chanId, rs.getString(7),
                                        rs.getString(8), rs.getString(9));
                                name_index = 10;
                                value_index = 11;
                            }
                            layoutStructure.put(new Integer(structId), ls);
                            lastStructId = structId;
                            if (!ls.isChannel()) {
                                ls.addFolderData(temp5, temp6); // Plug in saved column values
                            }
                            if (databaseMetadata.supportsOuterJoins()) {
                                do {
                                    String name = rs.getString(name_index);
                                    String value = rs.getString(value_index); // Oracle JDBC requires us to do this for longs
                                    if (name != null) { // may not be there because of the join
                                        ls.addParameter(name, value);
                                    }
                                    if (!rs.next()) {
                                        break readLayout;
                                    }
                                    structId = rs.getInt(1);
                                    if (rs.wasNull()) {
                                        structId = 0;
                                    }
                                } while (structId == lastStructId);
                            } else { // Do second SELECT later on for structure parameters
                                if (ls.isChannel()) {
                                    structChanIds.append(sepChar + ls.getChanId());
                                    sepChar = ",";
                                }
                                if (rs.next()) {
                                    structId = rs.getInt(1);
                                    if (rs.wasNull()) {
                                        structId = 0;
                                    }
                                } else {
                                    break readLayout;
                                }
                            }
                        } // while
                    }
                } finally {
                    rs.close();
                }

                if (!databaseMetadata.supportsOuterJoins() && structChanIds.length() > 0) { // Pick up structure parameters
                    // first, get the struct ids for the channels
                    String sql = "SELECT STRUCT_ID FROM UP_LAYOUT_STRUCT WHERE USER_ID=" + userId
                            + " AND LAYOUT_ID=" + layoutId + " AND CHAN_ID IN (" + structChanIds.toString()
                            + ") ORDER BY STRUCT_ID";

                    if (log.isDebugEnabled())
                        log.debug("RDBMUserLayoutStore::getUserLayout(): " + sql);
                    StringBuffer structIdsSB = new StringBuffer("");
                    String sep = "";
                    rs = stmt.executeQuery(sql);
                    try {
                        // use the results to build a correct list of struct ids to look for
                        while (rs.next()) {
                            structIdsSB.append(sep + rs.getString(1));
                            sep = ",";
                        } // while
                    } finally {
                        rs.close();
                    } // be a good doobie

                    sql = "SELECT STRUCT_ID, STRUCT_PARM_NM,STRUCT_PARM_VAL FROM UP_LAYOUT_PARAM WHERE USER_ID="
                            + userId + " AND LAYOUT_ID=" + layoutId + " AND STRUCT_ID IN ("
                            + structIdsSB.toString() + ") ORDER BY STRUCT_ID";
                    if (log.isDebugEnabled())
                        log.debug("RDBMUserLayoutStore::getUserLayout(): " + sql);
                    rs = stmt.executeQuery(sql);
                    try {
                        if (rs.next()) {
                            int structId = rs.getInt(1);
                            readParm: while (true) {
                                LayoutStructure ls = (LayoutStructure) layoutStructure
                                        .get(new Integer(structId));
                                int lastStructId = structId;
                                do {
                                    ls.addParameter(rs.getString(2), rs.getString(3));
                                    if (!rs.next()) {
                                        break readParm;
                                    }
                                } while ((structId = rs.getInt(1)) == lastStructId);
                            }
                        }
                    } finally {
                        rs.close();
                    }
                }

                if (layoutStructure.size() > 0) { // We have a layout to work with
                    createLayout(layoutStructure, doc, root, firstStructId);
                    layoutStructure.clear();

                    if (log.isDebugEnabled()) {
                        long stopTime = System.currentTimeMillis();
                        log.debug("RDBMUserLayoutStore::getUserLayout(): Layout document for user " + userId
                                + " took " + (stopTime - startTime) + " milliseconds to create");
                    }

                    doc.appendChild(root);
                }
            } finally {
                stmt.close();
                insertStmt.close();
            }
            return doc;
        }
    });
}

From source file:org.jasig.portal.layout.simple.RDBMUserLayoutStore.java

public IUserProfile getUserProfileById(final IPerson person, final int profileId) {
    final int userId = person.getID();
    return jdbcOperations.execute(new ConnectionCallback<IUserProfile>() {
        @Override//from  w w  w .  jav a  2  s .  c o  m
        public IUserProfile doInConnection(Connection con) throws SQLException, DataAccessException {

            Statement stmt = con.createStatement();
            try {
                String sQuery = "SELECT USER_ID, PROFILE_ID, PROFILE_FNAME, PROFILE_NAME, DESCRIPTION, LAYOUT_ID, STRUCTURE_SS_ID, THEME_SS_ID FROM UP_USER_PROFILE WHERE USER_ID="
                        + userId + " AND PROFILE_ID=" + profileId;
                if (log.isDebugEnabled())
                    log.debug("RDBMUserLayoutStore::getUserProfileById(): " + sQuery);
                ResultSet rs = stmt.executeQuery(sQuery);
                try {
                    if (rs.next()) {
                        String temp2 = rs.getString(3);
                        String temp3 = rs.getString(4);
                        String temp4 = rs.getString(5);
                        int layoutId = rs.getInt(6);
                        if (rs.wasNull()) {
                            layoutId = 0;
                        }
                        int structSsId = rs.getInt(7);
                        if (rs.wasNull()) {
                            // This is probably a data issue and probably an export operation;  defer to the system user...
                            if (!person.equals(getSystemUser())) {
                                structSsId = getSystemProfileByFname(temp2).getStructureStylesheetId();
                            } else {
                                String msg = "The system user profile has no structure stylesheet Id.";
                                throw new IllegalStateException(msg);
                            }
                        }
                        int themeSsId = rs.getInt(8);
                        if (rs.wasNull()) {
                            // This is probably a data issue and probably an export operation;  defer to the system user...
                            if (!person.equals(getSystemUser())) {
                                themeSsId = getSystemProfileByFname(temp2).getThemeStylesheetId();
                            } else {
                                String msg = "The system user profile has no theme stylesheet Id.";
                                throw new IllegalStateException(msg);
                            }
                        }
                        IUserProfile userProfile = new UserProfile(profileId, temp2, temp3, temp4, layoutId,
                                structSsId, themeSsId);
                        final Locale[] userLocales = localeStore.getUserLocales(person);
                        userProfile.setLocaleManager(new LocaleManager(person, userLocales));
                        return userProfile;
                    } else {
                        throw new RuntimeException(
                                "Unable to find User Profile for user " + userId + " and profile " + profileId);
                    }
                } finally {
                    rs.close();
                }
            } finally {
                stmt.close();
            }

        }
    });
}