senthil12345 0 Newbie Poster

hi,
i have a problem while reloading the apllet with SwingWorker. it works fine in first time, if i reload with the same browser means the Applet window is opened but if i clicking the Download Button means it shows an Exception like "illegalThreadStateException" and it wont perform the copying files.

jsp code:
 
<html> 
<body>
<%
String projid="P0001396";
%>
<jsp:plugin archive="archivedownload.jar" type="applet" code="archiveapplet.class" codebase="/archivedownload">
<jsp:params>
<jsp:param name="projid" value="<%=projid%>"/> 
</jsp:params>
<jsp:fallback>
<p> unable to load Plugin </p>
</jsp:fallback>
</jsp:plugin>
</body>
</html>
 
 
this is my applet code:

archiveapplet .java 

 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.io.*; 
 
public class archiveapplet extends Applet
{
  public boolean status=false;
  archivedownload arch;
  
  public void init()
  {
    setBackground(Color.red);
  }
 
  public void start()
  {
    if (arch==null) {
      arch = new archivedownload("");
    } else {
      arch.setVisible(true);
    }
    status=true;
  }
 
  public void stop()
  {
    System.out.println("stop()");
    status=false;
    arch.setVisible(false);
    try
    {
      Thread.sleep(1);
    }
    catch (Exception ee)
    {
      System.out.println("The Exception is ====>"+ee);
    }
  }
 
  public void destroy(){
    System.out.println("destroy()");
    arch = null;
    System.gc();
  }
 
  public static void main(String[] args)
  {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    try
    {
        UIManager.setLookAndFeel(
        "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }
    catch (Exception ex)
    {
      System.out.println("Failed loading L&F: ");
      System.out.println(ex);
    }
    new archivedownload("");
  }
}
 
class archivedownload extends JFrame
{
  private JButton Exit;
  private JButton download;
  File f1;
  File f2;
 
  public archivedownload(String val)
  {
    super();
    initializeComponent();
    this.setVisible(true);
  }
 
  private void initializeComponent()
  {
    Exit = new JButton();
	download = new JButton();
    JPanel contentPane = (JPanel)this.getContentPane();
    Exit.setText("Exit");
    Exit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e)
      {
        Exit_actionPerformed(e);
      }
 
    });
 
   download.setText("Download");
    download.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e)
      {
        download_actionPerformed(e);
      }
 
    });
 
    contentPane.setLayout(null);
    addComponent(contentPane, Exit, 169,92,83,28);
    addComponent(contentPane, download, 48,92,83,28);
    this.setTitle("archivedownload - extends JFrame");
    this.setLocation(new Point(0, 0));
    this.setSize(new Dimension(420, 227));
  }
 
  private void addComponent(
    Container container,
    Component c,
    int x,
    int y,
    int width,
    int height)
  {
    c.setBounds(x,y,width,height);
    container.add(c);
  }
 
 
  private void Exit_actionPerformed(ActionEvent e)
  {
    this.dispose(); 
  }
 
 private void download_actionPerformed(ActionEvent e)
  {
	 try
	 {
    System.out.println("inside Folder copy");
    
	f1 = new File("c"+":/"+"fms/");
	f2= new File("d"+":/"+"fms/"); 
 
		SwingWorker sw = new SwingWorker() {
        protected Object doInBackground() throws Exception {
	
		copyDirectory(f1,f2);  // this is for copy files from C: fms(folder) to D: (fms) 			
		System.out.println("Folder Copied ");
		return null;
		}};
 
		sw.execute();
		if(sw.isDone()){
		sw = null;
		}
 
	 }
	 catch (Exception ee)
	 {
		 System.out.println("The Exception is -->"+ee);
	 }
 
  }
public void copyDirectory(File srcDir, File dstDir) throws IOException {
		if (srcDir.isDirectory()) {
            if (!dstDir.exists()) {
                dstDir.mkdir();
            }    
            String[] children = srcDir.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(srcDir, children[i]),new File(dstDir, children[i]));
            }
        } else {
		InputStream in = new FileInputStream(srcDir);
	    OutputStream out = new FileOutputStream(dstDir);
    
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }	
 
        in.close();
        out.close();
}
}
}
 
 
AccumulativeRunnable.java 
 
