1/*
2 * Copyright (c) 1997, 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 */
25
26package com.sun.tools.internal.xjc.addon.accessors;
27
28import com.sun.codemodel.internal.JAnnotationUse;
29import com.sun.codemodel.internal.JClass;
30import java.io.IOException;
31import com.sun.tools.internal.xjc.BadCommandLineException;
32import com.sun.tools.internal.xjc.Options;
33import com.sun.tools.internal.xjc.Plugin;
34import com.sun.tools.internal.xjc.outline.ClassOutline;
35import com.sun.tools.internal.xjc.outline.Outline;
36import java.lang.reflect.Field;
37import java.util.Iterator;
38import java.util.logging.Level;
39import java.util.logging.Logger;
40import javax.xml.bind.annotation.XmlAccessType;
41import javax.xml.bind.annotation.XmlAccessorType;
42import org.xml.sax.ErrorHandler;
43
44/**
45 * Generates synchronized methods.
46 *
47 * @author
48 *     Martin Grebac (martin.grebac@sun.com)
49 */
50public class PluginImpl extends Plugin {
51
52    public String getOptionName() {
53        return "Xpropertyaccessors";
54    }
55
56    public String getUsage() {
57        return "  -Xpropertyaccessors :  Use XmlAccessType PROPERTY instead of FIELD for generated classes";
58    }
59
60    @Override
61    public int parseArgument(Options opt, String[] args, int i) throws BadCommandLineException, IOException {
62        return 0;   // no option recognized
63    }
64
65    public boolean run( Outline model, Options opt, ErrorHandler errorHandler ) {
66
67        for( ClassOutline co : model.getClasses() ) {
68            Iterator<JAnnotationUse> ann = co.ref.annotations().iterator();
69            while (ann.hasNext()) {
70               try {
71                    JAnnotationUse a = ann.next();
72                    Field clazzField = a.getClass().getDeclaredField("clazz");
73                    clazzField.setAccessible(true);
74                    JClass cl = (JClass) clazzField.get(a);
75                    if (cl.equals(model.getCodeModel()._ref(XmlAccessorType.class))) {
76                        a.param("value", XmlAccessType.PROPERTY);
77                        break;
78                    }
79                } catch (IllegalArgumentException ex) {
80                    Logger.getLogger(PluginImpl.class.getName()).log(Level.SEVERE, null, ex);
81                } catch (IllegalAccessException ex) {
82                    Logger.getLogger(PluginImpl.class.getName()).log(Level.SEVERE, null, ex);
83                } catch (NoSuchFieldException ex) {
84                    Logger.getLogger(PluginImpl.class.getName()).log(Level.SEVERE, null, ex);
85                } catch (SecurityException ex) {
86                    Logger.getLogger(PluginImpl.class.getName()).log(Level.SEVERE, null, ex);
87                }
88            }
89        }
90        return true;
91    }
92
93}
94