Revision 320 org.gvsig.projection.jcrs/trunk/org.gvsig.projection.jcrs/org.gvsig.projection.jcrs.lib/src/main/java/org/gvsig/crs/CrsFactory.java

View differences:

CrsFactory.java
66 66
     * @throws CrsException
67 67
     */
68 68
    public ICrs getCRS(String code) throws CrsException {
69
        return getCRS(code,null,null);
70
    }
69 71

  
70
        if (enableMemoryCache && data.containsKey(code)) {
71
            return (ICrs) data.get(code);
72
    public ICrs getCRS(String code, String theSourceParams, String theTargetParams) throws CrsException {
73

  
74
        String keyOfCache = getKeyOfCache(code,theSourceParams,theTargetParams);
75
        if (enableMemoryCache && data.containsKey(keyOfCache)) {
76
            return (ICrs) data.get(keyOfCache);
72 77
        }
78
        String sourceParams = theSourceParams;
79
        String targetParams = theTargetParams;
80
        String crsCode = code;
81

  
82
        ICrs crs = null;
83

  
84
        if ( code.indexOf(":", code.indexOf(":") + 1) >= 0 ) {
85
            crsCode = code.substring(0, code.indexOf(":", code.indexOf(":") + 1));
86
            if ( code.indexOf("@") == -1 ) {
87
                crsCode = crsCode.substring(0, crsCode.indexOf(","));
88
            } else {
89
                sourceParams = code.substring(code.indexOf("@") + 1, code.lastIndexOf("@"));
90
                targetParams = code.substring(code.lastIndexOf("@") + 1);
91

  
92
                if ( sourceParams.equals("") ) {
93
                    sourceParams = null;
94
                } else if ( targetParams.equals("1") ) { // Compativilidad con versiones de libJCrs sin soporte para transf. compuestas.
95
                    targetParams = sourceParams;
96
                    sourceParams = "";
97
                }
98
                if ( targetParams.equals("") || targetParams.equals("0") ) // Compativilidad con versiones de libJCrs sin soporte para transf. compuestas.
99
                {
100
                    targetParams = null;
101
                }
102
            }
103
        }
104
        crs = getSimpleCRS(crsCode);
105
        if( sourceParams!=null || targetParams!=null ) {
106
            crs.setTransformationParams(sourceParams, targetParams);
107
        }
108

  
109
        if( enableMemoryCache ) {
110
            keyOfCache = getKeyOfCache(crsCode,sourceParams,targetParams);
111
            data.put(keyOfCache, crs);
112
        }
113

  
114

  
115
        return crs;
116
    }
117

  
118
    private String getKeyOfCache(String code, String theSourceParams, String theTargetParams) {
119
        String keyOfCache = code;
120
        if( theSourceParams!=null ) {
121
            keyOfCache += ":proj@" + theSourceParams + "@";
122
            if( theTargetParams!=null ) {
123
                keyOfCache += theTargetParams;
124
            }
125
        } 
126
        return keyOfCache;
127
    }
128
    
129
    private ICrs getSimpleCRS(String code) throws CrsException {
130

  
73 131
        String repoId = "";
74 132
        String crsCode = "";
75 133
        ICrs crs = null;
76 134
        ICrsRepository repo = null;
77 135

  
78 136
        try {
79
            if ( code.indexOf(":", code.indexOf(":") + 1) < 0 ) {
80 137
                repoId = code.substring(0, code.indexOf(":"));
81 138
                crsCode = code.substring(code.indexOf(":") + 1);
82 139

  
......
116 173
                        crs = repo.getCrs(crsCode);
117 174
                    }
118 175
                }
119
            } else {
120
                String sourceParams = null;
121
                String targetParams = null;
122

  
123
                crsCode = code.substring(0, code.indexOf(":", code.indexOf(":") + 1));
124
                if ( code.indexOf("@") == -1 ) {
125
                    crsCode = crsCode.substring(0, crsCode.indexOf(","));
176
                if ( crs == null ) {
177
                    logger.debug("Can't find CRS '" + code + "' in available repositories.");
126 178
                } else {
127
                    sourceParams = code.substring(code.indexOf("@") + 1, code.lastIndexOf("@"));
128
                    targetParams = code.substring(code.lastIndexOf("@") + 1);
129

  
130
                    if ( sourceParams.equals("") ) {
131
                        sourceParams = null;
132
                    } else if ( targetParams.equals("1") ) { // Compativilidad con versiones de libJCrs sin soporte para transf. compuestas.
133
                        targetParams = sourceParams;
134
                        sourceParams = "";
135
                    }
136
                    if ( targetParams.equals("") || targetParams.equals("0") ) // Compativilidad con versiones de libJCrs sin soporte para transf. compuestas.
137
                    {
138
                        targetParams = null;
139
                    }
140
                }
141
                crs = getCRS(crsCode);
142
                if ( crs != null ) {
143
                    crs.setTransformationParams(sourceParams, targetParams);
144
                }
145

  
146
            }
147

  
148
            if( enableMemoryCache ) {
149
                code = crs.getAbrev();
150
                data.put(code, crs);
151
            }
152
            
153
            if ( crs == null ) {
154
                logger.debug("Can't find CRS '" + code + "' in available repositories.");
155
            } else {
156
                logger.debug("Found CRS '" + code + "' in repository '" +
157
                        (repo == null ? "unknow" : (repo.getClass().getSimpleName())) + "'.");
158
            }
159
            return crs;
179
                    logger.debug("Found CRS '" + code + "' in repository '" +
180
                            (repo == null ? "unknow" : (repo.getClass().getSimpleName())) + "'.");
181
                }        
182
                return crs;
160 183
        } finally {
161 184
            if( repo instanceof Disposable ) {
162 185
                ((Disposable)repo).dispose();
163 186
            }
164 187
        } 
