001 /* 002 * Licensed under the Apache License, Version 2.0 (the "License"); 003 * you may not use this file except in compliance with the License. 004 * You may obtain a copy of the License at 005 * 006 * http://www.apache.org/licenses/LICENSE-2.0 007 * 008 * Unless required by applicable law or agreed to in writing, software 009 * distributed under the License is distributed on an "AS IS" BASIS, 010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 011 * See the License for the specific language governing permissions and 012 * limitations under the License. 013 */ 014 /* 015 * This file has been modified by Chris Pheby in accordance with Section 4.2 016 * of the Apache Software License 017 */ 018 package org.jadira.repositorysnapshot; 019 020 import java.awt.Cursor; 021 import java.io.File; 022 import java.io.IOException; 023 import java.util.zip.ZipException; 024 025 import javax.swing.JFileChooser; 026 import javax.swing.JFrame; 027 028 import org.jadira.dependencynavigator.DependencyNavigator; 029 import org.jadira.dependencynavigator.gui.ProgressMeter; 030 import org.jadira.dependencynavigator.implementations.Repository; 031 import org.jadira.dependencynavigator.implementations.Workspace; 032 import org.jadira.dependencynavigator.implementations.local.LocalDiskRepository; 033 import org.jadira.dependencynavigator.implementations.local.LocalDiskWorkspace; 034 035 public class RepositorySnapshotFactory { 036 037 private Workspace workspace; 038 private Repository repository; 039 private String repositoryType; 040 private JFrame frame; 041 042 public boolean isSnapshotEnabled() { 043 return DependencyNavigator.TYPE_LOCAL.equals(repositoryType); 044 } 045 046 public void createSnapshot(ProgressMeter progressMeter) { 047 048 JFileChooser fc = new JFileChooser() { 049 050 private static final long serialVersionUID = 5044149990493116910L; 051 052 @Override 053 public void updateUI() { 054 // workaround for bug 055 // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6317789 056 putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); 057 super.updateUI(); 058 } 059 }; 060 fc.setDialogTitle("Save repository snapshot file"); 061 int returnVal = fc.showSaveDialog(frame); 062 File snapshotFile = fc.getSelectedFile(); 063 if (snapshotFile != null) { 064 if (!snapshotFile.getName().endsWith(".zip")) { 065 snapshotFile = new File(snapshotFile.getParentFile(), snapshotFile.getName() + ".zip"); 066 } 067 if (returnVal == JFileChooser.APPROVE_OPTION) { 068 LocalDiskRepository localDiskRepository = (LocalDiskRepository) repository; 069 LocalDiskWorkspace localDiskWorkspace = (LocalDiskWorkspace) workspace; 070 RepositorySnapshot snapshotCreator = new RepositorySnapshot(localDiskRepository.getRepositoryRoot(), snapshotFile, localDiskWorkspace.getWorkspaceDirectory()); 071 Thread snapshotCreatorThread = new Thread(new SnapshotCreatorThread(snapshotCreator, progressMeter)); 072 snapshotCreatorThread.setDaemon(true); 073 snapshotCreatorThread.setName("snapshot-creator"); 074 snapshotCreatorThread.start(); 075 } 076 } 077 } 078 079 private class SnapshotCreatorThread implements Runnable { 080 081 private RepositorySnapshot snapshotCreator; 082 private ProgressMeter progressMeter; 083 084 public SnapshotCreatorThread(RepositorySnapshot snapshotCreator, ProgressMeter progressMeter) { 085 this.snapshotCreator = snapshotCreator; 086 this.progressMeter = progressMeter; 087 } 088 089 public void run() { 090 frame.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 091 try { 092 snapshotCreator.createSnapshot(progressMeter); 093 progressMeter.snapshotComplete(); 094 } catch (ZipException e) { 095 progressMeter.error(e); 096 } catch (IOException e) { 097 progressMeter.error(e); 098 } 099 frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 100 } 101 } 102 }