import java.net.URLConnection;
import java.net.URL;
import java.net.HttpURLConnection;

import java.nio.charset.Charset;

import java.util.Iterator;
import java.util.ArrayList;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.FileInputStream;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.awt.Color;
import java.awt.Image;
import java.awt.GridLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Canvas;

import javax.imageio.ImageIO;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.JScrollPane;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.JTextArea;
import java.util.List;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.name.Rename;

import org.apache.sanselan.*;
import org.apache.sanselan.common.*;
import org.apache.sanselan.formats.jpeg.*;
import org.apache.sanselan.formats.tiff.*;
import org.apache.sanselan.formats.tiff.constants.*;

import ij.ImagePlus;
import ij.plugin.*;

/*************************************************************************************************************************************************/
public class Extract_exif implements PlugIn{
	private JFrame frame;
	private final  JTable tabella;
	private JTable tabella2;
	private DefaultTableModel model;
	private DefaultTableModel model2;
	private static TiffImageMetadata exifMetadata = null;
	private static File selected = null;
	private ImagePlus imp = null;
	
	JButton next=new JButton("NEXT IMAGE");
	JButton prev = new JButton("PREVIOUS IMAGE");
	JButton save = new JButton("SAVE");
	boolean salv1 = false;
	String chiave="";
	String test="";
	String percorso1 ="C:\\File\\thumbnail\\";
	int numero=0;
	int numFoto=0;
	node E = null;
	File f=null;
	boolean condizione1=true;
	lista tmp = new lista();
	String operatore="";

	public void run(String args) {
		Extract_exif window = new Extract_exif();
		window.frame.setVisible(true);
	}	
	
/***************************************************************** costruttore*****************************************************************/