import java.util.*;
import java.lang.reflect.Array;
import javax.swing.SwingUtilities; 
abstract class AccumulativeRunnable<T> implements Runnable {
    private List<T> arguments = null;
    private Class<?> componentType = null;     
    protected abstract void run(T... args);     
    public final void run() {
        run(flush());
    }    
    public final synchronized void add(T... args) {
        if (componentType == null) {
            componentType = (Class<T>) args.getClass().getComponentType();
        }
        boolean isSubmitted = true;
        if (arguments == null) {
            isSubmitted = false;
            arguments = new ArrayList<T>();
        }
        Collections.addAll(arguments, args);
        if (!isSubmitted) {
            submit();
        }
    }
   
    protected void submit() {
        SwingUtilities.invokeLater(this);
    }
 
    private final synchronized T[] flush() {
        List<T> list = arguments;
        arguments = null;
        if (componentType == null) {
            componentType = Object.class;
        }
        T[] args = (T[]) Array.newInstance(componentType,
                                           list.size()); 
        list.toArray(args);
        return args;
    }
}
 
 
SwingPropertyChangeSupport.java 
 
 
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeEvent;
import javax.swing.SwingUtilities;
import java.beans.*;
public final class SwingPropertyChangeSupport extends PropertyChangeSupport {
   
    public SwingPropertyChangeSupport(Object sourceBean) {
        this(sourceBean, false);
    }   
    public SwingPropertyChangeSupport(Object sourceBean, boolean notifyOnEDT) {
        super(sourceBean);
        this.notifyOnEDT = notifyOnEDT;
    }
    
    public void firePropertyChange(final PropertyChangeEvent evt) {
        if (evt == null) {
            throw new NullPointerException();
        }
        if (! isNotifyOnEDT()
            || SwingUtilities.isEventDispatchThread()) {
            super.firePropertyChange(evt);
        } else {
            SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {
                        firePropertyChange(evt);
                    }
                });
        }
    }
    public final boolean isNotifyOnEDT() {
        return notifyOnEDT;
    }
    static final long serialVersionUID = 7162625831330845068L;    
    private final boolean notifyOnEDT;
}
 
 
SwingWorker.java 
 
 
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import javax.swing.SwingUtilities;
import java.beans.*;
 
public abstract class SwingWorker<T, V> implements Runnable, Future<T> {     
    private static final int MAX_WORKER_THREADS = 10;     
    private volatile int progress;
    private volatile StateValue state;
    private final FutureTask<T> future;
    private final SwingPropertyChangeSupport propertyChangeSupport;
    private AccumulativeRunnable<V> doProcess;
    private AccumulativeRunnable<Integer> doNotifyProgressChange;
    private static ExecutorService executorService = null;
    public enum StateValue {PENDING,STARTED,DONE  };
 
    public SwingWorker() {
        Callable<T> callable = 
                new Callable<T>() {
                    public T call() throws Exception {
                        setState(StateValue.STARTED);
                        return doInBackground();
                    }
                };
 
        future = new FutureTask<T>(callable) {
                       @Override
                       protected void done() {
                           doneEDT();
                           setState(StateValue.DONE);
                       }
                   };
 
       state = StateValue.PENDING;
       propertyChangeSupport = new SwingPropertyChangeSupport(this, true);
 
       doProcess = null;
       doNotifyProgressChange = null;
    }
    
    protected abstract T doInBackground() throws Exception ;
    public final void run() {
        future.run();
    }
    protected final void publish(V... chunks) {
        synchronized (this) {
            if (doProcess == null) {
                doProcess = new AccumulativeRunnable<V>() {
                    @Override
                    public void run(V... args) {
                        process(args);
                    }
                };
            }
        }
        doProcess.add(chunks);
    }
 
    protected void process(V... chunks) {
    }
 
