/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.portlet.container.services; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import javax.portlet.ValidatorException; import org.apache.pluto.container.om.portlet.PortletDefinition; import org.apache.pluto.container.om.portlet.Preference; import org.apache.pluto.container.om.portlet.Preferences; import org.apereo.portal.portlet.dao.jpa.PortletPreferenceImpl; import org.apereo.portal.portlet.om.IPortletDefinition; import org.apereo.portal.portlet.om.IPortletDefinitionId; import org.apereo.portal.portlet.om.IPortletPreference; import org.apereo.portal.portlet.registry.IPortletDefinitionRegistry; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionOperations; /** * Preferences impl that manipulates the portlet definition level preference data * */ public class PortletDefinitionPreferencesImpl extends AbstractPortletPreferencesImpl<IPortletDefinition> { private final IPortletDefinitionId portletDefinitionId; private final IPortletDefinitionRegistry portletDefinitionRegistry; private final TransactionOperations transactionOperations; public PortletDefinitionPreferencesImpl( IPortletDefinitionRegistry portletDefinitionRegistry, TransactionOperations transactionOperations, IPortletDefinitionId portletDefinitionId, boolean render) { super(render); this.portletDefinitionRegistry = portletDefinitionRegistry; this.transactionOperations = transactionOperations; this.portletDefinitionId = portletDefinitionId; } @Override protected IPortletDefinition getInitializationContext() { return this.portletDefinitionRegistry.getPortletDefinition(portletDefinitionId); } @Override protected Object getLogDescription() { return this.getInitializationContext(); } @Override protected void loadTargetPortletPreferences( IPortletDefinition portletDefinition, Map<String, IPortletPreference> targetPortletPreferences) { final List<IPortletPreference> entityPreferences = portletDefinition.getPortletPreferences(); for (final IPortletPreference preference : entityPreferences) { targetPortletPreferences.put(preference.getName(), preference); } } @Override protected void loadBasePortletPreferences( IPortletDefinition portletDefinition, Map<String, IPortletPreference> basePortletPreferences) { //Add descriptor prefs to base Map final IPortletDefinitionId portletDefinitionId = portletDefinition.getPortletDefinitionId(); final PortletDefinition portletDescriptor = this.portletDefinitionRegistry.getParentPortletDescriptor(portletDefinitionId); final Preferences descriptorPreferences = portletDescriptor.getPortletPreferences(); for (final Preference preference : descriptorPreferences.getPortletPreferences()) { final IPortletPreference preferenceWrapper = new PortletPreferenceImpl(preference); basePortletPreferences.put(preferenceWrapper.getName(), preferenceWrapper); } } @Override protected boolean isReadOnly(IPortletPreference portletPreference) { //In config mode (editing definition prefs) we ignore the read-only flag return false; } @Override protected boolean storeInternal() throws IOException, ValidatorException { return this.transactionOperations.execute( new TransactionCallback<Boolean>() { @Override public Boolean doInTransaction(TransactionStatus status) { //Refresh the entity to avoid optimistic locking errors final IPortletDefinition portletDefinition = portletDefinitionRegistry.getPortletDefinition(portletDefinitionId); final Map<String, IPortletPreference> targetPortletPreferences = getTargetPortletPreferences(); final Collection<IPortletPreference> values = targetPortletPreferences.values(); final boolean modified = portletDefinition.setPortletPreferences( new ArrayList<IPortletPreference>(values)); if (!modified) { //Nothing actually changed, skip the store return Boolean.FALSE; } portletDefinitionRegistry.savePortletDefinition(portletDefinition); return Boolean.TRUE; } }); } }