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;
}
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);
}
}
}
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();
}
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);
}
}
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;
}
Aggregations