This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 208394
Collapse All | Expand All

(-)a/apisupport.refactoring/src/org/netbeans/modules/apisupport/hints/DataObjectRegistrationHinter.java (+142 lines)
Line 0 Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2012 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * If you wish your version of this file to be governed by only the CDDL
28
 * or only the GPL Version 2, indicate your decision by adding
29
 * "[Contributor] elects to include this software in this distribution
30
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
31
 * single choice of license, a recipient has the option to distribute
32
 * your version of this file under either the CDDL, the GPL Version 2 or
33
 * to extend the choice of license to its licensees as provided above.
34
 * However, if you add GPL Version 2 code and therefore, elected the GPL
35
 * Version 2 license, then the option applies only if the new code is
36
 * made subject to such option by the copyright holder.
37
 *
38
 * Contributor(s):
39
 *
40
 * Portions Copyrighted 2012 Sun Microsystems, Inc.
41
 */
42
package org.netbeans.modules.apisupport.hints;
43
44
import com.sun.source.tree.ModifiersTree;
45
import java.util.HashMap;
46
import java.util.Map;
47
import java.util.concurrent.Callable;
48
import javax.lang.model.element.Element;
49
import org.netbeans.api.java.source.GeneratorUtilities;
50
import org.netbeans.api.java.source.WorkingCopy;
51
import org.openide.DialogDisplayer;
52
import org.openide.NotifyDescriptor;
53
import org.openide.filesystems.FileObject;
54
import org.openide.loaders.DataObject;
55
import org.openide.util.NbBundle.Messages;
56
import org.openide.util.lookup.ServiceProvider;
57
import static org.netbeans.modules.apisupport.hints.Bundle.*;
58
59
/**
60
 * #207219: {@code DataObject.Registration} conversion.
61
 *  
62
 */
63
@ServiceProvider(service = Hinter.class)
64
public class DataObjectRegistrationHinter implements Hinter {
65
66
    private static final String LOADERS_FOLDER = "Loaders/";
67
    private static final String FACTORIES_FOLDER = "Factories";
68
69
    @Override
70
    public void process(final Context ctx) throws Exception {
71
        final FileObject file = ctx.file();
72
        final Object instanceCreate = ctx.instanceAttribute(file);
73
        if (instanceCreate == null) {
74
            return;
75
        }
76
77
        if (file.getPath().startsWith(LOADERS_FOLDER) && file.getPath().contains(FACTORIES_FOLDER)) {
78
            ctx.addStandardAnnotationHint(new Callable<Void>() {
79
80
                @Override
81
                public Void call() throws Exception {
82
                    if (!annotationsAvailable(ctx)) {
83
                        return null;
84
                    }
85
                    ctx.findAndModifyDeclaration(instanceCreate, new RegisterDataObject(ctx));
86
                    return null;
87
                }
88
            });
89
        }
90
91
92
    }
93
94
    @Messages("DataObjectRegistrationHinter.missing_dep=You must add a dependency on org.openide.loaders (7.36+) before using this fix.")
95
    private boolean annotationsAvailable(Context ctx) {
96
        if (ctx.canAccess(DataObject.Registration.class.getName()) && ctx.canAccess(DataObject.Registrations.class.getName())) {
97
            return true;
98
        } else {
99
            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(DataObjectRegistrationHinter_missing_dep(), NotifyDescriptor.WARNING_MESSAGE));
100
            return false;
101
        }
102
    }
103
104
    private static class RegisterDataObject implements Context.ModifyDeclarationTask {
105
106
        private static final String DATAOBJECT_REGISTRATION = "org.openide.loaders.DataObject.Registration";
107
        private static final String DATAOBJECT_REGISTRATIONS = "org.openide.loaders.DataObject.Registrations";
108
        private final Context ctx;
109
110
        private RegisterDataObject(Context ctx) {
111
            this.ctx = ctx;
112
        }
113
114
        @Override
115
        public void run(WorkingCopy wc, Element declaration, ModifiersTree modifiers) throws Exception {
116
            Map<String, Object> params = new HashMap<String, Object>();
117
            FileObject file = ctx.file();
118
119
            String displayName = ctx.bundlevalue(file.getAttribute("literal:displayName"), declaration); 
120
121
            if (displayName == null) {
122
                displayName = "#TODO";
123
            }
124
            // parameter of annotation
125
            params.put("position", file.getAttribute("position"));
126
            params.put("displayName", displayName);
127
            params.put("iconBase", file.getAttribute("iconBase"));
128
            params.put("mimeType", getMimeTypeFromPath(file.getPath()));
129
130
            ModifiersTree mt = ctx.addAnnotation(wc, modifiers, DATAOBJECT_REGISTRATION, DATAOBJECT_REGISTRATIONS, params);
131
            ctx.delete(file);
132
            wc.rewrite(modifiers, GeneratorUtilities.get(wc).importFQNs(mt));
133
134
        }
135
136
        private String getMimeTypeFromPath(String path) {
137
            String mimeType = path.replace(LOADERS_FOLDER, "");
138
            mimeType = mimeType.substring(0, mimeType.indexOf(FACTORIES_FOLDER) - 1);// -1 to remove last file separator
139
            return mimeType;
140
        }
141
    }
142
}

Return to bug 208394