Mon, 10 Dec 2012 12:10:50 +0000
8004094: Javac compiler error - synthetic method accessor generated with duplicate name
Summary: method clash check logic should skip methods marked with ACC_SYNTHETIC
Reviewed-by: jjg
1 /*
2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
26 package anttasks;
28 import java.awt.GridBagConstraints;
29 import java.awt.GridBagLayout;
30 import java.awt.event.ActionEvent;
31 import java.awt.event.ActionListener;
32 import java.awt.event.FocusEvent;
33 import java.awt.event.FocusListener;
34 import java.awt.event.ItemEvent;
35 import java.awt.event.ItemListener;
36 import java.io.BufferedReader;
37 import java.io.BufferedWriter;
38 import java.io.File;
39 import java.io.FileReader;
40 import java.io.FileWriter;
41 import java.io.IOException;
42 import java.io.Reader;
43 import java.io.Writer;
44 import java.util.ArrayList;
45 import java.util.Arrays;
46 import java.util.List;
47 import java.util.Properties;
48 import javax.swing.JButton;
49 import javax.swing.JCheckBox;
50 import javax.swing.JComboBox;
51 import javax.swing.JDialog;
52 import javax.swing.JLabel;
53 import javax.swing.JOptionPane;
54 import javax.swing.JPanel;
55 import javax.swing.JTextField;
57 import javax.swing.SwingUtilities;
58 import org.apache.tools.ant.BuildException;
59 import org.apache.tools.ant.Project;
60 import org.apache.tools.ant.Task;
62 /**
63 * Task to allow the user to control langtools tools built when using NetBeans.
64 *
65 * There are two primary modes.
66 * 1) Property mode. In this mode, property names are provided to get values
67 * that may be specified by the user, either directly in a GUI dialog, or
68 * read from a properties file. If the GUI dialog is invoked, values may
69 * optionally be set for future use.
70 * 2) Setup mode. In this mode, no property names are provided, and the GUI
71 * is invoked to allow the user to set or reset values for use in property mode.
72 */
73 public class SelectToolTask extends Task {
74 /**
75 * Set the location of the private properties file used to keep the retain
76 * user preferences for this repository.
77 */
78 public void setPropertyFile(File propertyFile) {
79 this.propertyFile = propertyFile;
80 }
82 /**
83 * Set the name of the property which will be set to the name of the
84 * selected tool, if any. If no tool is selected, the property will
85 * remain unset.
86 */
87 public void setToolProperty(String toolProperty) {
88 this.toolProperty = toolProperty;
89 }
91 /**
92 * Set the name of the property which will be set to the execution args of the
93 * selected tool, if any. The args default to an empty string.
94 */
95 public void setArgsProperty(String argsProperty) {
96 this.argsProperty = argsProperty;
97 }
99 /**
100 * Specify whether or not to pop up a dialog if the user has not specified
101 * a default value for a property.
102 */
103 public void setAskIfUnset(boolean askIfUnset) {
104 this.askIfUnset = askIfUnset;
105 }
107 @Override
108 public void execute() {
109 Project p = getProject();
111 Properties props = readProperties(propertyFile);
112 toolName = props.getProperty("tool.name");
113 if (toolName != null) {
114 toolArgs = props.getProperty(toolName + ".args", "");
115 }
117 if (toolProperty == null ||
118 askIfUnset && (toolName == null
119 || (argsProperty != null && toolArgs == null))) {
120 showGUI(props);
121 }
123 // finally, return required values, if any
124 if (toolProperty != null && !(toolName == null || toolName.equals(""))) {
125 p.setProperty(toolProperty, toolName);
127 if (argsProperty != null && toolArgs != null)
128 p.setProperty(argsProperty, toolArgs);
129 }
130 }
132 void showGUI(Properties fileProps) {
133 Properties guiProps = new Properties(fileProps);
134 JOptionPane p = createPane(guiProps);
135 p.createDialog("Select Tool").setVisible(true);
137 toolName = (String) toolChoice.getSelectedItem();
138 toolArgs = argsField.getText();
140 if (defaultCheck.isSelected()) {
141 if (toolName.equals("")) {
142 fileProps.remove("tool.name");
143 } else {
144 fileProps.put("tool.name", toolName);
145 fileProps.put(toolName + ".args", toolArgs);
146 }
147 writeProperties(propertyFile, fileProps);
148 }
149 }
151 JOptionPane createPane(final Properties props) {
152 JPanel body = new JPanel(new GridBagLayout());
153 GridBagConstraints lc = new GridBagConstraints();
154 lc.insets.right = 10;
155 lc.insets.bottom = 3;
156 GridBagConstraints fc = new GridBagConstraints();
157 fc.anchor = GridBagConstraints.WEST;
158 fc.gridx = 1;
159 fc.gridwidth = GridBagConstraints.REMAINDER;
160 fc.insets.bottom = 3;
162 JLabel toolLabel = new JLabel("Tool:");
163 body.add(toolLabel, lc);
164 String[] toolChoices = { "apt", "javac", "javadoc", "javah", "javap" };
165 if (true || toolProperty == null) {
166 // include empty value in setup mode
167 List<String> l = new ArrayList<String>(Arrays.asList(toolChoices));
168 l.add(0, "");
169 toolChoices = l.toArray(new String[l.size()]);
170 }
171 toolChoice = new JComboBox(toolChoices);
172 if (toolName != null)
173 toolChoice.setSelectedItem(toolName);
174 toolChoice.addItemListener(new ItemListener() {
175 public void itemStateChanged(ItemEvent e) {
176 String tn = (String) e.getItem();
177 argsField.setText(getDefaultArgsForTool(props, tn));
178 if (toolProperty != null)
179 okButton.setEnabled(!tn.equals(""));
180 }
181 });
182 body.add(toolChoice, fc);
184 argsField = new JTextField(getDefaultArgsForTool(props, toolName), 40);
185 if (toolProperty == null || argsProperty != null) {
186 JLabel argsLabel = new JLabel("Args:");
187 body.add(argsLabel, lc);
188 body.add(argsField, fc);
189 argsField.addFocusListener(new FocusListener() {
190 public void focusGained(FocusEvent e) {
191 }
192 public void focusLost(FocusEvent e) {
193 String toolName = (String) toolChoice.getSelectedItem();
194 if (toolName.length() > 0)
195 props.put(toolName + ".args", argsField.getText());
196 }
197 });
198 }
200 defaultCheck = new JCheckBox("Set as default");
201 if (toolProperty == null)
202 defaultCheck.setSelected(true);
203 else
204 body.add(defaultCheck, fc);
206 final JOptionPane p = new JOptionPane(body);
207 okButton = new JButton("OK");
208 okButton.setEnabled(toolProperty == null || (toolName != null && !toolName.equals("")));
209 okButton.addActionListener(new ActionListener() {
210 public void actionPerformed(ActionEvent e) {
211 JDialog d = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, p);
212 d.setVisible(false);
213 }
214 });
215 p.setOptions(new Object[] { okButton });
217 return p;
218 }
220 Properties readProperties(File file) {
221 Properties p = new Properties();
222 if (file != null && file.exists()) {
223 Reader in = null;
224 try {
225 in = new BufferedReader(new FileReader(file));
226 p.load(in);
227 in.close();
228 } catch (IOException e) {
229 throw new BuildException("error reading property file", e);
230 } finally {
231 if (in != null) {
232 try {
233 in.close();
234 } catch (IOException e) {
235 throw new BuildException("cannot close property file", e);
236 }
237 }
238 }
239 }
240 return p;
241 }
243 void writeProperties(File file, Properties p) {
244 if (file != null) {
245 Writer out = null;
246 try {
247 File dir = file.getParentFile();
248 if (dir != null && !dir.exists())
249 dir.mkdirs();
250 out = new BufferedWriter(new FileWriter(file));
251 p.store(out, "langtools properties");
252 out.close();
253 } catch (IOException e) {
254 throw new BuildException("error writing property file", e);
255 } finally {
256 if (out != null) {
257 try {
258 out.close();
259 } catch (IOException e) {
260 throw new BuildException("cannot close property file", e);
261 }
262 }
263 }
264 }
265 }
267 String getDefaultArgsForTool(Properties props, String tn) {
268 return (tn == null || tn.equals("")) ? "" : props.getProperty(tn + ".args", "");
269 }
271 // Ant task parameters
272 private boolean askIfUnset;
273 private String toolProperty;
274 private String argsProperty;
275 private File propertyFile;
277 // GUI components
278 private JComboBox toolChoice;
279 private JTextField argsField;
280 private JCheckBox defaultCheck;
281 private JButton okButton;
283 // Result values for the client
284 private String toolName;
285 private String toolArgs;
286 }