Search in sources :

Example 1 with LayoutStructure

use of org.apereo.portal.layout.LayoutStructure in project uPortal by Jasig.

the class RDBMUserLayoutStore method getPersonalUserLayout.

protected Document getPersonalUserLayout(final IPerson person, final IUserProfile profile) {
    final LocaleManager localeManager = profile.getLocaleManager();
    return jdbcOperations.execute(new ConnectionCallback<Document>() {

        @Override
        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;
                                    logger.debug("getUserLayout(): {}", sQuery);
                                    ResultSet rs = stmt.executeQuery(sQuery);
                                    try {
                                        if (rs.next()) {
                                            newUserId = rs.getInt(1);
                                            newLayoutId = rs.getInt(2);
                                        } else {
                                            final String msg = "Unable to find default user for USER_ID=" + realUserId;
                                            throw new SQLException(msg);
                                        }
                                    } 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;
                                    logger.debug("getUserLayout(): {}", sQuery);
                                    int nextStructId;
                                    rs = stmt.executeQuery(sQuery);
                                    try {
                                        if (rs.next()) {
                                            nextStructId = rs.getInt(1);
                                        } else {
                                            final String msg = "Unable to find NEXT_STRUCT_ID for USER_ID=" + realUserId;
                                            throw new SQLException(msg);
                                        }
                                    } 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;
                                        logger.debug("getUserLayout(): {}", sQuery);
                                        rs = stmt.executeQuery(sQuery);
                                        try {
                                            if (rs.next()) {
                                                realNextStructId = rs.getInt(1);
                                            } else {
                                                final String msg = "Unable to find NEXT_STRUCT_ID for USER_ID=" + realUserId;
                                                throw new SQLException(msg);
                                            }
                                        } finally {
                                            rs.close();
                                        }
                                    }
                                    if (nextStructId > realNextStructId) {
                                        sQuery = "UPDATE UP_USER SET NEXT_STRUCT_ID=" + nextStructId + " WHERE USER_ID=" + realUserId;
                                        logger.debug("getUserLayout(): {}", sQuery);
                                        stmt.executeUpdate(sQuery);
                                    }
                                    return new Tuple<>(newUserId, newLayoutId);
                                }
                            });
                        }
                    });
                    userId = userLayoutIds.first;
                    layoutId = userLayoutIds.second;
                }
                int firstStructId;
                // Flags to enable a default layout lookup if it's needed
                boolean foundLayout;
                boolean triedDefault = false;
                // once.
                do {
                    String sQuery = "SELECT INIT_STRUCT_ID FROM UP_USER_LAYOUT WHERE USER_ID=" + userId + " AND LAYOUT_ID = " + layoutId;
                    logger.debug("getUserLayout(): {}", sQuery);
                    rs = stmt.executeQuery(sQuery);
                    try {
                        if (rs.next()) {
                            firstStructId = rs.getInt(1);
                        } else {
                            throw new RuntimeException("getUserLayout(): No INIT_STRUCT_ID in UP_USER_LAYOUT for USER_ID: " + userId + " and LAYOUT_ID: " + layoutId);
                        }
                    } finally {
                        rs.close();
                    }
                    String sql;
                    if (localeManagerFactory.isLocaleAware()) {
                        // 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";
                    logger.debug("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;
                        logger.debug("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);
                        // -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(// Some JDBC drivers require columns
                            5);
                            // accessed in order
                            String temp6 = rs.getString(// Access 5 and 6 now, save till needed.
                            6);
                            // uPortal i18n
                            int name_index, value_index;
                            if (localeManagerFactory.isLocaleAware()) {
                                List<Locale> locales = localeManager.getLocales();
                                String locale = locales.get(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, // Plug in saved column values
                                temp6);
                            }
                            if (databaseMetadata.supportsOuterJoins()) {
                                do {
                                    String name = rs.getString(name_index);
                                    String value = // Oracle JDBC
                                    rs.getString(value_index);
                                    // 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 {
                                // 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";
                    logger.debug("getUserLayout(): {}", sql);
                    StringBuffer structIdsSB = new StringBuffer("");
                    String sep = "";
                    rs = stmt.executeQuery(sql);
                    try {
                        // 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";
                    logger.debug("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 (logger.isDebugEnabled()) {
                        long stopTime = System.currentTimeMillis();
                        long timeTook = stopTime - startTime;
                        logger.debug("getUserLayout(): Layout document for user {} took {} milliseconds to create", userId, timeTook);
                    }
                    doc.appendChild(root);
                }
            } finally {
                stmt.close();
                insertStmt.close();
            }
            return doc;
        }
    });
}
Also used : Locale(java.util.Locale) SQLException(java.sql.SQLException) HashMap(java.util.HashMap) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Element(org.w3c.dom.Element) Connection(java.sql.Connection) TransactionStatus(org.springframework.transaction.TransactionStatus) IJoinQueryString(org.apereo.portal.jdbc.IJoinQueryString) Document(org.w3c.dom.Document) TransactionCallback(org.springframework.transaction.support.TransactionCallback) LayoutStructure(org.apereo.portal.layout.LayoutStructure) ResultSet(java.sql.ResultSet) LocaleManager(org.apereo.portal.i18n.LocaleManager) DataAccessException(org.springframework.dao.DataAccessException) Tuple(org.apereo.portal.utils.Tuple)

Example 2 with LayoutStructure

use of org.apereo.portal.layout.LayoutStructure in project uPortal by Jasig.

the class RDBMUserLayoutStore method createLayout.

/**
 * Create a layout
 *
 * @param layoutStructure
 * @param doc
 * @param root
 * @param structId
 * @exception java.sql.SQLException
 */
protected final void createLayout(HashMap layoutStructure, Document doc, Element root, int structId) throws java.sql.SQLException {
    while (structId != 0) {
        LayoutStructure ls = (LayoutStructure) layoutStructure.get(new Integer(structId));
        // replaced with call to method in containing class to allow overriding
        // by subclasses of RDBMUserLayoutStore.
        // Element structure = ls.getStructureDocument(doc);
        Element structure = getStructure(doc, ls);
        root.appendChild(structure);
        String id = structure.getAttribute("ID");
        if (id != null && !id.equals("")) {
            structure.setIdAttribute("ID", true);
        }
        createLayout(layoutStructure, doc, structure, ls.getChildId());
        structId = ls.getNextId();
    }
}
Also used : LayoutStructure(org.apereo.portal.layout.LayoutStructure) Element(org.w3c.dom.Element) IJoinQueryString(org.apereo.portal.jdbc.IJoinQueryString)

Aggregations

IJoinQueryString (org.apereo.portal.jdbc.IJoinQueryString)2 LayoutStructure (org.apereo.portal.layout.LayoutStructure)2 Element (org.w3c.dom.Element)2 Connection (java.sql.Connection)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 SQLException (java.sql.SQLException)1 Statement (java.sql.Statement)1 HashMap (java.util.HashMap)1 Locale (java.util.Locale)1 LocaleManager (org.apereo.portal.i18n.LocaleManager)1 Tuple (org.apereo.portal.utils.Tuple)1 DataAccessException (org.springframework.dao.DataAccessException)1 TransactionStatus (org.springframework.transaction.TransactionStatus)1 TransactionCallback (org.springframework.transaction.support.TransactionCallback)1 Document (org.w3c.dom.Document)1