	public Extract_exif() { 
		
		// frame
		
		frame = new JFrame();
		frame.setTitle("EXIF DATA FROM   http://www.flickr.com OR EXTRACT PHOTO FROM   https://www.facebook.com ");
		frame.setResizable(false);
		frame.setAlwaysOnTop(false);
		frame.setSize(1350,700);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		frame.getContentPane().setBackground(Color.WHITE);
		//labelNumber
		final JLabel labelN = new JLabel(numFoto+"   di  "+numero);
		labelN.setBounds(980, 350, 200, 15);
		frame.getContentPane().add(labelN);
		labelN.setEnabled(true);
		labelN.setForeground(Color.RED);
		//label nome foto
		final JLabel labelS = new JLabel("Salva con nome:");
		labelS.setBounds(1050, 400, 100, 15);
		frame.getContentPane().add(labelS);
		labelS.setEnabled(false);
		labelS.setForeground(Color.RED);
		// textArea key
		final JTextArea textAreaS = new JTextArea();
		frame.getContentPane().add(textAreaS);
		textAreaS.setBounds(1150, 400, 150, 30);
		textAreaS.setEnabled(false);
		textAreaS.setBackground(new java.awt.Color(190, 231, 241));
		// labelKey
		final JLabel labelKey = new JLabel("INSERT YOUR KEY");
		labelKey.setBounds(300, 3, 200, 15);
		frame.getContentPane().add(labelKey);
		labelKey.setEnabled(false);
		labelKey.setForeground(Color.RED);
		// textArea key
		final JTextArea textArea = new JTextArea();
		frame.getContentPane().add(textArea);
		textArea.setBounds(300, 25, 200, 30);
		textArea.setEnabled(false);
		textArea.setBackground(new java.awt.Color(190, 231, 241));
		// label numfoto
		final JLabel labelF = new JLabel("How many photo you want to download?");
		labelF.setBounds(500, 450, 400, 15);
		frame.getContentPane().add(labelF);
		labelF.setEnabled(true);
		labelF.setForeground(Color.RED);
		// textAreaFoto
		final JTextArea textAreaF = new JTextArea();
		frame.getContentPane().add(textAreaF);
		textAreaF.setBounds(550, 465, 100, 30);
		textAreaF.setEnabled(false);
		textAreaF.setBackground(new java.awt.Color(190, 231, 241));
		// scelta
		final JRadioButton flickr  = new JRadioButton("FLICKR"   , false);
		ButtonGroup bgroup = new ButtonGroup();
		
		bgroup.add(flickr);
		JPanel radioPanel = new JPanel();
		radioPanel.setLayout(new GridLayout(3, 1));
		
		radioPanel.add(flickr);
		radioPanel.setBorder(BorderFactory.createTitledBorder(
		BorderFactory.createEtchedBorder(), "CHOOSE : "));
		radioPanel.setBounds(30,20,200,75);
		frame.getContentPane().add(radioPanel);
		// scroll exif
		JScrollPane scrollPaneExifData = new JScrollPane();
		scrollPaneExifData.setBounds(10, 441, 444, 218);
		JScrollPane scrollPaneExifData2 = new JScrollPane();
		scrollPaneExifData2.setBounds(850, 441, 444, 218);
		frame.add(scrollPaneExifData);
		// tabella
		model = new myTableModel();
		tabella = new JTable(model);	
		tabella.setForeground(Color.BLUE);
		TableColumn col0 = tabella.getTableHeader().getColumnModel().getColumn(0);
		tabella.setSurrendersFocusOnKeystroke(true);
		tabella.setBackground(new java.awt.Color(190, 231, 241));
		scrollPaneExifData.setViewportView(tabella);
		frame.add(scrollPaneExifData2);
		model2 = new myTableModel();
		tabella2 = new JTable(model2);	
		tabella2.setForeground(Color.BLUE);
		col0 = tabella.getTableHeader().getColumnModel().getColumn(0);
		tabella2.setSurrendersFocusOnKeystroke(true);
		tabella2.setBackground(new java.awt.Color(190, 231, 241));
		scrollPaneExifData2.setViewportView(tabella2);
		// le 6 immagini per visualizzazione nel frame
		
		final JLabel labelImmagine1 = new JLabel("");
		labelImmagine1.setBounds(700, 3, 500, 320);
		frame.getContentPane().add(labelImmagine1);
			
		
		// load image
		final JButton load = new JButton("LOAD IMAGE");
		load.setBounds(300, 60, 200, 40);
		load.setEnabled(false);
		
		
		// download delle immagini
		final JButton download = new JButton("Download image");
		download.setBounds(500, 580, 200, 30);
		download.setEnabled(false);
		frame.add(download);
		
		final JRadioButton or   = new JRadioButton("OR"  , false);
		final JRadioButton and  = new JRadioButton("AND"   , false);
		ButtonGroup bgroup1 = new ButtonGroup();
		bgroup1.add(or);
		bgroup1.add(and);
		JPanel radioPanel1 = new JPanel();
		radioPanel1.setLayout(new GridLayout(3, 1));
		radioPanel1.add(or);
		radioPanel1.add(and);
		radioPanel1.setBorder(BorderFactory.createTitledBorder(
		BorderFactory.createEtchedBorder(), "CHOOSE : "));
		radioPanel1.setBounds(500,500,120,75);
		frame.getContentPane().add(radioPanel1);
		
		
		final JTextArea testo = new JTextArea("");
		frame.getContentPane().add(testo);
		testo.setBounds(650, 500, 160, 70);
		testo.setEnabled(true);
		testo.setBackground(new java.awt.Color(190, 231, 241));
		
		
		
		
		
		or.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent event){
			try{		
				download.setEnabled(true);
				operatore="any";
			}
			catch(Exception o){
				JOptionPane.showMessageDialog(null,"","Warning!",JOptionPane.WARNING_MESSAGE);
			}
		}
		});
		
		and.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent event){
			try{		
				download.setEnabled(true);
				operatore="all";
			}
			catch(Exception o){
				JOptionPane.showMessageDialog(null,"","Warning!",JOptionPane.WARNING_MESSAGE);
			}
		}
		});
		
		//flickr
		flickr.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent event1) {
			try{
				load.setEnabled(true);
				textArea.setEnabled(true);
				labelKey.setEnabled(true);
			}
			catch(Exception e){
				JOptionPane.showMessageDialog(null,"You should select ","Warning!",JOptionPane.WARNING_MESSAGE);
			}
			}
		});
		
		// carica la foto
		load.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action1) {
		{
		try{
			
			chiave=textArea.getText();
			textAreaF.setEnabled(true);
			// scelta del file
			boolean flagWarning = false; 
			JFileChooser browser = new JFileChooser();
			browser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
			browser.showOpenDialog(null); 
			File input = browser.getSelectedFile();	
			    
                  	  if(input.isFile()){	
				String exif = readMetaData(input);
				  if(exif.equals("")){
					  JOptionPane.showMessageDialog(null,"One or more images are not supported!","Warning!",JOptionPane.WARNING_MESSAGE);
					  }else{
						  
			
				new File(percorso1).mkdir();
				String nome_n = input.getName();
				Thumbnails.of(input).size(150, 150).outputFormat("jpg").toFile(percorso1 +"\\"+ "thumbnail."+nome_n);
				writeReport(input, exif);
				JLabel image = new JLabel("");
				image.setBounds(10, 110, 500, 300);
				Image ii=java.awt.Toolkit.getDefaultToolkit().getImage(input.getAbsolutePath());
				ii=ii.getScaledInstance(500,300,Image.SCALE_DEFAULT);
				ImageIcon iconi = new ImageIcon(ii);
				image.setIcon(iconi); 
				frame.getContentPane().add(image);
				image.repaint();
				image.setVisible(true);
				frame.getContentPane().add(image);
				filltabella(input);}
			}
			else if(input.isDirectory()){	
				File[] content = input.listFiles(new JpegExtensionFilter());
				for(int i=0;i<content.length;i++){
					String exif = readMetaData(content[i]);
					writeReport(content[i], exif);
				}
			}
			else
				flagWarning = true;
			if (flagWarning)
				JOptionPane.showMessageDialog(null,"One or more images are not supported!","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		catch(Exception e){
                    	JOptionPane.showMessageDialog(null,"You should select something first...","Warning!",JOptionPane.WARNING_MESSAGE);
		}
               }
		}
		});
		frame.getContentPane().add(load);
		
		// precedenti sei foto
		prev.setBounds(700,350 , 200, 40);
		prev.setEnabled(false);
		prev.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action2) {
		{
			try{	
				if(numFoto > 1){
				E = tmp.getNCurrent().getPrev();
				tmp.setNCurrent(E);
				setCurrent2(tmp);
				next.setEnabled(true);
				URLConnection conn = new URL(new gURL_image(E.getOggetto()).getUrl()).openConnection();
				InputStream buf = conn.getInputStream();
				Image image = ImageIO.read(buf).getScaledInstance(500,320,0);
				labelImmagine1.setVisible(true);
				ImageIcon icon1 = new ImageIcon(image);
				labelImmagine1.setIcon(icon1); 
				frame.getContentPane().add(labelImmagine1);
				labelImmagine1.repaint();
				numFoto--;
				labelN.setText(numFoto+"   di  "+numero);
				labelImmagine1.addMouseListener(new MouseAdapter() {  
				public void mouseReleased(MouseEvent e13)  {	  
				try{	
					estrazione_exif e0=new estrazione_exif("C:\\File",chiave);
					e0.estrapolazione(E.getOggetto());
					f =e0.Inserimento_File();
					tabella2.setVisible(true);
					filltabella2(f);
					labelS.setEnabled(true);
					textAreaS.setEnabled(true);
					textAreaS.setText(E.getOggetto().getNome());
					final JButton saveLabel2 = new JButton("Save");
					saveLabel2.setEnabled(true);
					saveLabel2.setBounds(950, 405, 100, 20);
					frame.getContentPane().add(saveLabel2);
					saveLabel2.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent action3) {
					{
					try{
						String p =Salvataggio("C:\\File",textAreaS.getText(),E.getOggetto());
						File o = new File(p);
						Thumbnails.of(p).size(150, 150).outputFormat("jpg").toFile(percorso1+ "thumbnail." + E.getOggetto().getNome());
						saveLabel2.setEnabled(false);
						saveLabel2.setVisible(false);
				}
					catch(Exception e){
					JOptionPane.showMessageDialog(null,"Errore non è possibile visualizzare","Warning!",JOptionPane.WARNING_MESSAGE);
					}
					}
					}
					});
				}
				catch(Exception o){
				}
			}
			}); 
			}else prev.setEnabled(false);
		}
			catch(Exception e){
                    	JOptionPane.showMessageDialog(null,"There are no more image","Warning!",JOptionPane.WARNING_MESSAGE);
			}
			
                }
		} 
		});    
		frame.getContentPane().add(prev);
		
		// successive sei foto
		next.setBounds(1100, 350, 200, 40);
		next.setEnabled(false);
		next.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action8) {
		{
		try{
		if(numFoto<numero){
		E = tmp.getNCurrent().getNext();
		tmp.setNCurrent(E);	
		setCurrent2(tmp);
		URLConnection conn = new URL(new gURL_image(E.getOggetto()).getUrl()).openConnection();
		InputStream buf = conn.getInputStream();
		Image image = ImageIO.read(buf).getScaledInstance(500,320,0);
		labelImmagine1.setVisible(true);
		ImageIcon icon1 = new ImageIcon(image);
		labelImmagine1.setIcon(icon1); 
		frame.getContentPane().add(labelImmagine1);
		labelImmagine1.repaint();
		numFoto++;
		labelN.setText(numFoto+"   di  "+tmp.getSize());
		labelImmagine1.addMouseListener(new MouseAdapter() {  
		public void mouseClicked(MouseEvent e7)  {	  
		try{	
		estrazione_exif e0=new estrazione_exif("C:\\File",chiave);
		e0.estrapolazione(E.getOggetto());
		f =e0.Inserimento_File();
		tabella2.setVisible(true);
		filltabella2(f);
		labelS.setEnabled(true);
		textAreaS.setEnabled(true);
		textAreaS.setText(E.getOggetto().getNome());
		final JButton saveLabel2 = new JButton("Save");
		saveLabel2.setEnabled(true);
		saveLabel2.setBounds(950, 405, 100, 20);
		saveLabel2.setVisible(true);
		frame.getContentPane().add(saveLabel2);
		saveLabel2.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action9) {
		{
		try{
		String p =Salvataggio("C:\\File",textAreaS.getText(),E.getOggetto());
		File o = new File(p);
		Thumbnails.of(p).size(150, 150).outputFormat("jpg").toFile(percorso1+ "thumbnail." + E.getOggetto().getNome());
		saveLabel2.setEnabled(false);
		saveLabel2.setVisible(false);
		}catch(Exception e){
			JOptionPane.showMessageDialog(null,"Errore non è possibile visualizzare","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		saveLabel2.setEnabled(false);
		saveLabel2.setVisible(false);	
		}
		}
		});
		}catch(Exception o){
		}
		}
		}); 
		}else next.setEnabled(false);
		prev.setEnabled(true);
		}catch(Exception e){
		JOptionPane.showMessageDialog(null,"There are no more image","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		}
		}
		});
		frame.getContentPane().add(next);
		// semplice visualizzazione
		JLabel labelExif = new JLabel("METADATA:");
		labelExif.setFont(new Font("Serif", Font.BOLD, 20));
		labelExif.setForeground(Color.blue);
		labelExif.setBounds(10, 421, 280, 21);
		frame.getContentPane().add(labelExif);
		tabella.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent eventd){
		download.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action15) {
		{
		try{
		numFoto = 0;
		test=testo.getText();
		numero=Integer.parseInt(textAreaF.getText());
		if(!((numero>0) && (numero <250))){
		JOptionPane.showMessageDialog(null,"Insert the correct number of photo you want to download","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		List<String> selectedRows = new ArrayList<String>();
		List<String> selectedRowsName = new ArrayList<String>();
		for(int i = 0; i < tabella.getRowCount(); i++) {
		if(tabella.isRowSelected(i)==true){
		String col1 = (String) tabella.getValueAt(i, 0);
		String col2 = (String) tabella.getValueAt(i, 1);
		selectedRows.add(col2);
		selectedRowsName.add(col1);
		}
		}
		search jim = new search(chiave,selectedRows,selectedRowsName,numero,operatore,test);
		connessione_Sito tmp2 = new connessione_Sito("C:\\File");
		tmp2.estrapolazione(jim);
		tmp2.InserimentoLista();
		tmp = tmp2.getLista();
		E = tmp.getNCurrent();
		URLConnection conn = new URL(new gURL_image(E.getOggetto()).getUrl()).openConnection();
		InputStream buf = conn.getInputStream();
		Image image = ImageIO.read(buf).getScaledInstance(500,320,0);
		labelImmagine1.setVisible(true);
		ImageIcon icon1 = new ImageIcon(image);
		labelImmagine1.setIcon(icon1); 
		frame.getContentPane().add(labelImmagine1);
		labelImmagine1.repaint();
		numFoto++;
		labelN.setText(numFoto+"   di  "+numero);
		labelImmagine1.addMouseListener(new MouseAdapter() { 
		public void mouseClicked(MouseEvent e1)  {
		try{
		estrazione_exif e0=new estrazione_exif("C:\\File",chiave);
		e0.estrapolazione(E.getOggetto());
		f =e0.Inserimento_File();
		tabella2.setVisible(true);
		filltabella2(f);
		labelS.setEnabled(true);
		textAreaS.setEnabled(true);
		textAreaS.setText(E.getOggetto().getNome());
		final JButton saveLabel2 = new JButton("Save");
		saveLabel2.setEnabled(true);
		saveLabel2.setBounds(950, 405, 100, 20);
		frame.getContentPane().add(saveLabel2);
		saveLabel2.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent action16) {
		try{
		String p =Salvataggio("C:\\File",textAreaS.getText(),E.getOggetto());
		File o = new File(p);
		Thumbnails.of(p).size(150, 150).outputFormat("jpg").toFile(percorso1+ Rename.PREFIX_DOT_THUMBNAIL.toString());
		saveLabel2.setEnabled(false);
		saveLabel2.setVisible(false);
		}catch(Exception e){
		JOptionPane.showMessageDialog(null,"There are no more image","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		}
		});
		}catch(Exception o){
		}
		}
		}); 
		next.setEnabled(true);
		}catch(Exception e){
		JOptionPane.showMessageDialog(null,"Checks that everything is correct","Warning!",JOptionPane.WARNING_MESSAGE);
		}
		}
		}
		});
		}
		});
		}
