001/* 002 * (C) Copyright 2019 Nuxeo (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * bdelbosc 018 */ 019 020package org.nuxeo.ecm.core.scroll; 021 022import java.util.HashMap; 023import java.util.List; 024import java.util.Map; 025import java.util.Objects; 026 027import org.nuxeo.ecm.core.api.scroll.Scroll; 028import org.nuxeo.ecm.core.api.scroll.ScrollRequest; 029import org.nuxeo.ecm.core.api.scroll.ScrollService; 030 031/** 032 * @since 11.1 033 */ 034public class ScrollServiceImpl implements ScrollService { 035 036 protected static final String SEP_KEY = ":"; 037 038 protected static final String DEFAULT_NAME = "default"; 039 040 protected final Map<String, ScrollDescriptor> descriptors; 041 042 public ScrollServiceImpl(List<ScrollDescriptor> scrollDescriptors) { 043 descriptors = new HashMap<>(scrollDescriptors.size()); 044 scrollDescriptors.forEach(descriptor -> descriptors.put(getKey(descriptor), descriptor)); 045 scrollDescriptors.stream() 046 .filter(ScrollDescriptor::isDefault) 047 .forEach(descriptor -> descriptors.put(getDefaultKey(descriptor), descriptor)); 048 } 049 050 protected String getKey(ScrollDescriptor descriptor) { 051 return getKey(descriptor.getType(), descriptor.getName()); 052 } 053 054 protected String getDefaultKey(ScrollDescriptor descriptor) { 055 return getKey(descriptor.getType(), DEFAULT_NAME); 056 } 057 058 protected String getKey(ScrollRequest request) { 059 return getKey(request.getType(), request.getName() == null ? DEFAULT_NAME : request.getName()); 060 } 061 062 protected String getKey(String type, String name) { 063 return type + SEP_KEY + name; 064 } 065 066 @Override 067 public Scroll scroll(ScrollRequest request) { 068 Objects.requireNonNull(request); 069 ScrollDescriptor descriptor = descriptors.get(getKey(request)); 070 if (descriptor == null) { 071 throw new IllegalArgumentException( 072 "Unknown Scroll " + getKey(request) + " implementation for request: " + request); 073 } 074 Scroll scroll = descriptor.newScrollInstance(); 075 scroll.init(request, descriptor.getOptions()); 076 return scroll; 077 } 078 079 @Override 080 public boolean exists(ScrollRequest request) { 081 if (request == null) { 082 return false; 083 } 084 return descriptors.containsKey(getKey(request)); 085 } 086}