Search in sources :

Example 16 with IStylesheetUserPreferences

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

the class StylesheetUserPreferencesServiceImpl method populateStylesheetParameters.

@Override
public <P extends Populator<String, String>> P populateStylesheetParameters(HttpServletRequest request, PreferencesScope prefScope, P stylesheetParameters) {
    final StylesheetPreferencesKey stylesheetPreferencesKey = this.getStylesheetPreferencesKey(request, prefScope);
    final IStylesheetDescriptor stylesheetDescriptor = stylesheetPreferencesKey.stylesheetDescriptor;
    // Get the scoped sources once
    final IStylesheetUserPreferences stylesheetUserPreferences = this.getStylesheetUserPreferences(request, stylesheetPreferencesKey);
    final Map<String, String> sessionStylesheetParameters;
    final HttpSession session = request.getSession(false);
    if (session == null) {
        sessionStylesheetParameters = null;
    } else {
        sessionStylesheetParameters = PortalWebUtils.getMapSessionAttribute(session, STYLESHEET_PARAMETERS_KEY + stylesheetPreferencesKey.toString(), false);
    }
    final Map<String, String> requestStylesheetParameters = PortalWebUtils.getMapRequestAttribute(request, STYLESHEET_PARAMETERS_KEY + stylesheetPreferencesKey.toString(), false);
    // Try getting each stylesheet parameter to populate the Map
    for (final IStylesheetParameterDescriptor stylesheetParameterDescriptor : stylesheetDescriptor.getStylesheetParameterDescriptors()) {
        final String name = stylesheetParameterDescriptor.getName();
        final String value;
        final Scope scope = stylesheetParameterDescriptor.getScope();
        switch(scope) {
            case PERSISTENT:
                {
                    if (stylesheetUserPreferences == null) {
                        value = null;
                        break;
                    }
                    value = stylesheetUserPreferences.getStylesheetParameter(name);
                    break;
                }
            case SESSION:
                {
                    if (sessionStylesheetParameters == null) {
                        value = null;
                        break;
                    }
                    value = sessionStylesheetParameters.get(name);
                    break;
                }
            case REQUEST:
                {
                    if (requestStylesheetParameters == null) {
                        value = null;
                        break;
                    }
                    value = requestStylesheetParameters.get(name);
                    break;
                }
            default:
                {
                    value = null;
                    break;
                }
        }
        // Don't add unset properties
        if (value == null) {
            continue;
        }
        // If the value is equal to the default value remove the property and return null
        if (this.compareValues(value, stylesheetParameterDescriptor.getDefaultValue())) {
            this.removeStylesheetParameter(request, prefScope, name);
            continue;
        }
        stylesheetParameters.put(name, value);
    }
    return stylesheetParameters;
}
Also used : IStylesheetParameterDescriptor(org.apereo.portal.layout.om.IStylesheetParameterDescriptor) Scope(org.apereo.portal.layout.om.IStylesheetData.Scope) HttpSession(javax.servlet.http.HttpSession) IStylesheetDescriptor(org.apereo.portal.layout.om.IStylesheetDescriptor) IStylesheetUserPreferences(org.apereo.portal.layout.om.IStylesheetUserPreferences)

Example 17 with IStylesheetUserPreferences

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

the class StylesheetUserPreferencesServiceImpl method setLayoutAttribute.

