GeoWebCache

root/trunk/geowebcache/src/main/java/org/geowebcache/storage/blobstore/file/FilePathGenerator.java

Revision 720, 3.4 kB (checked in by arneke, 7 months ago)

#91 zeroPadder initializes StringBuilder? with negative size (in some cases, when the grid is not square)

Line 
1/**
2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as published by
4 * the Free Software Foundation, either version 3 of the License, or
5 * (at your option) any later version.
6 *
7 *  This program is distributed in the hope that it will be useful,
8 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
9 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 *  GNU General Public License for more details.
11 *
12 *  You should have received a copy of the GNU Lesser General Public License
13 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
14 *
15 * @author Arne Kepp, The Open Planning Project, Copyright 2008
16 * 
17 */
18package org.geowebcache.storage.blobstore.file;
19
20import java.io.File;
21
22import org.geowebcache.mime.MimeType;
23
24public class FilePathGenerator {
25    protected static String[] tilePath(String prefix, String layerName, long[] tileIndex, 
26            String gridSetId, MimeType mimeType, long parameters_id) {
27        long x = tileIndex[0];
28        long y = tileIndex[1];
29        long z = tileIndex[2];
30       
31        //System.out.println("x: " + x + " y: " + y + " z: " + z);
32       
33        String gridSetStr = filteredGridSetId(gridSetId);
34        String layerStr = filteredLayerName(layerName);
35       
36        String paramStr = "";
37        if(parameters_id != -1L) {
38            paramStr = "_" + Long.toHexString(parameters_id);
39        }
40       
41        long shift = z / 2;
42        long half = 2 << shift;
43        int digits = 1;
44        if (half > 10) {
45            digits = (int) (Math.log10(half)) + 1;
46        }
47        long halfx = x / half;
48        long halfy = y / half;
49
50        String fileExtension = mimeType.getFileExtension();
51       
52        String[] ret = new String[2];
53       
54        ret[0] = prefix + File.separator + layerStr + File.separator
55                + gridSetStr + "_" + zeroPadder(z, 2) + paramStr + File.separator 
56                + zeroPadder(halfx, digits) + "_" 
57                + zeroPadder(halfy, digits);
58       
59        ret[1] = zeroPadder(x, 2 * digits) + "_" + zeroPadder(y, 2 * digits) + "." + fileExtension;
60       
61        return ret;
62    }
63   
64
65    /**
66     * Silly way to pad numbers with leading zeros, since I don't know a fast
67     * way of doing this in Java.
68     *
69     * @param number
70     * @param order
71     * @return
72     */
73    public static String zeroPadder(long number, int order) {
74        int numberOrder = 1;
75
76        if (number > 9) {
77            if(number > 11) {
78                numberOrder = (int) Math.ceil(Math.log10(number) - 0.001);
79            } else {
80                numberOrder = 2;
81            }
82        }
83
84        int diffOrder = order - numberOrder;
85       
86        if(diffOrder > 0) {
87            //System.out.println("number: " + number + " order: " + order + " diff: " + diffOrder);
88            StringBuilder padding = new StringBuilder(diffOrder);
89           
90            while (diffOrder > 0) {
91                padding.append("0");
92                diffOrder--;
93            }
94            return padding.toString() + Long.toString(number);
95        } else {
96            return Long.toString(number);
97        }
98    }
99   
100    public static String filteredGridSetId(String gridSetId) {
101        return gridSetId.replace(':', '_');
102    }
103   
104    public static String filteredLayerName(String layerName) {
105        return layerName.replace(':', '_').replace(' ', '_');
106    }
107}
Note: See TracBrowser for help on using the browser.