Added MimeTypeUtil class

This commit is contained in:
Ziver Koc 2018-10-10 22:22:47 +02:00
parent 8b4217c1d3
commit 62923e7f60
3 changed files with 579 additions and 98 deletions

108
src/zutil/MimeTypeUtil.java Normal file
View file

@ -0,0 +1,108 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2018 Ziver Koc
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package zutil;
import zutil.io.file.FileUtil;
import zutil.parser.DataNode;
import zutil.parser.json.JSONParser;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.*;
/**
* Utility class for MIME type definitions
*/
public class MimeTypeUtil {
// Define mime types
static {
try {
readMimeFile("zutil/data/mime.json");
} catch (IOException e) {
e.printStackTrace();
}
}
// Static variables
private static final ArrayList<MimeType> mimes = new ArrayList<MimeType>();
private static void readMimeFile(String path) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(FileUtil.find(path)));
DataNode json = new JSONParser(in).read();
for (Iterator<String> it = json.keyIterator(); it.hasNext(); ) {
String primaryType = it.next();
for (Iterator<String> it2 = json.get(primaryType).keyIterator(); it2.hasNext(); ) {
String subType = it2.next();
DataNode mimeJson = json.get(primaryType).get(subType);
addMimeType(new MimeType(
primaryType,
subType,
mimeJson.getString("description"),
mimeJson.getList("extensions")));
}
}
}
private static void addMimeType(MimeType mime){
mimes.add(mime);
}
public static class MimeType{
private final String primaryType;
private final String subType;
private final String description;
private final String[] extensions;
private MimeType(String primary, String subType, String description, List extensions) {
this.primaryType = primary;
this.subType = subType;
this.description = description;
this.extensions = (String[]) extensions.toArray(new String[0]);
}
public String getPrimaryType() {
return primaryType;
}
public String getSubType() {
return subType;
}
public String toString() {
return primaryType + "/" + subType;
}
}
}

242
src/zutil/data/mime.json Normal file
View file

