package org.gatein.security.oauth.utils; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.organization.UserProfile; import java.util.ArrayList; import java.util.List; /** * Various utils method related to persistence * * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> */ public class OAuthPersistenceUtils { public static final int DEFAULT_CHUNK_LENGTH = 250; // Private constructor for utils class private OAuthPersistenceUtils() {} /** * Save some potentially long attribute (For example OAuth accessToken) into given UserProfile. The point is that attribute needs * to be divided and saved into more "children" attributes (chunks) of userProfile because it's too long. * * @param longAttribute long attribute to save * @param userProfile user profile where attribute will be saved * @param attributePrefix prefix to save. For example if prefix is "myPrefix" then longAttribute will be saved into chunks (attributes) * like "myPrefix.1", "myPrefix.2", ... etc. * @param useSuffixInFirstAttribute Whether to use suffix in very first attribute. If true, the first attribute will be "myPrefix.1". If false, it will be just "myPrefix". * The only point of this parameter is backwards compatibility * @param lengthOfOneChunk length of single chunk */ public static void saveLongAttribute(String longAttribute, UserProfile userProfile, String attributePrefix, boolean useSuffixInFirstAttribute, int lengthOfOneChunk) { List<String> chunks = new ArrayList<String>(); while (longAttribute.length() > lengthOfOneChunk) { chunks.add(longAttribute.substring(0, lengthOfOneChunk)); longAttribute = longAttribute.substring(lengthOfOneChunk); } chunks.add(longAttribute); int chunkCounter = 1; for (String chunk : chunks) { String chunkAttrName = attributePrefix; if (useSuffixInFirstAttribute || chunkCounter > 1) { chunkAttrName = chunkAttrName + "." + chunkCounter; } userProfile.setAttribute(chunkAttrName, chunk); chunkCounter++; } // Null existing chunks if previous attribute was much longer than new one boolean chunkRemoved; do { chunkRemoved = false; String chunkAttrName = attributePrefix; if (useSuffixInFirstAttribute || chunkCounter > 1) { chunkAttrName = chunkAttrName + "." + chunkCounter; } if (userProfile.getAttribute(chunkAttrName) != null) { userProfile.setAttribute(chunkAttrName, null); chunkRemoved = true; } chunkCounter++; } while (chunkRemoved); } /** * Remove very long attribute. For parameters description {@see #saveLongAttribute} */ public static void removeLongAttribute(UserProfile userProfile, String attributePrefix, boolean useSuffixInFirstAttribute) { boolean chunkRemoved; int chunkCounter = 1; do { chunkRemoved = false; String chunkAttrName = attributePrefix; if (useSuffixInFirstAttribute || chunkCounter > 1) { chunkAttrName = chunkAttrName + "." + chunkCounter; } if (userProfile.getAttribute(chunkAttrName) != null) { userProfile.setAttribute(chunkAttrName, null); chunkRemoved = true; } chunkCounter++; } while (chunkRemoved); } /** * Get very long attribute. For parameters description {@see #saveLongAttribute} * @return very long attribute from all chunks */ public static String getLongAttribute(UserProfile userProfile, String attributePrefix, boolean useSuffixInFirstAttribute) { boolean chunkFound; int chunkCounter = 1; StringBuilder result = new StringBuilder(); do { chunkFound = false; String chunkAttrName = attributePrefix; if (useSuffixInFirstAttribute || chunkCounter > 1) { chunkAttrName = chunkAttrName + "." + chunkCounter; } if (userProfile.getAttribute(chunkAttrName) != null) { result.append(userProfile.getAttribute(chunkAttrName)); chunkFound = true; } chunkCounter++; } while (chunkFound); String str = result.toString(); return (str.length() > 0) ? str : null; } /** * Parse chunkLength from value params (same code used in all processors) */ public static int getChunkLength(InitParams params) { String chunkLengthParam = null; if (params.getValueParam("chunkLength") != null) { chunkLengthParam = params.getValueParam("chunkLength").getValue(); } if (chunkLengthParam != null && !chunkLengthParam.isEmpty()) { return Integer.parseInt(chunkLengthParam); } else { return OAuthPersistenceUtils.DEFAULT_CHUNK_LENGTH; } } }