1 /* 2 * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.javadoc.internal.doclets.formats.html.markup; 27 28 import java.io.IOException; 29 import java.io.Writer; 30 import java.util.ArrayList; 31 import java.util.Collections; 32 import java.util.List; 33 34 import jdk.javadoc.internal.doclets.toolkit.Content; 35 36 /** 37 * A sequence of Content nodes. 38 */ 39 public class ContentBuilder extends Content { 40 protected List<Content> contents = Collections.emptyList(); 41 ContentBuilder()42 public ContentBuilder() { } 43 ContentBuilder(Content... contents)44 public ContentBuilder(Content... contents) { 45 for (Content c : contents) { 46 addContent(c); 47 } 48 } 49 50 @Override addContent(Content content)51 public void addContent(Content content) { 52 nullCheck(content); 53 ensureMutableContents(); 54 if (content instanceof ContentBuilder) { 55 contents.addAll(((ContentBuilder) content).contents); 56 } else 57 contents.add(content); 58 } 59 60 @Override addContent(CharSequence text)61 public void addContent(CharSequence text) { 62 if (text.length() == 0) 63 return; 64 ensureMutableContents(); 65 Content c = contents.isEmpty() ? null : contents.get(contents.size() - 1); 66 StringContent sc; 67 if (c != null && c instanceof StringContent) { 68 sc = (StringContent) c; 69 } else { 70 contents.add(sc = new StringContent()); 71 } 72 sc.addContent(text); 73 } 74 75 @Override write(Writer writer, boolean atNewline)76 public boolean write(Writer writer, boolean atNewline) throws IOException { 77 for (Content content: contents) { 78 atNewline = content.write(writer, atNewline); 79 } 80 return atNewline; 81 } 82 83 @Override isEmpty()84 public boolean isEmpty() { 85 for (Content content: contents) { 86 if (!content.isEmpty()) 87 return false; 88 } 89 return true; 90 } 91 92 @Override charCount()93 public int charCount() { 94 int n = 0; 95 for (Content c : contents) 96 n += c.charCount(); 97 return n; 98 } 99 ensureMutableContents()100 private void ensureMutableContents() { 101 if (contents.isEmpty()) 102 contents = new ArrayList<>(); 103 } 104 } 105