Skip to content

Commit 4dfc826

Browse files
author
emmanue1
committed
Internal update on preferences management
1 parent f6c51fb commit 4dfc826

File tree

4 files changed

+131
-35
lines changed

4 files changed

+131
-35
lines changed

app/src/main/java/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@
1515
import javax.swing.*;
1616
import javax.xml.stream.*;
1717
import java.awt.*;
18-
import java.io.File;
19-
import java.io.FileInputStream;
20-
import java.io.FileOutputStream;
21-
import java.util.ArrayList;
18+
import java.io.*;
19+
import java.net.URL;
20+
import java.util.*;
2221
import java.util.List;
23-
import java.util.Map;
24-
import java.util.Stack;
22+
import java.util.jar.Manifest;
2523

2624
public class ConfigurationXmlPersisterProvider implements ConfigurationPersister {
2725
protected static final String ERROR_BACKGROUND_COLOR = "JdGuiPreferences.errorBackgroundColor";
26+
protected static final String JD_CORE_VERSION = "JdGuiPreferences.jdCoreVersion";
2827

2928
protected static final File FILE = getConfigFile();
3029

@@ -57,6 +56,7 @@ protected static File getConfigFile() {
5756
return new File(Constants.CONFIG_FILENAME);
5857
}
5958

59+
@Override
6060
public Configuration load() {
6161
// Default values
6262
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
@@ -170,9 +170,31 @@ public Configuration load() {
170170
config.getPreferences().put(ERROR_BACKGROUND_COLOR, "0xFF6666");
171171
}
172172

173+
config.getPreferences().put(JD_CORE_VERSION, getJdCoreVersion());
174+
173175
return config;
174176
}
175177

178+
protected String getJdCoreVersion() {
179+
try {
180+
Enumeration<URL> enumeration = ConfigurationXmlPersisterProvider.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
181+
182+
while (enumeration.hasMoreElements()) {
183+
try (InputStream is = enumeration.nextElement().openStream()) {
184+
String attribute = new Manifest(is).getMainAttributes().getValue("JD-Core-Version");
185+
if (attribute != null) {
186+
return attribute;
187+
}
188+
}
189+
}
190+
} catch (IOException e) {
191+
assert ExceptionUtil.printStackTrace(e);
192+
}
193+
194+
return "SNAPSHOT";
195+
}
196+
197+
@Override
176198
public void save(Configuration configuration) {
177199
Point l = configuration.getMainWindowLocation();
178200
Dimension s = configuration.getMainWindowSize();

services/src/main/java/org/jd/gui/service/sourcesaver/ClassFileSourceSaverProvider.java

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,23 @@
1616
import org.jd.gui.util.io.NewlineOutputStream;
1717

1818
import java.io.*;
19-
import java.net.URL;
2019
import java.nio.charset.Charset;
2120
import java.nio.file.Files;
2221
import java.nio.file.Path;
23-
import java.util.Enumeration;
2422
import java.util.HashMap;
2523
import java.util.Map;
26-
import java.util.jar.Manifest;
2724

2825
public class ClassFileSourceSaverProvider extends AbstractSourceSaverProvider {
2926
protected static final String ESCAPE_UNICODE_CHARACTERS = "ClassFileDecompilerPreferences.escapeUnicodeCharacters";
30-
protected static final String REALIGN_LINE_NUMBERS = "ClassFileDecompilerPreferences.realignLineNumbers";
31-
protected static final String WRITE_LINE_NUMBERS = "ClassFileSaverPreferences.writeLineNumbers";
32-
protected static final String WRITE_METADATA = "ClassFileSaverPreferences.writeMetadata";
27+
protected static final String REALIGN_LINE_NUMBERS = "ClassFileDecompilerPreferences.realignLineNumbers";
28+
protected static final String WRITE_LINE_NUMBERS = "ClassFileSaverPreferences.writeLineNumbers";
29+
protected static final String WRITE_METADATA = "ClassFileSaverPreferences.writeMetadata";
30+
protected static final String JD_CORE_VERSION = "JdGuiPreferences.jdCoreVersion";
3331

3432
protected static final ClassFileToJavaSourceDecompiler DECOMPILER = new ClassFileToJavaSourceDecompiler();
3533

3634
protected ContainerLoader loader = new ContainerLoader();
3735
protected LineNumberStringBuilderPrinter printer = new LineNumberStringBuilderPrinter();
38-
protected String jdCoreVersion = "SNAPSHOT";
39-
40-
public ClassFileSourceSaverProvider() {
41-
try {
42-
Enumeration<URL> enumeration = ClassFileSourceSaverProvider.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
43-
44-
while (enumeration.hasMoreElements()) {
45-
try (InputStream is = enumeration.nextElement().openStream()) {
46-
String attribute = new Manifest(is).getMainAttributes().getValue("JD-Core-Version");
47-
if (attribute != null) {
48-
jdCoreVersion = attribute;
49-
}
50-
}
51-
}
52-
} catch (IOException e) {
53-
assert ExceptionUtil.printStackTrace(e);
54-
}
55-
}
5636

5737
@Override public String[] getSelectors() { return appendSelectors("*:file:*.class"); }
5838

@@ -144,7 +124,7 @@ public void saveContent(API api, Controller controller, Listener listener, Path
144124
}
145125
// Add JD-Core version
146126
stringBuffer.append("\n * JD-Core Version: ");
147-
stringBuffer.append(jdCoreVersion);
127+
stringBuffer.append(preferences.get(JD_CORE_VERSION));
148128
stringBuffer.append("\n */");
149129
}
150130

services/src/main/java/org/jd/gui/view/component/ClassFilePage.java

Lines changed: 94 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,24 @@
1212
import org.jd.core.v1.ClassFileToJavaSourceDecompiler;
1313
import org.jd.gui.api.API;
1414
import org.jd.gui.api.model.Container;
15-
import org.jd.gui.util.decompiler.ClassPathLoader;
16-
import org.jd.gui.util.decompiler.ContainerLoader;
17-
import org.jd.gui.util.decompiler.NopPrinter;
18-
import org.jd.gui.util.decompiler.StringBuilderPrinter;
15+
import org.jd.gui.util.decompiler.*;
1916
import org.jd.gui.util.exception.ExceptionUtil;
17+
import org.jd.gui.util.io.NewlineOutputStream;
2018

2119
import javax.swing.text.BadLocationException;
2220
import javax.swing.text.DefaultCaret;
2321
import java.awt.*;
22+
import java.io.*;
23+
import java.nio.charset.Charset;
2424
import java.util.HashMap;
2525
import java.util.Map;
2626

2727
public class ClassFilePage extends TypePage {
2828
protected static final String ESCAPE_UNICODE_CHARACTERS = "ClassFileDecompilerPreferences.escapeUnicodeCharacters";
2929
protected static final String REALIGN_LINE_NUMBERS = "ClassFileDecompilerPreferences.realignLineNumbers";
30+
protected static final String WRITE_LINE_NUMBERS = "ClassFileSaverPreferences.writeLineNumbers";
31+
protected static final String WRITE_METADATA = "ClassFileSaverPreferences.writeMetadata";
32+
protected static final String JD_CORE_VERSION = "JdGuiPreferences.jdCoreVersion";
3033

3134
protected static final ClassFileToJavaSourceDecompiler DECOMPILER = new ClassFileToJavaSourceDecompiler();
3235

@@ -97,18 +100,102 @@ protected static boolean getPreferenceValue(Map<String, String> preferences, Str
97100
return (v == null) ? defaultValue : Boolean.valueOf(v);
98101
}
99102

103+
@Override
100104
public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_JAVA; }
101105

102106
// --- ContentSavable --- //
107+
@Override
103108
public String getFileName() {
104109
String path = entry.getPath();
105110
int index = path.lastIndexOf('.');
106111
return path.substring(0, index) + ".java";
107112
}
108113

114+
@Override
115+
public void save(API api, OutputStream os) {
116+
try {
117+
// Init preferences
118+
Map<String, String> preferences = api.getPreferences();
119+
boolean realignmentLineNumbers = getPreferenceValue(preferences, REALIGN_LINE_NUMBERS, true);
120+
boolean unicodeEscape = getPreferenceValue(preferences, ESCAPE_UNICODE_CHARACTERS, false);
121+
boolean showLineNumbers = getPreferenceValue(preferences, WRITE_LINE_NUMBERS, true);
122+
123+
Map<String, Object> configuration = new HashMap<>();
124+
configuration.put("realignLineNumbers", realignmentLineNumbers);
125+
126+
// Init loader
127+
ContainerLoader loader = new ContainerLoader(entry);
128+
129+
// Init printer
130+
LineNumberStringBuilderPrinter printer = new LineNumberStringBuilderPrinter();
131+
printer.setRealignmentLineNumber(realignmentLineNumbers);
132+
printer.setUnicodeEscape(unicodeEscape);
133+
printer.setShowLineNumbers(showLineNumbers);
134+
135+
// Format internal name
136+
String entryPath = entry.getPath();
137+
assert entryPath.endsWith(".class");
138+
String entryInternalName = entryPath.substring(0, entryPath.length() - 6); // 6 = ".class".length()
139+
140+
// Decompile class file
141+
DECOMPILER.decompile(loader, printer, entryInternalName, configuration);
142+
143+
StringBuilder stringBuffer = printer.getStringBuffer();
144+
145+
// Metadata
146+
if (getPreferenceValue(preferences, WRITE_METADATA, true)) {
147+
// Add location
148+
String location =
149+
new File(entry.getUri()).getPath()
150+
// Escape "\ u" sequence to prevent "Invalid unicode" errors
151+
.replaceAll("(^|[^\\\\])\\\\u", "\\\\\\\\u");
152+
stringBuffer.append("\n\n/* Location: ");
153+
stringBuffer.append(location);
154+
// Add Java compiler version
155+
int majorVersion = printer.getMajorVersion();
156+
157+
if (majorVersion >= 45) {
158+
stringBuffer.append("\n * Java compiler version: ");
159+
160+
if (majorVersion >= 49) {
161+
stringBuffer.append(majorVersion - (49 - 5));
162+
} else {
163+
stringBuffer.append(majorVersion - (45 - 1));
164+
}
165+
166+
stringBuffer.append(" (");
167+
stringBuffer.append(majorVersion);
168+
stringBuffer.append('.');
169+
stringBuffer.append(printer.getMinorVersion());
170+
stringBuffer.append(')');
171+
}
172+
// Add JD-Core version
173+
stringBuffer.append("\n * JD-Core Version: ");
174+
stringBuffer.append(preferences.get(JD_CORE_VERSION));
175+
stringBuffer.append("\n */");
176+
}
177+
178+
try (PrintStream ps = new PrintStream(new NewlineOutputStream(os), true, "UTF-8")) {
179+
ps.print(stringBuffer.toString());
180+
} catch (IOException e) {
181+
assert ExceptionUtil.printStackTrace(e);
182+
}
183+
} catch (Throwable t) {
184+
assert ExceptionUtil.printStackTrace(t);
185+
186+
try (OutputStreamWriter writer = new OutputStreamWriter(os, Charset.defaultCharset())) {
187+
writer.write("// INTERNAL ERROR //");
188+
} catch (IOException ee) {
189+
assert ExceptionUtil.printStackTrace(ee);
190+
}
191+
}
192+
}
193+
109194
// --- LineNumberNavigable --- //
195+
@Override
110196
public int getMaximumLineNumber() { return maximumLineNumber; }
111197

198+
@Override
112199
public void goToLineNumber(int lineNumber) {
113200
int textAreaLineNumber = getTextAreaLineNumber(lineNumber);
114201
if (textAreaLineNumber > 0) {
@@ -122,9 +209,11 @@ public void goToLineNumber(int lineNumber) {
122209
}
123210
}
124211

212+
@Override
125213
public boolean checkLineNumber(int lineNumber) { return lineNumber <= maximumLineNumber; }
126214

127215
// --- PreferencesChangeListener --- //
216+
@Override
128217
public void preferencesChanged(Map<String, String> preferences) {
129218
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
130219
int updatePolicy = caret.getUpdatePolicy();
@@ -220,6 +309,7 @@ public void endLine() {
220309
super.endLine();
221310
textAreaLineNumber++;
222311
}
312+
@Override
223313
public void extraLine(int count) {
224314
super.extraLine(count);
225315
if (realignmentLineNumber) {

services/src/main/java/org/jd/gui/view/component/TextPage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
public class TextPage extends AbstractTextPage implements ContentCopyable, ContentSelectable, ContentSavable {
2323

2424
// --- ContentCopyable --- //
25+
@Override
2526
public void copy() {
2627
if (textArea.getSelectionStart() == textArea.getSelectionEnd()) {
2728
getToolkit().getSystemClipboard().setContents(new StringSelection(""), null);
@@ -31,13 +32,16 @@ public void copy() {
3132
}
3233

3334
// --- ContentSelectable --- //
35+
@Override
3436
public void selectAll() {
3537
textArea.selectAll();
3638
}
3739

3840
// --- ContentSavable --- //
41+
@Override
3942
public String getFileName() { return "file.txt"; }
4043

44+
@Override
4145
public void save(API api, OutputStream os) {
4246
try (OutputStreamWriter writer = new OutputStreamWriter(new NewlineOutputStream(os), "UTF-8")) {
4347
writer.write(textArea.getText());

0 commit comments

Comments
 (0)