package com.revolsys.io; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.PostConstruct; public abstract class AbstractIoFactory implements IoFactory { private final List<String> fileExtensions = new ArrayList<>(); private final Map<String, Set<String>> fileExtensionToMediaType = new HashMap<>(); private final Set<String> mediaTypes = new HashSet<>(); private final Map<String, Set<String>> mediaTypeToFileExtension = new HashMap<>(); private final String name; public AbstractIoFactory(final String name) { this.name = name; } private void add(final Map<String, Set<String>> mapSet, final String key, final String value) { Set<String> set = mapSet.get(key); if (set == null) { set = new LinkedHashSet<>(); mapSet.put(key, set); } set.add(value); } protected void addFileExtension(final String fileExtension) { addFileExtensionInternal(fileExtension); if (isReadFromZipFileSupported()) { addFileExtensionInternal(fileExtension + "z"); addFileExtensionInternal(fileExtension + ".zip"); } } protected void addFileExtensionInternal(final String fileExtension) { if (!this.fileExtensions.contains(fileExtension)) { this.fileExtensions.add(fileExtension); } } protected void addMediaType(final String mediaType) { this.mediaTypes.add(mediaType); } protected void addMediaTypeAndFileExtension(final String mediaType, final String fileExtension) { addFileExtension(fileExtension); addMediaType(mediaType); add(this.mediaTypeToFileExtension, mediaType, fileExtension); add(this.mediaTypeToFileExtension, fileExtension, fileExtension); add(this.fileExtensionToMediaType, fileExtension, mediaType); add(this.fileExtensionToMediaType, mediaType, mediaType); } @Override public String getFileExtension(final String mediaType) { final Set<String> fileExtensions = this.mediaTypeToFileExtension.get(mediaType); if (fileExtensions == null) { return null; } else { final Iterator<String> iterator = fileExtensions.iterator(); if (iterator.hasNext()) { final String fileExtension = iterator.next(); return fileExtension; } else { return null; } } } @Override public List<String> getFileExtensions() { return this.fileExtensions; } @Override public String getMediaType(final String fileExtension) { final Set<String> mediaTypes = this.fileExtensionToMediaType.get(fileExtension); if (mediaTypes == null) { return null; } else { final Iterator<String> iterator = mediaTypes.iterator(); if (iterator.hasNext()) { final String mediaType = iterator.next(); return mediaType; } else { return null; } } } @Override public Set<String> getMediaTypes() { return this.mediaTypes; } @Override public String getName() { return this.name; } @Override @PostConstruct public void init() { } // TODO Required because JSP API doesn't support default methods for // properties public boolean isBinary() { return false; } @Override public String toString() { return getName(); } }