165
        /*if (data.containsKey(code))
166
         return (Crs) data.get(code);
167

  
168
         Crs crs = new Crs(code);
169

  
170
         // LWS Esta l?nea sobra, cuando el cuadro de di?logo est?
171
         // mejor hecho.
172
         code = crs.getAbrev();
173

  
174
         data.put(code, crs);
175

  
176
         return crs;*/
177 188
    }
178

  
189
  
190
    
179 191
    /**
180 192
     *
181 193
     * @param epsg_code
......
184 196
     * @throws CrsException
185 197
     */
186 198
    public ICrs getCRS(int epsg_code, String code) throws CrsException {
187
        /*if (data.containsKey(code))
188
         return (Crs) data.get(code);*/
189

  
190 199
        Crs crs = new Crs(epsg_code, code);
191

  
192
        // LWS Esta l?nea sobra, cuando el cuadro de di?logo est?
193
        // mejor hecho.
194
		/*code = crs.getAbrev();
195

  
196
         data.put(code, crs);*/
197 200
        return crs;
198 201
    }
199 202

  
......
206 209
     * @throws CrsException
207 210
     */
208 211
    public ICrs getCRS(int epsg_code, String code, String params) throws CrsException {
209
        /*if (data.containsKey(code))
210
         return (Crs) data.get(code);*/
211

  
212 212
        Crs crs = new Crs(epsg_code, code, params);
213

  
214
        // LWS Esta l?nea sobra, cuando el cuadro de di?logo est?
215
        // mejor hecho.
216
		/*code = crs.getAbrev();
217

  
218
         data.put(code, crs);*/
219 213
        return crs;
220 214
    }
221 215

  
......
224 218
     */
225 219
    public IProjection get(String name) {
226 220
        try {
227
            return getCRS(name);
221
            return getCRS(name,null,null);
228 222
        } catch (CrsException e) {
229 223
            logger.error("Can't cget CRS name '" + name + "'.", e);
230 224
        }

Also available in: Unified diff