From d7674eb7a16838877fb360085be48f951facf7b1 Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Sat, 2 Mar 2019 17:12:52 +0100 Subject: [PATCH 1/8] Update README file --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 300e21f..eda5452 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,25 @@ -#JD-Eclipse +# JD-Eclipse JD-Eclipse, a Java decompiler plug-in for the Eclipse platform. ![](http://jd.benow.ca/img/screenshot8.png) -- Java Decompiler projects home page: [http://jd.benow.ca](http://jd.benow.ca) +- Java Decompiler projects home page: [java-decompiler.github.io](java-decompiler.github.io) - Java Decompiler Wikipedia page: [http://en.wikipedia.org/wiki/Java_Decompiler](http://en.wikipedia.org/wiki/Java_Decompiler) - JD-Eclipse source code: [https://github.com/java-decompiler/jd-eclipse](https://github.com/java-decompiler/jd-eclipse) -##Description +## Description JD-Eclipse is a plug-in for the Eclipse platform. It allows you to display all the Java sources during your debugging process, even if you do not have them all. -##How to build JD-Eclipse ? -###With Gradle: +## How to build JD-Eclipse ? +### With Gradle: ``` > ./gradlew installSiteDist ``` generate _"build/install/jd-eclipse-site"_ -###With Eclipse: +### With Eclipse: - Download dependencies ``` > ./gradlew downloadDependencies @@ -29,7 +29,7 @@ generate _"build/install/jd-eclipse-site"_ - Export _"Deployable features"_, - Copy _"site.xml"_ to the destination directory. -##How to install JD-Eclipse ? +## How to install JD-Eclipse ? 1. Build or download & unzip _"jd-eclipse-site-x.y.z.zip"_, 2. Launch _Eclipse_, 3. Click on _"Help > Install New Software..."_, @@ -38,15 +38,15 @@ generate _"build/install/jd-eclipse-site"_ 6. Check _"Java Decompiler Eclipse Plug-in"_, 7. Next, next, next... and restart. -##How to check the file associations ? +## How to check the file associations ? Click on _"Window > Preferences > General > Editors > File Associations"_ - _"*.class"_ : _Eclipse_ _"Class File Viewer"_ is selected by default. - _"*.class without source"_ : _"JD Class File Viewer"_ is selected by default. -##How to configure JD-Eclipse ? +## How to configure JD-Eclipse ? Click on _"Window > Preferences > Java > Decompiler"_ -##How to uninstall JD-Eclipse ? +## How to uninstall JD-Eclipse ? 1. Click on _"Help > About Eclipse > Installation Details"_, 2. Select _"JD-Eclipse Plug-in"_, 3. Click on _"Uninstall..."_. From 5a4d6aa8dee86894f08afced8db847f128692d3b Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Sat, 2 Mar 2019 17:14:24 +0100 Subject: [PATCH 2/8] Update README file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eda5452..174d1c9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ JD-Eclipse, a Java decompiler plug-in for the Eclipse platform. ![](http://jd.benow.ca/img/screenshot8.png) -- Java Decompiler projects home page: [java-decompiler.github.io](java-decompiler.github.io) +- Java Decompiler projects home page: [http://java-decompiler.github.io](http://java-decompiler.github.io) - Java Decompiler Wikipedia page: [http://en.wikipedia.org/wiki/Java_Decompiler](http://en.wikipedia.org/wiki/Java_Decompiler) - JD-Eclipse source code: [https://github.com/java-decompiler/jd-eclipse](https://github.com/java-decompiler/jd-eclipse) From d27b66f8a73016e05e8b01165d4cf9f7f31656be Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Thu, 30 May 2019 13:29:04 +0200 Subject: [PATCH 3/8] Update README.md --- README.md | 10 +++++++++- src/website/img/btn_donate_euro.gif | Bin 0 -> 1518 bytes src/website/img/btn_donate_usd.gif | Bin 0 -> 1537 bytes 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/website/img/btn_donate_euro.gif create mode 100644 src/website/img/btn_donate_usd.gif diff --git a/README.md b/README.md index 174d1c9..0f03821 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ JD-Eclipse, a Java decompiler plug-in for the Eclipse platform. -![](http://jd.benow.ca/img/screenshot8.png) +![](http://java-decompiler.github.io/img/screenshot8.png) - Java Decompiler projects home page: [http://java-decompiler.github.io](http://java-decompiler.github.io) - Java Decompiler Wikipedia page: [http://en.wikipedia.org/wiki/Java_Decompiler](http://en.wikipedia.org/wiki/Java_Decompiler) @@ -50,3 +50,11 @@ Click on _"Window > Preferences > Java > Decompiler"_ 1. Click on _"Help > About Eclipse > Installation Details"_, 2. Select _"JD-Eclipse Plug-in"_, 3. Click on _"Uninstall..."_. + +## License +Released under the [GNU GPL v3](LICENSE). + +## Donations +Did JD-GUI help you to solve a critical situation? Do you use JD-Eclipse daily? What about making a donation? + +[![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_euro.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=C88ZMVZ78RF22) [![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_usd.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CRMXT4Y4QLQGU) diff --git a/src/website/img/btn_donate_euro.gif b/src/website/img/btn_donate_euro.gif new file mode 100644 index 0000000000000000000000000000000000000000..f317055f02a7bbc7cd9b0dada33595b829ec9685 GIT binary patch literal 1518 zcmd6m`#X~h0LR~5ZF3tlhB;?b5oWf%yS(JG&BW%CWGA9rBJ`X}C{LHCNJ^z5jX zBI)E9&bqj6Ox1Aq`kBHi=XoV>tquC5;KFK`?@#$~hdUmNL;%2#VNi%r z3F+ex)hW`pJC~+f(WAfff(G_9{9FSU?%naB4urd9+Tp}`C0{NgQH(K5?UK(* zX!;=-?Mv3dAbLw3>E=38h`81ru-Xc3qT;Y<1ZyJ!p1eRNqP3cR>mA~yX2D9k$b)6@ z_=?^4=R3oVx+<;ImCRMtI_919;|YiYviqKV!u4*8R?^B5HZHjl($*; zeI55*E!WvWZ=j4>d*1fxRXe!L$CasnY`5h?v-_7OPcNP!K?iw!x8)%@Ws9T!(Onko zO@zOySX45$Fohl^BQHGTzpCcMZ!>dY=rQQ{MYaEI18=981iw6%5o1++#QN5W4ex3> z%FA}=<9;$RL@&0w&o*#J?>Mcr2>!0;-aNixu95$)7JO08JQ-nWPQr8)GQKuR7S#c- zAFx+d9w+u#stO#Q<=DG1^+jw0Z@!^+Fv3t5rHezRMN`ozKy#D%>OQBtgpqrQw%+cX zf0+JHv&VLKWB9o!=O7L4mcpZ{ud3OO)`aG3_P>Zp@9V&y&9Fy8EuLJl(`sT5?4ZQ@ zn-1T0f=7?SW5>IS855N(c=93u0I=E_{{KPO8hIwgMy15Y&{7jp;%VMe|3HAgj7AUu z7-0Ok4g41hfYSmnp1Ne{Wu+Sj=uygv01#(L7pM5Jfi%F>ksnTp1UfGnm@`xOt>)c% z0~S+5nP%57y{?zFH>bXRYB~S{#uYYuHG$K0L%BNfGd-7Ar@HdfZ_8Y7^#18IYJ3qro$gy8 zRO}O+O8H{BaIHoG_*q#CyNpM48nwK(sDf5Bv*lbOt7GgA79XcLnLC^waIG3Dc^j%3 zPm{*>`xNC%Vlv8NZI*FHGYBFn4zaS7CPZFWcoIwS(wL-xN4#vRL_WMfa2#_hNgG~u zfCJpchqxSGsz;rn&EZPq?9PlV1?}M&u_Up#IA71`?3*mmO_D}1_cTEjpw9C)XUfgq zrgh5EWBY=r{au=^pc|Cu3+6zi*NB0tp={)U@J%-I6s3GRA#g6T6|rAAB??v^i5|7N zq!E{aR+L(Az&DY27A)t^T*&Ir@ezS~P=yrRFG;)&vP$YD8U2($XoddbcnoUKT9Fs% z0nJFjFepO=US)mUn4ctxMB(`1#TU_tqPJ@FUT8{4-(HM}4lN3fY{%Vb3L=nQg^Agq ziks0zZmYG?O^21xz5NkmeL(%-8B|bPd z1dPb1BZC`$)%anXi@4F1fy^l}=sxyB4>yn{{G?y1Opt(cHKNU)KreKpC3U|QEo#;M-N$zu1^@$0# JR5B6R@-Iak)QtcD literal 0 HcmV?d00001 diff --git a/src/website/img/btn_donate_usd.gif b/src/website/img/btn_donate_usd.gif new file mode 100644 index 0000000000000000000000000000000000000000..3682dea12a4def16bb135e8a52b3c23c8449cf3f GIT binary patch literal 1537 zcmd6m{Xf$Q0LQ<3z{Vau4pW=qs9`gkO~uAM&14?tA&Pm(>UCX;QgRnvl#cR{E1im5 zo>C{`wH{~>h%lo_&a0$)aYe_KJnwtme{t{E>+{q5m(MS6zW`r0M0s!Bp1A|2K zjsE(kx_Me9ry|3eM9|~XF&KRq3<@l@yIEW4f#av%G`fHq$yg2T^8+T!0kzf_HPhlY zUPlAfF%xz44JG^aEtiS9ZF!HIkm99*l}yV2#f+~KyWleWtWk6k{-E_Md9_n4)rq*b}wom@NZpyb6(TG?T8 ze}&`fW45KS?s})^NeM9{#$u$}IW5XOcsu@68xvHy&$Tf(G|3D1nRqlzz{VvBO_}xv z)6K5$n_M|tQR-_>O=rG)c)vBP7b-P?zW)z^b&?zTKACTw#=AKhg^ zx7Gi%jz%=my_8Ot2uv0qv0gQ}NQ2GXsVFKLxzrgn+scgeG6G*5|2fI3{D^hc3CjB> z7g?dhnUqb&Soo6MW46_G^mpgg$8I0*xn9qt%(b!JH!+4PowDLA&5d-rE>Zt!=Pz~c ze0__)rt&8_wY9QE)7?r<^)oO9Lm)0RRAYa=`x|WG&wNaIz#lIf<09FI`IV3kVVcUBx7)yfp#TUi03wOYSRX5c6aYo2!~sAGmh6@8PY1FAQ%6=TAs*=d1!L}%&XSw= zmZ~i#hjUL=_T_Mkq%Rk%5G}v4(>_e}w$uh+^YI|XR*j&z)@P}>a*|(;o zB`Jy&m|Yo@A_+AtMrZz7{*J;g(Bld#bY|YdpvWjSh9|YNDemR8kJ1j~7DE|PcW-N* z5M^(b2TCFKLGs~zRjm~ce#lSLc#gh_U!k+FD^GJeM(tnBgG<;`LM*=0s~gwFPtL>F zoek*`o4w2K7Q-j^h7t#QG`@@-?9xC+5!?GUL|r#r09A9}6hMC>OeX9X&Bekif7H)u3Q%X$g;kZ=69D+BsHTPVg0q z6&Pcg#8PY)rN}n(-8EWb`karg_%ZGXOORFrvK$4e zg+JoWc>1oyXLCehywdZajYym@kQI`L5REkR80O0f!}$$+?q?eeEXVsXNNkE%qg!f8 zEq>tpRKIYbKO_%dDi?{Na)fb!L0Y{iC;D Date: Thu, 30 May 2019 13:33:34 +0200 Subject: [PATCH 4/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f03821..82d8d5e 100644 --- a/README.md +++ b/README.md @@ -57,4 +57,4 @@ Released under the [GNU GPL v3](LICENSE). ## Donations Did JD-GUI help you to solve a critical situation? Do you use JD-Eclipse daily? What about making a donation? -[![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_euro.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=C88ZMVZ78RF22) [![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_usd.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CRMXT4Y4QLQGU) +[![paypal](https://raw.githubusercontent.com/java-decompiler/jd-eclipse/master/src/website/img/btn_donate_euro.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=C88ZMVZ78RF22) [![paypal](https://raw.githubusercontent.com/java-decompiler/jd-eclipse/master/src/website/img/btn_donate_usd.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CRMXT4Y4QLQGU) From dfdde7719123b7db9cf1e49e6ee8fd175608dd23 Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Mon, 15 Jul 2019 18:54:17 +0200 Subject: [PATCH 5/8] Update JD-Core 1.0.7 First code commit since 2015 --- .gitignore | 3 + .project | 9 + LICENSE | 6 +- build.gradle | 26 ++- gradle/wrapper/gradle-wrapper.jar | Bin 51010 -> 52266 bytes gradle/wrapper/gradle-wrapper.properties | 12 +- org.jd.ide.eclipse.feature/.classpath | 5 + org.jd.ide.eclipse.feature/.project | 21 +++ org.jd.ide.eclipse.feature/build.gradle | 6 + org.jd.ide.eclipse.feature/build.properties | 1 + org.jd.ide.eclipse.feature/feature.xml | 90 +++++++++ org.jd.ide.eclipse.plugin/.classpath | 8 + org.jd.ide.eclipse.plugin/.project | 25 +++ .../META-INF/MANIFEST.MF | 25 +++ org.jd.ide.eclipse.plugin/about.ini | 7 + org.jd.ide.eclipse.plugin/build.gradle | 81 +++++++++ org.jd.ide.eclipse.plugin/build.properties | 9 + org.jd.ide.eclipse.plugin/icons/jd_16.png | Bin 0 -> 734 bytes org.jd.ide.eclipse.plugin/icons/jd_32.png | Bin 0 -> 1691 bytes org.jd.ide.eclipse.plugin/plugin.xml | 33 ++++ .../jd/ide/eclipse/JavaDecompilerPlugin.java | 129 +++++++++++++ .../eclipse/editors/JDClassFileEditor.java | 171 ++++++++++++++++++ .../ide/eclipse/editors/JDSourceMapper.java | 163 +++++++++++++++++ .../preferences/PreferenceInitializer.java | 32 ++++ .../eclipse/preferences/PreferencePage.java | 63 +++++++ .../ide/eclipse/startup/JDStartupClass.java | 20 ++ .../eclipse/util/loader/DirectoryLoader.java | 48 +++++ .../jd/ide/eclipse/util/loader/ZipLoader.java | 61 +++++++ .../LineNumberStringBuilderPrinter.java | 106 +++++++++++ .../util/printer/StringBuilderPrinter.java | 95 ++++++++++ org.jd.ide.eclipse.site/.project | 17 ++ org.jd.ide.eclipse.site/site.xml | 7 + settings.gradle | 2 +- 33 files changed, 1264 insertions(+), 17 deletions(-) create mode 100644 .project create mode 100644 org.jd.ide.eclipse.feature/.classpath create mode 100644 org.jd.ide.eclipse.feature/.project create mode 100644 org.jd.ide.eclipse.feature/build.gradle create mode 100644 org.jd.ide.eclipse.feature/build.properties create mode 100644 org.jd.ide.eclipse.feature/feature.xml create mode 100644 org.jd.ide.eclipse.plugin/.classpath create mode 100644 org.jd.ide.eclipse.plugin/.project create mode 100644 org.jd.ide.eclipse.plugin/META-INF/MANIFEST.MF create mode 100644 org.jd.ide.eclipse.plugin/about.ini create mode 100644 org.jd.ide.eclipse.plugin/build.gradle create mode 100644 org.jd.ide.eclipse.plugin/build.properties create mode 100644 org.jd.ide.eclipse.plugin/icons/jd_16.png create mode 100644 org.jd.ide.eclipse.plugin/icons/jd_32.png create mode 100644 org.jd.ide.eclipse.plugin/plugin.xml create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/JavaDecompilerPlugin.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDClassFileEditor.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDSourceMapper.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferenceInitializer.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferencePage.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/startup/JDStartupClass.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/DirectoryLoader.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/ZipLoader.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/LineNumberStringBuilderPrinter.java create mode 100644 org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/StringBuilderPrinter.java create mode 100644 org.jd.ide.eclipse.site/.project create mode 100644 org.jd.ide.eclipse.site/site.xml diff --git a/.gitignore b/.gitignore index 0bacf76..a19a1bc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ *.class *.jar +# JD +debug* + # Eclipse .settings/ bin/ diff --git a/.project b/.project new file mode 100644 index 0000000..044654e --- /dev/null +++ b/.project @@ -0,0 +1,9 @@ + + + jd-eclipse + + + + + + diff --git a/LICENSE b/LICENSE index 21dbbc6..230579e 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,7 @@ Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (c) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -635,7 +635,7 @@ the "copyright" line and a pointer to where the full notice is found. JD-Eclipse is a plug-in for the Eclipse platform. It allows you to display all the Java sources during your debugging process, even if you do not have them all. - Copyright (C) 2008-2015 Emmanuel Dupuy + Copyright (c) 2008, 2019 Emmanuel Dupuy This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -655,7 +655,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - JD-Eclipse Copyright (C) 2008-2015 Emmanuel Dupuy + JD-Eclipse Copyright (c) 2008, 2019 Emmanuel Dupuy This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/build.gradle b/build.gradle index 22c7c6d..6bf9df5 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'distribution' // Common configuration // allprojects { - version='1.0.0' + version='2.0.0' } subprojects.each { subproject -> @@ -10,17 +10,29 @@ subprojects.each { subproject -> } distributions { - site { + distZip { + // Create JAR files before final ZIP file + dependsOn subprojects.tasks['jar'] + // For each file, remove root directory + eachFile { file -> + String path = file.relativePath + file.setPath(path.substring(path.indexOf('/')+1, path.length())) + } + } + + main { contents { into('features') { - from { fileTree('jd.ide.eclipse.feature/build/libs') { include '*.jar' } } + from { + fileTree 'org.jd.ide.eclipse.feature/build/libs' + } } into('plugins') { - from { fileTree('jd.ide.eclipse.plugin/build/libs') { include '*.jar' } } + from { + fileTree 'org.jd.ide.eclipse.plugin/build/libs' + } } - from 'jd.ide.eclipse.site/site.xml', 'LICENSE', 'NOTICE', 'README.md' + from 'org.jd.ide.eclipse.site/site.xml', 'LICENSE', 'NOTICE', 'README.md' } } } - -installSiteDist.dependsOn subprojects.tasks['jar'] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2322723c7ed5f591adfa4c87b6c51932f591249a..b5166dad4d90021f6a0b45268c0755719f1d5cd4 100644 GIT binary patch delta 20819 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%0As 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 bASgruN7Vt0FQi$Nz-7#K7@V{Ez1IH$92=ST delta 19525 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5b79a30..1715e2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jul 06 16:38:55 CEST 2015 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +#Sat Mar 02 11:11:32 CET 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip diff --git a/org.jd.ide.eclipse.feature/.classpath b/org.jd.ide.eclipse.feature/.classpath new file mode 100644 index 0000000..b7e2871 --- /dev/null +++ b/org.jd.ide.eclipse.feature/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/org.jd.ide.eclipse.feature/.project b/org.jd.ide.eclipse.feature/.project new file mode 100644 index 0000000..2194f53 --- /dev/null +++ b/org.jd.ide.eclipse.feature/.project @@ -0,0 +1,21 @@ + + + org.jd.ide.eclipse.feature + + + + org.eclipse.pde.FeatureNature + org.eclipse.jdt.core.javanature + + + + org.eclipse.pde.FeatureBuilder + + + + org.eclipse.jdt.core.javabuilder + + + + + diff --git a/org.jd.ide.eclipse.feature/build.gradle b/org.jd.ide.eclipse.feature/build.gradle new file mode 100644 index 0000000..269e3be --- /dev/null +++ b/org.jd.ide.eclipse.feature/build.gradle @@ -0,0 +1,6 @@ +apply plugin: 'java' + +jar { + from 'feature.xml' + archiveName baseName + '_' + version + '.' + extension +} diff --git a/org.jd.ide.eclipse.feature/build.properties b/org.jd.ide.eclipse.feature/build.properties new file mode 100644 index 0000000..64f93a9 --- /dev/null +++ b/org.jd.ide.eclipse.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/org.jd.ide.eclipse.feature/feature.xml b/org.jd.ide.eclipse.feature/feature.xml new file mode 100644 index 0000000..5680b88 --- /dev/null +++ b/org.jd.ide.eclipse.feature/feature.xml @@ -0,0 +1,90 @@ + + + + + JD-Eclipse is a plug-in for the Eclipse platform. It allows you to display all the Java sources during your debugging process, even if you do not have them all. + + + + Copyright (c) 2008, 2019 Emmanuel Dupuy + + + + . + GNU GENERAL PUBLIC LICENSE + + Version 3, 29 June 2007 + + <http://www.gnu.org/licenses/gpl-3.0.html> + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + JD-Eclipse is a plug-in for the Eclipse platform. It allows you to + display all the Java sources during your debugging process, even if you + do not have them all. + Copyright (c) 2008, 2019 Emmanuel Dupuy + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + JD-Eclipse Copyright (c) 2008, 2019 Emmanuel Dupuy + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + + + diff --git a/org.jd.ide.eclipse.plugin/.classpath b/org.jd.ide.eclipse.plugin/.classpath new file mode 100644 index 0000000..a6d508d --- /dev/null +++ b/org.jd.ide.eclipse.plugin/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.jd.ide.eclipse.plugin/.project b/org.jd.ide.eclipse.plugin/.project new file mode 100644 index 0000000..e5dfac0 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/.project @@ -0,0 +1,25 @@ + + + org.jd.ide.eclipse.plugin + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + + + org.eclipse.jdt.core.javabuilder + + + + org.eclipse.pde.ManifestBuilder + + + + org.eclipse.pde.SchemaBuilder + + + + + diff --git a/org.jd.ide.eclipse.plugin/META-INF/MANIFEST.MF b/org.jd.ide.eclipse.plugin/META-INF/MANIFEST.MF new file mode 100644 index 0000000..9f14a20 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/META-INF/MANIFEST.MF @@ -0,0 +1,25 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: JD-Eclipse Plug-in +Bundle-SymbolicName: org.jd.ide.eclipse.plugin;singleton:=true +Bundle-Version: 2.0.0 +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.ui, + org.eclipse.ui.editors, + org.eclipse.jdt.ui, + org.eclipse.jdt.core, + org.eclipse.core.runtime, + org.eclipse.core.resources, + org.eclipse.ui.ide, + org.eclipse.jface.text +Bundle-Vendor: Java Decompiler +Bundle-Activator: org.jd.ide.eclipse.JavaDecompilerPlugin +Bundle-ActivationPolicy: lazy +Bundle-ClassPath: /lib/jd-core-1.0.7.jar,. +Export-Package: org.jd.core.v1, + org.jd.ide.eclipse, + org.jd.ide.eclipse.editors, + org.jd.ide.eclipse.preferences, + org.jd.ide.eclipse.startup, + org.jd.ide.eclipse.util.loader, + org.jd.ide.eclipse.util.printer diff --git a/org.jd.ide.eclipse.plugin/about.ini b/org.jd.ide.eclipse.plugin/about.ini new file mode 100644 index 0000000..6892842 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/about.ini @@ -0,0 +1,7 @@ +featureImage=icons/jd_32.png +aboutText=Java Decompiler\n\ +\n\ +Web site: http://java-decompiler.github.io\n\ +Issues: https://github.com/java-decompiler/jd-eclipse/issues\n\ +\n\ +Copyright (c) 2008, 2019 Emmanuel Dupuy diff --git a/org.jd.ide.eclipse.plugin/build.gradle b/org.jd.ide.eclipse.plugin/build.gradle new file mode 100644 index 0000000..5a48efc --- /dev/null +++ b/org.jd.ide.eclipse.plugin/build.gradle @@ -0,0 +1,81 @@ +apply plugin: 'java' + +repositories { + jcenter() +} + +configurations { + provided + compile.extendsFrom provided +} + +dependencies { + compile 'org.jd:jd-core:1.0.7' + + provided 'org.eclipse.core:org.eclipse.core.commands:3.6.0' + provided 'org.eclipse.core:org.eclipse.core.resources:3.7.100' + + provided('org.eclipse.jdt:org.eclipse.jdt.core:3.18.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.jdt:org.eclipse.jdt.ui:3.18.0') { + exclude group:'org.eclipse.birt.runtime' + exclude group:'org.eclipse.emf' + exclude group:'org.eclipse.jdt' + exclude group:'org.eclipse.platform' + exclude group:'com.ibm.icu' + } + provided('org.eclipse.platform:org.eclipse.jface:3.15.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.jface.text:3.15.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.swt.win32.win32.x86_64:3.111.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.ui.workbench:3.111.0') { + exclude group:'org.eclipse.emf' + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.ui.workbench.texteditor:3.11.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.ui.ide:3.15.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.ui.editors:3.11.0') { + exclude group:'org.eclipse.platform' + } + provided('org.eclipse.platform:org.eclipse.ui.editors:3.11.0') { + exclude group:'org.eclipse.platform' + } +} + +compileJava { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' + source 'src' +} + +jar { + archiveName baseName + '_' + version + '.' + extension + manifest { + from 'META-INF/MANIFEST.MF' + } + from fileTree('.') { + include 'icons/**' + include 'about.ini' + include 'plugin.xml' + } + into('lib') { + from project.configurations.runtime - project.configurations.provided + } +} + +task copyDependencies(type: Copy) { + from project.configurations.runtime - project.configurations.provided + into 'lib' +} + +build.finalizedBy copyDependencies diff --git a/org.jd.ide.eclipse.plugin/build.properties b/org.jd.ide.eclipse.plugin/build.properties new file mode 100644 index 0000000..290bd9f --- /dev/null +++ b/org.jd.ide.eclipse.plugin/build.properties @@ -0,0 +1,9 @@ +bin.includes = META-INF/,\ + plugin.xml,\ + icons/,\ + about.ini,\ + lib/jd-core-1.0.7.jar,\ + . +source.. = src/ +jars.compile.order = . + diff --git a/org.jd.ide.eclipse.plugin/icons/jd_16.png b/org.jd.ide.eclipse.plugin/icons/jd_16.png new file mode 100644 index 0000000000000000000000000000000000000000..986fb1dc8af8e429c39d3b1821491e1d14117414 GIT binary patch literal 734 zcmV<40wMj0P)2KP3(|OO$(6m5($w}VlobztZy(Sb{ZnxXX zId?F|V!ge+E3K`q7#SJa!xM@bP)b9LF^42c9qsMy4yV&8?Z+!>P*YP=X|vhRsjAu} z%kt&H!9ltoj}$5Yg3srxCxo2d-rf#+z21ppADMPv+`n}V5vk&trfElhPy1f|^iB*V z)NK5}26vn5E!9;*=dq@!n?d#|H7k#74qX2k; z!Sn7@eOGQj=t_L-hqaW#<}8I0m!Pc^kgy7v80;6@;9r_zUENPzpXS5wcML=TxbCX! zY;@f`Dx^gaH4SZR5&FUsGQYw|uVi5=tAtQj3yq{qLH}H|t?BR?SuiimY{X-^5Jd}t z-0T8y$;ehPD%Am~P?Z=;R?F~ksN)XTHH2@poWNw@s<5{y1b_s<3czBVMF0Y5VgqAC zkC6&^VLwpb06-#zc?t$Z!$b$bj5iZ#Y8_U(f{od6d>ES<2S9ht0nfvZnCC(#q6Mi` zl0A7e{L(WW>;b??p_my$El->^_6!-CMo<5bdlQS10RV~IC`Tjlpss8hWDNiXpcPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU0RjvI4KfPQW&i*NElET{R9M5s zmtAZeR~3N2J2N}GYp>UK{1-cRXhWPp5*sB_qqYR8AtDH+QU$Jx1QG~@5Kpc9#8bo* z4MAEUP7zO686pKkhuL9{o`lo;hgi1Y2HkwQt8d=&>q$J>C>l;vuDpf?>NqjmSwf| z^z?imXxOYCW3vlRojTQ_lsahJ_R(UoxWl&Xgp^X3Qa%}tMnB=YZuYSNoIH85DGbB! zWwY6*N~Kc5^SqdpQU`>TQr@_6W7u`w!ejG5p-|}0WHQgVu3G~LP1A(yy3YLk{KU}E z(3R=w>1)8`V*xmE;soh*y2-Mv8l{xbG)+uSPL5r^eECADR7wGJKoL-nD-#jtN&UedgX9;tM9ABF*EpVZQS3NNSfPg z;zqOCwlkRxTM>ePZ8m#9OsHAMwu4L|@6P6J4Fewy3TXYe3I6tdR)&XpZ;KNSw!L2^cl#ox>32|GmWUyVBqA6w z9ZedH-PMRmgZ5+%wY72d`UKIAX0*CyM05wLW*3?93!MAuYtEa4*{@%@w{+p-ARY#x zABdw*f4+NL%bstL9X(I>H$R~+mZWBT3$czyjJgEq5u~GYpdErNcr!lshZzbZLzKoR zi1&2TcljDAG#LB+)ob4d{tPTv1qhWgHBAzUYb16YBIx`OV_^g_J&*U` z9!|^x%_hkE`19aSYLxyVab_ec1kEsT=N3e$;zHjbyFD5a9SS`*Em+u1^<=-O|M z%=%T2p)f+?ZB4{qewn~6;iqQ^9^8Z64ANSJLIKg{VeXD#9I2(gt^u=iE9R5iiFS0L zM{DtX!P49!GITj|py}DVy3X4|2=cj7K4us{Ja_&6&j7DV9#EiZ81W=VXD@W_FDn~j z?RyU;KoKAV7wP0d26P?x7X3$e>UykM7g_{s_G;6Q`(OP*W8A!&EqOy56eDd#M49L- z%&VeTq!LlKMxvRmXl66Qs6`lY>e`>>;Guo>yW0|dfLX-@qD9NjEUU;j zzx!p9tv#gY7qGq1U){+D9uO67)ysg?I&FnmqoZh96fKVzUg#xi*5PLFa^=dHKasXa zfYJs4szRx#fRGzz+GInFmtNdMyml)B$saBbFfcqjoOk>`Z2+Lk46BNHS?2a?^+%zF zNldYf@8!90?p<|eVCwz9&n&+VjBHSjRfVkXR#X_56(AKJ(R@-9Q(PQeEWJIl@YmFW z^$Xw<;QWUG<-rxM;}KaQta&F_Smxv#Q!{U;=6`8>;ctQ4K(KBm6#oVwAD-v6Lzcxz zr5Ds1k0_-mIKhW8|!p$<;OEbg&tmJf#T$K+*{|#OjWx?yO lNC~i3jAa44+IKG>{{)@p^p + + + + + + + + + + + + + + + + + diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/JavaDecompilerPlugin.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/JavaDecompilerPlugin.java new file mode 100644 index 0000000..223b082 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/JavaDecompilerPlugin.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse; + +import org.eclipse.jdt.ui.JavaUI; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IEditorDescriptor; +import org.eclipse.ui.IFileEditorMapping; +import org.eclipse.ui.internal.WorkbenchPlugin; +import org.eclipse.ui.internal.registry.EditorDescriptor; +import org.eclipse.ui.internal.registry.EditorRegistry; +import org.eclipse.ui.internal.registry.FileEditorMapping; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.4 + */ +@SuppressWarnings({ "restriction", "deprecation" }) +public class JavaDecompilerPlugin extends AbstractUIPlugin { + // The plug-in IDs + public static final String PLUGIN_ID = "jd.ide.eclipse"; + private static final String EDITOR_ID = PLUGIN_ID + ".editors.JDClassFileEditor"; + + // Versions + public static final String VERSION_JD_ECLIPSE = "2.0.0"; + public static final String VERSION_JD_CORE = "1.0.7"; + + // Preferences + public static final String PREF_ESCAPE_UNICODE_CHARACTERS = PLUGIN_ID + ".prefs.EscapeUnicodeCharacters"; + public static final String PREF_REALIGN_LINE_NUMBERS = PLUGIN_ID + ".prefs.RealignLineNumbers"; + public static final String PREF_SHOW_LINE_NUMBERS = PLUGIN_ID + ".prefs.ShowLineNumbers"; + public static final String PREF_SHOW_METADATA = PLUGIN_ID + ".prefs.ShowMetadata"; + + // URLs + public static final String URL_JDECLIPSE = "https://github.com/java-decompiler/jd-eclipse"; + + // The shared instance + private static JavaDecompilerPlugin plugin; + + + /** + * The constructor + */ + public JavaDecompilerPlugin() {} + + /** + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + + // Setup ".class" file associations + Display.getDefault().syncExec(new SetupClassFileAssociationRunnable()); + } + + /* + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext context) throws Exception { + plugin.savePluginPreferences(); + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * @return the shared instance + */ + public static JavaDecompilerPlugin getDefault() { + return plugin; + } + + protected static class SetupClassFileAssociationRunnable implements Runnable { + public void run() { + EditorRegistry registry = (EditorRegistry)WorkbenchPlugin.getDefault().getEditorRegistry(); + + IFileEditorMapping[] mappings = registry.getFileEditorMappings(); + IFileEditorMapping c = null; + IFileEditorMapping cws = null; + + // Search Class file editor mappings + for (IFileEditorMapping mapping : mappings) { + if (mapping.getExtension().equals("class")) { + // ... Helios 3.6, Indigo 3.7, Juno 4.2, Kepler 4.3, ... + c = mapping; + } else if (mapping.getExtension().equals("class without source")) { + // Juno 4.2, Kepler 4.3, ... + cws = mapping; + } + } + + if ((c != null) && (cws != null)) { + // Search JD editor descriptor on "class" extension + for (IEditorDescriptor descriptor : c.getEditors()) { + if (descriptor.getId().equals(EDITOR_ID)) { + // Remove JD editor on "class" extension + ((FileEditorMapping)c).removeEditor((EditorDescriptor)descriptor); + + // Set JD as default editor on "class without source" extension + registry.setDefaultEditor("." + cws.getExtension(), descriptor.getId()); + break; + } + } + + // Restore the default editor for "class" extension + IEditorDescriptor defaultClassFileEditor = registry.findEditor(JavaUI.ID_CF_EDITOR); + + if (defaultClassFileEditor != null) { + registry.setDefaultEditor("." + c.getExtension(), JavaUI.ID_CF_EDITOR); + } + + registry.setFileEditorMappings((FileEditorMapping[]) mappings); + registry.saveAssociations(); + } + } + } +} \ No newline at end of file diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDClassFileEditor.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDClassFileEditor.java new file mode 100644 index 0000000..b0d94e6 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDClassFileEditor.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.editors; + +import java.io.File; +import java.lang.reflect.Method; +import java.net.URI; +import java.util.Map; + +import org.jd.ide.eclipse.JavaDecompilerPlugin; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.jdt.core.IBuffer; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.internal.core.BufferManager; +import org.eclipse.jdt.internal.core.ClassFile; +import org.eclipse.jdt.internal.core.PackageFragment; +import org.eclipse.jdt.internal.core.PackageFragmentRoot; +import org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor; +import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IFileEditorInput; +import org.eclipse.ui.ide.FileStoreEditorInput; +import org.eclipse.ui.ide.ResourceUtil; + + +/** + * JDClassFileEditor + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.4 + * @see org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor + */ +@SuppressWarnings("restriction") +public class JDClassFileEditor extends ClassFileEditor implements IPropertyChangeListener { + public JDClassFileEditor() { + JavaDecompilerPlugin + .getDefault() + .getPreferenceStore() + .addPropertyChangeListener(this); + } + + @Override + protected void doSetInput(IEditorInput input) throws CoreException { + if (input instanceof IFileEditorInput) { + IFile file = ((IFileEditorInput)input).getFile(); + + if (file instanceof IClassFile) { + IClassFile classFile = (IClassFile)file; + cleanupBuffer(classFile); + setupSourceMapper(classFile); + } + } else if (input instanceof IClassFileEditorInput) { + IClassFileEditorInput classFileEditorInput = (IClassFileEditorInput)input; + IClassFile classFile = classFileEditorInput.getClassFile(); + cleanupBuffer(classFile); + setupSourceMapper(classFile); + } + + super.doSetInput(input); + } + + protected static void cleanupBuffer(IClassFile file) { + IBuffer buffer = BufferManager.getDefaultBufferManager().getBuffer(file); + + if (buffer != null) { + try { + // Remove the buffer + Method method = BufferManager.class.getDeclaredMethod("removeBuffer", new Class[] {IBuffer.class}); + method.setAccessible(true); + method.invoke(BufferManager.getDefaultBufferManager(), new Object[] {buffer}); + } catch (Exception e) { + JavaDecompilerPlugin.getDefault().getLog().log(new Status( + Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, + 0, e.getMessage(), e)); + } + } + } + + @SuppressWarnings("rawtypes") + protected void setupSourceMapper(IClassFile classFile) { + try { + // Search package fragment root and classPath + IJavaElement packageFragment = classFile.getParent(); + IJavaElement packageFragmentRoot = packageFragment.getParent(); + + if (packageFragmentRoot instanceof PackageFragmentRoot) { + // Setup a new source mapper. + PackageFragmentRoot root = (PackageFragmentRoot)packageFragmentRoot; + + // Location of the archive file containing classes. + IPath basePath = root.getPath(); + File baseFile = basePath.makeAbsolute().toFile(); + + if (!baseFile.exists()) { + IResource resource = root.getCorrespondingResource(); + basePath = resource.getLocation(); + baseFile = basePath.makeAbsolute().toFile(); + } + + // Class path + String classPath = classFile.getElementName(); + String packageName = packageFragment.getElementName(); + if ((packageName != null) && (packageName.length() > 0)) { + classPath = packageName.replace('.', '/') + '/' + classPath; + } + + // Location of the archive file containing source. + IPath sourcePath = root.getSourceAttachmentPath(); + if (sourcePath == null) { + sourcePath = basePath; + } + + // Location of the package fragment root within the zip + // (empty specifies the default root). + IPath sourceAttachmentRootPath = root.getSourceAttachmentRootPath(); + String sourceRootPath; + + if (sourceAttachmentRootPath == null) { + sourceRootPath = null; + } else { + sourceRootPath = sourceAttachmentRootPath.toString(); + if ((sourceRootPath != null) && (sourceRootPath.length() == 0)) + sourceRootPath = null; + } + + // Options + Map options = root.getJavaProject().getOptions(true); + + root.setSourceMapper(new JDSourceMapper(baseFile, sourcePath, sourceRootPath, options)); + } + } catch (CoreException e) { + JavaDecompilerPlugin.getDefault().getLog().log(new Status( + Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, + 0, e.getMessage(), e)); + } + } + + @Override public boolean isEditable() { return false; } + @Override public boolean isDirty() { return false; } + @Override public boolean isEditorInputReadOnly() { return false; } + + @Override + public void dispose() { + JavaDecompilerPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this); + } + + /** + * Refresh decompiled source code. + * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + if (getSourceViewer() != null) { + setInput(getEditorInput()); + } + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDSourceMapper.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDSourceMapper.java new file mode 100644 index 0000000..b3339ed --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/editors/JDSourceMapper.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.editors; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.jd.core.v1.ClassFileToJavaSourceDecompiler; +import org.jd.core.v1.api.loader.Loader; +import org.jd.ide.eclipse.JavaDecompilerPlugin; +import org.jd.ide.eclipse.util.loader.DirectoryLoader; +import org.jd.ide.eclipse.util.loader.ZipLoader; +import org.jd.ide.eclipse.util.printer.LineNumberStringBuilderPrinter; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Status; +import org.eclipse.jdt.internal.core.SourceMapper; +import org.eclipse.jface.preference.IPreferenceStore; + + +/** + * JDSourceMapper + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.4 + * @see org.eclipse.jdt.internal.core.SourceMapper + */ +@SuppressWarnings("restriction") +public class JDSourceMapper extends SourceMapper { + private final static String JAVA_CLASS_SUFFIX = ".class"; + private final static String JAVA_SOURCE_SUFFIX = ".java"; + private final static int JAVA_SOURCE_SUFFIX_LENGTH = 5; + + private final static ClassFileToJavaSourceDecompiler DECOMPILER = new ClassFileToJavaSourceDecompiler(); + + private File basePath; + + private LineNumberStringBuilderPrinter printer = new LineNumberStringBuilderPrinter(); + + @SuppressWarnings("rawtypes") + public JDSourceMapper(File basePath, IPath sourcePath, String sourceRootPath, Map options) { + super(sourcePath, sourceRootPath, options); + this.basePath = basePath; + } + + @Override + @SuppressWarnings("rawtypes") + public char[] findSource(String javaSourcePath) { + char[] source = null; + + // Search source file + if (this.rootPaths == null) { + source = super.findSource(javaSourcePath); + } else { + Iterator iterator = this.rootPaths.iterator(); + + while (iterator.hasNext() && (source == null)) { + String sourcesRootPath = (String)iterator.next(); + source = super.findSource(sourcesRootPath + IPath.SEPARATOR + javaSourcePath); + } + } + + if ((source == null) && javaSourcePath.toLowerCase().endsWith(JAVA_SOURCE_SUFFIX)) { + String internalTypeName = javaSourcePath.substring(0, javaSourcePath.length()-JAVA_SOURCE_SUFFIX_LENGTH); + + // Decompile class file + try { + source = decompile(this.basePath.getAbsolutePath(), internalTypeName); + } catch (Exception e) { + JavaDecompilerPlugin.getDefault().getLog().log(new Status( + Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, + 0, e.getMessage(), e)); + } + } + + return source; + } + + /** + * @param basePath Path to the root of the classpath, either a + * path to a directory or a path to a jar file. + * @param internalClassName internal name of the class. + * @return Decompiled class text. + */ + protected char[] decompile(String basePath, String internalTypeName) throws Exception { + // Load preferences + IPreferenceStore store = JavaDecompilerPlugin.getDefault().getPreferenceStore(); + + boolean realignmentLineNumber = store.getBoolean(JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS); + boolean unicodeEscape = store.getBoolean(JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS); + boolean showLineNumbers = store.getBoolean(JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS); + boolean showMetaData = store.getBoolean(JavaDecompilerPlugin.PREF_SHOW_METADATA); + + Map configuration = new HashMap<>(); + configuration.put("realignLineNumbers", realignmentLineNumber); + + // Initialize loader + Loader loader; + File base = new File(basePath); + + if (base.isFile()) { + if (basePath.toLowerCase().endsWith(".jar") || basePath.toLowerCase().endsWith(".zip")) { + loader = new ZipLoader(base); + } else { + JavaDecompilerPlugin.getDefault().getLog().log(new Status( + Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, + "Unexpected container type file: " + basePath)); + return null; + } + } else { + loader = new DirectoryLoader(base); + } + + // Initialize printer + printer.setRealignmentLineNumber(realignmentLineNumber); + printer.setUnicodeEscape(unicodeEscape); + printer.setShowLineNumbers(showLineNumbers); + + // Decompile class file + DECOMPILER.decompile(loader, printer, internalTypeName, configuration); + + StringBuilder stringBuffer = printer.getStringBuffer(); + + // Metadata + if (showMetaData) { + // Add location + stringBuffer.append("\n\n/* Location: "); + String classPath = internalTypeName + JAVA_CLASS_SUFFIX; + String location = base.isFile() ? base.getPath() + "!/" + classPath : new File(base, classPath).getPath(); + // Escape "\ u" sequence to prevent "Invalid unicode" errors + stringBuffer.append(location.replaceAll("(^|[^\\\\])\\\\u", "\\\\\\\\u")); + // Add Java compiler version + int majorVersion = printer.getMajorVersion(); + if (majorVersion >= 45) { + stringBuffer.append("\n * Java compiler version: "); + + if (majorVersion >= 49) { + stringBuffer.append(majorVersion - (49 - 5)); + } else { + stringBuffer.append(majorVersion - (45 - 1)); + } + + stringBuffer.append(" ("); + stringBuffer.append(majorVersion); + stringBuffer.append('.'); + stringBuffer.append(printer.getMinorVersion()); + stringBuffer.append(')'); + } + // Add JD-Core version + stringBuffer.append("\n * JD-Core Version: "); + stringBuffer.append(JavaDecompilerPlugin.VERSION_JD_CORE); + stringBuffer.append("\n */"); + } + + return stringBuffer.toString().toCharArray(); + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferenceInitializer.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferenceInitializer.java new file mode 100644 index 0000000..2806c75 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferenceInitializer.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.preferences; + +import org.jd.ide.eclipse.JavaDecompilerPlugin; + +import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; +import org.eclipse.jface.preference.IPreferenceStore; + +/** + * Class used to initialize default preference values. + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.3 + */ +public class PreferenceInitializer extends AbstractPreferenceInitializer { + /** + * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() + */ + public void initializeDefaultPreferences() { + IPreferenceStore store = JavaDecompilerPlugin.getDefault().getPreferenceStore(); + store.setDefault(JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS, false); + store.setDefault(JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS, true); + store.setDefault(JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS, true); + store.setDefault(JavaDecompilerPlugin.PREF_SHOW_METADATA, true); + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferencePage.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferencePage.java new file mode 100644 index 0000000..7a092a8 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/preferences/PreferencePage.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.preferences; + +import org.jd.ide.eclipse.JavaDecompilerPlugin; + +import org.eclipse.jface.preference.BooleanFieldEditor; +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +/** + * PreferencePage + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.3 + */ +public class PreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { + public PreferencePage() { + super(SWT.NONE); + setDescription("JD-Eclipse preference page"); + } + + /** + * Creates the field editors. Field editors are abstractions of + * the common GUI blocks needed to manipulate various types + * of preferences. Each field editor knows how to save and + * restore itself. + */ + public void createFieldEditors() { + Composite fieldEditorParent = getFieldEditorParent(); + + new Label(fieldEditorParent, SWT.NONE); + + addField(new BooleanFieldEditor( + JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS, + "Escape unicode characters", fieldEditorParent)); + addField(new BooleanFieldEditor( + JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS, + "Realign line numbers", fieldEditorParent)); + addField(new BooleanFieldEditor( + JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS, + "Show original line numbers", fieldEditorParent)); + addField(new BooleanFieldEditor( + JavaDecompilerPlugin.PREF_SHOW_METADATA, + "Show metadata", fieldEditorParent)); + } + + /** + * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) + */ + public void init(IWorkbench workbench) { + setPreferenceStore(JavaDecompilerPlugin.getDefault().getPreferenceStore()); + } +} \ No newline at end of file diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/startup/JDStartupClass.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/startup/JDStartupClass.java new file mode 100644 index 0000000..28b18bf --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/startup/JDStartupClass.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.startup; + +import org.eclipse.ui.IStartup; + +/** + * JDStartupClass + * + * @project Java Decompiler Eclipse Plugin + * @version 0.1.4 + */ +public class JDStartupClass implements IStartup { + public void earlyStartup() {} +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/DirectoryLoader.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/DirectoryLoader.java new file mode 100644 index 0000000..9f184cd --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/DirectoryLoader.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.util.loader; + +import org.jd.core.v1.api.loader.Loader; +import org.jd.core.v1.api.loader.LoaderException; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class DirectoryLoader implements Loader { + protected File root; + + public DirectoryLoader(File root) throws LoaderException { + this.root = root; + } + + @Override + public byte[] load(String internalName) throws LoaderException { + File file = new File(root, internalName + ".class"); + + try (FileInputStream in=new FileInputStream(file); ByteArrayOutputStream out=new ByteArrayOutputStream()) { + byte[] buffer = new byte[1024]; + int read = in.read(buffer); + + while (read > 0) { + out.write(buffer, 0, read); + read = in.read(buffer); + } + + return out.toByteArray(); + } catch (IOException e) { + throw new LoaderException(e); + } + } + + @Override + public boolean canLoad(String internalName) { + return new File(root, internalName + ".class").exists(); + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/ZipLoader.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/ZipLoader.java new file mode 100644 index 0000000..dab834d --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/loader/ZipLoader.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.util.loader; + +import org.jd.core.v1.api.loader.Loader; +import org.jd.core.v1.api.loader.LoaderException; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class ZipLoader implements Loader { + protected HashMap map = new HashMap<>(); + + public ZipLoader(File zip) throws LoaderException { + byte[] buffer = new byte[1024 * 2]; + + try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zip))) { + ZipEntry ze = zis.getNextEntry(); + + while (ze != null) { + if (ze.isDirectory() == false) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int read = zis.read(buffer); + + while (read > 0) { + out.write(buffer, 0, read); + read = zis.read(buffer); + } + + map.put(ze.getName(), out.toByteArray()); + } + + ze = zis.getNextEntry(); + } + + zis.closeEntry(); + } catch (IOException e) { + throw new LoaderException(e); + } + } + + @Override + public byte[] load(String internalName) throws LoaderException { + return map.get(internalName + ".class"); + } + + @Override + public boolean canLoad(String internalName) { + return map.containsKey(internalName + ".class"); + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/LineNumberStringBuilderPrinter.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/LineNumberStringBuilderPrinter.java new file mode 100644 index 0000000..1930949 --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/LineNumberStringBuilderPrinter.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.util.printer; + +public class LineNumberStringBuilderPrinter extends StringBuilderPrinter { + protected boolean showLineNumbers = false; + + protected int maxLineNumber = 0; + protected int digitCount = 0; + + protected String lineNumberBeginPrefix; + protected String lineNumberEndPrefix; + protected String unknownLineNumberPrefix; + + public void setShowLineNumbers(boolean showLineNumbers) { this.showLineNumbers = showLineNumbers; } + + protected int printDigit(int dcv, int lineNumber, int divisor, int left) { + if (digitCount >= dcv) { + if (lineNumber < divisor) { + stringBuffer.append(' '); + } else { + int e = (lineNumber-left) / divisor; + stringBuffer.append((char)('0' + e)); + left += e*divisor; + } + } + + return left; + } + + // --- Printer --- // + @Override + public void start(int maxLineNumber, int majorVersion, int minorVersion) { + super.start(maxLineNumber, majorVersion, minorVersion); + + if (showLineNumbers) { + this.maxLineNumber = maxLineNumber; + + if (maxLineNumber > 0) { + digitCount = 1; + unknownLineNumberPrefix = " "; + int maximum = 9; + + while (maximum < maxLineNumber) { + digitCount++; + unknownLineNumberPrefix += ' '; + maximum = maximum*10 + 9; + } + + lineNumberBeginPrefix = "/* "; + lineNumberEndPrefix = " */ "; + } else { + unknownLineNumberPrefix = ""; + lineNumberBeginPrefix = ""; + lineNumberEndPrefix = ""; + } + } else { + this.maxLineNumber = 0; + unknownLineNumberPrefix = ""; + lineNumberBeginPrefix = ""; + lineNumberEndPrefix = ""; + } + } + + @Override public void startLine(int lineNumber) { + if (maxLineNumber > 0) { + stringBuffer.append(lineNumberBeginPrefix); + + if (lineNumber == UNKNOWN_LINE_NUMBER) { + stringBuffer.append(unknownLineNumberPrefix); + } else { + int left = 0; + + left = printDigit(5, lineNumber, 10000, left); + left = printDigit(4, lineNumber, 1000, left); + left = printDigit(3, lineNumber, 100, left); + left = printDigit(2, lineNumber, 10, left); + stringBuffer.append((char)('0' + (lineNumber-left))); + } + + stringBuffer.append(lineNumberEndPrefix); + } + + for (int i=0; i 0) { + if (maxLineNumber > 0) { + stringBuffer.append(lineNumberBeginPrefix); + stringBuffer.append(unknownLineNumberPrefix); + stringBuffer.append(lineNumberEndPrefix); + } + + stringBuffer.append(NEWLINE); + } + } + } +} diff --git a/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/StringBuilderPrinter.java b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/StringBuilderPrinter.java new file mode 100644 index 0000000..118720c --- /dev/null +++ b/org.jd.ide.eclipse.plugin/src/org/jd/ide/eclipse/util/printer/StringBuilderPrinter.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2008, 2019 Emmanuel Dupuy. + * This project is distributed under the GPLv3 license. + * This is a Copyleft license that gives the user the right to use, + * copy and modify the code freely for non-commercial purposes. + */ + +package org.jd.ide.eclipse.util.printer; + +import org.jd.core.v1.api.printer.Printer; + +public class StringBuilderPrinter implements Printer { + protected static final String TAB = " "; + protected static final String NEWLINE = "\n"; + + protected StringBuilder stringBuffer = new StringBuilder(10*1024); + + protected boolean unicodeEscape = true; + protected boolean realignmentLineNumber = false; + + protected int majorVersion = 0; + protected int minorVersion = 0; + protected int indentationCount; + + public void setUnicodeEscape(boolean unicodeEscape) { this.unicodeEscape = unicodeEscape; } + public void setRealignmentLineNumber(boolean realignmentLineNumber) { this.realignmentLineNumber = realignmentLineNumber; } + + public int getMajorVersion() { return majorVersion; } + public int getMinorVersion() { return minorVersion; } + public StringBuilder getStringBuffer() { return stringBuffer; } + + protected void escape(String s) { + if (unicodeEscape && (s != null)) { + int length = s.length(); + + for (int i=0; i> 3))); + stringBuffer.append((char) ('0' + (c & 0x7))); + } else if (c > 127) { + // Write octal format + stringBuffer.append("\\u"); + + int z = (c >> 12); + stringBuffer.append((char) ((z <= 9) ? ('0' + z) : (('A' - 10) + z))); + z = ((c >> 8) & 0xF); + stringBuffer.append((char) ((z <= 9) ? ('0' + z) : (('A' - 10) + z))); + z = ((c >> 4) & 0xF); + stringBuffer.append((char) ((z <= 9) ? ('0' + z) : (('A' - 10) + z))); + z = (c & 0xF); + stringBuffer.append((char) ((z <= 9) ? ('0' + z) : (('A' - 10) + z))); + } else { + stringBuffer.append(c); + } + } + } else { + stringBuffer.append(s); + } + } + + // --- Printer --- // + @Override + public void start(int maxLineNumber, int majorVersion, int minorVersion) { + this.stringBuffer.setLength(0); + this.majorVersion = majorVersion; + this.minorVersion = minorVersion; + this.indentationCount = 0; + } + + @Override public void end() {} + + @Override public void printText(String text) { escape(text); } + @Override public void printNumericConstant(String constant) { escape(constant); } + @Override public void printStringConstant(String constant, String ownerInternalName) { escape(constant); } + @Override public void printKeyword(String keyword) { stringBuffer.append(keyword); } + + @Override public void printDeclaration(int type, String internalTypeName, String name, String descriptor) { escape(name); } + @Override public void printReference(int type, String internalTypeName, String name, String descriptor, String ownerInternalName) { escape(name); } + + @Override public void indent() { indentationCount++; } + @Override public void unindent() { if (indentationCount > 0) indentationCount--; } + + @Override public void startLine(int lineNumber) { for (int i=0; i 0) stringBuffer.append(NEWLINE); } + + @Override public void startMarker(int type) {} + @Override public void endMarker(int type) {} +} diff --git a/org.jd.ide.eclipse.site/.project b/org.jd.ide.eclipse.site/.project new file mode 100644 index 0000000..7862459 --- /dev/null +++ b/org.jd.ide.eclipse.site/.project @@ -0,0 +1,17 @@ + + + jd.ide.eclipse.site + + + + + + org.eclipse.pde.UpdateSiteBuilder + + + + + + org.eclipse.pde.UpdateSiteNature + + diff --git a/org.jd.ide.eclipse.site/site.xml b/org.jd.ide.eclipse.site/site.xml new file mode 100644 index 0000000..91c5031 --- /dev/null +++ b/org.jd.ide.eclipse.site/site.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/settings.gradle b/settings.gradle index ea0e698..65c50a0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'jd.ide.eclipse.plugin', 'jd.ide.eclipse.feature' +include 'org.jd.ide.eclipse.plugin', 'org.jd.ide.eclipse.feature' From 3b26f544b6320314ca48c0dedcd1826bf77d42ed Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Wed, 17 Jul 2019 22:32:56 +0200 Subject: [PATCH 6/8] Update README.md --- README.md | 30 ++++++++++++----------------- src/website/img/install_anyway.png | Bin 0 -> 8630 bytes src/website/img/jd-eclipse.png | Bin 0 -> 67652 bytes 3 files changed, 12 insertions(+), 18 deletions(-) create mode 100644 src/website/img/install_anyway.png create mode 100644 src/website/img/jd-eclipse.png diff --git a/README.md b/README.md index 82d8d5e..0a0cba6 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ JD-Eclipse, a Java decompiler plug-in for the Eclipse platform. -![](http://java-decompiler.github.io/img/screenshot8.png) +![](https://raw.githubusercontent.com/java-decompiler/jd-eclipse/master/src/website/img/jd-eclipse.png) - Java Decompiler projects home page: [http://java-decompiler.github.io](http://java-decompiler.github.io) -- Java Decompiler Wikipedia page: [http://en.wikipedia.org/wiki/Java_Decompiler](http://en.wikipedia.org/wiki/Java_Decompiler) - JD-Eclipse source code: [https://github.com/java-decompiler/jd-eclipse](https://github.com/java-decompiler/jd-eclipse) ## Description @@ -16,27 +15,22 @@ you do not have them all. ## How to build JD-Eclipse ? ### With Gradle: ``` -> ./gradlew installSiteDist +> git clone https://github.com/java-decompiler/jd-eclipse.git +> cd jd-eclipse +> ./gradlew build ``` -generate _"build/install/jd-eclipse-site"_ -### With Eclipse: -- Download dependencies -``` -> ./gradlew downloadDependencies -``` -- Launch _Eclipse_, -- Import the 3 _"Existing Projects into Workspace"_ by selecting the parent project folder, -- Export _"Deployable features"_, -- Copy _"site.xml"_ to the destination directory. +generate _"build/distributions/jd-eclipse-x.y.z.zip"_ ## How to install JD-Eclipse ? -1. Build or download & unzip _"jd-eclipse-site-x.y.z.zip"_, +1. Build or download _"jd-eclipse-x.y.z.zip"_, 2. Launch _Eclipse_, 3. Click on _"Help > Install New Software..."_, -4. Click on button _"Add..."_ to add an new repository, -5. Enter _"JD-Eclipse Update Site"_ and select the local site directory, -6. Check _"Java Decompiler Eclipse Plug-in"_, -7. Next, next, next... and restart. +4. Drag and drop _"jd-eclipse-x.y.z.zip"_ on dialog windows, +5. Check _"Java Decompiler Eclipse Plug-in"_, +6. Click on "Next" and "Finish" buttons. +7. A warning message dialog windows appear because _"org.jd.ide.eclipse.plugin_x.y.z.jar"_ is not signed. Click on "Install anyway" button. + +![](https://raw.githubusercontent.com/java-decompiler/jd-eclipse/master/src/website/img/install_anyway.png) ## How to check the file associations ? Click on _"Window > Preferences > General > Editors > File Associations"_ diff --git a/src/website/img/install_anyway.png b/src/website/img/install_anyway.png new file mode 100644 index 0000000000000000000000000000000000000000..380eea245bd3a11f9675b9ceb45232f5a27a4e2f GIT binary patch literal 8630 zcmd6MXH-*Nw=U`@sHmt&KxraP0YQpHx`K2Bm6FgBdJi#F1BCdZsPx{OB8Z6eCXj&A zA@tt!N(-R~B!m(Ox#274j{D<|^XrUpe(W{(+N;eu*E65B$6R6047D#^xOstziRqHA z&XX5ROs4^i_uO;LjFR`w+cbta<^4iiovEachsdb>!};;k$4pG+F|0?nXBqYLFLlhl znV2rOoIIyG;9nh>m<057pFB2s1=+|7jJ0k<5lWxNV)Jyuh5Xi^x!eC$uG!O4^u%WJ zp)_+rh&_A9FOzq#t0k{k7W#UOz0RUcbsxu>y4eD~Hrme#mA#rMmyM5Yb&(rdQ3z;a zKEHiU{j7{kOdMC&tys*d;As@!-Y#((^`~xc7uB;uE~1WPs?O5Z@WemEG%R6GsdlH3 zUSZ78lS%!`dDe?9_b;}TIbE{-%a-e%E%?3$*oGmw06kX#C-U7{*|%p;r0uVZ|KBc^ zU*5KDL!&!!5lsTMbGz1cTSxt!b?j<)(cAfJd9`~2H+XrU>YYr&f7BYn? zN;%A2Iv)WvLxUhxJbyAy>W7@*9Rrap-y{R#;r!<^W7tozCURRkuW)818jcqU*I;Tbk&I%2*tQ^6AUW?Cuz| zERJQsQ}~aDXBHzJ0}`?o^%ZN+0&huF#oo6YyKP66@GX&$-|hNdsBHW5{zY!Md~#^0 zys=J|o{3A5J{Ut=C6n6My_Xg^Ap&T>1K?t5>2Y>YF`+5&AO=m@BaON@O4SCfHH5KD z@3d#5s-ZQDy07{2)-8ns77Y6f;QAA%e;IUi3>O$ZJ<3BOrVDe1cFg1OJxW}LzwIx) z-vJ-$*~`ULvsOlt%>4~2#o(-_RG}`}k~V9@v_WU%q=~|j6BwmGz}Ada+;&uSE&S+` z^mV{2rR)_sET?N*fwMd0fKA&-Fnpri9^MITI)El5;>6THRTO4q6dD>D$q)SSsJ>F( z4T7~lkYDvO+l581_8YgFDU_~?Hh+eOz3q&lndwftwK<$)+Yl5qsh}J!iEaPM$k&WO zz!)&Gb_g&QR|no`&P^RXXr2Ga(?k{|P3lV~xR+3)XI^fobv}h+XCs2`5VNEB1o+Vg zUYO5I0$I%qi%cuvIIk$E2u0p}Chbigb%M837H@D@Z^F_|l(}x(K}mJtJMhWeUNvm= zZE088;YNFymc`yv5lDjs1D<1%L|;rY$KBz(`kJA~?tJfSsEk;6j$HVo>qUp9;QE6x z>d}0tdtHd>Uj%K3K5P1IJRM#u>P&hH@2)$YyVQJJ`&MeQ$2{$uL9Y0`_u%y1cTEPE zWy?EAX;*Svsxq*Ii*ac3^k8QhYIm?wlL69MZ3eKl-tc zX^JzleidOAFbKPvQ@;W@SUd~Fops*p+(fV7yao@@w~dsK4PH!F1Xo{80jiQ=m$7&2 z=SW*vj%ztmaMGZ0$mxu7cXE{c3Q3A~FyxC=?BZkNM5JJf>O_vt=20kVcN#AG02Tq%P`Pr|(eb0i)CX(iq@uZWT(W8N#{sABMftvBFl|B) zmcu5#cGzYn=UZ04cEGsRLdq z&5D*hHX<$Za^f`k({9oTy{!FpW|Gt`DDHs0G%m~;A_Cn%swNHO-lX#s>G$q^>Xmj( ztF>hS`2Kg5vD7l1bqc}1`*#k+__#QBkJfi~34cK$Xuk|Y8MD;wl6El7G3CktsHogv z89yP-sC({u;7BQNl&76U+IEfpKa9jrD0P>+`Sd@z)#hCpBW7FfOQZ@&oXCr;PUrqb zyCFCJ`!43@U>=o#>kPL3c=yW5IdtXX+ml1)A7^Y&F~qM&U`F}q{{Q}_`WN8H=;&_2 z2EVQnZNDz>eieemumpBkPo{WWd0c#0&)8wP3{m2rp7@1w(=pxV)fa8J#R+`yWp4<6j= z4gp%hBkb?UpzA&6{PW8uYBybpYuvHFIMy6z>jf0N7C%&48BcJ->&bIJb7!Ln(H=r_gNfG_Vw9KC9;~_BbN_gN?-_(9#W3}MQ#>iTWX(Kzi z*;Cf%VlQ>=Nsa?i(N0lXJj5eycGdp>%>XLJj4N`@A3@UtK1@r zqsbEiJfOL%g;SaGuyDmvoX8nPS>$3C^0eJ$KZt@RX-7y^t@4EtD>L4Hr{dYrxE)4D zKFIZ`lwoeD-FQi#N%IppLln#}+ z(d(7*W94h^+tE?G=6|P0#AwQAPZ$k3l_EEiR0}=Fms&hDjE(qR+7Ii+-=vsEAsO-|x1v^y-s^V^L1e0{PNhK{HXU zu_Jd!q+F+6C6L}dC2F!_8EJUrq0X&(J@7i79w`AH5M|};OA(dN5@6YT8kL!6A=H;&V z_n@xIe$}<_)AwE9bMxj%&YMOc<+j{zKY7J`ADAV(Z0X-C(r-b9OM?L4QP&Wbm#^=vY0^ba20wXB1L@(o*|nV-`D z(eI@i1A<0cO;tOZfM2RS)IZh1zK}`ZePV;lX$tM-PPD3M#lD`Dv4IE8c6)zjD;&DS zh@14Vb^LZoMOkdEp3HuN5srGvs56{Hyd^l+m@R&F5h8qBCIhjv-^rEQW0TH`b!S2` z4vr*4yKi;R9+r12irCIJ=dM&MO?_+sZrniIA59URQ%7(p)C~FVqD9)jP?fOEzN&7} zf+Q)~Z1r)E6!LR%K0)g$Yj)_xXmS+Xq1vvS%$bm7FM{-4qqr}w{lJpNJKzvBAgvTh zc@y(qmsizoUMyz;&zX~l#jrZ&+Q2W8}^wyfuK&=mIByz3}+csJ;oY`U-|a8g36K@4Bk_NldUfS-txi(Vo9vt7D}Z&Fc!Kiy|f* zWp0m5FMJNyi3 zGD9+`YP)E-QJO-n96T1Iv_!vGBt(|-@%x!`gMu6BQ+t1*Jr6sYvIDiRVxT_t^HO{r z7;1anw>9`BUQPhZWuDl4eNboLZ`;Wcbm38xz3>5b9G=JxKWdzLx!}J@U4zG6!l~Y2 zsm+q)KBODUdm^oB;P~G=48%k{%LZ~1R@T;1QXs*mV^SHCrM#K9NK|-NSW7_{kiL7NjzosWiL34* z4;IvpBRw_(b2`aQ_nHDovlYk3vP(p55bj;ClI5<_ZN?AK02ePiK*?`C_7kP0!gtMX zvWe)g8GZa^p5`?_;7ZDYr;Bkyz3S$TNksjE?%l?{59?~y(VGXp3O|mno0I>}=@$PC z?_3>q|4c{!Cb2PQ+$a!iR;Tmn;D?q-LpW`RUJcOQ$B6pQ&do3$RbxYpPyNg*+JOua zqrb>@yp=$z6PHZVPRSCe@DIT>E|@4ZVuf1R3}Wxm{5xxSjk@h)RF*x?Fy@^y(tg|a z_upd3_3bwmNSX?1{T=?Q!j39(?eDbPEO^mUHRQXXgYLb~2KsE^(iwhbZAsc<$5Pzc zg6<}U0zO!~EIXtw75%aXBPS!q*ur>?_m>r>iI*cwPif{b?P14FtE`xYN}rD&-H)L? z5Pee;cGat+(0;Maq~D4S0n-dxks%WJ?7ZmoQ$ERNrD~LCKGvn(IKfuTCJ&4gK=r<= ze+cR}Hd48}#u;R`$jQFgI$Y3IuCkf95UA(n;I3P;|0KxX=+!v9dqiKPt1kzm0f8FF zgP5edxntw9p`1~MUU?usX+wXL3&3Vr%i2sn8ZCtPoxe(hF z%Yg-U|1RE4v{y=cHenV&_*57P)7OQVqMKg2N=O9n(b$)8AZxL};N8m#HR@sE!r^Vg z3K$)lH8}pSX}tI}@N)Oh@X^6(@e+9@qtEO`V+UGYWM@LCXTzP@Yudo){XeSXb77(3 zz}9Mx?caCUvDZ{?G*(}A`);9I+xnbUsV^4+v?x__En)!p{fcG17BllQ?oVg|j$6-U zMfAFMVk+0{$0u#=@t99T1;w zhH?37N4XwT$38ps`&O{!Yxj7{KMYQk#>%Q`@Lomxijv)+Y86I&UJWkH^R=2p z@7T4+?Hf>4;mWIrb^cL@H@!M$4#?w3WcX>+3s+I$?a5Xn?FQV$_KHeFto%Umcy5 z4-P;5$+@;SDoYANWrXEZ=kAOVh)5ccl7F8ZM6O-0?F)D?|3?nS4iFR+WaMjFDr^@# z&5swR#U3$2{WD~ln5(eD1aS{zwbe+enp8q(&su}R+ZUwuP zaN70dJbymWDitmJQ`zjgr`qP!MYJiU2Qy)Wv>kz^h?YMe3opFj9IPU3;X0h7=t(n* z>|o9FR!uDQY>AYfh94lKqB5ink(A7F!rjmI-qDs29;XIPJDF(g21n`}T}TiN!MlfD zY9VphUI_i(zfR!-k3XwZBd<=w8tk5@Hd3nP?{Ct`eS_JuQoF{L{Fprh2ra-)Zn$?u zmgJK&we1FdaH!njoVeQyO$b;uceF`w&q>XnJPzzx&KF-QZl$|yjXHdI`BZKJTnitgB;j}pT#XLzKDEx6 zO_qZ3Xm2ceU`mea?W%^f@YPGA?Y!m5cZak@vJya`oKzD+(i%sjs&?99ke?MV;`-_t zd^J}`=v0y9X5@4r{NQDh^s@0tGTg(UDyJ$_(Qu)&7+$*(HvXgJ3jrmv;ad7FGuK7! zVfR5F=h}O~qGmalxAsCk&}|nv2)1&?A7uK({ZKNneB1Wx4U6NiW>xbVk4MbtBXfnS z<*aREMqFu)->LcvejYCvZoj%;!#8VQ&>h&HDFNKEx_$Tu z^!7q`skoL>)^4dHw6QBms?vxx>b-T}n^J>8c^P7+vbGWf9no$0e$$aV3A~`9;%1ah zYhqVXW68{JPnDD>YVO1jiPAL2uV>`bD!JM3AR5^QN^ouyr$4hp(;Hs5~Gz!r4> zK44$`Nh|1Vp}(s6&SNF0Pi4-nwYEYy44!eExsvvabSYR}u5d@{_l-A2P+1HYNbhhB%bq(myMD89()qHk;AN~+MqIT=K?ePn1>pH)m~ zUr{|HdOFBOnVc$!mu*}DbB81YD@ypz8$xzh@unM&(|!-B#k`a#soD&J zSn!WWHzZV9ftATUs^(=jVG_YE+21#@>T`2}HJKB#x`yl2ubEuOA2KJ9B|LaUbml}! zA3WoZOi;21mVSohoTH*$a*PvS%BF9-DkyIWD5&l{N5V#hkiMfx($vk~ybt!_&`YQ% ze)JVu#YzcxVi{P_vc|)={e`An;c$npCbODw_V>vSqb`LF@yf3g?9E%;Pf0%v=lVt6 zHTjcdry}~6RF2)YrYc~Qjw<7JR`1C)4QMd0v>D~G$@m@n0@f&Pb&<=Tqb}A%@(nQ0 zIAARXgr&O})OU zU+r9-r0=kkjw%lw7uz@;b_PE1AT_;pqTRIEG&|BkT98Ce^fm_bY72?nB^E3ecKB&i zs`)qI{V&)3$F~G4+(s?Tu>sYx*@(Z)iiit_Oe>N<)P4&UEH&E^hw{BPv1;-B$1iK< z|D-ByCM!Aj$4&b8$2AaU1ihDg5)`}%T{FnNE(~(7V`lI5Ou+zp*n98mQQh8GFK={S zH(t`f3Nv8LmFQGS0XPm0R%QdIez6xg%0 zdfE4jFNK^rPfwFNJm9)j-6q86!93G2&DPQf`}{7pCUQh109Z^ zV(no2bISN~UC0fk{^QyolgiFVuI5h|x>TKdt66+W1*sQ{I&G5zN~Ool5y!t7S7MT) z=R1SX2dQ#PY9c&&A5{Gp_YYN?@t?MX&+ zK;#ObTHfcg;ZjSCS!3|+XXJwLs0H<93Y`9@j*~biQI`-r&@I-7(_mh;z*UbalvIWsJ&e zn_K^E;`(3H^ji7}QOQW1`y~b26>^sKzzUYD($;AtV#XF(sRagMb)H}DbI zhvgjWYlLC_b{&Ap<#IOIhx1&-A12#V_xp5#s@dQw=Kpt~_dTWo9_8{C$t!@_Q_ZJs zG7~(5jzt0Fyn+!yawhWA0L&oy#@hNqxsg9>gs+Ufm#$v^+b&s$tV%0!7y83m5O`%x zmTD%AY**B-V>SnBh{OyAGXHzI@zYm6a~5lbY7U<5mjKoPx|HjwVVYIaNqNqY-ISWEVoJGhKV#F{6^QNQ>7oElPUXs(2@4_j!K~)n!7t*j za=;2`3p3`npFXr&6$ci^1s4`X^BrQi+?IfB|2ClH>@6)R3!-|0gpF(fPmF(M%xK^; zu_DQbst1D@QR>#4SD-@PYi4bW6Uu}_nS{|IucZR7IX5Gz<2f)*)fz6~v%wy5n%fG6 z${MRAJn~XSDqhQ}U4CKB?c(iY1)d-me1rOA$rW$)X;|ZT;CzAYw={+fCqdYQUIy&A z2zlJla#6ro$Y$PG4EE4vxs( zAXV8Vai8L{J4eXy5LA|jOC2g@Bn$^8Oh58JAE8BU>ml=4l4Vm|j=YxP#YfDK!Az0f zLs9+JOsy-Lxa)xBT<5$55OgxCO|n!6P{h^Iyz1rW$ z^iB#Mcsb{CJBdA_{&0#Qo5slj4R=|nL{(@1xdL!PbF8NX{7GwtSO4^mQ=Q%F4YfFk z`j1uHqKt(=*mJ9(qkvOBjbbU13HTHF}O5f`F6!{MhP{Mp0&u)y|v zK~E9$xn{xS|DbM%J;LF0cp>JRIC@JWpeLj8+6xEy<*5jV^7;~=Yj0?cmHHA6s|QmN z2&&IOb+bCVwYOK)psxrwxCK=_%z<8dI^s#lLyEWla2l^xJk0M3Z1?8(WBUMvM9*P+Xi;C+ z>HosGjYop2`sITkSk;`90A_Ug`JVtd?gu}Ty(Ll4@>bLT^}hg_)A-vM@eBVFeHAc! zra4!Maj|rQA2y4KqRpoh0~T!m`DT@I>utyAo=8A>=-9$)AUlZnTujj>`G58zDzf5) ft(jc1vqKyZvte)GGCwM)7K2Q6dODvu| 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
@`Db-s3PI5A2L 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≦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 Date: Wed, 17 Jul 2019 22:35:44 +0200 Subject: [PATCH 7/8] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 0a0cba6..024bdc9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ display all the Java sources during your debugging process, even if you do not have them all. ## How to build JD-Eclipse ? -### With Gradle: ``` > git clone https://github.com/java-decompiler/jd-eclipse.git > cd jd-eclipse @@ -28,7 +27,7 @@ generate _"build/distributions/jd-eclipse-x.y.z.zip"_ 4. Drag and drop _"jd-eclipse-x.y.z.zip"_ on dialog windows, 5. Check _"Java Decompiler Eclipse Plug-in"_, 6. Click on "Next" and "Finish" buttons. -7. A warning message dialog windows appear because _"org.jd.ide.eclipse.plugin_x.y.z.jar"_ is not signed. Click on "Install anyway" button. +7. A warning dialog windows appear because _"org.jd.ide.eclipse.plugin_x.y.z.jar"_ is not signed. Click on "Install anyway" button. ![](https://raw.githubusercontent.com/java-decompiler/jd-eclipse/master/src/website/img/install_anyway.png) From 9f28f363764183d28dabd435c59846e3cfc41456 Mon Sep 17 00:00:00 2001 From: emmanue1 Date: Wed, 17 Jul 2019 23:02:40 +0200 Subject: [PATCH 8/8] Remove old directories --- jd.ide.eclipse.feature/.project | 17 -- jd.ide.eclipse.feature/build.gradle | 6 - jd.ide.eclipse.feature/build.properties | 1 - jd.ide.eclipse.feature/feature.xml | 93 --------- jd.ide.eclipse.plugin/.classpath | 10 - jd.ide.eclipse.plugin/.project | 28 --- jd.ide.eclipse.plugin/META-INF/MANIFEST.MF | 21 -- jd.ide.eclipse.plugin/about.ini | 7 - jd.ide.eclipse.plugin/build.gradle | 45 ----- jd.ide.eclipse.plugin/build.properties | 10 - jd.ide.eclipse.plugin/icons/jd_16.png | Bin 734 -> 0 bytes jd.ide.eclipse.plugin/icons/jd_32.png | Bin 1691 -> 0 bytes jd.ide.eclipse.plugin/plugin.xml | 33 --- .../jd/ide/eclipse/JavaDecompilerPlugin.java | 142 ------------- .../eclipse/editors/JDClassFileEditor.java | 189 ------------------ .../ide/eclipse/editors/JDSourceMapper.java | 122 ----------- .../preferences/PreferenceInitializer.java | 34 ---- .../eclipse/preferences/PreferencePage.java | 72 ------- .../ide/eclipse/startup/JDStartupClass.java | 19 -- jd.ide.eclipse.site/.project | 17 -- jd.ide.eclipse.site/site.xml | 10 - 21 files changed, 876 deletions(-) delete mode 100644 jd.ide.eclipse.feature/.project delete mode 100644 jd.ide.eclipse.feature/build.gradle delete mode 100644 jd.ide.eclipse.feature/build.properties delete mode 100644 jd.ide.eclipse.feature/feature.xml delete mode 100644 jd.ide.eclipse.plugin/.classpath delete mode 100644 jd.ide.eclipse.plugin/.project delete mode 100644 jd.ide.eclipse.plugin/META-INF/MANIFEST.MF delete mode 100644 jd.ide.eclipse.plugin/about.ini delete mode 100644 jd.ide.eclipse.plugin/build.gradle delete mode 100644 jd.ide.eclipse.plugin/build.properties delete mode 100644 jd.ide.eclipse.plugin/icons/jd_16.png delete mode 100644 jd.ide.eclipse.plugin/icons/jd_32.png delete mode 100644 jd.ide.eclipse.plugin/plugin.xml delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/JavaDecompilerPlugin.java delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDClassFileEditor.java delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDSourceMapper.java delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferenceInitializer.java delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferencePage.java delete mode 100644 jd.ide.eclipse.plugin/src/jd/ide/eclipse/startup/JDStartupClass.java delete mode 100644 jd.ide.eclipse.site/.project delete mode 100644 jd.ide.eclipse.site/site.xml diff --git a/jd.ide.eclipse.feature/.project b/jd.ide.eclipse.feature/.project deleted file mode 100644 index 9ba520b..0000000 --- a/jd.ide.eclipse.feature/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - jd.ide.eclipse.feature - - - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/jd.ide.eclipse.feature/build.gradle b/jd.ide.eclipse.feature/build.gradle deleted file mode 100644 index 269e3be..0000000 --- a/jd.ide.eclipse.feature/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -apply plugin: 'java' - -jar { - from 'feature.xml' - archiveName baseName + '_' + version + '.' + extension -} diff --git a/jd.ide.eclipse.feature/build.properties b/jd.ide.eclipse.feature/build.properties deleted file mode 100644 index 64f93a9..0000000 --- a/jd.ide.eclipse.feature/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = feature.xml diff --git a/jd.ide.eclipse.feature/feature.xml b/jd.ide.eclipse.feature/feature.xml deleted file mode 100644 index 86ce025..0000000 --- a/jd.ide.eclipse.feature/feature.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - JD-Eclipse is a plug-in for the Eclipse platform. It allows you to display all the Java sources during your debugging process, even if you do not have them all. - - - - Copyright (C) 2008-2015 Emmanuel Dupuy - - - . - GNU GENERAL PUBLIC LICENSE - - Version 3, 29 June 2007 - - <http://www.gnu.org/licenses/gpl-3.0.html> - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - JD-Eclipse is a plug-in for the Eclipse platform. It allows you to - display all the Java sources during your debugging process, even if you - do not have them all. - Copyright (C) 2008-2015 Emmanuel Dupuy - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - JD-Eclipse Copyright (C) 2008-2015 Emmanuel Dupuy - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. - - - - - - - - - diff --git a/jd.ide.eclipse.plugin/.classpath b/jd.ide.eclipse.plugin/.classpath deleted file mode 100644 index b0752f0..0000000 --- a/jd.ide.eclipse.plugin/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/jd.ide.eclipse.plugin/.project b/jd.ide.eclipse.plugin/.project deleted file mode 100644 index 1a5dd7c..0000000 --- a/jd.ide.eclipse.plugin/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - jd.ide.eclipse.plugin - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/jd.ide.eclipse.plugin/META-INF/MANIFEST.MF b/jd.ide.eclipse.plugin/META-INF/MANIFEST.MF deleted file mode 100644 index aaea229..0000000 --- a/jd.ide.eclipse.plugin/META-INF/MANIFEST.MF +++ /dev/null @@ -1,21 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: JD-Eclipse Plug-in -Bundle-SymbolicName: jd.ide.eclipse.plugin;singleton:=true -Bundle-Version: 1.0.0 -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Require-Bundle: org.eclipse.ui, - org.eclipse.ui.editors, - org.eclipse.jdt.ui, - org.eclipse.jdt.core, - org.eclipse.core.runtime, - org.eclipse.core.resources, - org.eclipse.ui.ide, - org.eclipse.jface.text -Bundle-Vendor: Java Decompiler -Bundle-Activator: jd.ide.eclipse.JavaDecompilerPlugin -Bundle-ActivationPolicy: lazy -Bundle-ClassPath: lib/jd-common-0.7.1.jar, - lib/jd-common-ide-0.7.1.jar, - lib/jd-core-0.7.1.jar, - . diff --git a/jd.ide.eclipse.plugin/about.ini b/jd.ide.eclipse.plugin/about.ini deleted file mode 100644 index 1e3ca8b..0000000 --- a/jd.ide.eclipse.plugin/about.ini +++ /dev/null @@ -1,7 +0,0 @@ -featureImage=icons/jd_32.png -aboutText=Java Decompiler\n\ -\n\ -Wikipedia http://en.wikipedia.org/wiki/Java_Decompiler\n\ -Google+ https://plus.google.com/107508651694381167848\n\ -\n\ -Copyright © 2008-2015 Emmanuel Dupuy diff --git a/jd.ide.eclipse.plugin/build.gradle b/jd.ide.eclipse.plugin/build.gradle deleted file mode 100644 index 25c2ea9..0000000 --- a/jd.ide.eclipse.plugin/build.gradle +++ /dev/null @@ -1,45 +0,0 @@ -apply plugin: 'java' - -repositories { - maven { - url 'https://raw.github.com/java-decompiler/mvn-repo/master' - } -} - -configurations { - provided - compile.extendsFrom provided -} - -dependencies { - compile 'jd:jd-common-ide:0.7.1' - compile 'jd:jd-common:0.7.1' - compile 'jd:jd-core:0.7.1' - provided 'jd:eclipse-jee-juno-SR2-minimal:1.0.0' -} - -compileJava { - sourceCompatibility = '1.5' - targetCompatibility = '1.5' - source 'src' -} - -jar { - archiveName baseName + '_' + version + '.' + extension - manifest { - from 'META-INF/MANIFEST.MF' - } - from fileTree('.') { - include 'icons/**' - include 'about.ini' - include 'plugin.xml' - } - into('lib') { - from project.configurations.runtime - project.configurations.provided - } -} - -task downloadDependencies(type: Copy) { - from project.configurations.runtime - into 'lib' -} diff --git a/jd.ide.eclipse.plugin/build.properties b/jd.ide.eclipse.plugin/build.properties deleted file mode 100644 index f9889fd..0000000 --- a/jd.ide.eclipse.plugin/build.properties +++ /dev/null @@ -1,10 +0,0 @@ -bin.includes = META-INF/,\ - plugin.xml,\ - icons/,\ - about.ini,\ - lib/jd-common-0.7.1.jar,\ - lib/jd-common-ide-0.7.1.jar,\ - lib/jd-core-0.7.1.jar,\ - . -source.. = src/ - diff --git a/jd.ide.eclipse.plugin/icons/jd_16.png b/jd.ide.eclipse.plugin/icons/jd_16.png deleted file mode 100644 index 986fb1dc8af8e429c39d3b1821491e1d14117414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)2KP3(|OO$(6m5($w}VlobztZy(Sb{ZnxXX zId?F|V!ge+E3K`q7#SJa!xM@bP)b9LF^42c9qsMy4yV&8?Z+!>P*YP=X|vhRsjAu} z%kt&H!9ltoj}$5Yg3srxCxo2d-rf#+z21ppADMPv+`n}V5vk&trfElhPy1f|^iB*V z)NK5}26vn5E!9;*=dq@!n?d#|H7k#74qX2k; z!Sn7@eOGQj=t_L-hqaW#<}8I0m!Pc^kgy7v80;6@;9r_zUENPzpXS5wcML=TxbCX! zY;@f`Dx^gaH4SZR5&FUsGQYw|uVi5=tAtQj3yq{qLH}H|t?BR?SuiimY{X-^5Jd}t z-0T8y$;ehPD%Am~P?Z=;R?F~ksN)XTHH2@poWNw@s<5{y1b_s<3czBVMF0Y5VgqAC zkC6&^VLwpb06-#zc?t$Z!$b$bj5iZ#Y8_U(f{od6d>ES<2S9ht0nfvZnCC(#q6Mi` zl0A7e{L(WW>;b??p_my$El->^_6!-CMo<5bdlQS10RV~IC`Tjlpss8hWDNiXpcPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU0RjvI4KfPQW&i*NElET{R9M5s zmtAZeR~3N2J2N}GYp>UK{1-cRXhWPp5*sB_qqYR8AtDH+QU$Jx1QG~@5Kpc9#8bo* z4MAEUP7zO686pKkhuL9{o`lo;hgi1Y2HkwQt8d=&>q$J>C>l;vuDpf?>NqjmSwf| z^z?imXxOYCW3vlRojTQ_lsahJ_R(UoxWl&Xgp^X3Qa%}tMnB=YZuYSNoIH85DGbB! zWwY6*N~Kc5^SqdpQU`>TQr@_6W7u`w!ejG5p-|}0WHQgVu3G~LP1A(yy3YLk{KU}E z(3R=w>1)8`V*xmE;soh*y2-Mv8l{xbG)+uSPL5r^eECADR7wGJKoL-nD-#jtN&UedgX9;tM9ABF*EpVZQS3NNSfPg z;zqOCwlkRxTM>ePZ8m#9OsHAMwu4L|@6P6J4Fewy3TXYe3I6tdR)&XpZ;KNSw!L2^cl#ox>32|GmWUyVBqA6w z9ZedH-PMRmgZ5+%wY72d`UKIAX0*CyM05wLW*3?93!MAuYtEa4*{@%@w{+p-ARY#x zABdw*f4+NL%bstL9X(I>H$R~+mZWBT3$czyjJgEq5u~GYpdErNcr!lshZzbZLzKoR zi1&2TcljDAG#LB+)ob4d{tPTv1qhWgHBAzUYb16YBIx`OV_^g_J&*U` z9!|^x%_hkE`19aSYLxyVab_ec1kEsT=N3e$;zHjbyFD5a9SS`*Em+u1^<=-O|M z%=%T2p)f+?ZB4{qewn~6;iqQ^9^8Z64ANSJLIKg{VeXD#9I2(gt^u=iE9R5iiFS0L zM{DtX!P49!GITj|py}DVy3X4|2=cj7K4us{Ja_&6&j7DV9#EiZ81W=VXD@W_FDn~j z?RyU;KoKAV7wP0d26P?x7X3$e>UykM7g_{s_G;6Q`(OP*W8A!&EqOy56eDd#M49L- z%&VeTq!LlKMxvRmXl66Qs6`lY>e`>>;Guo>yW0|dfLX-@qD9NjEUU;j zzx!p9tv#gY7qGq1U){+D9uO67)ysg?I&FnmqoZh96fKVzUg#xi*5PLFa^=dHKasXa zfYJs4szRx#fRGzz+GInFmtNdMyml)B$saBbFfcqjoOk>`Z2+Lk46BNHS?2a?^+%zF zNldYf@8!90?p<|eVCwz9&n&+VjBHSjRfVkXR#X_56(AKJ(R@-9Q(PQeEWJIl@YmFW z^$Xw<;QWUG<-rxM;}KaQta&F_Smxv#Q!{U;=6`8>;ctQ4K(KBm6#oVwAD-v6Lzcxz zr5Ds1k0_-mIKhW8|!p$<;OEbg&tmJf#T$K+*{|#OjWx?yO lNC~i3jAa44+IKG>{{)@p^p - - - - - - - - - - - - - - - - - diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/JavaDecompilerPlugin.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/JavaDecompilerPlugin.java deleted file mode 100644 index 8447483..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/JavaDecompilerPlugin.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse; - -import org.eclipse.jdt.ui.JavaUI; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IEditorDescriptor; -import org.eclipse.ui.IFileEditorMapping; -import org.eclipse.ui.internal.WorkbenchPlugin; -import org.eclipse.ui.internal.registry.EditorRegistry; -import org.eclipse.ui.internal.registry.FileEditorMapping; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.4 - */ -@SuppressWarnings({ "restriction", "deprecation" }) -public class JavaDecompilerPlugin extends AbstractUIPlugin -{ - // The plug-in IDs - public static final String PLUGIN_ID = "jd.ide.eclipse"; - private static final String EDITOR_ID = PLUGIN_ID + ".editors.JDClassFileEditor"; - - // Versions - public static final String VERSION_JD_ECLIPSE = "1.0.0"; - - // Preferences - public static final String PREF_ESCAPE_UNICODE_CHARACTERS = PLUGIN_ID + ".prefs.EscapeUnicodeCharacters"; - public static final String PREF_OMIT_PREFIX_THIS = PLUGIN_ID + ".prefs.OmitPrefixThis"; - public static final String PREF_REALIGN_LINE_NUMBERS = PLUGIN_ID + ".prefs.RealignLineNumbers"; - public static final String PREF_SHOW_LINE_NUMBERS = PLUGIN_ID + ".prefs.ShowLineNumbers"; - public static final String PREF_SHOW_DEFAULT_CONSTRUCTOR = PLUGIN_ID + ".prefs.ShowDefaultConstructor"; - public static final String PREF_SHOW_METADATA = PLUGIN_ID + ".prefs.ShowMetadata"; - - // URLs - public static final String URL_JDECLIPSE = "http://en.wikipedia.org/wiki/Java_Decompiler"; - - // The shared instance - private static JavaDecompilerPlugin plugin; - - - /** - * The constructor - */ - public JavaDecompilerPlugin() {} - - /** - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception - { - super.start(context); - plugin = this; - - // Setup ".class" file associations - Display.getDefault().syncExec(new SetupClassFileAssociationRunnable()); - } - - /* - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception - { - plugin.savePluginPreferences(); - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * @return the shared instance - */ - public static JavaDecompilerPlugin getDefault() - { - return plugin; - } - - protected static class SetupClassFileAssociationRunnable implements Runnable - { - public void run() - { - EditorRegistry registry = (EditorRegistry) - WorkbenchPlugin.getDefault().getEditorRegistry(); - - IFileEditorMapping[] mappings = registry.getFileEditorMappings(); - IFileEditorMapping c = null; - IFileEditorMapping cws = null; - - // Search Class file editor mappings - for (IFileEditorMapping mapping : mappings) - { - if (mapping.getExtension().equals("class")) - { - // ... Helios 3.6, Indigo 3.7, Juno 4.2, Kepler 4.3, ... - c = mapping; - } - else if (mapping.getExtension().equals("class without source")) - { - // Juno 4.2, Kepler 4.3, ... - cws = mapping; - } - } - - if ((c != null) && (cws != null)) - { - // Search JD editor descriptor on "class" extension - for (IEditorDescriptor descriptor : c.getEditors()) - { - if (descriptor.getId().equals(EDITOR_ID)) - { - // Remove JD editor on "class" extension - //((FileEditorMapping)c).removeEditor((EditorDescriptor)descriptor); - - // Set JD as default editor on "class without source" extension - registry.setDefaultEditor( - "." + cws.getExtension(), descriptor.getId()); - break; - } - } - - // Restore the default editor for "class" extension - IEditorDescriptor defaultClassFileEditor = - registry.findEditor(JavaUI.ID_CF_EDITOR); - if (defaultClassFileEditor != null) - { - registry.setDefaultEditor( - "." + c.getExtension(), JavaUI.ID_CF_EDITOR); - } - - registry.setFileEditorMappings((FileEditorMapping[]) mappings); - registry.saveAssociations(); - } - } - } -} \ No newline at end of file diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDClassFileEditor.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDClassFileEditor.java deleted file mode 100644 index bf916bb..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDClassFileEditor.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse.editors; - -import java.io.File; -import java.lang.reflect.Method; -import java.util.Map; - -import jd.ide.eclipse.JavaDecompilerPlugin; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Status; -import org.eclipse.jdt.core.IBuffer; -import org.eclipse.jdt.core.IClassFile; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.internal.core.BufferManager; -import org.eclipse.jdt.internal.core.PackageFragmentRoot; -import org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor; -import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IFileEditorInput; - - -/** - * JDClassFileEditor - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.4 - * @see org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor - */ -@SuppressWarnings("restriction") -public class JDClassFileEditor - extends ClassFileEditor implements IPropertyChangeListener -{ - public JDClassFileEditor() - { - JavaDecompilerPlugin - .getDefault() - .getPreferenceStore() - .addPropertyChangeListener(this); - } - - protected void doSetInput(IEditorInput input) throws CoreException - { - if (input instanceof IFileEditorInput) - { - IFile file = ((IFileEditorInput)input).getFile(); - - if (file instanceof IClassFile) - { - IClassFile classFile = (IClassFile)file; - cleanupBuffer(classFile); - setupSourceMapper(classFile); - } - } - else if (input instanceof IClassFileEditorInput) - { - IClassFileEditorInput classFileEditorInput = - (IClassFileEditorInput)input; - IClassFile classFile = classFileEditorInput.getClassFile(); - cleanupBuffer(classFile); - setupSourceMapper(classFile); - } - - super.doSetInput(input); - } - - protected static void cleanupBuffer(IClassFile file) - { - IBuffer buffer = - BufferManager.getDefaultBufferManager().getBuffer(file); - - if (buffer != null) - { - try - { - // Remove the buffer - Method method = BufferManager.class.getDeclaredMethod( - "removeBuffer", new Class[] {IBuffer.class}); - method.setAccessible(true); - method.invoke( - BufferManager.getDefaultBufferManager(), - new Object[] {buffer}); - } - catch (Exception e) - { - JavaDecompilerPlugin.getDefault().getLog().log(new Status( - Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, - 0, e.getMessage(), e)); - } - } - } - - @SuppressWarnings("rawtypes") - protected void setupSourceMapper(IClassFile classFile) - { - try - { - // Search package fragment root and classPath - IJavaElement packageFragment = classFile.getParent(); - IJavaElement packageFragmentRoot = packageFragment.getParent(); - - if (packageFragmentRoot instanceof PackageFragmentRoot) - { - // Setup a new source mapper. - PackageFragmentRoot root = (PackageFragmentRoot)packageFragmentRoot; - - // Location of the archive file containing classes. - IPath basePath = root.getPath(); - File baseFile = basePath.makeAbsolute().toFile(); - - if (!baseFile.exists()) { - IResource resource = root.getCorrespondingResource(); - basePath = resource.getLocation(); - baseFile = basePath.makeAbsolute().toFile(); - } - - // Class path - String classPath = classFile.getElementName(); - String packageName = packageFragment.getElementName(); - if ((packageName != null) && (packageName.length() > 0)) - classPath = packageName.replace('.', '/') + '/' + classPath; - - // Location of the archive file containing source. - IPath sourcePath = root.getSourceAttachmentPath(); - if (sourcePath == null) sourcePath = basePath; - - // Location of the package fragment root within the zip - // (empty specifies the default root). - IPath sourceAttachmentRootPath = root.getSourceAttachmentRootPath(); - String sourceRootPath; - - if (sourceAttachmentRootPath == null) { - sourceRootPath = null; - } else { - sourceRootPath = sourceAttachmentRootPath.toString(); - if ((sourceRootPath != null) && (sourceRootPath.length() == 0)) - sourceRootPath = null; - } - - // Options - Map options = root.getJavaProject().getOptions(true); - - root.setSourceMapper(new JDSourceMapper( - baseFile, sourcePath, sourceRootPath, options)); - } - } - catch (CoreException e) - { - JavaDecompilerPlugin.getDefault().getLog().log(new Status( - Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, - 0, e.getMessage(), e)); - } - } - - public boolean isEditable() { return false; } - - public boolean isDirty() { return false; } - - public boolean isEditorInputReadOnly() { return false; } - - public void dispose() - { - JavaDecompilerPlugin - .getDefault() - .getPreferenceStore() - .removePropertyChangeListener(this); - } - - /** - * Refresh decompiled source code. - * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) - { - if (getSourceViewer() != null) - { - setInput(getEditorInput()); - } - } -} diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDSourceMapper.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDSourceMapper.java deleted file mode 100644 index b855a90..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/editors/JDSourceMapper.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse.editors; - -import java.io.File; -import java.util.Iterator; -import java.util.Map; - -import jd.commonide.IdeDecompiler; -import jd.commonide.preferences.IdePreferences; -import jd.ide.eclipse.JavaDecompilerPlugin; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Status; -import org.eclipse.jdt.internal.core.SourceMapper; -import org.eclipse.jface.preference.IPreferenceStore; - - -/** - * JDSourceMapper - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.4 - * @see org.eclipse.jdt.internal.core.SourceMapper - */ -@SuppressWarnings("restriction") -public class JDSourceMapper extends SourceMapper -{ - private final static String JAVA_CLASS_SUFFIX = ".class"; - private final static String JAVA_SOURCE_SUFFIX = ".java"; - private final static int JAVA_SOURCE_SUFFIX_LENGTH = 5; - - private File basePath; - - @SuppressWarnings("rawtypes") - public JDSourceMapper( - File basePath, IPath sourcePath, String sourceRootPath, Map options) - { - super(sourcePath, sourceRootPath, options); - this.basePath = basePath; - } - - @SuppressWarnings("rawtypes") - public char[] findSource(String javaSourcePath) - { - char[] source = null; - - // Search source file - if (this.rootPaths == null) - { - source = super.findSource(javaSourcePath); - } - else - { - Iterator iterator = this.rootPaths.iterator(); - while (iterator.hasNext() && (source == null)) - { - String sourcesRootPath = (String)iterator.next(); - source = super.findSource( - sourcesRootPath + IPath.SEPARATOR + javaSourcePath); - } - } - - if ((source == null) && javaSourcePath.endsWith(JAVA_SOURCE_SUFFIX)) - { - String classPath = javaSourcePath.substring( - 0, javaSourcePath.length()-JAVA_SOURCE_SUFFIX_LENGTH) + JAVA_CLASS_SUFFIX; - - // Decompile class file - try - { - String result = decompile(this.basePath.getAbsolutePath(), classPath); - if (result != null) - source = result.toCharArray(); - } - catch (Exception e) - { - JavaDecompilerPlugin.getDefault().getLog().log(new Status( - Status.ERROR, JavaDecompilerPlugin.PLUGIN_ID, - 0, e.getMessage(), e)); - } - } - - return source; - } - - /** - * @param basePath Path to the root of the classpath, either a - * path to a directory or a path to a jar file. - * @param internalClassName internal name of the class. - * @return Decompiled class text. - */ - protected String decompile(String basePath, String classPath) { - // Load preferences - IPreferenceStore store = JavaDecompilerPlugin.getDefault().getPreferenceStore(); - - boolean showDefaultConstructor = store.getBoolean(JavaDecompilerPlugin.PREF_SHOW_DEFAULT_CONSTRUCTOR); - boolean realignmentLineNumber = store.getBoolean(JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS); - boolean showPrefixThis = store.getBoolean(JavaDecompilerPlugin.PREF_OMIT_PREFIX_THIS); - boolean mergeEmptyLines = false; - boolean unicodeEscape = store.getBoolean(JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS); - boolean showLineNumbers = store.getBoolean(JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS); - boolean showMetadata = store.getBoolean(JavaDecompilerPlugin.PREF_SHOW_METADATA); - - // Create preferences - IdePreferences preferences = new IdePreferences( - showDefaultConstructor, realignmentLineNumber, showPrefixThis, - mergeEmptyLines, unicodeEscape, showLineNumbers, showMetadata); - - // Decompile - return IdeDecompiler.decompile(preferences, basePath, classPath); - } - - /** - * @return version of JD-Core - * @since JD-Core 0.7.0 - */ - public static String getVersion() { return "0.7.1"; } -} diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferenceInitializer.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferenceInitializer.java deleted file mode 100644 index 20619af..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferenceInitializer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse.preferences; - -import jd.ide.eclipse.JavaDecompilerPlugin; - -import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; -import org.eclipse.jface.preference.IPreferenceStore; - -/** - * Class used to initialize default preference values. - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.3 - */ -public class PreferenceInitializer extends AbstractPreferenceInitializer -{ - /** - * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() - */ - public void initializeDefaultPreferences() - { - IPreferenceStore store = JavaDecompilerPlugin.getDefault().getPreferenceStore(); - store.setDefault(JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS, false); - store.setDefault(JavaDecompilerPlugin.PREF_OMIT_PREFIX_THIS, false); - store.setDefault(JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS, true); - store.setDefault(JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS, true); - store.setDefault(JavaDecompilerPlugin.PREF_SHOW_DEFAULT_CONSTRUCTOR, false); - store.setDefault(JavaDecompilerPlugin.PREF_SHOW_METADATA, true); - } -} diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferencePage.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferencePage.java deleted file mode 100644 index 8ce99d5..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/preferences/PreferencePage.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse.preferences; - -import jd.ide.eclipse.JavaDecompilerPlugin; - -import org.eclipse.jface.preference.BooleanFieldEditor; -import org.eclipse.jface.preference.FieldEditorPreferencePage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPreferencePage; - -/** - * PreferencePage - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.3 - */ -public class PreferencePage - extends FieldEditorPreferencePage implements IWorkbenchPreferencePage -{ - public PreferencePage() - { - super(SWT.NONE); - setDescription("JD-Eclipse preference page"); - } - - /** - * Creates the field editors. Field editors are abstractions of - * the common GUI blocks needed to manipulate various types - * of preferences. Each field editor knows how to save and - * restore itself. - */ - public void createFieldEditors() - { - Composite fieldEditorParent = getFieldEditorParent(); - - new Label(fieldEditorParent, SWT.NONE); - - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_ESCAPE_UNICODE_CHARACTERS, - "Escape unicode characters", fieldEditorParent)); - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_OMIT_PREFIX_THIS, - "Omit the prefix 'This' if possible", fieldEditorParent)); - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_REALIGN_LINE_NUMBERS, - "Realign line numbers", fieldEditorParent)); - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_SHOW_LINE_NUMBERS, - "Show original line numbers", fieldEditorParent)); - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_SHOW_DEFAULT_CONSTRUCTOR, - "Show default constructor", fieldEditorParent)); - addField(new BooleanFieldEditor( - JavaDecompilerPlugin.PREF_SHOW_METADATA, - "Show metadata", fieldEditorParent)); - } - - /** - * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) - */ - public void init(IWorkbench workbench) - { - setPreferenceStore(JavaDecompilerPlugin.getDefault().getPreferenceStore()); - } -} \ No newline at end of file diff --git a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/startup/JDStartupClass.java b/jd.ide.eclipse.plugin/src/jd/ide/eclipse/startup/JDStartupClass.java deleted file mode 100644 index 7d90e57..0000000 --- a/jd.ide.eclipse.plugin/src/jd/ide/eclipse/startup/JDStartupClass.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2008-2015 Emmanuel Dupuy - * This program is made available under the terms of the GPLv3 License. - */ - -package jd.ide.eclipse.startup; - -import org.eclipse.ui.IStartup; - -/** - * JDStartupClass - * - * @project Java Decompiler Eclipse Plugin - * @version 0.1.4 - */ -public class JDStartupClass implements IStartup -{ - public void earlyStartup() {} -} diff --git a/jd.ide.eclipse.site/.project b/jd.ide.eclipse.site/.project deleted file mode 100644 index 7862459..0000000 --- a/jd.ide.eclipse.site/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - jd.ide.eclipse.site - - - - - - org.eclipse.pde.UpdateSiteBuilder - - - - - - org.eclipse.pde.UpdateSiteNature - - diff --git a/jd.ide.eclipse.site/site.xml b/jd.ide.eclipse.site/site.xml deleted file mode 100644 index e9f2bcc..0000000 --- a/jd.ide.eclipse.site/site.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Eclipse Update Site for Java Decompiler Plug-in - - - - - -