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 194744
Collapse All | Expand All

(-)a/java.project/nbproject/project.xml (+8 lines)
Lines 95-100 Link Here
95
                    </run-dependency>
95
                    </run-dependency>
96
                </dependency>
96
                </dependency>
97
                <dependency>
97
                <dependency>
98
                    <code-name-base>org.netbeans.modules.autoupdate.services</code-name-base>
99
                    <build-prerequisite/>
100
                    <compile-dependency/>
101
                    <run-dependency>
102
                        <specification-version>1.23</specification-version>
103
                    </run-dependency>
104
                </dependency>
105
                <dependency>
98
                    <code-name-base>org.netbeans.modules.classfile</code-name-base>
106
                    <code-name-base>org.netbeans.modules.classfile</code-name-base>
99
                    <build-prerequisite/>
107
                    <build-prerequisite/>
100
                    <compile-dependency/>
108
                    <compile-dependency/>
(-)a/java.project/src/org/netbeans/modules/java/project/ModuleDownloadLibraryDefiner.java (+138 lines)
Line 0 Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2011 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 2011 Sun Microsystems, Inc.
41
 */
42
43
package org.netbeans.modules.java.project;
44
45
import java.util.List;
46
import java.util.concurrent.Callable;
47
import org.netbeans.api.autoupdate.InstallSupport;
48
import org.netbeans.api.autoupdate.InstallSupport.Installer;
49
import org.netbeans.api.autoupdate.InstallSupport.Validator;
50
import org.netbeans.api.autoupdate.OperationContainer;
51
import org.netbeans.api.autoupdate.OperationSupport.Restarter;
52
import org.netbeans.api.autoupdate.UpdateElement;
53
import org.netbeans.api.autoupdate.UpdateManager;
54
import org.netbeans.api.autoupdate.UpdateUnit;
55
import org.netbeans.api.progress.ProgressHandle;
56
import org.netbeans.api.progress.ProgressHandleFactory;
57
import org.netbeans.api.project.libraries.Library;
58
import org.netbeans.api.project.libraries.LibraryManager;
59
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport.LibraryDefiner;
60
import org.openide.DialogDisplayer;
61
import org.openide.NotifyDescriptor;
62
import org.openide.filesystems.FileObject;
63
import org.openide.filesystems.FileUtil;
64
import org.openide.util.NbBundle.Messages;
65
import static org.netbeans.modules.java.project.Bundle.*;
66
67
/**
68
 * Defines a library by downloading a module definition.
69
 */
70
public class ModuleDownloadLibraryDefiner implements LibraryDefiner {
71
72
    @Messages({
73
        "# {0} - display name of module", "ModuleDownloadLibraryDefiner.downloading=Downloading {0}",
74
        "# {0} - display name of module", "ModuleDownloadLibraryDefiner.accept_license=Accept License for {0}"
75
    })
76
    public @Override Callable<Library> missingLibrary(final String name) {
77
        FileObject f = FileUtil.getConfigFile("org-netbeans-api-project-libraries/Downloads/" + name); // NOI18N
78
        if (f != null) {
79
            final String module = (String) f.getAttribute("module"); // NOI18N
80
            assert module != null;
81
            return new Callable<Library>() {
82
                public @Override Library call() throws Exception {
83
                    return download(name, module);
84
                }
85
            };
86
        } else {
87
            return null;
88
        }
89
    }
90
91
    @SuppressWarnings("SleepWhileInLoop")
92
    private Library download(String name, String module) throws Exception {
93
        for (UpdateUnit unit : UpdateManager.getDefault().getUpdateUnits(UpdateManager.TYPE.MODULE)) {
94
            if (unit.getCodeName().equals(module)) {
95
                List<UpdateElement> updates = unit.getAvailableUpdates();
96
                if (updates.isEmpty()) {
97
                    throw new Exception("no updates for " + unit);
98
                }
99
                OperationContainer<InstallSupport> oc = OperationContainer.createForInstall();
100
                UpdateElement element = updates.get(0);
101
                if (!oc.canBeAdded(unit, element)) {
102
                    throw new Exception("could not add " + element + " to updates");
103
                }
104
                for (UpdateElement req : oc.add(element).getRequiredElements()) {
105
                    oc.add(req);
106
                }
107
                String license = element.getLicence();
108
                String moduleLabel = element.getDisplayName();
109
                if (license != null) {
110
                    if (DialogDisplayer.getDefault().notify(new NotifyDescriptor.Confirmation(license, ModuleDownloadLibraryDefiner_accept_license(moduleLabel), NotifyDescriptor.OK_CANCEL_OPTION)) != NotifyDescriptor.OK_OPTION) {
111
                        throw new Exception("license for " + element + " was rejected");
112
                    }
113
                }
114
                // XXX any benefit in marking handle cancelable?
115
                ProgressHandle handle = ProgressHandleFactory.createHandle(ModuleDownloadLibraryDefiner_downloading(moduleLabel));
116
                InstallSupport is = oc.getSupport();
117
                Validator validator = is.doDownload(handle, false);
118
                Installer installer = is.doValidate(validator, null);
119
                Restarter restarter = is.doInstall(installer, null);
120
                if (restarter != null) {
121
                    is.doRestart(restarter, null);
122
                } else {
123
                    // XXX new library & build.properties apparently do not show up immediately... how to listen properly?
124
                    for (int i = 0; i < 10; i++) {
125
                        Library lib = LibraryManager.getDefault().getLibrary(name);
126
                        if (lib != null) {
127
                            return lib;
128
                        }
129
                        Thread.sleep(1000);
130
                    }
131
                    throw new Exception(module + " failed to install properly");
132
                }
133
            }
134
        }
135
        throw new Exception("could not find " + module + " on any update site");
136
    }
137
138
}
(-)a/java.project/src/org/netbeans/spi/java/project/support/ui/BrokenReferencesSupport.java (+5 lines)
Lines 246-251 Link Here
246
    
246
    
247
    /**
247
    /**
248
     * Service which may be {@linkplain ServiceProvider registered} to download remote libraries or otherwise define them.
248
     * Service which may be {@linkplain ServiceProvider registered} to download remote libraries or otherwise define them.
249
     * <p>A predefined implementation allows broken library references to be fixed by downloading a module
250
     * with a library definition. For a library referred to by {@code libs.foo.classpath},
251
     * just define a layer file {@code org-netbeans-api-project-libraries/Downloads/foo}
252
     * with the {@code module} attribute set to {@code org.netbeans.modules.foo}
253
     * or whatever the code name base of the module defining the library should be.
249
     * @since org.netbeans.modules.java.project/1 1.35
254
     * @since org.netbeans.modules.java.project/1 1.35
250
     */
255
     */
251
    public interface LibraryDefiner {
256
    public interface LibraryDefiner {

Return to bug 194744