Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / execution / InstallerProviderInstallers.java @ 43127

History | View | Annotate | Download (7.01 KB)

1
package org.gvsig.installer.lib.impl.execution;
2

    
3
import java.io.File;
4
import java.io.FilenameFilter;
5
import java.net.MalformedURLException;
6
import java.net.URL;
7
import java.net.URLClassLoader;
8
import java.util.Properties;
9
import org.apache.commons.io.FileUtils;
10
import org.gvsig.installer.lib.api.InstallerLocator;
11
import org.gvsig.installer.lib.api.InstallerManager;
12
import org.gvsig.installer.lib.api.PackageInfo;
13
import org.gvsig.installer.lib.api.execution.InstallPackageService;
14
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
15
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
16
import org.gvsig.tools.service.spi.NotRegisteredException;
17
import org.gvsig.tools.service.spi.ParametersException;
18
import org.gvsig.tools.service.spi.ProviderManager_WithGetFactories;
19
import org.gvsig.tools.util.Invocable;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22

    
23
public class InstallerProviderInstallers {
24

    
25
    private static final Logger LOG = LoggerFactory.getLogger(InstallerProviderInstallers.class);
26

    
27
    private final InstallPackageService bundle;
28
    private final String installerName;
29
    private String packageCode;
30
    private String factoryName;
31
    private String initializerClassName;
32
    private String libs;
33
    private PackageInfo packageInfo = null;
34

    
35
    public InstallerProviderInstallers(InstallPackageService bundle, String installerName) {
36
        this.bundle = bundle;
37
        this.installerName = installerName;
38
        this.init();
39
    }
40
    
41
    private void init() {
42
        Properties props = this.bundle.getProperties();
43
        String s = "installer."+installerName;
44
        this.setInitializerClassName(props.getProperty(s+".initializer"));
45
        this.setPackageCode(props.getProperty(s+".package.code"));
46
        this.setFactoryName(props.getProperty(s+".factory.name"));
47
        this.setLibs(props.getProperty(s+".libs", "lib"));
48
    }
49

    
50
    /**
51
     * @return the bundle
52
     */
53
    public InstallPackageService getBundle() {
54
        return bundle;
55
    }
56

    
57
    /**
58
     * @return the packageCode
59
     */
60
    public String getPackageCode() {
61
        return packageCode;
62
    }
63

    
64
    /**
65
     * @param packageCode the packageCode to set
66
     */
67
    public void setPackageCode(String packageCode) {
68
        this.packageCode = packageCode;
69
    }
70

    
71
    /**
72
     * @return the initializerClassName
73
     */
74
    public String getInitializerClassName() {
75
        return initializerClassName;
76
    }
77

    
78
    /**
79
     * @param initializerClassName the initializerClassName to set
80
     */
81
    public void setInitializerClassName(String initializerClassName) {
82
        this.initializerClassName = initializerClassName;
83
    }
84

    
85
    /**
86
     * @return the libs
87
     */
88
    public String getLibs() {
89
        return libs;
90
    }
91

    
92
    /**
93
     * @param libs the libs to set
94
     */
95
    public void setLibs(String libs) {
96
        this.libs = libs;
97
    }
98

    
99
    /**
100
     * @return the factoryName
101
     */
102
    public String getFactoryName() {
103
        return factoryName;
104
    }
105

    
106
    /**
107
     * @param factoryName the factoryName to set
108
     */
109
    public void setFactoryName(String factoryName) {
110
        this.factoryName = factoryName;
111
    }
112
    
113
    private ClassLoader createClassLoader(File installFolder) {
114
        File folder = FileUtils.getFile(installFolder, this.packageCode,this.libs);
115
        File[] jars = folder.listFiles(new FilenameFilter() {
116

    
117
            @Override
118
            public boolean accept(File dir, String name) {
119
                if (name.endsWith(".jar")) {
120
                    return true;
121
                }
122
                return false;
123
            }
124
        });
125
        URL[] urls = new URL[jars.length];
126
        for (int i = 0; i < jars.length; i++) {
127
            File f = jars[i];
128
            try {
129
                urls[i] = f.toURI().toURL();
130
            } catch (MalformedURLException ex) {
131
                LOG.warn("Can't add jar '" + f.getAbsolutePath() + "' to class loader.", ex);
132
            }
133
        }
134
        URLClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
135
        return loader;
136
    }
137

    
138
    private Object newInstance(ClassLoader loader, String className) {
139
        try {
140
            Class theClass = loader.loadClass(className);
141
            Object instance = theClass.newInstance();
142
            return instance;
143
        } catch (Exception ex) {
144
            LOG.warn("Can't create class '" + className + "'.", ex);
145
            return null;
146
        }
147
    }
148

    
149
    private PackageInfo getPackageInfo() {
150
        if (this.packageInfo == null) {
151
            this.packageInfo = this.bundle.getPackageInfo(packageCode);
152
        }
153
        return this.packageInfo;
154
    }
155

    
156
    public boolean isAlreadyRegistered() {
157
        try {
158
            ProviderManager_WithGetFactories providerManager = InstallerProviderLocator.getProviderManager();
159
            providerManager.getProviderFactory(factoryName);
160
            return true;
161
        } catch (NotRegisteredException ex) {
162
            return false;
163
        } catch (ParametersException ex) {
164
            throw new RuntimeException(ex);
165
        }
166
    }
167
    
168
    public void install() {
169
        InstallerManager installerManager = InstallerLocator.getInstallerManager();
170

    
171
        File installFolder = installerManager.getDefaultLocalAddonRepository(
172
                this.getPackageInfo().getType(),
173
                InstallerManager.ACCESS_WRITE
174
        );
175
        try {
176
            File f = FileUtils.getFile(installFolder,this.packageCode);
177
            if( ! f.exists() ) {
178
                this.bundle.installPackage(
179
                        installFolder,
180
                        this.packageCode
181
                );
182
            }
183
            if( ! isAlreadyRegistered() ) {
184
                ClassLoader loader = this.createClassLoader(installFolder);
185

    
186
                new DefaultLibrariesInitializer(loader).fullInitialize(true);
187

    
188
                Invocable initializer = (Invocable) this.newInstance(loader, initializerClassName);
189
                if (initializer == null) {
190
                    return;
191
                }
192
                initializer.call(this.packageCode);
193
            }
194
        } catch (Exception ex) {
195
            LOG.warn("Can't install package provider '" + this.packageCode + "' in the folder '" + installFolder == null ? "unknown" : installFolder.getAbsolutePath() + "'.", ex);
196
        }
197
    }
198
    
199
    class MyClassLoader extends URLClassLoader {
200

    
201
        public MyClassLoader(URL[] urls, ClassLoader parent) {
202
            super(urls, parent);
203
        }
204

    
205
        @Override
206
        protected Class<?> findClass(String name) throws ClassNotFoundException {
207
            LOG.info("findClass('"+name+"').");
208
            return super.findClass(name); 
209
        }
210

    
211
        @Override
212
        public Class<?> loadClass(String name) throws ClassNotFoundException {
213
            LOG.info("loadClass('"+name+"').");
214
            return super.loadClass(name); 
215
        }
216

    
217
        @Override
218
        protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
219
            LOG.info("loadClass('"+name+"',"+resolve+").");
220
            return super.loadClass(name, resolve); 
221
        }
222
        
223
    }
224

    
225
}