]> git.uio.no Git - ifi-stolz-refaktor.git/blame - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarRsrcUrlBuilder.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / jarpackagerfat / FatJarRsrcUrlBuilder.java
CommitLineData
1b2798f6
EK
1/*******************************************************************************
2 * Copyright (c) 2008, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option
11 * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262746 [jar exporter] Create a builder for jar-in-jar-loader.zip
12 *******************************************************************************/
13
14package org.eclipse.jdt.internal.ui.jarpackagerfat;
15
16import java.io.ByteArrayInputStream;
17import java.io.File;
18import java.io.FileInputStream;
19import java.io.FileNotFoundException;
20import java.io.IOException;
21import java.io.InputStream;
22import java.util.HashSet;
23import java.util.Set;
24import java.util.jar.JarEntry;
25import java.util.zip.ZipEntry;
26import java.util.zip.ZipFile;
27import java.util.zip.ZipInputStream;
28
29import org.eclipse.swt.widgets.Shell;
30
31import org.eclipse.core.runtime.CoreException;
32import org.eclipse.core.runtime.IProgressMonitor;
33import org.eclipse.core.runtime.IStatus;
34import org.eclipse.core.runtime.MultiStatus;
35import org.eclipse.core.runtime.Status;
36
37import org.eclipse.jdt.ui.JavaUI;
38import org.eclipse.jdt.ui.jarpackager.IManifestProvider;
39import org.eclipse.jdt.ui.jarpackager.JarPackageData;
40
41import org.eclipse.jdt.internal.ui.JavaPlugin;
42import org.eclipse.jdt.internal.ui.jarpackager.JarPackagerUtil;
43
44/**
45 * A jar builder which copies the referenced libraries into the generated jar and adds a special
46 * class loader which allows to load the classes from the referenced libraries.
47 *
48 * @since 3.5
49 */
50public class FatJarRsrcUrlBuilder extends FatJarBuilder {
51
52 public static final String BUILDER_ID= "org.eclipse.jdt.ui.fat_jar_rsrc_url_builder"; //$NON-NLS-1$
53 public static final String JAR_RSRC_LOADER_ZIP= "jar-in-jar-loader.zip"; //$NON-NLS-1$
54
55 private Set<String> jarNames;
56 private JarPackageData fJarPackage;
57
58 /**
59 * {@inheritDoc}
60 */
61 public String getId() {
62 return BUILDER_ID;
63 }
64
65 /**
66 * we do not need to merge any manifests here.
67 * @return false
68 */
69 @Override
70 public boolean isMergeManifests() {
71 return false;
72 }
73
74 /**
75 * we do not need to remove signers here.
76 * @return false
77 */
78 @Override
79 public boolean isRemoveSigners() {
80 return false;
81 }
82
83 /**
84 * {@inheritDoc}
85 */
86 @Override
87 public String getManifestClasspath() {
88 return "."; //$NON-NLS-1$
89 }
90
91 /**
92 * {@inheritDoc}
93 */
94 public IManifestProvider getManifestProvider() {
95 return new FatJarRsrcUrlManifestProvider(this);
96 }
97
98 /**
99 * {@inheritDoc}
100 */
101 @Override
102 public void open(JarPackageData jarPackage, Shell displayShell, MultiStatus status) throws CoreException {
103 super.open(jarPackage, displayShell, status);
104 fJarPackage= jarPackage;
105 jarNames= new HashSet<String>();
106 try {
107 writeRsrcUrlClasses();
108 } catch (IOException e) {
109 throw new CoreException(new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, e.getMessage(), e));
110 }
111 }
112
113 /**
114 * {@inheritDoc}
115 */
116 public void writeArchive(ZipFile jarFile, IProgressMonitor progressMonitor) {
117 File jarPathFile= new File(jarFile.getName());
118 String jarName = jarPathFile.getName();
119 while (jarNames.contains(jarName)) {
120 jarName= FatJarPackagerUtil.nextNumberedFileName(jarName);
121 }
122 jarNames.add(jarName);
123 JarEntry newEntry = new JarEntry(jarName);
124 newEntry.setMethod(ZipEntry.STORED);
125 byte[] readBuffer= new byte[4096];
126 try {
127 if (!fJarPackage.isCompressed())
128 JarPackagerUtil.calculateCrcAndSize(newEntry, new FileInputStream(jarPathFile), readBuffer);
129 getJarWriter().addZipEntryStream(newEntry, new FileInputStream(jarPathFile), jarName);
130 } catch (FileNotFoundException e) {
131 throw new RuntimeException(e);
132 } catch (IOException e) {
133 throw new RuntimeException(e);
134 }
135 }
136
137 public void writeRsrcUrlClasses() throws IOException {
138 InputStream is= JavaPlugin.getDefault().getBundle().getEntry(JAR_RSRC_LOADER_ZIP).openStream();
139 ZipInputStream zis= new ZipInputStream(is);
140 ZipEntry zipEntry= zis.getNextEntry();
141 while (zipEntry != null) {
142 if (!zipEntry.isDirectory()) {
143 String entryName= zipEntry.getName();
144 byte[] content= FatJarPackagerUtil.readInputStream(zis);
145 getJarWriter().addZipEntryStream(zipEntry, new ByteArrayInputStream(content), entryName);
146 }
147 zipEntry= zis.getNextEntry();
148 }
149 }
150}