package com.github.dreamhead.moco.parser.model; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.github.dreamhead.moco.parser.deserializer.FileContainerDeserializer; import com.github.dreamhead.moco.resource.ContentResource; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import java.util.Map; import static com.google.common.base.Optional.absent; import static com.google.common.base.Optional.of; @JsonDeserialize(using = FileContainerDeserializer.class) public final class FileContainer extends TextContainer { private TextContainer name; private Optional<Charset> charset; private TextContainer content; private FileContainer(final TextContainer container) { this.name = container; this.charset = absent(); this.content = container; } private FileContainer(final TextContainer name, final Optional<Charset> charset) { this.name = name; this.charset = charset; this.content = null; } public TextContainer getName() { return name; } public Optional<Charset> getCharset() { return charset; } @Override public ContentResource asResource() { if (this.content == null) { return null; } return this.content.asResource(); } @Override public ContentResource asTemplateResource() { if (this.content == null) { return null; } return this.content.asTemplateResource(); } @Override public ContentResource asTemplateResource(final String resourceName) { if (this.content == null) { return null; } return this.content.asTemplateResource(resourceName); } @Override public boolean isRawText() { return this.content != null && this.content.isRawText(); } @Override public String getText() { if (this.content == null) { return null; } return this.content.getText(); } @Override public String getOperation() { if (this.content == null) { return null; } return this.content.getOperation(); } @Override public boolean hasProperties() { return this.content != null && this.content.hasProperties(); } @Override public Map<String, TextContainer> getProps() { if (this.content == null) { return null; } return this.content.getProps(); } @Override public boolean isForTemplate() { return this.content != null && this.content.isForTemplate(); } @Override public String toString() { return MoreObjects.toStringHelper(this) .omitNullValues() .add("name", name) .add("charset", charset) .toString(); } @Override public boolean isFileContainer() { return true; } public static FileContainer asFileContainer(final TextContainer container) { return new FileContainer(container); } public static FileContainerBuilder aFileContainer() { return new FileContainerBuilder(); } public static class FileContainerBuilder { private TextContainer name; private String charset; public FileContainerBuilder withName(final TextContainer name) { this.name = name; return this; } public FileContainerBuilder withCharset(final String charset) { this.charset = charset; return this; } public FileContainer build() { return new FileContainer(name, toCharset(charset)); } private Optional<Charset> toCharset(final String charset) { if (charset == null) { return absent(); } try { return of(Charset.forName(charset)); } catch (UnsupportedCharsetException e) { return absent(); } } } }