/* * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This 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 software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xwiki.wiki.user.internal; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import org.xwiki.component.annotation.Component; import org.xwiki.model.reference.DocumentReference; import org.xwiki.wiki.user.MembershipType; import org.xwiki.wiki.user.UserScope; import org.xwiki.wiki.user.WikiUserConfiguration; import org.xwiki.wiki.user.WikiUserManagerException; import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.objects.BaseObject; /** * Default implementation of {@link WikiUserConfigurationHelper}. * * @version $Id: 32f703422c8bc668023f0faa8169c2d66ce54b57 $ * @since 5.3M2 */ @Component @Singleton public class DefaultWikiUserConfigurationHelper implements WikiUserConfigurationHelper { private static final String CONFIGURATION_PAGE_NAME = "WikiUserConfiguration"; private static final String CONFIGURATION_SPACE_NAME = WikiUserClassDocumentInitializer.DOCUMENT_SPACE; @Inject private Provider<XWikiContext> xcontextProvider; private XWikiDocument getDocument(String wikiId) throws WikiUserManagerException { try { XWikiContext context = xcontextProvider.get(); XWiki xwiki = context.getWiki(); DocumentReference reference = new DocumentReference(wikiId, CONFIGURATION_SPACE_NAME, CONFIGURATION_PAGE_NAME); return xwiki.getDocument(reference, context); } catch (XWikiException e) { throw new WikiUserManagerException(String.format("Fail to get the configuration document for wiki [%s].", wikiId)); } } @Override public WikiUserConfiguration getConfiguration(String wikiId) throws WikiUserManagerException { // Create the configuration object to return WikiUserConfiguration configuration = new WikiUserConfiguration(); // Get the document XWikiDocument document = getDocument(wikiId); // Get the XWiki object BaseObject object = document.getXObject(WikiUserClassDocumentInitializer.CONFIGURATION_CLASS); if (object != null) { // Get the user scope String scopeValue = object.getStringValue(WikiUserClassDocumentInitializer.FIELD_USERSCOPE); UserScope userScope; try { userScope = UserScope.valueOf(scopeValue.toUpperCase()); } catch (Exception e) { // Default value userScope = UserScope.LOCAL_AND_GLOBAL; } configuration.setUserScope(userScope); // Get the membershipType value String membershipTypeValue = object.getStringValue( WikiUserClassDocumentInitializer.FIELD_MEMBERSHIPTYPE); MembershipType membershipType; try { membershipType = MembershipType.valueOf(membershipTypeValue.toUpperCase()); } catch (Exception e) { // Default value membershipType = MembershipType.INVITE; } configuration.setMembershipType(membershipType); } return configuration; } @Override public void saveConfiguration(WikiUserConfiguration configuration, String wikiId) throws WikiUserManagerException { XWikiContext context = xcontextProvider.get(); // Get the document XWikiDocument document = getDocument(wikiId); // Fill the object BaseObject object = document.getXObject(WikiUserClassDocumentInitializer.CONFIGURATION_CLASS, true, context); object.setStringValue(WikiUserClassDocumentInitializer.FIELD_USERSCOPE, configuration.getUserScope().name().toLowerCase()); if (configuration.getMembershipType() != null) { object.setStringValue(WikiUserClassDocumentInitializer.FIELD_MEMBERSHIPTYPE, configuration.getMembershipType().name().toLowerCase()); } // Save the document try { XWiki xwiki = context.getWiki(); document.setHidden(true); // The document must have a creator if (document.getCreatorReference() == null) { document.setCreatorReference(context.getUserReference()); } // The document must have an author if (document.getAuthorReference() == null) { document.setAuthorReference(context.getUserReference()); } xwiki.saveDocument(document, "Changed configuration.", context); } catch (XWikiException e) { throw new WikiUserManagerException( String.format("Fail to save the confguration document for wiki [%s].", wikiId), e); } } }