@Transactional
@Override
public String setLayoutAttribute(HttpServletRequest request, PreferencesScope prefScope, String nodeId, String name, String value) {
    final StylesheetPreferencesKey stylesheetPreferencesKey = this.getStylesheetPreferencesKey(request, prefScope);
    final IStylesheetDescriptor stylesheetDescriptor = stylesheetPreferencesKey.stylesheetDescriptor;
    final ILayoutAttributeDescriptor layoutAttributeDescriptor = stylesheetDescriptor.getLayoutAttributeDescriptor(name);
    if (layoutAttributeDescriptor == null) {
        logger.warn("Attempted to set layout attribute {}={} on node with ID=\"{}\" but no such stylesheet parameter is defined in stylesheet descriptor {}. It will be ignored.", new Object[] { name, value, nodeId, stylesheetDescriptor.getName() });
        return null;
    }
    if (this.compareValues(value, layoutAttributeDescriptor.getDefaultValue())) {
        // Value matches the default value, remove the attribute
        return this.removeLayoutAttribute(request, prefScope, nodeId, name);
    }
    final IStylesheetUserPreferences distributedStylesheetUserPreferences = this.getDistributedStylesheetUserPreferences(request, prefScope);
    if (distributedStylesheetUserPreferences != null) {
        final String defaultValue = distributedStylesheetUserPreferences.getLayoutAttribute(nodeId, name);
        if (this.compareValues(value, defaultValue)) {
            // Value matches the DLM preferences value, remove the value
            return this.removeLayoutAttribute(request, prefScope, nodeId, name);
        }
    }
    final Scope scope = this.getWriteScope(request, prefScope, stylesheetPreferencesKey, layoutAttributeDescriptor);
    switch(scope) {
        case PERSISTENT:
            {
                IStylesheetUserPreferences stylesheetUserPreferences = this.getStylesheetUserPreferences(request, stylesheetPreferencesKey);
                if (stylesheetUserPreferences == null) {
                    stylesheetUserPreferences = this.stylesheetUserPreferencesDao.createStylesheetUserPreferences(stylesheetDescriptor, stylesheetPreferencesKey.person, stylesheetPreferencesKey.userProfile);
                    this.clearStylesheetUserPreferencesCache(request, stylesheetPreferencesKey);
                }
                final String oldValue = stylesheetUserPreferences.setLayoutAttribute(nodeId, name, value);
                this.stylesheetUserPreferencesDao.storeStylesheetUserPreferences(stylesheetUserPreferences);
                return oldValue;
            }
        default:
            {
                // Determine the mutex to use for accessing the nodeAttributes map
                final Object mutex;
                switch(scope) {
                    case REQUEST:
                        {
                            mutex = PortalWebUtils.getRequestAttributeMutex(request);
                            break;
                        }
                    case SESSION:
                        {
                            final HttpSession session = request.getSession();
                            mutex = WebUtils.getSessionMutex(session);
                            break;
                        }
                    default:
                        {
                            mutex = new Object();
                            break;
                        }
                }
                // Get/Create the nodeAttributes map
                Map<String, String> nodeAttributes;
                synchronized (mutex) {
                    nodeAttributes = this.getDataValue(request, stylesheetPreferencesKey, scope, LAYOUT_ATTRIBUTES_KEY, nodeId);
                    if (nodeAttributes == null) {
                        nodeAttributes = new ConcurrentHashMap<>();
                        this.putDataValue(request, stylesheetPreferencesKey, scope, LAYOUT_ATTRIBUTES_KEY, nodeId, nodeAttributes);
                    }
                }
                return nodeAttributes.put(name, value);
            }
    }
}
Also used : Scope(org.apereo.portal.layout.om.IStylesheetData.Scope) HttpSession(javax.servlet.http.HttpSession) IStylesheetDescriptor(org.apereo.portal.layout.om.IStylesheetDescriptor) IStylesheetUserPreferences(org.apereo.portal.layout.om.IStylesheetUserPreferences) ILayoutAttributeDescriptor(org.apereo.portal.layout.om.ILayoutAttributeDescriptor) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Transactional(org.springframework.transaction.annotation.Transactional)

Example 18 with IStylesheetUserPreferences

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

the class StylesheetUserPreferencesServiceImpl method getAllNodesAndValuesForAttribute.

@Override
public Map<String, String> getAllNodesAndValuesForAttribute(HttpServletRequest request, PreferencesScope prefScope, String name) {
    final StylesheetPreferencesKey stylesheetPreferencesKey = this.getStylesheetPreferencesKey(request, prefScope);
    final Builder<String, String> result = ImmutableMap.builder();
    final boolean isFragmentOwner = this.isFragmentOwnerStylesheetPreferencesKey(stylesheetPreferencesKey);
    if (!isFragmentOwner) {
        final IStylesheetUserPreferences distributedStylesheetUserPreferences = this.getDistributedStylesheetUserPreferences(request, prefScope);
        if (distributedStylesheetUserPreferences != null) {
            final Map<String, String> allNodesAndValuesForAttribute = distributedStylesheetUserPreferences.getAllNodesAndValuesForAttribute(name);
            result.putAll(allNodesAndValuesForAttribute);
        }
    }
    final IStylesheetUserPreferences stylesheetUserPreferences = this.getStylesheetUserPreferences(request, stylesheetPreferencesKey);
    if (stylesheetUserPreferences != null) {
        final Map<String, String> allNodesAndValuesForAttribute = stylesheetUserPreferences.getAllNodesAndValuesForAttribute(name);
        result.putAll(allNodesAndValuesForAttribute);
    }
    final HttpSession session = request.getSession(false);
    if (session != null) {
        // nodeId, name, value
        final Map<String, Map<String, String>> sessionLayoutAttributes = getSessionLayoutAttributes(session, stylesheetPreferencesKey);
        getAllNodesAndValuesForAttribute(sessionLayoutAttributes, name, result);
    }
    final Map<String, Map<String, String>> requestLayoutAttributes = getRequestLayoutAttributes(request, stylesheetPreferencesKey);
    if (requestLayoutAttributes != null) {
        getAllNodesAndValuesForAttribute(requestLayoutAttributes, name, result);
    }
    return result.build();
}
Also used : HttpSession(javax.servlet.http.HttpSession) IStylesheetUserPreferences(org.apereo.portal.layout.om.IStylesheetUserPreferences) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 19 with IStylesheetUserPreferences

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

