Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.tilecache / org.gvsig.fmap.dal.tilecache.raster / src / main / java / org / gvsig / raster / tilecache / provider / TileCacheStoreProvider.java @ 43876

History | View | Annotate | Download (7.97 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.tilecache.provider;
24

    
25
import java.io.File;
26
import java.io.IOException;
27
import java.security.MessageDigest;
28
import java.security.NoSuchAlgorithmException;
29

    
30
import org.apache.commons.io.FileUtils;
31
import org.cresques.cts.IProjection;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
import org.gvsig.fmap.dal.DataStoreNotification;
36
import org.gvsig.fmap.dal.DataStoreParameters;
37
import org.gvsig.fmap.dal.FileHelper;
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.exception.InitializeException;
40
import org.gvsig.fmap.dal.raster.RasterQuery;
41
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
42
import org.gvsig.fmap.dal.raster.spi.RasterStoreProviderServices;
43
import org.gvsig.fmap.dal.resource.file.FileResource;
44
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
45
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
46
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
47
import org.gvsig.metadata.MetadataLocator;
48
import org.gvsig.metadata.MetadataManager;
49
import org.gvsig.metadata.exceptions.MetadataException;
50
import org.gvsig.tools.ToolsLocator;
51
import org.gvsig.tools.dynobject.DynObject;
52
import org.gvsig.tools.dynobject.DynObjectEncoder;
53
import org.gvsig.tools.dynobject.DynObjectManager;
54
import org.gvsig.tools.exception.BaseException;
55
import org.gvsig.tools.task.SimpleTaskStatus;
56
import org.gvsig.tools.task.TaskStatusManager;
57

    
58
/**
59
 * Provider for Tile Cache
60
 *
61
 * @author dmartinezizquierdo
62
 *
63
 */
64
public class TileCacheStoreProvider extends AbstractTileCacheStoreProvider implements //RasterCacheStoreProvider,
65
    ResourceConsumer {
66

    
67
    private static final Logger logger = LoggerFactory.getLogger(TileCacheStoreProvider.class);
68

    
69
    public static String NAME = "TileCache";
70
    public static String DESCRIPTION = "Tile cache provider";
71
    public static final String METADATA_DEFINITION_NAME = NAME;
72

    
73
    private ResourceProvider resource;
74
    private final SimpleTaskStatus taskStatus;
75

    
76
    protected static void registerMetadataDefinition() throws MetadataException {
77
        MetadataManager manager = MetadataLocator.getMetadataManager();
78
        if (manager.getDefinition(METADATA_DEFINITION_NAME) == null) {
79
            manager.addDefinition(METADATA_DEFINITION_NAME,
80
                TileCacheStoreProviderParameters.class.getResourceAsStream("TileCacheMetadata.xml"),
81
                TileCacheStoreProviderParameters.class.getClassLoader());
82
        }
83
    }
84

    
85
    /**
86
     * @param params
87
     * @param storeServices
88
     * @throws InitializeException
89
     */
90
    public TileCacheStoreProvider(TileCacheStoreProviderParameters params, DataStoreProviderServices storeServices)
91
        throws InitializeException {
92
        super(params, storeServices, FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME));
93
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
94
        this.taskStatus = manager.createDefaultSimpleTaskStatus("TileCache");
95
        this.init(params, storeServices);
96
    }
97

    
98
    protected TileCacheStoreProvider(TileCacheStoreProviderParameters params, DataStoreProviderServices storeServices,
99
        DynObject metadata) throws InitializeException {
100
        super(params, storeServices, metadata);
101
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
102
        this.taskStatus = manager.createDefaultSimpleTaskStatus("TileCache");
103
        this.init(params, storeServices);
104
    }
105

    
106
    protected void init(TileCacheStoreProviderParameters params,
107
        DataStoreProviderServices storeServices) throws InitializeException {
108
        bandsNumber = ((RasterStoreProviderServices)storeServices).getProvider().getBands();
109

    
110
        if (params == null) {
111
            throw new InitializeException(
112
                new NullPointerException("params is null"));
113
        }
114

    
115
    }
116

    
117
    public TileCacheStoreProviderParameters getParameters() {
118
        return (TileCacheStoreProviderParameters) super.getParameters();
119
    }
120

    
121
    @Override
122
    public ResourceProvider getResource() {
123
        return this.resource;
124
    }
125

    
126
    @Override
127
    public Object getSourceId() {
128
        File folder = this.getParameters().getFolder();
129
        if(folder == null){
130
            folder = this.getParameters().getRootFolder();
131
        }
132
        return folder;
133
    }
134

    
135
    @Override
136
    public String getProviderName() {
137
        return NAME;
138
    }
139

    
140
    @Override
141
    public boolean closeResourceRequested(ResourceProvider resource) {
142
        return true;
143
    }
144

    
145
    @Override
146
    public void resourceChanged(ResourceProvider resource) {
147
        this.getStoreServices().notifyChange(DataStoreNotification.RESOURCE_CHANGED, resource);
148
    }
149

    
150
    @Override
151
    protected void doDispose() throws BaseException {
152
        super.doDispose();
153
        resource.removeConsumer(this);
154
    }
155

    
156
    @Override
157
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
158
        super.apply(provider, crs, query);
159

    
160
        DataStoreParameters params = getParameters();
161
        File folder = (File) params.getDynValue(TileCacheStoreProviderParameters.TILECACHE_FOLDER_PARAMTER_NAME);
162
        if(folder == null){
163
            folder = (File) params.getDynValue(TileCacheStoreProviderParameters.TILECACHE_ROOTFOLDER_PARAMTER_NAME);
164
            DynObjectManager dynObjectManager = ToolsLocator.getDynObjectManager();
165
            DynObjectEncoder encoder = dynObjectManager.createSimpleDynObjectEncoder();
166

    
167
            MessageDigest md = null;
168
            String hex = "";
169
            try {
170
                md = java.security.MessageDigest.getInstance("MD5");
171
                md.update(encoder.encode(provider.getParameters()).getBytes());
172
                hex = convertToHex(md.digest());
173
            } catch (NoSuchAlgorithmException e) {
174
                logger.warn("Can't get a MD5 instance.", e);
175
            }
176

    
177
            folder = new File(folder.getAbsolutePath() + File.separator + hex+"-"+getName());
178
            try {
179
                FileUtils.write(new File(folder,"parameters.txt"), encoder.encode(provider.getParameters()));
180
            } catch (IOException e) {
181
                logger.warn("Can't create parameters file of store '"+getName()+"' for the cache.",e);
182
            }
183

    
184
        }
185

    
186
        resource = this.createResource(
187
            FileResource.NAME,
188
            new Object[] { folder.getAbsolutePath() }
189
        );
190
        resource.addConsumer(this);
191

    
192
        setTileStructImage(new FileTileCacheStructImage(folder, crs, provider, query));
193
    }
194

    
195
    /**
196
     * Converts an array of bytes to hexadecimal string
197
     *
198
     * @param data
199
     * @return
200
     */
201
    private String convertToHex(byte[] data) {
202
        StringBuffer buf = new StringBuffer();
203
        for (int i = 0; i < data.length; i++) {
204
            int halfbyte = (data[i] >>> 4) & 0x0F;
205
            int two_halfs = 0;
206
            do {
207
                if ((0 <= halfbyte) && (halfbyte <= 9))
208
                    buf.append((char) ('0' + halfbyte));
209
                else
210
                    buf.append((char) ('a' + (halfbyte - 10)));
211
                halfbyte = data[i] & 0x0F;
212
            } while (two_halfs++ < 1);
213
        }
214
        return buf.toString();
215
    }
216

    
217

    
218

    
219
}