/*****************************************************************end costruttore*****************************************************************/
	
/*************************************************** legge i metadati da un'immagine e torna tutto in una stringa****************************************/
	
private static String readMetaData(File file) {
		IImageMetadata metadata = null;
		StringBuffer s = new StringBuffer();	//Output
		
		try {
		    metadata = Sanselan.getMetadata(file);
		} catch (ImageReadException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		if (metadata instanceof JpegImageMetadata) {
			JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
			exifMetadata = jpegMetadata.getExif();
			ArrayList items = exifMetadata.getItems(); 
			for (int i=0; i<items.size();i++) 
				s.append(items.get(i)+"\n");
		}
		return s.toString();
	} // end metodo
	    

	// scriviamo i metadata in un file .txt
	private void writeReport(File input, String exif){
		try {
			new File(input.getParent()+"/Reports").mkdir();
			FileOutputStream file = new FileOutputStream(input.getParent()+"/Reports/"+input.getName()+".txt");
			PrintStream out = new PrintStream(file);
			out.print(exif+"\r\n");
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	} 
    

	/**  importare nelle check box  i dati di report **/
	private void filltabella(File file){
		
		int count = model.getRowCount();
		if(count!=0)
			for(int i=0;i<count;i++)
				model.removeRow(0);
		
		BufferedReader in = null;
		try{	
			in = new BufferedReader(new FileReader(file.getParent()+"/Reports/"+file.getName()+".txt"));
			String s = null;
			while(!(s=in.readLine()).equals("")){
				
				int i=0;
				String name="";
				while(s.charAt(i)!=':')	
					name+=(""+s.charAt(i++));
				String value="";
				while(++i<s.length())
					value+=(""+s.charAt(i));
				String[] row = {name,value};
				model.addRow(row);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	} // end metodo
	
	
	private void filltabella2(File file){
		int count = model2.getRowCount();
		if(count!=0)
			for(int i=0;i<count;i++)
				model2.removeRow(0);
		BufferedReader in = null;
		try{	
			in = new BufferedReader(new FileReader(file.getAbsolutePath()));
			String s = null;
			while(!(s=in.readLine()).equals("")){
				int i=0;
				String name="";
				while(s.charAt(i)!=':')	
					name+=(""+s.charAt(i++));
				String value="";
				while(++i<s.length())
					value+=(""+s.charAt(i));
				String[] row = {name,value};
				model2.addRow(row);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	} // end metodo
 
public static void setCurrent2(lista temporanea){
		
		if(temporanea.getNCurrent()  == temporanea.getHeader()) temporanea.setNCurrent(temporanea.getNCurrent().getNext()); 
		if(temporanea.getNCurrent()  == temporanea.getTrailer()) temporanea.setNCurrent(temporanea.getNCurrent().getPrev()); 
	}
	
	
	public static String Salvataggio(String percorso,String nome,oggetto_search timo){
		String localFilename ="";
		try{
		gURL_image lm = new gURL_image(timo);
		URLConnection conn = new URL(lm.getUrl()).openConnection();
		InputStream buf = conn.getInputStream();
		BufferedImage image = ImageIO.read(buf);
		new File(percorso).mkdirs();
		localFilename = percorso +"\\"+ nome +".jpg";
		File fileImageDest = new File(localFilename);
		ImageIO.write(image, "jpg", fileImageDest);
			
		}catch(Exception e){
			System.out.println(e);}
		return localFilename;
			}
		




		
	
}// end class extract_exif


// ALTRE CLASSI
class JpegExtensionFilter implements FilenameFilter{
	private String ext1 =".jpeg";
	private String ext2 =".JPEG";
	private String ext3 =".jpg";
	private String ext4 =".JPG";
	public boolean accept(File dir, String name){
		if (name.endsWith(ext1) || name.endsWith(ext2) || name.endsWith(ext3) || name.endsWith(ext4))
			return true;
		return false;
	}
}

class myTableModel extends DefaultTableModel{
	static String[] labels = {"Name","Value"};
	static String[][] content = {};
	public myTableModel( ){
		super(content,labels);
	 }

	public boolean isCellEditable(int row,int cols){
		if (cols == 0) 
			return false;         
		else	return true;	
    }
    }
    
    
    class myTableModel2 extends DefaultTableModel{
	static String[] labels = {"Name","Value"};
	static String[][] content = {};
	public myTableModel2( ){
		super(content,labels);
	 }

	public boolean isCellEditable(int row,int cols){
		if (cols == 0) 
			return false;         
		else	return true;	
    }
    
}

class lista {
	private node header;
	private node trailer;
	private int size;
	private int current;
	private node ncurrent;
	
	public lista(){
		
		header = new node(null);
		trailer = new node(null);
		header.setNext(trailer);
		trailer.setPrev(header);
		size = 0;
		current = 1;
		ncurrent = null;
	}
	
	public void add(node e){
		
		node tmp = header.getNext();
		tmp.setPrev(e);
		e.setNext(tmp);
		e.setPrev(header);
		header.setNext(e);
		size++;
		setNCurrent(header.getNext());
	}
	
	public void setNCurrent(node e){
		ncurrent = e;
	}
	public void setCurrent(int n){
		current = n;
	}
	
	public int getSize(){return size;}
	public int getCurrent(){return current;}
	public node getNCurrent(){return ncurrent;}
	
	
	
	public node getHeader(){return header;}
	public node getTrailer(){return trailer;}
}


class gURL_image {
	private String URL_Immagine;
	
	public gURL_image(oggetto_search vis){
		URL_Immagine = "http://static.flickr.com/" + vis.getServer() + "/" + vis.getID() + "_" + vis.getSecret() + "_b.jpg";
	}
	public String getUrl(){return URL_Immagine;}
}

class node {
	
	private oggetto_search oggetto;
	private node next;
	private node prev;
	
	public node(oggetto_search oggetto){
		this.oggetto = oggetto;
	}
	
	public oggetto_search getOggetto(){return oggetto;}
	public void setNext(node e){
		next = e;
	}
	public void setPrev(node e){
		prev =e;
	}
	public node getNext(){
		return next;
	}
	public node getPrev(){
		return prev;
	}
}

class oggetto_search {

	private String id;
	private String server;
	private String secret;
	private String nome;
	
	
	public oggetto_search(String ID,String Server,String Secret,String nome){
		
		this.id= ID;
		this.server=Server;
		this.secret =Secret;
		this.nome = nome;
	}
	
	
	public String getID(){return id;}
	public String getServer(){return server;}
	public String getSecret(){return secret;}
	public String getNome(){return nome;}
	public String getTutto(){return id + " " + server + " " + secret + " " + nome;}
}


class search {
	private String URL="";
	private String key;
	private int numero;
	private String valore;
	private String testoRicerca;
	private List<Object> nomiCampi;
	private List<Object> valoriCampi;
	//attributi rappresentano i dati Exif ottenuti dall' immagine
	
	public search(String key,List list,List nomi,int numero,String op,String t){
		this.key =key;
		this.numero=numero;
		this.testoRicerca=t;
		this.valoriCampi = list;
		this.nomiCampi = nomi;
		try{
			
			String aggiungi ="";
			
			Object[] valnomi = nomi.toArray();
			Object[] valvalori = list.toArray();
			
			int n = valnomi.length;
			int m = valvalori.length;
			for(int i = 0;i<n;i++){
				
				
				String valore = valvalori[i].toString();
				String nome = valnomi[i].toString();
				
				if(nome.equals("Make") || nome.equals("Model")){
					valore = valore.substring(2,valore.length()-1);
					aggiungi += valore + ",";
				}else if(nome.equals("XResolution") || nome.equals("YResolution")){
					valore = valore.substring(1,valore.length());
					aggiungi += valore + ",";
				}else if(nome.equals("Date Time Original") || nome.equals("Create Date")){
					valore = valore.substring(2,valore.length()-1);
					valore = valore.substring(0,10);
					aggiungi += valore + ",";
				}else if(nome.equals("Software")){
					valore = valore.substring(2,valore.length()-1);
					char c;
					String tmp = "";
					for(int u = 0;u<valore.length();u++){
						c = valore.charAt(u);
						if(c != ' '){ 
							tmp+=c;
							}else if(c == ' '){
								tmp += '-';}
							
					}
					
					aggiungi += valore + ",";
				}
			}
			aggiungi = aggiungi.substring(0,aggiungi.length()-1);
			if(testoRicerca.equals("")){
				URL = "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key="+ key +"&tags="+aggiungi+"&tag_mode="+op +"&content_type=1"+"&privacy_filter=1"+"&per_page="+numero+"";
			}else{
				URL = "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key="+ key +"&tags="+aggiungi+"&tag_mode="+op +"&content_type=1"+"&privacy_filter=1"+"&text="+testoRicerca+"&per_page="+numero+"";
				}
			
	}catch(Exception e){}finally{}
	}

		
		
	public String getURL(){return URL;}
	public String getKey(){return key;}
}

class connessione_Sito {
	
	private search cerca;
	private lista ricercati;
	private File risultato;
	private String percorso;
	
	public connessione_Sito(String street){
		// Inizializzare Percorso
		this.percorso = street;
		
		if(new File(percorso).mkdirs() == true){
		
			if(new File(percorso + "\\Search").mkdirs() == true){
			
			percorso = percorso + "\\Search";
			risultato = new File(percorso + "\\RisultatiSearch.xml");
			this.percorso = risultato.getAbsolutePath();
			ricercati = new lista();
		
		}else{
			
			percorso = percorso +"\\Search";
			risultato = new File(percorso + "\\RisultatiSearch.xml");
			this.percorso = risultato.getAbsolutePath();
			ricercati = new lista();
			
		}
		
		}else{
			
			if(new File(percorso + "\\Search").mkdirs() == true){
				
				percorso = percorso +"\\Search";
				risultato = new File(percorso + "\\RisultatiSearch.xml");
				this.percorso = risultato.getAbsolutePath();
				ricercati = new lista();
				
			}else{
				
				percorso = percorso +"\\Search";
				risultato = new File(percorso + "\\RisultatiSearch.xml");
				this.percorso = risultato.getAbsolutePath();
				ricercati = new lista();
				
			}
		}
		
	}
	
	public void estrapolazione(search cerca){
		try{
		this.cerca = cerca;
		String URL = cerca.getURL();
		FileWriter scrittore;
		String line;
		
		HttpURLConnection connessione = (HttpURLConnection)new URL(URL).openConnection();
		BufferedReader reader = new BufferedReader(new InputStreamReader(connessione.getInputStream(),Charset.forName("ASCII")));
		
		scrittore = new FileWriter(risultato);
		while((line = reader.readLine()) != null){
		scrittore.append(line);
		}
		scrittore.close();
		}catch(Exception E){
			System.out.println(E +"");
		}
	}
	public void InserimentoLista(){
		try{
			XMLInputFactory factory = XMLInputFactory.newInstance();
			XMLEventReader r = factory.createXMLEventReader(percorso, new FileInputStream(percorso));
			String value_Server ="",value_ID ="",value_Secret = "",value_Nome ="";
			int i =0;
			while (r.hasNext()) {
				XMLEvent event = r.nextEvent();
				if (event.isStartElement()) {
				    StartElement element = (StartElement) event;
				    String elementName = element.getName().toString();
					if (elementName.equals("photo")) {
					i=0;
					Iterator iterator = element.getAttributes();
					while (iterator.hasNext()) {
						Attribute attribute = (Attribute) iterator.next();
						QName name = attribute.getName();
						String value = attribute.getValue();
						if(name.toString().compareTo("id") == 0) {
							value_ID = value;
							i++;
						}else if(name.toString().compareTo("server") == 0){
							value_Server = value;
							i++;	
						}else if(name.toString().compareTo("secret") == 0){
						value_Secret = value;
						i++;
						}else if(name.toString().compareTo("title") == 0){
							value_Nome = value;
							i++;
							}
					}
					if(i == 4){
						ricercati.add(new node(new oggetto_search(value_ID,value_Server,value_Secret,value_Nome)));
					}
					}
				}
			}
		    }catch(Exception E){}
		}
			public lista getLista(){return ricercati;}
			public String getPercorso(){return percorso;}
}


class gURL_exif {

	private String URL_Exif;
	
	public gURL_exif(oggetto_search vis,String chiave){
		URL_Exif = "http://api.flickr.com/services/rest/?method=flickr.photos.getExif&api_key="+chiave+"&photo_id="+ vis.getID();;
	}
	public String getURL(){return URL_Exif;}
	
}






class estrazione_exif {
	private oggetto_search immagine;
	private File lettura; // txt utilizzato da filltabella2.
	private File xml; // xml utilizzati per fare parsing.
	private String percorso_F; // percorso del file.txt
	private String percorso_X; // percorso del file.xml
	private String percorso_P; 
	private String chiave;
	public estrazione_exif(String percorso,String chiave){
	this.percorso_P = percorso;
	this.chiave = chiave;
	if(new File(percorso).mkdirs()){
		if(new File(percorso_P + "\\EXIF").mkdirs() == true){
			percorso_P = percorso_P+"\\EXIF";
			xml = new File(percorso_P + "\\Exif.xml");
			percorso_X = percorso_P + "\\Exif.xml";
			lettura = new File(percorso_P + "\\Exif.txt");
			percorso_F = percorso_F + "\\Exif.txt";
				
		}else{
			percorso_P = percorso_P+"\\EXIF";
			xml = new File(percorso_P + "\\Exif.xml");
			percorso_X = percorso_P + "\\Exif.xml";
			lettura = new File(percorso_P + "\\Exif.txt");
			percorso_F = percorso_F + "\\Exif.txt";
	}
		}else{
		
		if(new File(percorso + "\\EXIF").mkdirs() == true){
			
			percorso_P = percorso_P+"\\EXIF";
			xml = new File(percorso_P + "\\Exif.xml");
			percorso_X = percorso_P + "\\Exif.xml";
			lettura = new File(percorso_P + "\\Exif.txt");
			percorso_F = percorso_F + "\\Exif.txt";
		}else{
			percorso_P = percorso_P+"\\EXIF";
			xml = new File(percorso_P + "\\Exif.xml");
			percorso_X = percorso_P + "\\Exif.xml";
			lettura = new File(percorso_P + "\\Exif.txt");
			percorso_F = percorso_F + "\\Exif.txt";
		}
		}
	}
	
	
	public void estrapolazione(oggetto_search immagine){
		
		this.immagine = immagine;
		try{
			gURL_exif tmp = new gURL_exif(immagine,chiave);
			String URL = tmp.getURL();
			FileWriter scrittore;
			
			String line;
			
			HttpURLConnection connessione = (HttpURLConnection)new URL(URL).openConnection();
			BufferedReader reader = new BufferedReader(new InputStreamReader(connessione.getInputStream(),Charset.forName("ASCII")));
			
			scrittore = new FileWriter(xml);
			while((line = reader.readLine()) != null){
			scrittore.append(line);
			}
			scrittore.close();
		}catch(Exception E){
				System.out.println(E +"");
			}
		
	}
	
	public File Inserimento_File(){ 
	
	try{
		FileWriter scrittore;
		String line;
		
	XMLInputFactory factory = XMLInputFactory.newInstance();
    	XMLEventReader r = factory.createXMLEventReader(percorso_X, new FileInputStream(percorso_X));
    	scrittore = new FileWriter(lettura);
    	int i =0;
    	while (r.hasNext()) {
    			
    		XMLEvent event = r.nextEvent();
             XMLEvent event1 ;
             if (event.isStartElement()) {
                 StartElement element = (StartElement) event;
                 String elementName = element.getName().toString();
                 if (elementName.equals("exif")) {
                 	Iterator iterator = element.getAttributes();
                 	while (iterator.hasNext()) {
                     	Attribute attribute = (Attribute) iterator.next();
                     	QName name = attribute.getName();
                     	String value = attribute.getValue();
                     	if(name.toString().compareTo("label") == 0){
                     		scrittore.append(""+ value +":" + "");
                     	}
                 	}
                 	}
                 if(elementName.equals("raw")){
                 	event1 = r.nextEvent();
                 	line = event1.toString();
                 	scrittore.append("\'"+line+"\'");
                 	scrittore.append("\r\n");
                 	}
                 
                 }
             }
    	scrittore.close();
    	}catch(Exception E){
    	System.out.println("" + E);
	}
	return lettura;
}
}