the class RDBMDistributedLayoutStore method loadStylesheetUserPreferencesAttributes.

private void loadStylesheetUserPreferencesAttributes(IPerson person, IUserProfile profile, org.dom4j.Element layout, final int structureStylesheetId, final String nodeType) {
    final IStylesheetDescriptor stylesheetDescriptor = this.stylesheetDescriptorDao.getStylesheetDescriptor(structureStylesheetId);
    final List<org.dom4j.Element> structureAttributes = layout.selectNodes("//" + nodeType + "-attribute");
    IStylesheetUserPreferences ssup = this.stylesheetUserPreferencesDao.getStylesheetUserPreferences(stylesheetDescriptor, person, profile);
    if (structureAttributes.isEmpty()) {
        if (ssup != null) {
            this.stylesheetUserPreferencesDao.deleteStylesheetUserPreferences(ssup);
        }
    } else {
        if (ssup == null) {
            ssup = this.stylesheetUserPreferencesDao.createStylesheetUserPreferences(stylesheetDescriptor, person, profile);
        }
        final Map<String, Map<String, String>> oldLayoutAttributes = new HashMap<>();
        for (final String nodeId : ssup.getAllLayoutAttributeNodeIds()) {
            final MapPopulator<String, String> nodeAttributes = new MapPopulator<>();
            ssup.populateLayoutAttributes(nodeId, nodeAttributes);
            oldLayoutAttributes.put(nodeId, nodeAttributes.getMap());
        }
        for (final org.dom4j.Element structureAttribute : structureAttributes) {
            final org.dom4j.Element layoutElement = structureAttribute.getParent();
            final String nodeId = layoutElement.valueOf("@ID");
            if (StringUtils.isEmpty(nodeId)) {
                logger.warn("@ID is empty for layout element, the attribute will be ignored: {}", structureAttribute.asXML());
            }
            final String name = structureAttribute.valueOf("name");
            if (StringUtils.isEmpty(nodeId)) {
                logger.warn("name is empty for layout element, the attribute will be ignored: {}", structureAttribute.asXML());
                continue;
            }
            final String value = structureAttribute.valueOf("value");
            if (StringUtils.isEmpty(nodeId)) {
                logger.warn("value is empty for layout element, the attribute will be ignored: {}", structureAttribute.asXML());
                continue;
            }
            // Remove from the old attrs set as we've updated it
            final Map<String, String> oldAttrs = oldLayoutAttributes.get(nodeId);
            if (oldAttrs != null) {
                oldAttrs.remove(name);
            }
            ssup.setLayoutAttribute(nodeId, name, value);
            // Remove the layout attribute element or DLM fails
            layoutElement.remove(structureAttribute);
        }
        // Purge orphaned entries
        for (final Entry<String, Map<String, String>> oldAttributeEntry : oldLayoutAttributes.entrySet()) {
            final String nodeId = oldAttributeEntry.getKey();
            for (final String name : oldAttributeEntry.getValue().keySet()) {
                ssup.removeLayoutAttribute(nodeId, name);
            }
        }
        this.stylesheetUserPreferencesDao.storeStylesheetUserPreferences(ssup);
    }
}
Also used : HashMap(java.util.HashMap) Element(org.w3c.dom.Element) IStylesheetDescriptor(org.apereo.portal.layout.om.IStylesheetDescriptor) IStylesheetUserPreferences(org.apereo.portal.layout.om.IStylesheetUserPreferences) Map(java.util.Map) HashMap(java.util.HashMap) NamedNodeMap(org.w3c.dom.NamedNodeMap) MapPopulator(org.apereo.portal.utils.MapPopulator)

Example 20 with IStylesheetUserPreferences

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

the class RDBMDistributedLayoutStore method loadDistributedStylesheetUserPreferences.

