package com.brightgenerous.pdfbox.writer; import java.util.ArrayList; import java.util.List; import com.brightgenerous.pdfbox.writer.creater.DocumentCreater; import com.brightgenerous.pdfbox.writer.creater.DocumentCreaters; public class PdfWriterBuilder<T> { private static final IPagesAppender DEFAULT_MULTI_APPENDER = new EmptyPagesAppender(); private static final IPageAppender DEFAULT_APPENDER = new EmptyPageAppender(); private static final Boolean DEFAULT_FLATTEN = Boolean.FALSE; private IPagesAppender pagesAppender; private CreaterHolder<T> emptyHolder; private final List<CreaterHolder<T>> createrHolders = new ArrayList<>(); private IResourceLoader<T> defaultResource; private IDataConverter<T> defaultConverter; private IPageAppender defaultAppender; private Boolean defaultFlatten; protected PdfWriterBuilder() { } public static <T> PdfWriterBuilder<T> create() { return new PdfWriterBuilder<>(); } public PdfWriterBuilder<T> clear() { pagesAppender = null; emptyHolder = null; createrHolders.clear(); defaultResource = null; defaultConverter = null; defaultAppender = null; defaultFlatten = null; return this; } // pagesAppender public IPagesAppender pagesAppender() { return pagesAppender; } public PdfWriterBuilder<T> pagesAppender(IPagesAppender pagesAppender) { this.pagesAppender = pagesAppender; return this; } // emptyCreater public PdfWriterBuilder<T> emptyCreater() { return emptyCreater(null, null, null, null); } public PdfWriterBuilder<T> emptyCreater(Boolean flatten) { return emptyCreater(null, null, null, flatten); } public PdfWriterBuilder<T> emptyCreater(IDataConverter<T> converter) { return emptyCreater(null, converter, null, null); } public PdfWriterBuilder<T> emptyCreater(IDataConverter<T> converter, Boolean flatten) { return emptyCreater(null, converter, null, flatten); } public PdfWriterBuilder<T> emptyCreater(IPageAppender appender) { return emptyCreater(null, null, appender, null); } public PdfWriterBuilder<T> emptyCreater(IPageAppender appender, Boolean flatten) { return emptyCreater(null, null, appender, flatten); } public PdfWriterBuilder<T> emptyCreater(IDataConverter<T> converter, IPageAppender appender) { return emptyCreater(null, converter, appender, null); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource) { return emptyCreater(resource, null, null, null); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, Boolean flatten) { return emptyCreater(resource, null, null, flatten); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IDataConverter<T> converter) { return emptyCreater(resource, converter, null, null); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IDataConverter<T> converter, Boolean flatten) { return emptyCreater(resource, converter, null, flatten); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IPageAppender appender) { return emptyCreater(resource, null, appender, null); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IPageAppender appender, Boolean flatten) { return emptyCreater(resource, null, appender, flatten); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IDataConverter<T> converter, IPageAppender appender) { return emptyCreater(resource, converter, appender, null); } public PdfWriterBuilder<T> emptyCreater(IResourceLoader<T> resource, IDataConverter<T> converter, IPageAppender appender, Boolean flatten) { CreaterHolder<T> holder = new CreaterHolder<>(); holder.resource = resource; holder.converter = converter; holder.appender = appender; holder.flatten = flatten; emptyHolder = holder; return this; } // addCreater public PdfWriterBuilder<T> addCreater() { return addCreater(null, null, null, null); } public PdfWriterBuilder<T> addCreater(Boolean flatten) { return addCreater(null, null, null, flatten); } public PdfWriterBuilder<T> addCreater(IDataConverter<T> converter) { return addCreater(null, converter, null, null); } public PdfWriterBuilder<T> addCreater(IDataConverter<T> converter, Boolean flatten) { return addCreater(null, converter, null, flatten); } public PdfWriterBuilder<T> addCreater(IPageAppender appender) { return addCreater(null, null, appender, null); } public PdfWriterBuilder<T> addCreater(IPageAppender appender, Boolean flatten) { return addCreater(null, null, appender, flatten); } public PdfWriterBuilder<T> addCreater(IDataConverter<T> converter, IPageAppender appender) { return addCreater(null, converter, appender, null); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource) { return addCreater(resource, null, null, null); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, Boolean flatten) { return addCreater(resource, null, null, flatten); } public PdfWriterBuilder<T> addPdfReaderCreater(IResourceLoader<T> resource, IDataConverter<T> converter) { return addCreater(resource, converter, null, null); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, IDataConverter<T> converter, Boolean flatten) { return addCreater(resource, converter, null, flatten); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, IPageAppender appender) { return addCreater(resource, null, appender, null); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, IPageAppender appender, Boolean flatten) { return addCreater(resource, null, appender, flatten); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, IDataConverter<T> converter, IPageAppender appender) { return addCreater(resource, converter, appender, null); } public PdfWriterBuilder<T> addCreater(IResourceLoader<T> resource, IDataConverter<T> converter, IPageAppender appender, Boolean flatten) { CreaterHolder<T> holder = new CreaterHolder<>(); holder.resource = resource; holder.converter = converter; holder.appender = appender; holder.flatten = flatten; createrHolders.add(holder); return this; } // defaultResource public IResourceLoader<T> defaultResource() { return defaultResource; } public PdfWriterBuilder<T> defaultResource(IResourceLoader<T> defaultResource) { this.defaultResource = defaultResource; return this; } // defaultConverter public IDataConverter<T> defaultConverter() { return defaultConverter; } public PdfWriterBuilder<T> defaultConverter(IDataConverter<T> defaultConverter) { this.defaultConverter = defaultConverter; return this; } // defaultAppender public IPageAppender defaultAppender() { return defaultAppender; } public PdfWriterBuilder<T> defaultAppender(IPageAppender defaultAppender) { this.defaultAppender = defaultAppender; return this; } // defaultFlatten public Boolean defaultFlatten() { return defaultFlatten; } public PdfWriterBuilder<T> defaultFlatten(Boolean defaultFlatten) { this.defaultFlatten = defaultFlatten; return this; } public PdfWriterBuilder<T> defaultFlatten(boolean defaultFlatten) { return defaultFlatten(defaultFlatten ? Boolean.TRUE : Boolean.FALSE); } // -- protected IPdfWriterStrategy<T> getStrategy() { return new PdfWriterStrategy<>(getCreaters(), getEmptyCreater()); } protected IDocumentCreaters<T> getCreaters() { IPagesAppender appender = pagesAppender; if (appender == null) { appender = DEFAULT_MULTI_APPENDER; } List<IDocumentCreater<T>> creaters = new ArrayList<>(); for (CreaterHolder<T> holder : createrHolders) { holder = replaceIfNull(holder); creaters.add(new DocumentCreater<>(holder.resource, holder.converter, holder.appender, holder.flatten.booleanValue())); } return new DocumentCreaters<>(appender, creaters); } protected IDocumentCreater<T> getEmptyCreater() { CreaterHolder<T> holder = emptyHolder; if (holder == null) { holder = newDefaultEmptyCreaterHolder(); } holder = replaceIfNull(holder); return new DocumentCreater<>(holder.resource, holder.converter, holder.appender, holder.flatten.booleanValue()); } protected CreaterHolder<T> replaceIfNull(CreaterHolder<T> holder) { CreaterHolder<T> ret = new CreaterHolder<>(); ret.resource = holder.resource; if (ret.resource == null) { ret.resource = defaultResource; if (ret.resource == null) { ret.resource = newDefaultResource(); } } ret.converter = holder.converter; if (ret.converter == null) { ret.converter = defaultConverter; if (ret.converter == null) { ret.converter = newDefaultConverter(); } } ret.appender = holder.appender; if (ret.appender == null) { ret.appender = defaultAppender; if (ret.appender == null) { ret.appender = DEFAULT_APPENDER; } } ret.flatten = holder.flatten; if (ret.flatten == null) { ret.flatten = defaultFlatten; if (ret.flatten == null) { ret.flatten = DEFAULT_FLATTEN; } } return ret; } public IPdfWriter<T> build() { return getPdfWriter(getStrategy()); } protected IPdfWriter<T> getPdfWriter(IPdfWriterStrategy<T> strategy) { return new PdfWriter<>(strategy); } private volatile CreaterHolder<T> newDefaultEmptyCreaterHolder; protected CreaterHolder<T> newDefaultEmptyCreaterHolder() { if (newDefaultEmptyCreaterHolder == null) { synchronized (this) { if (newDefaultEmptyCreaterHolder == null) { newDefaultEmptyCreaterHolder = new CreaterHolder<>(); } } } return newDefaultEmptyCreaterHolder; } private volatile IResourceLoader<T> newDefaultResource; protected IResourceLoader<T> newDefaultResource() { if (newDefaultResource == null) { synchronized (this) { if (newDefaultResource == null) { newDefaultResource = new EmptyResourceLoader<>(); } } } return newDefaultResource; } private volatile IDataConverter<T> newDefaultConverter; protected IDataConverter<T> newDefaultConverter() { if (newDefaultConverter == null) { synchronized (this) { if (newDefaultConverter == null) { newDefaultConverter = new EmptyDataConverter<>(); } } } return newDefaultConverter; } protected static class CreaterHolder<T> { IResourceLoader<T> resource; IDataConverter<T> converter; IPageAppender appender; Boolean flatten; } }