DataContentHandlerManager.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package org.openspcoop2.utils.dch;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.activation.CommandInfo;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;

import org.slf4j.Logger;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.UtilsException;

/**
 * DataContentHandlerManager
 *
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DataContentHandlerManager {

	private Logger log;
	
	public DataContentHandlerManager(Logger log){
		this.log = log;
	}
	
	public void initMailcap(){
		// NOTA, anche se gia' esistenti le registrazioni, è importante farlo caricare per fargliele vedere.
		
		try{
			this.log.info("Search mailcap.default ...");
			Enumeration<URL> en = DataContentHandlerManager.class.getClassLoader().getResources("/META-INF/mailcap.default");
			if(en!=null){
				while (en.hasMoreElements()) {
					URL url = (URL) en.nextElement();
					this.log.info("Find mailcap.default ["+url.toString()+"]");
					this.log.info("Read mailcap.default ["+url.toString()+"] ...");
					byte[] tmp = Utilities.getAsByteArray(url);
					this.log.info("Read mailcap.default ["+url.toString()+"]: "+new String(tmp));
					addMimeTypesIntoMailcap(tmp);
				}
			}
		}catch(Exception e){
			this.log.error("Mailcap.default search error: "+e.getMessage(),e);
		}
		
		try{
			this.log.info("Search mailcap ...");
			Enumeration<URL> en = DataContentHandlerManager.class.getClassLoader().getResources("/META-INF/mailcap");
			if(en!=null){
				while (en.hasMoreElements()) {
					URL url = (URL) en.nextElement();
					this.log.info("Find mailcap ["+url.toString()+"]");
					this.log.info("Read mailcap ["+url.toString()+"] ...");
					byte[] tmp = Utilities.getAsByteArray(url);
					this.log.info("Read mailcap ["+url.toString()+"]: "+new String(tmp));
					addMimeTypesIntoMailcap(tmp);
				}
			}
		}catch(Exception e){
			this.log.error("Mailcap search error: "+e.getMessage(),e);
		}
	}
	
	
	public List<String> readMimeTypesRegistrati() {
		return readMimeTypesRegistrati(true);
	}
	public List<String> readMimeTypesRegistrati(boolean debug) {
		
		MailcapCommandMap mcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
		
		String [] gestiti = mcap.getMimeTypes();
		List<String> gestitiAsList = new ArrayList<>();
		if(gestiti!=null){
			if(debug) {
				this.log.info("MimeTypes registrati: ["+gestiti.length+"]");
			}
			for (int i = 0; i < gestiti.length; i++) {
				if(debug) {
					this.log.info("MimeType registrato: ["+gestiti[i]+"]");
				}
				gestitiAsList.add(gestiti[i]);
				CommandInfo [] cis = mcap.getAllCommands(gestiti[i]);
				for (int j = 0; j < cis.length; j++) {
					if(debug) {
						this.log.info("\t["+j+"] "+cis[j].getCommandName()+" = "+cis[j].getCommandClass());
					}
				}
			}
		}
		else{
			if(debug) {
				this.log.info("Non risultano registrati MimeTypes");
			}
		}
		
		return gestitiAsList;
	}
	
	public Map<String,String> readMimeTypesContentHandler() {
		return readMimeTypesContentHandler(true);
	}
	public Map<String,String> readMimeTypesContentHandler(boolean debug) {
		return _readMimeTypesClass(debug, "content-handler");
	}
	
	public Map<String,String> readMimeTypesView() {
		return readMimeTypesView(true);
	}
	public Map<String,String> readMimeTypesView(boolean debug) {
		return _readMimeTypesClass(debug, "view");
	}
	
	public Map<String,String> readMimeTypesEdit() {
		return readMimeTypesEdit(true);
	}
	public Map<String,String> readMimeTypesEdit(boolean debug) {
		return _readMimeTypesClass(debug, "edit");
	}
	
	private Map<String,String> _readMimeTypesClass(boolean debug,String commandName) {
		MailcapCommandMap mcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
		
		String [] gestiti = mcap.getMimeTypes();
		Map<String,String> map = new HashMap<>();
		if(gestiti!=null){
			if(debug) {
				this.log.info("MimeTypes ("+commandName+") registrati: ["+gestiti.length+"]");
			}
			for (int i = 0; i < gestiti.length; i++) {
				if(debug) {
					this.log.info("MimeType ("+commandName+") registrato: ["+gestiti[i]+"]");
				}
				CommandInfo [] cis = mcap.getAllCommands(gestiti[i]);
				if(cis!=null && cis.length>0) {
					for (int j = 0; j < cis.length; j++) {
						if(debug) {
							this.log.info("\t["+j+"] "+cis[j].getCommandName()+" = "+cis[j].getCommandClass());
						}
						if(commandName.equalsIgnoreCase(cis[j].getCommandName())) {
							map.put(gestiti[i],cis[j].getCommandClass());
						}
					}
				}
			}
		}
		else{
			if(debug) {
				this.log.info("Non risultano registrati MimeTypes ("+commandName+")");
			}
		}
		return map;
	}
	
	public void addMimeTypeIntoMailcap(String commandInfo) throws UtilsException{
		
		if(commandInfo.contains(";;")==false){
			throw new UtilsException("Formato non corretto, non è stato riscontrato il carattere ';;'");
		}
		String [] split = commandInfo.split(";;");
		if(split==null || split.length!=2){
			throw new UtilsException("Formato non corretto");
		}
		
		MailcapCommandMap mcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
		mcap.addMailcap(commandInfo);
		CommandMap.setDefaultCommandMap(mcap);
		
		this.log.info("Registrato in Mailcap il mimetype ["+split[0]+"]: "+commandInfo);
	}
	
	public void addMimeTypesIntoMailcap(byte[] mailcap) throws IOException, UtilsException{
		
		List<String> gestitiAsList = this.readMimeTypesRegistrati(false);
		
		BufferedReader br = null;
		InputStreamReader isr = null;
		ByteArrayInputStream bin = null;
		try{
			bin = new ByteArrayInputStream(mailcap);
			isr = new InputStreamReader(bin);
			br = new BufferedReader(isr);
			String strLine;
			//Read File Line By Line
			while ((strLine = br.readLine()) != null)   {
				// Print the content on the console
				//System.out.println (strLine);
				if(strLine!=null && strLine.startsWith("#")==false){
					if(strLine.contains(";;")){
						String [] split = strLine.split(";;");
						if(gestitiAsList.contains(split[0])==false){
							gestitiAsList.add(split[0]);
							this.addMimeTypeIntoMailcap(strLine);
						}
					}
				}
			}
		}finally{
			try{
				br.close();
			}catch(Exception eClose){}
			try{
				isr.close();
			}catch(Exception eClose){}
			try{
				bin.close();
			}catch(Exception eClose){}
		}
		
	}
	
}