private IStylesheetUserPreferences loadDistributedStylesheetUserPreferences(IPerson person, IUserProfile profile, long stylesheetDescriptorId, Set<String> fragmentNames) {
    final boolean isFragmentOwner = this.isFragmentOwner(person);
    final Locale locale = profile.getLocaleManager().getLocales().get(0);
    final IStylesheetDescriptor stylesheetDescriptor = this.stylesheetDescriptorDao.getStylesheetDescriptor(stylesheetDescriptorId);
    final IStylesheetUserPreferences stylesheetUserPreferences = this.stylesheetUserPreferencesDao.getStylesheetUserPreferences(stylesheetDescriptor, person, profile);
    final IStylesheetUserPreferences distributedStylesheetUserPreferences = new StylesheetUserPreferencesImpl();
    for (final String fragName : fragmentNames) {
        final FragmentDefinition fragmentDefinition = this.fragmentUtils.getFragmentDefinitionByName(fragName);
        // UserView may be missing if the fragment isn't defined correctly
        final UserView userView = this.fragmentUtils.getUserView(fragmentDefinition, locale);
        if (userView == null) {
            logger.warn("No UserView is present for fragment {} it will be skipped when loading distributed stylesheet user preferences", fragmentDefinition.getName());
            continue;
        }
        // IStylesheetUserPreferences only exist if something was actually set
        final IStylesheetUserPreferences fragmentStylesheetUserPreferences = this.stylesheetUserPreferencesDao.getStylesheetUserPreferences(stylesheetDescriptor, userView.getUserId(), userView.getProfileId());
        if (fragmentStylesheetUserPreferences == null) {
            continue;
        }
        // Get the info needed to DLMify node IDs
        final Element root = userView.getLayout().getDocumentElement();
        final String labelBase = root.getAttribute(Constants.ATT_ID);
        boolean modified = false;
        // Copy all of the fragment preferences into the distributed preferences
        final Collection<String> allLayoutAttributeNodeIds = fragmentStylesheetUserPreferences.getAllLayoutAttributeNodeIds();
        for (final String fragmentNodeId : allLayoutAttributeNodeIds) {
            final String userNodeId = (isFragmentOwner || fragmentNodeId.startsWith(Constants.FRAGMENT_ID_USER_PREFIX)) ? fragmentNodeId : labelBase + fragmentNodeId;
            final MapPopulator<String, String> layoutAttributesPopulator = new MapPopulator<>();
            fragmentStylesheetUserPreferences.populateLayoutAttributes(fragmentNodeId, layoutAttributesPopulator);
            final Map<String, String> layoutAttributes = layoutAttributesPopulator.getMap();
            for (final Map.Entry<String, String> layoutAttributesEntry : layoutAttributes.entrySet()) {
                final String name = layoutAttributesEntry.getKey();
                final String value = layoutAttributesEntry.getValue();
                // Fragmentize the nodeId here
                distributedStylesheetUserPreferences.setLayoutAttribute(userNodeId, name, value);
                // layout.
                if (stylesheetUserPreferences != null && !isFragmentOwner) {
                    final String userValue = stylesheetUserPreferences.getLayoutAttribute(userNodeId, name);
                    if (userValue != null && userValue.equals(value)) {
                        stylesheetUserPreferences.removeLayoutAttribute(userNodeId, name);
                        EditManager.removePreferenceDirective(person, userNodeId, name);
                        modified = true;
                    }
                }
            }
        }
        if (modified) {
            this.stylesheetUserPreferencesDao.storeStylesheetUserPreferences(stylesheetUserPreferences);
        }
    }
    return distributedStylesheetUserPreferences;
}
Also used : Locale(java.util.Locale) Element(org.w3c.dom.Element) IStylesheetDescriptor(org.apereo.portal.layout.om.IStylesheetDescriptor) IStylesheetUserPreferences(org.apereo.portal.layout.om.IStylesheetUserPreferences) StylesheetUserPreferencesImpl(org.apereo.portal.layout.StylesheetUserPreferencesImpl) Map(java.util.Map) HashMap(java.util.HashMap) NamedNodeMap(org.w3c.dom.NamedNodeMap) MapPopulator(org.apereo.portal.utils.MapPopulator)

Aggregations

IStylesheetUserPreferences (org.apereo.portal.layout.om.IStylesheetUserPreferences)20 IStylesheetDescriptor (org.apereo.portal.layout.om.IStylesheetDescriptor)16 Scope (org.apereo.portal.layout.om.IStylesheetData.Scope)10 Map (java.util.Map)8 HttpSession (javax.servlet.http.HttpSession)7 ImmutableMap (com.google.common.collect.ImmutableMap)6 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)6 ConcurrentMap (java.util.concurrent.ConcurrentMap)6 ILayoutAttributeDescriptor (org.apereo.portal.layout.om.ILayoutAttributeDescriptor)5 IStylesheetParameterDescriptor (org.apereo.portal.layout.om.IStylesheetParameterDescriptor)5 Transactional (org.springframework.transaction.annotation.Transactional)5 MapPopulator (org.apereo.portal.utils.MapPopulator)4 IOutputPropertyDescriptor (org.apereo.portal.layout.om.IOutputPropertyDescriptor)3 HashMap (java.util.HashMap)2 IUserProfile (org.apereo.portal.IUserProfile)2 IPerson (org.apereo.portal.security.IPerson)2 Test (org.junit.Test)2 Element (org.w3c.dom.Element)2 NamedNodeMap (org.w3c.dom.NamedNodeMap)2 LinkedHashSet (java.util.LinkedHashSet)1