@ -0,0 +1,242 @@
{
"audio": {
"aac": {
"description": "AAC audio",
"extensions": ["aac"]
},
"midi": {
"description": "Musical Instrument Digital Interface (MIDI)",
"extensions": ["mid", "midi"]
},
"ogg": {
"description": "OGG audio",
"extensions": ["oga"]
},
"wav": {
"description": "Waveform Audio Format",
"extensions": ["wav"]
},
"webm": {
"description": "WEBM audio",
"extensions": ["weba"]
}
},
"application": {
"octet-stream": {
"description": "Binary data",
"extensions": ["arc", "bin"]
},
"vnd.amazon.ebook": {
"description": "Amazon Kindle eBook format",
"extensions": ["azw"]
},
"x-bzip": {
"description": "BZip archive",
"extensions": ["bz"]
},
"x-bzip2": {
"description": "BZip2 archive",
"extensions": ["bz2"]
},
"x-csh": {
"description": "C-Shell script",
"extensions": ["csh"]
},
"msword": {
"description": "Microsoft Word",
"extensions": ["doc"]
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
"description": "Microsoft Word (OpenXML)",
"extensions": ["docx"]
},
"epub+zip": {
"description": "Electronic publication (EPUB)",
"extensions": ["epub"]
},
"java-archive": {
"description": "Java Archive (JAR)",
"extensions": ["jar"]
},
"json": {
"description": "JSON format",
"extensions": ["json"]
},
"vnd.apple.installer+xml": {
"description": "Apple Installer Package",
"extensions": ["mpkg"]
},
"vnd.oasis.opendocument.presentation": {
"description": "OpenDocument presentation document",
"extensions": ["odp"]
},
"vnd.oasis.opendocument.spreadsheet": {
"description": "OpenDocument spreadsheet document",
"extensions": ["ods"]
},
"vnd.oasis.opendocument.text": {
"description": "OpenDocument text document",
"extensions": ["odt"]
},
"ogg": {
"description": "OGG",
"extensions": ["ogx"]
},
"pdf": {
"description": "Adobe Portable Document Format (PDF)",
"extensions": ["pdf"]
},
"vnd.ms-powerpoint": {
"description": "Microsoft PowerPoint",
"extensions": ["ppt"]
},
"vnd.openxmlformats-officedocument.presentationml.presentation": {
"description": "Microsoft PowerPoint (OpenXML)",
"extensions": ["pptx"]
},
"x-rar-compressed": {
"description": "RAR archive",
"extensions": ["rar"]
},
"rtf": {
"description": "Rich Text Format (RTF)",
"extensions": ["rtf"]
},
"x-sh": {
"description": "Bourne shell script",
"extensions": ["sh"]
},
"x-shockwave-flash": {
"description": "Small web format (SWF) or Adobe Flash document",
"extensions": ["swf"]
},
"x-tar": {
"description": "Tape Archive (TAR)",
"extensions": ["tar"]
},
"typescript": {
"description": "Typescript file",
"extensions": ["ts"]
},
"xhtml+xml": {
"description": "XHTML",
"extensions": ["xhtml"]
},
"vnd.ms-excel": {
"description": "Microsoft Excel",
"extensions": ["xls"]
},
"vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
"description": "Microsoft Excel (OpenXML)",
"extensions": ["xlsx"]
},
"xml": {
"description": "XML",
"extensions": ["xml"]
},
"zip": {
"description": "ZIP archive",
"extensions": ["zip"]
},
"x-7z-compressed": {
"description": "7-zip archive",
"extensions": ["7z"]
}
},
"font": {
"otf": {
"description": "OpenType font",
"extensions": ["otf"]
},
"ttf": {
"description": "TrueType Font",
"extensions": ["ttf"]
},
"woff": {
"description": "Web Open Font Format (WOFF)",
"extensions": ["woff"]
},
"woff2": {
"description": "Web Open Font Format (WOFF)",
"extensions": ["woff2"]
}
},
"video": {
"x-msvideo": {
"description": "AVI: Audio Video Interleave",
"extensions": ["avi"]
},
"mpeg": {
"description": "MPEG Video",
"extensions": ["mpeg"]
},
"ogg": {
"description": "OGG video",
"extensions": ["ogv"]
},
"webm": {
"description": "WEBM video",
"extensions": ["webm"]
}
},
"image": {
"bmp": {
"description": "Windows OS/2 Bitmap Graphics",
"extensions": ["bmp"]
},
"gif": {
"description": "Graphics Interchange Format (GIF)",
"extensions": ["gif"]
},
"x-icon": {
"description": "Icon format",
"extensions": ["ico"]
},
"jpeg": {
"description": "JPEG image",
"extensions": ["jpeg", "jpg"]
},
"png": {
"description": "Portable Network Graphics",
"extensions": ["png"]
},
"svg+xml": {
"description": "Scalable Vector Graphics (SVG)",
"extensions": ["svg"]
},
"tiff": {
"description": "Tagged Image File Format (TIFF)",
"extensions": ["tif", "tiff"]
},
"webp": {
"description": "WEBP image",
"extensions": ["webp"]
}
},
"text":{
"css": {
"description": "Cascading Style Sheets (CSS)",
"extensions": ["css"]
},
"csv": {
"description": "Comma-separated values (CSV)",
"extensions": ["csv"]
},
"html": {
"description": "HyperText Markup Language (HTML)",
"extensions": ["htm", "html"]
},
"calendar": {
"description": "iCalendar format",
"extensions": ["ics"]
},
"javascript": {
"description": "JavaScript",
"extensions": ["js"]
},
"plain": {
"description": "Text, (generally ASCII or ISO 8859-n)",
"extensions": ["txt"]
}
}
}

View file

