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.io.BufferedOutputStream;
021 import java.io.File;
022 import java.io.FileInputStream;
023 import java.io.FileOutputStream;
024 import java.io.IOException;
025 import java.util.zip.Deflater;
026 import java.util.zip.ZipEntry;
027 import java.util.zip.ZipException;
028 import java.util.zip.ZipOutputStream;
029
030 import org.jadira.dependencynavigator.gui.ProgressMeter;
031 import org.jadira.dependencynavigator.implementations.zip.ZipFileRepository;
032 import org.jadira.dependencynavigator.implementations.zip.ZipFileWorkspace;
033
034 public class RepositorySnapshot {
035
036 private final File snapshotFile;
037 private final File repositoryRoot;
038 private final File workspace;
039
040 public RepositorySnapshot(File repositoryRoot, File snapshotFile, File workspace) {
041 this.repositoryRoot = repositoryRoot;
042 this.snapshotFile = snapshotFile;
043 this.workspace = workspace;
044 }
045
046 public void createSnapshot(ProgressMeter progressMeter) throws ZipException, IOException {
047 snapshotFile.delete();
048 snapshotFile.getParentFile().mkdirs();
049 snapshotFile.createNewFile();
050 ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(snapshotFile)));
051 out.setLevel(Deflater.BEST_COMPRESSION);
052 out.setMethod(ZipOutputStream.DEFLATED);
053
054 HierarchyFilter workspaceFilter = new HierarchyFilter() {
055
056 @Override
057 public boolean includeDirectory(File directory) throws IOException {
058 if (directory.getName().equals(".metadata")) {
059 return false;
060 }
061 if (directory.getCanonicalPath().equals(repositoryRoot.getCanonicalPath())) {
062 return false;
063 }
064 return true;
065 }
066
067 };
068
069 addHeirarchy(workspace, out, ZipFileWorkspace.PREFIX_WORKSPACE, workspaceFilter, progressMeter);
070
071 HierarchyFilter repositoryFilter = new HierarchyFilter() {
072
073 @Override
074 public boolean includeFile(File file) throws IOException {
075 if (!file.getName().endsWith(".pom")) {
076 // excude non-pom files
077 return false;
078 }
079 if (file.getName().matches("^.*-\\d{8}\\.\\d{6}-\\d+\\.pom$")) {
080 // exclude snapshot builds
081 return false;
082 }
083 return true;
084 }
085
086 };
087
088 addHeirarchy(repositoryRoot, out, ZipFileRepository.PREFIX_REPOSITORY, repositoryFilter, progressMeter);
089 out.close();
090 }
091
092 private void addHeirarchy(File directory, ZipOutputStream out, String repoPath, HierarchyFilter filter, ProgressMeter progressMeter) throws IOException {
093 File[] files = directory.listFiles();
094 for (int i = 0; i < files.length; i++) {
095 File file = files[i];
096 if (file.isDirectory() && filter.includeDirectory(file)) {
097 progressMeter.scanning(file);
098 addHeirarchy(file, out, repoPath + "/" + file.getName(), filter, progressMeter);
099 } else {
100 if (filter.includeFile(file)) {
101 progressMeter.adding(file);
102 addEntry(file, repoPath + "/" + file.getName(), out);
103 }
104 }
105 }
106 }
107
108 private class HierarchyFilter {
109
110 public boolean includeFile(File file) throws IOException {
111 return file.getName().equals("pom.xml");
112 }
113
114 public boolean includeDirectory(File directory) throws IOException {
115 return true;
116 }
117 }
118
119 private void addEntry(File target, String repoPath, ZipOutputStream out) throws IOException {
120 ZipEntry entry = new ZipEntry(repoPath);
121 int fileLength = (int) target.length();
122 FileInputStream fis = new FileInputStream(target);
123 byte[] wholeFile = new byte[fileLength];
124 fis.read(wholeFile, 0, fileLength);
125 fis.close();
126 out.putNextEntry(entry);
127 out.write(wholeFile, 0, fileLength);
128 out.closeEntry();
129 }
130 }