View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.devacfr.maven.skins.reflow.snippet;
20  
21  import java.util.ArrayList;
22  
23  import org.jsoup.internal.StringUtil;
24  
25  /**
26   * @author Christophe Friederich
27   * @version 2.4
28   */
29  public class Components extends ArrayList<Component<?>> {
30  
31      /** */
32      private static final long serialVersionUID = 1L;
33  
34      /** */
35      private static final Components EMPTY = new Components();
36  
37      /** */
38      public static Components empty() {
39          return EMPTY;
40      }
41  
42      /**
43       *
44       */
45      public Components() {
46      }
47  
48      /**
49       * @return
50       */
51      public String html() {
52          final StringBuilder sb = StringUtil.borrowBuilder();
53          for (final Component<?> component : this) {
54              if (sb.length() != 0) {
55                  sb.append("\n");
56              }
57              final String html = component.getHtml();
58              if (html != null) {
59                  sb.append(html);
60              }
61          }
62          return StringUtil.releaseBuilder(sb);
63      }
64  
65      /**
66       * Get the first matched element.
67       *
68       * @return The first matched component, or <code>null</code> if contents is empty.
69       */
70      public Component<?> first() {
71          return isEmpty() ? null : get(0);
72      }
73  
74      /**
75       * Get the last matched component.
76       *
77       * @return The last matched component, or <code>null</code> if contents is empty.
78       */
79      public Component<?> last() {
80          return isEmpty() ? null : get(size() - 1);
81      }
82  }