View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.dict;
17  
18  import java.io.BufferedInputStream;
19  import java.io.IOException;
20  import java.io.InputStream;
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.Date;
24  import java.util.Iterator;
25  import java.util.List;
26  import java.util.ListIterator;
27  
28  import org.codelibs.curl.CurlResponse;
29  import org.dbflute.optional.OptionalEntity;
30  import org.lastaflute.web.servlet.request.stream.WrittenStreamOut;
31  
32  public abstract class DictionaryFile<T extends DictionaryItem> {
33      protected DictionaryManager dictionaryManager;
34  
35      protected String id;
36  
37      protected String path;
38  
39      protected Date timestamp;
40  
41      public DictionaryFile(final String id, final String path, final Date timestamp) {
42          this.id = id;
43          this.path = path;
44          this.timestamp = timestamp;
45      }
46  
47      public String getId() {
48          return id;
49      }
50  
51      public String getPath() {
52          return path;
53      }
54  
55      public Date getTimestamp() {
56          return timestamp;
57      }
58  
59      public DictionaryFile<T> manager(final DictionaryManager dictionaryManager) {
60          this.dictionaryManager = dictionaryManager;
61          return this;
62      }
63  
64      public void writeOut(final WrittenStreamOut out) throws IOException {
65          try (final CurlResponse curlResponse = dictionaryManager.getContentResponse(this);
66                  final InputStream inputStream = new BufferedInputStream(curlResponse.getContentAsStream())) {
67              out.write(inputStream);
68          }
69      }
70  
71      public abstract String getType();
72  
73      public abstract PagingList<T> selectList(int offset, int size);
74  
75      public abstract OptionalEntity<T> get(long id);
76  
77      public abstract void insert(T item);
78  
79      public abstract void update(T item);
80  
81      public abstract void delete(T item);
82  
83      public static class PagingList<E> implements List<E> {
84          private final List<E> parent;
85  
86          protected int allPageCount;
87  
88          protected int allRecordCount;
89  
90          protected int pageSize;
91  
92          protected int currentPageNumber;
93  
94          protected int pageRangeSize;
95  
96          public PagingList(final List<E> list, final int offset, final int size, final int allRecordCount) {
97              this.parent = list;
98              this.allRecordCount = allRecordCount;
99              pageSize = size;
100             currentPageNumber = offset / size + 1;
101             allPageCount = (allRecordCount - 1) / size + 1;
102         }
103 
104         @Override
105         public int size() {
106             return parent.size();
107         }
108 
109         @Override
110         public boolean isEmpty() {
111             return parent.isEmpty();
112         }
113 
114         @Override
115         public boolean contains(final Object o) {
116             return parent.contains(o);
117         }
118 
119         @Override
120         public Iterator<E> iterator() {
121             return parent.iterator();
122         }
123 
124         @Override
125         public Object[] toArray() {
126             return parent.toArray();
127         }
128 
129         @Override
130         public <T> T[] toArray(final T[] a) {
131             return parent.toArray(a);
132         }
133 
134         @Override
135         public boolean add(final E e) {
136             return parent.add(e);
137         }
138 
139         @Override
140         public boolean remove(final Object o) {
141             return parent.remove(o);
142         }
143 
144         @Override
145         public boolean containsAll(final Collection<?> c) {
146             return parent.containsAll(c);
147         }
148 
149         @Override
150         public boolean addAll(final Collection<? extends E> c) {
151             return parent.addAll(c);
152         }
153 
154         @Override
155         public boolean addAll(final int index, final Collection<? extends E> c) {
156             return parent.addAll(index, c);
157         }
158 
159         @Override
160         public boolean removeAll(final Collection<?> c) {
161             return parent.retainAll(c);
162         }
163 
164         @Override
165         public boolean retainAll(final Collection<?> c) {
166             return parent.retainAll(c);
167         }
168 
169         @Override
170         public void clear() {
171             parent.clear();
172         }
173 
174         @Override
175         public E get(final int index) {
176             return parent.get(index);
177         }
178 
179         @Override
180         public E set(final int index, final E element) {
181             return parent.set(index, element);
182         }
183 
184         @Override
185         public void add(final int index, final E element) {
186             parent.add(index, element);
187         }
188 
189         @Override
190         public E remove(final int index) {
191             return parent.remove(index);
192         }
193 
194         @Override
195         public int indexOf(final Object o) {
196             return parent.indexOf(o);
197         }
198 
199         @Override
200         public int lastIndexOf(final Object o) {
201             return parent.lastIndexOf(o);
202         }
203 
204         @Override
205         public ListIterator<E> listIterator() {
206             return parent.listIterator();
207         }
208 
209         @Override
210         public ListIterator<E> listIterator(final int index) {
211             return parent.listIterator(index);
212         }
213 
214         @Override
215         public List<E> subList(final int fromIndex, final int toIndex) {
216             return parent.subList(fromIndex, toIndex);
217         }
218 
219         public int getAllRecordCount() {
220             return allRecordCount;
221         }
222 
223         public int getPageSize() {
224             return pageSize;
225         }
226 
227         public int getCurrentPageNumber() {
228             return currentPageNumber;
229         }
230 
231         public int getAllPageCount() {
232             return allPageCount;
233         }
234 
235         public boolean isExistPrePage() {
236             return currentPageNumber != 1;
237         }
238 
239         public boolean isExistNextPage() {
240             return currentPageNumber != allPageCount;
241         }
242 
243         public void setPageRangeSize(final int pageRangeSize) {
244             this.pageRangeSize = pageRangeSize;
245         }
246 
247         public List<Integer> createPageNumberList() {
248             int startPage = currentPageNumber - pageRangeSize;
249             if (startPage < 1) {
250                 startPage = 1;
251             }
252             int endPage = currentPageNumber + pageRangeSize;
253             if (endPage > allPageCount) {
254                 endPage = allPageCount;
255             }
256             final List<Integer> pageNumberList = new ArrayList<>();
257             for (int i = startPage; i <= endPage; i++) {
258                 pageNumberList.add(i);
259             }
260             return pageNumberList;
261         }
262 
263     }
264 
265 }