Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / execution / DefaultInstallPackageService.java @ 34005

History | View | Annotate | Download (8.85 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 * 
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 * 
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 * 
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
 * MA  02110-1301, USA.
20
 * 
21
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 {Prodevelop}   {Task}
26
 */
27

    
28
package org.gvsig.installer.lib.impl.execution;
29

    
30
import java.io.BufferedInputStream;
31
import java.io.File;
32
import java.io.FileFilter;
33
import java.io.FileInputStream;
34
import java.io.FileNotFoundException;
35
import java.io.IOException;
36
import java.io.InputStream;
37
import java.net.URL;
38
import java.util.ArrayList;
39
import java.util.HashMap;
40
import java.util.List;
41
import java.util.Map;
42

    
43
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
45

    
46
import org.gvsig.installer.lib.api.InstallerManager;
47
import org.gvsig.installer.lib.api.PackageInfo;
48
import org.gvsig.installer.lib.api.execution.InstallPackageService;
49
import org.gvsig.installer.lib.api.execution.InstallPackageServiceException;
50
import org.gvsig.installer.lib.impl.DefaultInstallerManager;
51
import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
52
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
53
import org.gvsig.installer.lib.spi.InstallerProviderManager;
54
import org.gvsig.installer.lib.spi.execution.InstallPackageProvider;
55
import org.gvsig.tools.service.Manager;
56
import org.gvsig.tools.service.ServiceException;
57

    
58
/**
59
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera Llodr&aacute;</a>
60
 */
61
public class DefaultInstallPackageService implements InstallPackageService {
62

    
63
    private Map<PackageInfo, File> packageInfoFileMap = null;
64
    private Map<PackageInfo, String> zipEntriesMap = null;
65
    private List<PackageInfo> packageInfos = null;
66
    private InstallerManager manager;
67
    private static final Logger logger = LoggerFactory
68
        .getLogger(DefaultInstallPackageService.class);
69
    private InstallPackageProviderServices installerProviderServices = null;
70

    
71
    public DefaultInstallPackageService(DefaultInstallerManager manager) {
72
        super();
73
        this.manager = manager;
74
        packageInfoFileMap = new HashMap<PackageInfo, File>();
75
        packageInfos = new ArrayList<PackageInfo>();
76
        zipEntriesMap = new HashMap<PackageInfo, String>();
77
        installerProviderServices =
78
            InstallerProviderLocator.getProviderManager()
79
                .createInstallerProviderServices();
80
    }
81

    
82
    public void installPackage(File applicationDirectory,
83
        PackageInfo packageInfo) throws InstallPackageServiceException {
84
        if (!applicationDirectory.exists()) {
85
            throw new InstallPackageServiceException(
86
                "application_directory_not_found");
87
        }
88
        if (!packageInfoFileMap.containsKey(packageInfo)) {
89
            throw new InstallPackageServiceException("package_not_found");
90
        }
91

    
92
        InputStream bundleStream = null;
93

    
94
        try {
95
            File file = packageInfoFileMap.get(packageInfo);
96
            bundleStream = new FileInputStream(file);
97
        } catch (FileNotFoundException e) {
98
            throw new InstallPackageServiceException("not_uri_selected");
99
        }
100

    
101
        InstallPackageProvider installerExecutionProvider =
102
            createProvider(packageInfo);
103

    
104
        if (packageInfo.getDownloadURL() == null) {
105
            InputStream packageStream =
106
                installerProviderServices.searchPackage(bundleStream,
107
                    zipEntriesMap.get(packageInfo));
108
            installerExecutionProvider.install(applicationDirectory,
109
                packageStream);
110
        } else {
111
            File downloadedBundle =
112
                downloadFile(packageInfo.getDownloadURL(), null);
113
            try {
114
                FileInputStream fis = new FileInputStream(downloadedBundle);
115
                BufferedInputStream bis = new BufferedInputStream(fis);
116
                installerExecutionProvider.install(applicationDirectory, bis);
117
                bis.close();
118
                fis.close();
119
            } catch (FileNotFoundException e) {
120
                throw new InstallPackageServiceException(
121
                    "Downloaded bundle file not found: " + downloadedBundle, e);
122
            } catch (IOException e) {
123
                throw new InstallPackageServiceException(
124
                    "IO error installing the downloaded bundle: "
125
                        + downloadedBundle, e);
126
            }
127
        }
128

    
129
    }
130

    
131
    public void installPackage(File applicationDirectory, String packageCode)
132
        throws InstallPackageServiceException {
133
        PackageInfo packageInfo = getPackageInfo(packageCode);
134
        if (packageInfo == null) {
135
            throw new InstallPackageServiceException(
136
                "The package doesn't exist");
137
        }
138
        installPackage(applicationDirectory, packageInfo);
139
    }
140

    
141
    private InstallPackageProvider createProvider(PackageInfo packageInfo)
142
        throws InstallPackageServiceException {
143
        InstallerProviderManager installerProviderManager =
144
            (InstallerProviderManager) ((DefaultInstallerManager) manager)
145
                .getProviderManager();
146

    
147
        try {
148
            return installerProviderManager.createExecutionProvider(packageInfo
149
                .getType());
150
        } catch (ServiceException e) {
151
            throw new InstallPackageServiceException(
152
                "Error creating the provider", e);
153
        }
154
    }
155

    
156
    public PackageInfo getPackageInfo(int index) {
157
        if (index >= packageInfos.size()) {
158
            return null;
159
        }
160
        return packageInfos.get(index);
161
    }
162

    
163
    public PackageInfo getPackageInfo(String packageCode) {
164
        for (int i = 0; i < getPackageCount(); i++) {
165
            if (packageInfos.get(i).getCode().equals(packageCode)) {
166
                return packageInfos.get(i);
167
            }
168
        }
169
        return null;
170
    }
171

    
172
    public void addBundle(File bundle) throws InstallPackageServiceException {
173
        if (!bundle.exists()) {
174
            throw new InstallPackageServiceException(
175
                "Only an existing file is supported");
176
        }
177
        try {
178
            int packageInfoCount = packageInfos.size();
179
            installerProviderServices.readPackageInfo(new FileInputStream(
180
                bundle), packageInfos, zipEntriesMap);
181
            for (int i = packageInfoCount; i < packageInfos.size(); i++) {
182
                packageInfoFileMap.put(packageInfos.get(i), bundle);
183
            }
184
        } catch (FileNotFoundException e) {
185
            logger.error("File not found", e);
186
        }
187
    }
188

    
189
    public void addBundle(URL bundleURL) throws InstallPackageServiceException {
190
        File bundle = downloadFile(bundleURL, "packages.gvspki");
191
        addBundle(bundle);
192
    }
193

    
194
    private File downloadFile(URL bundleURL, String defaultFileName)
195
        throws InstallPackageServiceException {
196
        try {
197
            return InstallerProviderLocator.getProviderManager()
198
                .createInstallerProviderServices()
199
                .downloadFile(bundleURL, defaultFileName);
200
        } catch (IOException e) {
201
            throw new InstallPackageServiceException(
202
                "Bundle file download error from URL: " + bundleURL, e);
203
        }
204
    }
205

    
206
    public void addBundlesFromDirectory(File directory)
207
        throws InstallPackageServiceException {
208
        if (!directory.isDirectory()) {
209
            throw new InstallPackageServiceException(
210
                "The application directory has to be a directory");
211
        }
212
        File[] files = directory.listFiles(new FileFilter() {
213
            
214
            private String packageExt = manager.getDefaultPackageFileExtension();
215
            private String packageSetExt = manager
216
                .getDefaultPackageSetFileExtension();
217
            
218
            public boolean accept(File file) {
219
                String name = file.getName().toLowerCase();
220
                return name.endsWith(packageExt)
221
                    || name.endsWith(packageSetExt);
222
            }
223
        });
224
        for (int i = 0; i < files.length; i++) {
225
            if (files[i].isFile()) {
226
                addBundle(files[i]);
227
            }
228
        }
229
    }
230

    
231
    public int getPackageCount() {
232
        if (packageInfos == null) {
233
            return 0;
234
        }
235
        return packageInfos.size();
236
    }
237

    
238
    public Manager getManager() {
239
        return this.manager;
240
    }
241

    
242
}