/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.social.util; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.ProxyFactory; import com.liferay.portal.kernel.util.Tuple; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.DocumentException; import com.liferay.portal.kernel.xml.DocumentType; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.UnsecureSAXReaderUtil; import com.liferay.portal.util.JavaFieldsParser; import com.liferay.social.kernel.model.SocialAchievement; import com.liferay.social.kernel.model.SocialActivityCounterConstants; import com.liferay.social.kernel.model.SocialActivityCounterDefinition; import com.liferay.social.kernel.model.SocialActivityDefinition; import com.liferay.social.kernel.model.SocialActivityProcessor; import com.liferay.social.kernel.util.SocialConfiguration; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * @author Zsolt Berentey */ public class SocialConfigurationImpl implements SocialConfiguration { @Override public List<String> getActivityCounterNames() { return getActivityCounterNames( SocialActivityCounterConstants.TYPE_ALL, false); } @Override public List<String> getActivityCounterNames(boolean transientCounter) { return getActivityCounterNames( SocialActivityCounterConstants.TYPE_ALL, transientCounter); } @Override public List<String> getActivityCounterNames(int ownerType) { return getActivityCounterNames(ownerType, false); } @Override public List<String> getActivityCounterNames( int ownerType, boolean transientCounter) { Set<String> activityCounterNames = new LinkedHashSet<>(); for (Map<Integer, SocialActivityDefinition> activityDefinitions : _activityDefinitions.values()) { for (SocialActivityDefinition activityDefinition : activityDefinitions.values()) { for (SocialActivityCounterDefinition activityCounterDefinition : activityDefinition.getActivityCounterDefinitions()) { if ((activityCounterDefinition.isTransient() == transientCounter) && ((ownerType == SocialActivityCounterConstants.TYPE_ALL) || (ownerType == activityCounterDefinition.getOwnerType()))) { activityCounterNames.add( activityCounterDefinition.getName()); } } } } return new ArrayList<>(activityCounterNames); } @Override public SocialActivityDefinition getActivityDefinition( String modelName, int activityType) { Map<Integer, SocialActivityDefinition> activityDefinitions = _activityDefinitions.get(modelName); if (activityDefinitions == null) { return null; } return activityDefinitions.get(activityType); } @Override public List<SocialActivityDefinition> getActivityDefinitions( String modelName) { Map<Integer, SocialActivityDefinition> activityDefinitions = _activityDefinitions.get(modelName); if (activityDefinitions == null) { return Collections.emptyList(); } return ListUtil.fromCollection(activityDefinitions.values()); } @Override public String[] getActivityModelNames() { Set<String> activityModelNames = _activityDefinitions.keySet(); return activityModelNames.toArray( new String[activityModelNames.size()]); } @Override public List<Object> read(ClassLoader classLoader, String[] xmls) throws Exception { List<Object> objects = new ArrayList<>(); for (String xml : xmls) { _read(classLoader, xml, objects); } return objects; } @Override public void removeActivityDefinition( SocialActivityDefinition activityDefinition) { Map<Integer, SocialActivityDefinition> activityDefinitions = _activityDefinitions.get(activityDefinition.getModelName()); if (activityDefinitions != null) { activityDefinitions.remove(activityDefinition.getActivityType()); } } private void _read( ClassLoader classLoader, String xml, List<Object> objects) throws Exception { if (xml == null) { return; } xml = JavaFieldsParser.parse(classLoader, xml); Document document = UnsecureSAXReaderUtil.read(xml); DocumentType documentType = document.getDocumentType(); String publicId = documentType.getPublicId(); if (!publicId.equals("-//Liferay//DTD Social 6.1.0//EN") && !publicId.equals("-//Liferay//DTD Social 6.2.0//EN") && !publicId.equals("-//Liferay//DTD Social 7.0.0//EN")) { throw new DocumentException( "Unsupported document type " + publicId); } Element rootElement = document.getRootElement(); List<Element> activityElements = rootElement.elements("activity"); for (Element activityElement : activityElements) { _readActivity(classLoader, objects, activityElement); } } private void _readAchievement( ClassLoader classLoader, List<Object> objects, SocialActivityDefinition activityDefinition, Element achievementElement) throws Exception { String achievementClassName = GetterUtil.getString( achievementElement.elementText("achievement-class")); SocialAchievement achievement = (SocialAchievement)ProxyFactory.newInstance( classLoader, SocialAchievement.class, achievementClassName); String name = GetterUtil.getString( achievementElement.elementText("name")); achievement.setName(name); String icon = GetterUtil.getString( achievementElement.elementText("icon")); achievement.setIcon(icon); List<Element> propertyElements = achievementElement.elements( "property"); for (Element propertyElement : propertyElements) { _readAchievementProperty(achievement, propertyElement); } achievement.initialize(activityDefinition); List<SocialAchievement> achievements = activityDefinition.getAchievements(); achievements.add(achievement); Tuple tuple = new Tuple(activityDefinition, achievement); objects.add(tuple); } private void _readAchievementProperty( SocialAchievement achievement, Element propertyElement) { String name = GetterUtil.getString(propertyElement.elementText("name")); String value = GetterUtil.getString( propertyElement.elementText("value")); achievement.setProperty(name, value); } private void _readActivity( ClassLoader classLoader, Element activityElement, SocialActivityDefinition activityDefinition) throws Exception { boolean logActivity = GetterUtil.getBoolean( activityElement.elementText("log-activity")); activityDefinition.setLogActivity(logActivity); boolean countersEnabled = GetterUtil.getBoolean( activityElement.elementText("counters-enabled"), true); activityDefinition.setCountersEnabled(countersEnabled); if (!countersEnabled) { return; } String languageKey = GetterUtil.getString( activityElement.elementText("language-key")); activityDefinition.setLanguageKey(languageKey); String processorClassName = GetterUtil.getString( activityElement.elementText("processor-class")); if (Validator.isNotNull(processorClassName)) { SocialActivityProcessor activityProcessor = (SocialActivityProcessor)ProxyFactory.newInstance( classLoader, SocialActivityProcessor.class, processorClassName); activityDefinition.setActivityProcessor(activityProcessor); } _readActivityContribution(activityElement, activityDefinition); _readActivityParticipation(activityElement, activityDefinition); } private void _readActivity( ClassLoader classLoader, List<Object> objects, Element activityElement) throws Exception { String modelName = GetterUtil.getString( activityElement.elementText("model-name")); Map<Integer, SocialActivityDefinition> activityDefinitions = _activityDefinitions.get(modelName); if (activityDefinitions == null) { activityDefinitions = new HashMap<>(); _activityDefinitions.put(modelName, activityDefinitions); } int activityType = GetterUtil.getInteger( activityElement.elementText("activity-type")); SocialActivityDefinition activityDefinition = activityDefinitions.get( activityType); if (activityDefinition == null) { activityDefinition = new SocialActivityDefinition(); activityDefinition.setModelName(modelName); activityDefinition.setActivityType(activityType); _readActivity(classLoader, activityElement, activityDefinition); activityDefinitions.put(activityType, activityDefinition); objects.add(activityDefinition); } List<Element> counterElements = activityElement.elements("counter"); for (Element counterElement : counterElements) { _readCounter(objects, activityDefinition, counterElement); } List<Element> achievementElements = activityElement.elements( "achievement"); for (Element achievementElement : achievementElements) { _readAchievement( classLoader, objects, activityDefinition, achievementElement); } } private void _readActivityContribution( Element activityElement, SocialActivityDefinition activityDefinition) { Element contributionValueElement = activityElement.element( "contribution-value"); Element contributionLimitElement = activityElement.element( "contribution-limit"); if ((contributionValueElement == null) && (contributionLimitElement == null)) { return; } SocialActivityCounterDefinition activityCounterDefinition = new SocialActivityCounterDefinition(); activityCounterDefinition.setName( SocialActivityCounterConstants.NAME_CONTRIBUTION); activityCounterDefinition.setOwnerType( SocialActivityCounterConstants.TYPE_CREATOR); int increment = 0; if (contributionValueElement != null) { increment = GetterUtil.getInteger( contributionValueElement.getText()); } activityCounterDefinition.setIncrement(increment); if (contributionLimitElement != null) { String limitEnabled = contributionLimitElement.attributeValue( "enabled"); if (Validator.isNotNull(limitEnabled)) { activityCounterDefinition.setLimitEnabled( GetterUtil.getBoolean(limitEnabled)); } String limitPeriod = contributionLimitElement.attributeValue( "period"); if (Validator.isNotNull(limitPeriod)) { activityCounterDefinition.setLimitPeriod(limitPeriod); } int limitValue = GetterUtil.getInteger( contributionLimitElement.getText()); activityCounterDefinition.setLimitValue(limitValue); } activityDefinition.addCounter(activityCounterDefinition); SocialActivityCounterDefinition popularityActivityCounterDefinition = new SocialActivityCounterDefinition(); popularityActivityCounterDefinition.setName( SocialActivityCounterConstants.NAME_POPULARITY); popularityActivityCounterDefinition.setOwnerType( SocialActivityCounterConstants.TYPE_ASSET); popularityActivityCounterDefinition.setIncrement( activityCounterDefinition.getIncrement()); popularityActivityCounterDefinition.setLimitEnabled( activityCounterDefinition.isLimitEnabled()); popularityActivityCounterDefinition.setLimitPeriod( activityCounterDefinition.getLimitPeriod()); popularityActivityCounterDefinition.setLimitValue( activityCounterDefinition.getLimitValue()); activityDefinition.addCounter(popularityActivityCounterDefinition); } private void _readActivityParticipation( Element activityElement, SocialActivityDefinition activityDefinition) { Element participationValueElement = activityElement.element( "participation-value"); Element participationLimitElement = activityElement.element( "participation-limit"); if ((participationValueElement == null) && (participationLimitElement == null)) { return; } SocialActivityCounterDefinition activityCounterDefinition = new SocialActivityCounterDefinition(); activityCounterDefinition.setName( SocialActivityCounterConstants.NAME_PARTICIPATION); activityCounterDefinition.setOwnerType( SocialActivityCounterConstants.TYPE_ACTOR); int increment = 0; if (participationValueElement != null) { increment = GetterUtil.getInteger( participationValueElement.getText()); } activityCounterDefinition.setIncrement(increment); if (participationLimitElement != null) { String limitEnabled = participationLimitElement.attributeValue( "enabled"); if (Validator.isNotNull(limitEnabled)) { activityCounterDefinition.setLimitEnabled( GetterUtil.getBoolean(limitEnabled)); } String limitPeriod = participationLimitElement.attributeValue( "period"); if (Validator.isNotNull(limitPeriod)) { activityCounterDefinition.setLimitPeriod(limitPeriod); } int limitValue = GetterUtil.getInteger( participationLimitElement.getText()); activityCounterDefinition.setLimitValue(limitValue); } activityDefinition.addCounter(activityCounterDefinition); } private void _readCounter( List<Object> objects, SocialActivityDefinition activityDefinition, Element counterElement) { SocialActivityCounterDefinition activityCounterDefinition = new SocialActivityCounterDefinition(); int increment = GetterUtil.getInteger( counterElement.elementText("increment"), 1); activityCounterDefinition.setIncrement(increment); boolean enabled = GetterUtil.getBoolean( counterElement.elementText("enabled"), true); activityCounterDefinition.setEnabled(enabled); String name = GetterUtil.getString(counterElement.elementText("name")); activityCounterDefinition.setName(name); String ownerType = GetterUtil.getString( counterElement.elementText("owner-type")); activityCounterDefinition.setOwnerType(ownerType); if (activityCounterDefinition.getOwnerType() == 0) { if (_log.isWarnEnabled()) { _log.warn( "Invalid owner type " + ownerType + " for model " + activityDefinition.getModelName()); } return; } activityDefinition.addCounter(activityCounterDefinition); Tuple tuple = new Tuple(activityDefinition, activityCounterDefinition); objects.add(tuple); } private static final Log _log = LogFactoryUtil.getLog( SocialConfigurationImpl.class); private final Map<String, Map<Integer, SocialActivityDefinition>> _activityDefinitions = new HashMap<>(); }