/* * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * * Alfresco 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 3 of the License, or * (at your option) any later version. * * Alfresco 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 Alfresco. If not, see . */ package org.alfresco.util; import org.alfresco.service.cmr.admin.RepoAdminService; import org.alfresco.service.cmr.admin.RepoUsage.LicenseMode; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Model related utility functions. * * @since 3.5 */ public class ModelUtil { private static final String SHARE = "Share"; private static final String TEAM = "Team"; public static final String PAGING_MAX_ITEMS = "maxItems"; public static final String PAGING_SKIP_COUNT = "skipCount"; public static final String PAGING_TOTAL_ITEMS = "totalItems"; public static final String PAGING_TOTAL_ITEMS_RANGE_END = "totalItemsRangeEnd"; public static final String PAGING_CONFIDENCE = "confidence"; /** * Returns the name of the product currently running, determined * by the current license. * * @param repoAdminService The RepoAdminService * @return "Share" or "Team" */ public static String getProductName(RepoAdminService repoAdminService) { // the product name is never localised so it's safe to // return a hard-coded string but if we ever need to it's // centralised here. String productName = SHARE; if (repoAdminService != null && repoAdminService.getRestrictions().getLicenseMode().equals(LicenseMode.TEAM)) { productName = TEAM; } return productName; } /** * Returns representation of paging object * * @param totalItems all count of object * @param maxItems max count of object that should be returned * @param skipCount count of skipped objects * @param confidence the confidence in the total, default is exact * @param totalItemsRangeEnd if the total is a range, what is the upper end of it * @return A model map of the details */ public static Map buildPaging(int totalItems, int maxItems, int skipCount, ScriptPagingDetails.ItemsSizeConfidence confidence, int totalItemsRangeEnd) { HashMap model = new HashMap(); if(confidence == null) { confidence = ScriptPagingDetails.ItemsSizeConfidence.EXACT; } model.put(PAGING_MAX_ITEMS, maxItems); model.put(PAGING_SKIP_COUNT, skipCount); model.put(PAGING_TOTAL_ITEMS, totalItems); model.put(PAGING_TOTAL_ITEMS_RANGE_END, totalItemsRangeEnd); model.put(PAGING_CONFIDENCE, confidence); return model; } /** * Returns representation of paging object * * @param totalItems all count of object * @param maxItems max count of object that should be returned * @param skipCount count of skipped objects * @return A model map of the details */ public static Map buildPaging(int totalItems, int maxItems, int skipCount) { return buildPaging(totalItems, maxItems, skipCount, null, -1); } /** * Returns representation of paging object * * @param paging The paging object with total, skip, max etc */ public static Map buildPaging(ScriptPagingDetails paging) { return buildPaging( paging.getTotalItems(), paging.getMaxItems(), paging.getSkipCount(), paging.getConfidence(), paging.getTotalItemsRangeMax() ); } public static List page(Collection objects, int maxItems, int skipCount) { return page(objects, new ScriptPagingDetails(maxItems, skipCount)); } public static List page(Collection objects, ScriptPagingDetails paging) { int maxItems = paging.getMaxItems(); int skipCount = paging.getSkipCount(); paging.setTotalItems(objects.size()); List result = new ArrayList(); // Do the paging int totalItems = objects.size(); if (maxItems<1 || maxItems>totalItems) { maxItems = totalItems; } if (skipCount<0) { skipCount = 0; } int endPoint = skipCount + maxItems; if (endPoint > totalItems) { endPoint = totalItems; } int pos = 0; for (T entry : objects) { if(pos >= skipCount) { if(pos < endPoint) { result.add(entry); } else { break; } } pos++; } return result; } public static T[] page(T[] objects, int maxItems, int skipCount) { // Do the paging int totalItems = objects.length; if (maxItems<1 || maxItems>totalItems) { maxItems = totalItems; } if (skipCount<0) { skipCount = 0; } int endPoint = skipCount + maxItems; if (endPoint > totalItems) { endPoint = totalItems; } int size = skipCount > endPoint ? 0 : endPoint - skipCount; if(size == totalItems) { return objects; } T[] result = Arrays.copyOfRange(objects, skipCount, endPoint); return result; } }