Search in sources :

Example 1 with LocaleManager

use of org.apereo.portal.i18n.LocaleManager in project uPortal by Jasig.

the class LocaleTransformerConfigurationSource method getParameters.

/* (non-Javadoc)
     * @see org.apereo.portal.rendering.xslt.TransformerConfigurationSource#getParameters(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
@Override
public Map<String, Object> getParameters(HttpServletRequest request, HttpServletResponse response) {
    final LocaleManager localeManager = this.getLocaleManager(request);
    final Locale[] locales = localeManager.getLocales();
    if (locales != null && locales.length > 0 && locales[0] != null) {
        final String locale = locales[0].toString();
        final String xslLocale = locale.replace('_', '-');
        this.logger.debug("Setting USER_LANG to {}", xslLocale);
        return Collections.singletonMap("USER_LANG", (Object) xslLocale);
    }
    return null;
}
Also used : Locale(java.util.Locale) LocaleManager(org.apereo.portal.i18n.LocaleManager)

Example 2 with LocaleManager

use of org.apereo.portal.i18n.LocaleManager in project uPortal by Jasig.

the class PortalHttpServletRequestWrapper method getLocale.

/* (non-Javadoc)
     * @see org.apereo.portal.url.AbstractHttpServletRequestWrapper#getLocale()
     */
@Override
public Locale getLocale() {
    if (super.getSession(false) == null) {
        return super.getLocale();
    }
    final IUserInstance userInstance = this.userInstanceManager.getUserInstance(this.getWrappedRequest());
    final LocaleManager localeManager = userInstance.getLocaleManager();
    final Locale[] locales = localeManager.getLocales();
    return locales[0];
}
Also used : IUserInstance(org.apereo.portal.user.IUserInstance) Locale(java.util.Locale) LocaleManager(org.apereo.portal.i18n.LocaleManager)

Example 3 with LocaleManager

use of org.apereo.portal.i18n.LocaleManager in project uPortal by Jasig.

the class PortalHttpServletRequestWrapper method getLocales.

/* (non-Javadoc)
     * @see org.apereo.portal.url.AbstractHttpServletRequestWrapper#getLocales()
     */
@Override
public Enumeration<Locale> getLocales() {
    if (super.getSession(false) == null) {
        return super.getLocales();
    }
    final IUserInstance userInstance = this.userInstanceManager.getUserInstance(this.getWrappedRequest());
    final LocaleManager localeManager = userInstance.getLocaleManager();
    final Locale[] locales = localeManager.getLocales();
    return new ArrayEnumerator<Locale>(locales);
}
Also used : IUserInstance(org.apereo.portal.user.IUserInstance) Locale(java.util.Locale) ArrayEnumerator(org.apereo.portal.utils.ArrayEnumerator) LocaleManager(org.apereo.portal.i18n.LocaleManager)

Example 4 with LocaleManager

use of org.apereo.portal.i18n.LocaleManager in project uPortal by Jasig.

the class UserLocaleHelper method updateUserLocale.

/**
     * Update the current user's locale to match the selected locale. This implementation will
     * update the session locale, and if the user is not a guest, will also update the locale in the
     * user's persisted preferences.
     *
     * @param request
     * @param localeString
     */
public void updateUserLocale(HttpServletRequest request, String localeString) {
    IUserInstance ui = userInstanceManager.getUserInstance(request);
    IUserPreferencesManager upm = ui.getPreferencesManager();
    final IUserProfile userProfile = upm.getUserProfile();
    LocaleManager localeManager = userProfile.getLocaleManager();
    if (localeString != null) {
        // build a new Locale[] array from the specified locale
        Locale userLocale = parseLocale(localeString);
        Locale[] locales = new Locale[] { userLocale };
        // set this locale in the session
        localeManager.setSessionLocales(locales);
        // if the current user is logged in, also update the persisted
        // user locale
        final IPerson person = ui.getPerson();
        if (!person.isGuest()) {
            try {
                localeManager.persistUserLocales(new Locale[] { userLocale });
                localeStore.updateUserLocales(person, new Locale[] { userLocale });
                // remove person layout framgent from session since it contains some of the data in previous
                // translation and won't be cleared until next logout-login (applies when using
                // RDBMDistributedLayoutStore as user layout store).
                person.setAttribute(Constants.PLF, null);
                upm.getUserLayoutManager().loadUserLayout(true);
            } catch (Exception e) {
                throw new PortalException(e);
            }
        }
    }
}
Also used : IUserInstance(org.apereo.portal.user.IUserInstance) Locale(java.util.Locale) IPerson(org.apereo.portal.security.IPerson) IUserProfile(org.apereo.portal.IUserProfile) IUserPreferencesManager(org.apereo.portal.IUserPreferencesManager) LocaleManager(org.apereo.portal.i18n.LocaleManager) PortalException(org.apereo.portal.PortalException) PortalException(org.apereo.portal.PortalException)

Example 5 with LocaleManager

use of org.apereo.portal.i18n.LocaleManager 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<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;
                //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;
                    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 (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";
                    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);
                        // 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(// Some JDBC drivers require columns accessed in order
                            5);
                            String temp6 = rs.getString(// Access 5 and 6 now, save till needed.
                            6);
                            // 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, // Plug in saved column values
                                temp6);
                            }
                            if (databaseMetadata.supportsOuterJoins()) {
                                do {
                                    String name = rs.getString(name_index);
                                    String value = rs.getString(// Oracle JDBC requires us to do this for longs
                                    value_index);
                                    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";
                    logger.debug("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";
                    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)

Aggregations

LocaleManager (org.apereo.portal.i18n.LocaleManager)14 Locale (java.util.Locale)12 IUserProfile (org.apereo.portal.IUserProfile)5 IPerson (org.apereo.portal.security.IPerson)5 IUserInstance (org.apereo.portal.user.IUserInstance)4 Connection (java.sql.Connection)2 PreparedStatement (java.sql.PreparedStatement)2 ResultSet (java.sql.ResultSet)2 SQLException (java.sql.SQLException)2 HttpServletRequest (javax.servlet.http.HttpServletRequest)2 IUserPreferencesManager (org.apereo.portal.IUserPreferencesManager)2 PortalException (org.apereo.portal.PortalException)2 IJoinQueryString (org.apereo.portal.jdbc.IJoinQueryString)2 Tuple (org.apereo.portal.utils.Tuple)2 DataAccessException (org.springframework.dao.DataAccessException)2 Document (org.w3c.dom.Document)2 Element (org.w3c.dom.Element)2 Statement (java.sql.Statement)1 HashMap (java.util.HashMap)1 HttpSession (javax.servlet.http.HttpSession)1