PageRenderTime 55ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/carrot-jdk7-jnlp-decompile-deploy/src/main/java/com/sun/deploy/jardiff/JarDiffPatcher.java

https://github.com/carrot-garden/carrot-jnlper
Java | 240 lines | 226 code | 10 blank | 4 comment | 52 complexity | 27bebd7fd9b530e2963a628e69e73f95 MD5 | raw file
  1. package com.sun.deploy.jardiff;
  2. import com.sun.applet2.preloader.CancelException;
  3. import com.sun.deploy.resources.ResourceManager;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.LineNumberReader;
  9. import java.io.OutputStream;
  10. import java.io.PrintStream;
  11. import java.util.ArrayList;
  12. import java.util.Enumeration;
  13. import java.util.HashMap;
  14. import java.util.HashSet;
  15. import java.util.Iterator;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.MissingResourceException;
  19. import java.util.Set;
  20. import java.util.jar.JarEntry;
  21. import java.util.jar.JarFile;
  22. import java.util.jar.JarOutputStream;
  23. import java.util.zip.ZipEntry;
  24. public class JarDiffPatcher
  25. implements JarDiffConstants, Patcher
  26. {
  27. private static final int DEFAULT_READ_SIZE = 2048;
  28. private static byte[] newBytes = new byte[2048];
  29. private static byte[] oldBytes = new byte[2048];
  30. public void applyPatch(Patcher.PatchDelegate paramPatchDelegate, String paramString1, String paramString2, OutputStream paramOutputStream)
  31. throws IOException
  32. {
  33. File localFile1 = new File(paramString1);
  34. File localFile2 = new File(paramString2);
  35. JarOutputStream localJarOutputStream = new JarOutputStream(paramOutputStream);
  36. JarFile localJarFile1 = new JarFile(localFile1);
  37. JarFile localJarFile2 = new JarFile(localFile2);
  38. HashSet localHashSet1 = new HashSet();
  39. HashMap localHashMap = new HashMap();
  40. determineNameMapping(localJarFile2, localHashSet1, localHashMap);
  41. Object[] arrayOfObject = localHashMap.keySet().toArray();
  42. HashSet localHashSet2 = new HashSet();
  43. Enumeration localEnumeration1 = localJarFile1.entries();
  44. if (localEnumeration1 != null)
  45. while (localEnumeration1.hasMoreElements())
  46. localHashSet2.add(((JarEntry)localEnumeration1.nextElement()).getName());
  47. double d1 = localHashSet2.size() + arrayOfObject.length + localJarFile2.size();
  48. double d2 = 0.0D;
  49. localHashSet2.removeAll(localHashSet1);
  50. d1 -= localHashSet1.size();
  51. Enumeration localEnumeration2 = localJarFile2.entries();
  52. if (localEnumeration2 != null)
  53. while (localEnumeration2.hasMoreElements())
  54. {
  55. JarEntry localJarEntry1 = (JarEntry)localEnumeration2.nextElement();
  56. if (!"META-INF/INDEX.JD".equals(localJarEntry1.getName()))
  57. {
  58. updateDelegate(paramPatchDelegate, d2, d1);
  59. d2 += 1.0D;
  60. writeEntry(localJarOutputStream, localJarEntry1, localJarFile2);
  61. boolean bool1 = localHashSet2.remove(localJarEntry1.getName());
  62. if (bool1)
  63. d1 -= 1.0D;
  64. }
  65. else
  66. {
  67. d1 -= 1.0D;
  68. }
  69. }
  70. String str;
  71. Object localObject1;
  72. for (int i = 0; i < arrayOfObject.length; i++)
  73. {
  74. str = (String)arrayOfObject[i];
  75. localObject1 = (String)localHashMap.get(str);
  76. JarEntry localJarEntry2 = localJarFile1.getJarEntry((String)localObject1);
  77. if (localJarEntry2 == null)
  78. {
  79. localObject2 = "move" + (String)localObject1 + " " + str;
  80. handleException("jardiff.error.badmove", (String)localObject2);
  81. }
  82. Object localObject2 = new JarEntry(str);
  83. ((JarEntry)localObject2).setTime(localJarEntry2.getTime());
  84. ((JarEntry)localObject2).setSize(localJarEntry2.getSize());
  85. ((JarEntry)localObject2).setCompressedSize(localJarEntry2.getCompressedSize());
  86. ((JarEntry)localObject2).setCrc(localJarEntry2.getCrc());
  87. ((JarEntry)localObject2).setMethod(localJarEntry2.getMethod());
  88. ((JarEntry)localObject2).setExtra(localJarEntry2.getExtra());
  89. ((JarEntry)localObject2).setComment(localJarEntry2.getComment());
  90. updateDelegate(paramPatchDelegate, d2, d1);
  91. d2 += 1.0D;
  92. writeEntry(localJarOutputStream, (JarEntry)localObject2, localJarFile1.getInputStream(localJarEntry2));
  93. boolean bool2 = localHashSet2.remove(localObject1);
  94. if (!bool2)
  95. continue;
  96. d1 -= 1.0D;
  97. }
  98. Iterator localIterator = localHashSet2.iterator();
  99. if (localIterator != null)
  100. while (localIterator.hasNext())
  101. {
  102. str = (String)localIterator.next();
  103. localObject1 = localJarFile1.getJarEntry(str);
  104. updateDelegate(paramPatchDelegate, d2, d1);
  105. d2 += 1.0D;
  106. writeEntry(localJarOutputStream, (JarEntry)localObject1, localJarFile1);
  107. }
  108. updateDelegate(paramPatchDelegate, d2, d1);
  109. localJarOutputStream.finish();
  110. localJarOutputStream.close();
  111. localJarFile1.close();
  112. localJarFile2.close();
  113. }
  114. private void updateDelegate(Patcher.PatchDelegate paramPatchDelegate, double paramDouble1, double paramDouble2)
  115. throws CancelException
  116. {
  117. if (paramPatchDelegate != null)
  118. paramPatchDelegate.patching((int)(100.0D * paramDouble1 / paramDouble2));
  119. }
  120. private void determineNameMapping(JarFile paramJarFile, Set paramSet, Map paramMap)
  121. throws IOException
  122. {
  123. InputStream localInputStream = paramJarFile.getInputStream(paramJarFile.getEntry("META-INF/INDEX.JD"));
  124. if (localInputStream == null)
  125. handleException("jardiff.error.noindex", null);
  126. LineNumberReader localLineNumberReader = new LineNumberReader(new InputStreamReader(localInputStream, "UTF-8"));
  127. String str = localLineNumberReader.readLine();
  128. if ((str == null) || (!str.equals("version 1.0")))
  129. handleException("jardiff.error.badheader", str);
  130. while ((str = localLineNumberReader.readLine()) != null)
  131. {
  132. List localList;
  133. if (str.startsWith("remove"))
  134. {
  135. localList = getSubpaths(str.substring("remove".length()));
  136. if (localList.size() != 1)
  137. handleException("jardiff.error.badremove", str);
  138. paramSet.add(localList.get(0));
  139. continue;
  140. }
  141. if (str.startsWith("move"))
  142. {
  143. localList = getSubpaths(str.substring("move".length()));
  144. if (localList.size() != 2)
  145. handleException("jardiff.error.badmove", str);
  146. if (paramMap.put(localList.get(1), localList.get(0)) != null)
  147. handleException("jardiff.error.badmove", str);
  148. continue;
  149. }
  150. if (str.length() <= 0)
  151. continue;
  152. handleException("jardiff.error.badcommand", str);
  153. }
  154. localLineNumberReader.close();
  155. localInputStream.close();
  156. }
  157. private void handleException(String paramString1, String paramString2)
  158. throws IOException
  159. {
  160. try
  161. {
  162. throw new IOException(ResourceManager.getString(paramString1, paramString2));
  163. }
  164. catch (MissingResourceException localMissingResourceException)
  165. {
  166. System.err.println("Fatal error: " + paramString1);
  167. new Throwable().printStackTrace(System.err);
  168. System.exit(-1);
  169. }
  170. }
  171. private List getSubpaths(String paramString)
  172. {
  173. int i = 0;
  174. int j = paramString.length();
  175. ArrayList localArrayList = new ArrayList();
  176. while (i < j)
  177. {
  178. while ((i < j) && (Character.isWhitespace(paramString.charAt(i))))
  179. i++;
  180. if (i >= j)
  181. continue;
  182. int k = i;
  183. int m = k;
  184. String str = null;
  185. while (i < j)
  186. {
  187. char c = paramString.charAt(i);
  188. if ((c == '\\') && (i + 1 < j) && (paramString.charAt(i + 1) == ' '))
  189. {
  190. if (str == null)
  191. str = paramString.substring(m, i);
  192. else
  193. str = str + paramString.substring(m, i);
  194. i++;
  195. m = i;
  196. }
  197. else
  198. {
  199. if (Character.isWhitespace(c))
  200. break;
  201. }
  202. i++;
  203. }
  204. if (m != i)
  205. if (str == null)
  206. str = paramString.substring(m, i);
  207. else
  208. str = str + paramString.substring(m, i);
  209. localArrayList.add(str);
  210. }
  211. return localArrayList;
  212. }
  213. private void writeEntry(JarOutputStream paramJarOutputStream, JarEntry paramJarEntry, JarFile paramJarFile)
  214. throws IOException
  215. {
  216. writeEntry(paramJarOutputStream, paramJarEntry, paramJarFile.getInputStream(paramJarEntry));
  217. }
  218. private void writeEntry(JarOutputStream paramJarOutputStream, JarEntry paramJarEntry, InputStream paramInputStream)
  219. throws IOException
  220. {
  221. paramJarOutputStream.putNextEntry(new ZipEntry(paramJarEntry.getName()));
  222. for (int i = paramInputStream.read(newBytes); i != -1; i = paramInputStream.read(newBytes))
  223. paramJarOutputStream.write(newBytes, 0, i);
  224. paramInputStream.close();
  225. }
  226. }
  227. /* Location: /opt/sun/java32/jdk1.7.0_04/jre/lib/deploy.jar
  228. * Qualified Name: com.sun.deploy.jardiff.JarDiffPatcher
  229. * JD-Core Version: 0.6.0
  230. */