    protected void done() {
    }
    protected final void setProgress(int progress) {
        if (progress < 0 || progress > 100) {
            throw new IllegalArgumentException("the value should be from 0 to 100");
        }
        int oldProgress = this.progress;
        this.progress = progress;
        synchronized (this) {
            if (doNotifyProgressChange == null) {
                doNotifyProgressChange = 
                    new AccumulativeRunnable<Integer>() {
                        @Override
                        public void run(Integer... args) {
                            firePropertyChange("progress", 
                               args[0], 
                               args[args.length - 1]);
                        }
                    };
            }
        }
        doNotifyProgressChange.add(oldProgress, progress);
    }
    public final int getProgress() {
        return progress;
    }
    public final void execute() {
        getWorkersExecutorService().execute(this);
    }
    public final boolean cancel(boolean mayInterruptIfRunning) {
        return future.cancel(mayInterruptIfRunning);
    }
    public final boolean isCancelled() {
        return future.isCancelled();
    }
    public final boolean isDone() {
        return future.isDone();
    }
    public final T get() throws InterruptedException, ExecutionException {
        return future.get();
    }    
    public final T get(long timeout, TimeUnit unit) throws InterruptedException,
            ExecutionException, TimeoutException {
        return future.get(timeout, unit);
    }
    public final void addPropertyChangeListener(PropertyChangeListener listener) {
        getPropertyChangeSupport().addPropertyChangeListener(listener);
    }
    public final void removePropertyChangeListener(PropertyChangeListener listener) {
        getPropertyChangeSupport().removePropertyChangeListener(listener);
    }
    public final void firePropertyChange(String propertyName, Object oldValue,
            Object newValue) {
        getPropertyChangeSupport().firePropertyChange(propertyName,
            oldValue, newValue);
    }
 
    public final PropertyChangeSupport getPropertyChangeSupport() {
        return propertyChangeSupport;
    }
 
    // PropertyChangeSupports methods END
 
    /**
     * Returns the {@code SwingWorker} state bound property.
     * 
     * @return the current state
     */
    public final StateValue getState() {
        /*
         * DONE is a special case
         * to keep getState and isDone is sync
         */
        if (isDone()) {
            return StateValue.DONE;
        } else {
            return state;
        }
    }
 
    private void setState(StateValue state) {
        StateValue old = this.state;
        this.state = state;
        firePropertyChange("state", old, state);
    }
    
    private void doneEDT() {
        Runnable doDone = 
            new Runnable() {
                public void run() {
                    done();
                }
            };
        if (SwingUtilities.isEventDispatchThread()) {
            doDone.run();
        } else {
            SwingUtilities.invokeLater(doDone);
        }
    }    
    private static synchronized ExecutorService getWorkersExecutorService() {
        if (executorService == null) {
            //this creates non-daemon threads. 
            ThreadFactory threadFactory = 
                new ThreadFactory() {
                    final ThreadFactory defaultFactory = 
                        Executors.defaultThreadFactory();
                    public Thread newThread(final Runnable r) {
                        Thread thread = 
                            defaultFactory.newThread(r);
                        thread.setName("SwingWorker-" 
                            + thread.getName());
                        return thread;
                    }
                };     
            executorService = new ThreadPoolExecutor(0, MAX_WORKER_THREADS,
                                         1L, TimeUnit.SECONDS,
                                         new LinkedBlockingQueue<Runnable>(),
                                         threadFactory) {
 
                    private final ReentrantLock pauseLock = new ReentrantLock();
                    private final Condition unpaused = pauseLock.newCondition();
                    private boolean isPaused = false;
                    private final ReentrantLock executeLock = new ReentrantLock();
                    
                    @Override
                    public void execute(Runnable command) {                        
                        executeLock.lock();
                        try {
 
                            pauseLock.lock();
                            try {
                                isPaused = true;
                            } finally {
                                pauseLock.unlock();
                            }
                            
                            setCorePoolSize(MAX_WORKER_THREADS);
                            super.execute(command);
                            setCorePoolSize(0);
                            
                            pauseLock.lock();
                            try {
                                isPaused = false;
                                unpaused.signalAll();
                            } finally {
                                pauseLock.unlock();
                            }
                        } finally {
                            executeLock.unlock();
                        }
                    }
                    @Override 
                    protected void afterExecute(Runnable r, Throwable t) { 
                        super.afterExecute(r, t);
                        pauseLock.lock();
                        try {
                            while(isPaused) {
                                unpaused.await();
                            }
                        } catch(InterruptedException ignore) {
                            
                        } finally {
                            pauseLock.unlock();
                        }
                    }
                };
        }
        return executorService; 
    }
}

can any one pls solve this problem. thanks in advance.