@ -32,11 +32,12 @@ import java.util.*;
*
* @author Ziver
*/
public class DataNode implements Iterable<DataNode>{
public enum DataType{
public class DataNode implements Iterable<DataNode> {
public enum DataType {
Map, List, String, Number, Boolean
}
private Map<String,DataNode> map = null;
private Map<String, DataNode> map = null;
private List<DataNode> list = null;
private String value = null;
private DataType type;
@ -45,50 +46,57 @@ public class DataNode implements Iterable<DataNode>{
/**
* Creates an instance with an Boolean value
*/
public DataNode(boolean value){
public DataNode(boolean value) {
this.type = DataType.Boolean;
this.value = ""+value;
this.value = "" + value;
}
/**
* Creates an instance with an int value
*/
public DataNode(int value){
public DataNode(int value) {
this.type = DataType.Number;
this.value = ""+value;
this.value = "" + value;
}
/**
* Creates an instance with an double value
*/
public DataNode(double value){
public DataNode(double value) {
this.type = DataType.Number;
this.value = ""+value;
this.value = "" + value;
}
/**
* Creates an instance with an long value
*/
public DataNode(long value){
public DataNode(long value) {
this.type = DataType.Number;
this.value = ""+value;
this.value = "" + value;
}
/**
* Creates an instance with an String value
*/
public DataNode(String value){
public DataNode(String value) {
this.type = DataType.String;
this.value = value;
}
/**
* Creates an instance with a specific type
*/
public DataNode(DataType type){
public DataNode(DataType type) {
this.type = type;
switch(type){
case Map:
map = new HashMap<>(); break;
case List:
list = new LinkedList<>(); break;
default:
break;
switch (type) {
case Map:
map = new HashMap<>();
break;
case List:
list = new LinkedList<>();
break;
default:
break;
}
}
@ -96,19 +104,20 @@ public class DataNode implements Iterable<DataNode>{
* @param index is the index of the List or Map
* @return an JSONNode that contains the next level of the List or Map
*/
public DataNode get(int index){
if(map != null)
return map.get(""+index);
else if(list != null)
public DataNode get(int index) {
if (map != null)
return map.get("" + index);
else if (list != null)
return list.get(index);
return null;
}
/**
* @param index is the key in the Map
* @return an JSONNode that contains the next level of the Map
*/
public DataNode get(String index){
if(map != null)
public DataNode get(String index) {
if (map != null)
return map.get(index);
return null;
}
@ -116,28 +125,30 @@ public class DataNode implements Iterable<DataNode>{
/**
* @return a iterator for the Map or List or null if the node contains a value
*/
public Iterator<DataNode> iterator(){
if(map != null)
public Iterator<DataNode> iterator() {
if (map != null)
return map.values().iterator();
else if(list != null)
else if (list != null)
return list.iterator();
return null;
}
/**
* @return a iterator for the keys in the Map or null if the node contains a value or List
*/
public Iterator<String> keyIterator(){
if(map != null)
public Iterator<String> keyIterator() {
if (map != null)
return map.keySet().iterator();
return null;
}
/**
* @return the size of the Map or List or -1 if it is a value
*/
public int size(){
if(map != null)
public int size() {
if (map != null)
return map.size();
else if(list != null)
else if (list != null)
return list.size();
return -1;
}
@ -146,87 +157,114 @@ public class DataNode implements Iterable<DataNode>{
/**
* Adds a node to the List
*/
public void add(DataNode node){
public void add(DataNode node) {
list.add(node);
}
public void add(boolean value){
list.add(new DataNode( value ));
public void add(boolean value) {
list.add(new DataNode(value));
}
public void add(int value){
list.add(new DataNode( value ));
public void add(int value) {
list.add(new DataNode(value));
}
public void add(double value){
list.add(new DataNode( value ));
public void add(double value) {
list.add(new DataNode(value));
}
public void add(long value){
list.add(new DataNode( value ));
public void add(long value) {
list.add(new DataNode(value));
}
public void add(String value){
list.add(new DataNode( value ));
public void add(String value) {
list.add(new DataNode(value));
}
/**
* Adds a node to the Map
*/
public void set(String key, DataNode node){
public void set(String key, DataNode node) {
map.put(key, node);
}
public void set(String key, boolean value){
public void set(String key, boolean value) {
map.put(key, new DataNode(value));
}
public void set(String key, int value){
public void set(String key, int value) {
map.put(key, new DataNode(value));
}
public void set(String key, double value){
public void set(String key, double value) {
map.put(key, new DataNode(value));
}
public void set(String key, long value){
public void set(String key, long value) {
map.put(key, new DataNode(value));
}
public void set(String key, String value){
public void set(String key, String value) {
map.put(key, new DataNode(value));
}
/**
* Sets the value of the node
* @exception NullPointerException if the node is setup as anything other than a DataType.Number
*
* @throws NullPointerException if the node is setup as anything other than a DataType.Number
*/
public void set(int value){
if( this.type != DataType.Number )
public void set(int value) {
if (this.type != DataType.Number)
throw new NullPointerException("The node is not setup as a DataType.Number");
this.value = ""+value;
this.value = "" + value;
}
/**
* Sets the value of the node
* @exception NullPointerException if the node is setup as anything other than a DataType.Number
*
* @throws NullPointerException if the node is setup as anything other than a DataType.Number
*/
public void set(double value){
if( this.type != DataType.Number )
public void set(double value) {
if (this.type != DataType.Number)
throw new NullPointerException("The node is not setup as a DataType.Number");
this.value = ""+value;
this.value = "" + value;
}
/**
* Sets the value of the node
* @exception NullPointerException if the node is setup as anything other than a DataType.Boolean
*
* @throws NullPointerException if the node is setup as anything other than a DataType.Boolean
*/
public void set(boolean value){
if( this.type != DataType.Boolean )
public void set(boolean value) {
if (this.type != DataType.Boolean)
throw new NullPointerException("The node is not setup as a DataType.Boolean");
this.value = ""+value;
this.value = "" + value;
}
/**
* Sets the value of the node, but only
* @exception NullPointerException if the node is setup as anything other than a DataType.Number
*
* @throws NullPointerException if the node is setup as anything other than a DataType.Number
*/
public void set(long value){
if( this.type != DataType.Number )
public void set(long value) {
if (this.type != DataType.Number)
throw new NullPointerException("The node is not setup as a DataType.Number");
this.value = ""+value;
this.value = "" + value;
}
/**
* Sets the value of the node
* @exception NullPointerException if the method DataType.isValue() returns false
*
* @throws NullPointerException if the method DataType.isValue() returns false
*/
public void set(String value){
if( !this.isValue() ) throw new NullPointerException("The node is not setup as a value node");
public void set(String value) {
if (!this.isValue())
throw new NullPointerException("The node is not setup as a value node");
this.value = value;
}
@ -234,108 +272,201 @@ public class DataNode implements Iterable<DataNode>{
/**
* @return if this node contains an Map
*/
public boolean isMap(){
public boolean isMap() {
return type == DataType.Map;
}
/**
* @return if this node contains an List
*/
public boolean isList(){
public boolean isList() {
return type == DataType.List;
}
/**
* @return if this node contains an value
*/
public boolean isValue(){
public boolean isValue() {
return type != DataType.Map && type != DataType.List;
}
/**
* @return the type of the node
*/
public DataType getType(){
public DataType getType() {
return type;
}
/**
* @return the String value in this map
* @return the String value in this map or null or if key does not exist
* @throws NullPointerException if the node is not of type map
*/
public String getString(String key){
if( !this.isMap() ) throw new NullPointerException("The node is not setup as a map");
if( !this.map.containsKey(key) )
public String getString(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
if (!this.map.containsKey(key))
return null;
return this.get(key).getString();
}
/**
* @return the boolean value in this map
* @throws NullPointerException if the node is not of type map or if key does not exist
*/
public boolean getBoolean(String key){
if( !this.isMap() ) throw new NullPointerException("The node is not setup as a map");
if( !this.map.containsKey(key) ) throw new NullPointerException("No such key in map");
public boolean getBoolean(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
if (!this.map.containsKey(key))
throw new NullPointerException("No such key '" + key + "' in map");
return this.get(key).getBoolean();
}
/**
* @return the integer value in this map
* @throws NullPointerException if the node is not of type map or if key does not exist
*/
public int getInt(String key){
if( !this.isMap() ) throw new NullPointerException("The node is not setup as a map");
if( !this.map.containsKey(key) ) throw new NullPointerException("No such key in map");
public int getInt(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
if (!this.map.containsKey(key))
throw new NullPointerException("No such key '" + key + "' in map");
return this.get(key).getInt();
}
/**
* @return the double value in this map
* @throws NullPointerException if the node is not of type map or if key does not exist
*/
public double getDouble(String key){
if( !this.isMap() ) throw new NullPointerException("The node is not setup as a map");
if( !this.map.containsKey(key) ) throw new NullPointerException("No such key in map");
public double getDouble(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
if (!this.map.containsKey(key))
throw new NullPointerException("No such key '" + key + "' in map");
return this.get(key).getDouble();
}
/**
* @return the long value in this map
* @throws NullPointerException if the node is not of type map or if key does not exist
*/
public long getLong(String key){
if( !this.isMap() ) throw new NullPointerException("The node is not setup as a map");
if( !this.map.containsKey(key) ) throw new NullPointerException("No such key in map");
public long getLong(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
if (!this.map.containsKey(key))
throw new NullPointerException("No such key '" + key + "' in map");
return this.get(key).getLong();
}
/**
* @return the long value in this map
* @throws NullPointerException if the node is not of type map
*/
public List getList(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
return this.get(key).getList();
}
/**
* @return the long value in this map
* @throws NullPointerException if the node is not of type map
*/
public Map getMap(String key) {
if (!this.isMap())
throw new NullPointerException("The node is not setup as a map");
return this.get(key).getMap();
}
/**
* @return the String value in this node, null if its a Map or List
*/
public String getString(){
public String getString() {
return value;
}
/**
* @return the boolean value in this node
*/
public boolean getBoolean(){
public boolean getBoolean() {
return Boolean.parseBoolean(value);
}
/**
* @return the integer value in this node
*/
public int getInt(){
public int getInt() {
return Integer.parseInt(value);
}
/**
* @return the double value in this node
*/
public double getDouble(){
public double getDouble() {
return Double.parseDouble(value);
}
/**
* @return the long value in this node
*/
public long getLong(){
public long getLong() {
return Long.parseLong(value);
}
/**
* @return a list with the items in the node
* @throws NullPointerException if the node is not of type list
*/
public List getList() {
if (!this.isList()) throw new NullPointerException("The node is not setup as a list");
public String toString(){
if( this.isMap() )
List output = new ArrayList();
for (DataNode node : this) {
switch (node.getType()) {
case Map: output.add(node.getMap()); break;
case List: output.add(node.getList()); break;
case Number: output.add(node.getDouble()); break;
case Boolean: output.add(node.getBoolean()); break;
case String: output.add(node.getString()); break;
}
}
return output;
}
/**
* @return a map with the items in the node
* @throws NullPointerException if the node is not of type map
*/
public Map getMap() {
if (!this.isMap()) throw new NullPointerException("The node is not setup as a map");
Map output = new HashMap();
for (String key : map.keySet()) {
DataNode node = get(key);
switch (node.getType()) {
case Map: output.put(key, node.getMap()); break;
case List: output.put(key, node.getList()); break;
case Number: output.put(key, node.getDouble()); break;
case Boolean: output.put(key, node.getBoolean()); break;
case String: output.put(key, node.getString()); break;
}
}
return output;
}
public String toString() {
if (this.isMap())
return map.toString();
else if( this.isList() )
else if (this.isList())
return list.toString();
return value;
}