svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / impl / DatabaseWorkspaceStoresRepository.java @ 47611
History | View | Annotate | Download (9.2 KB)
1 |
package org.gvsig.fmap.dal.impl; |
---|---|
2 |
|
3 |
import java.io.File; |
4 |
import org.gvsig.fmap.dal.DatabaseWorkspaceManager; |
5 |
import java.util.HashMap; |
6 |
import java.util.Map; |
7 |
import org.apache.commons.lang3.StringUtils; |
8 |
import org.gvsig.expressionevaluator.ExpressionUtils; |
9 |
import org.gvsig.fmap.dal.AbstractStoresRepository; |
10 |
import org.gvsig.fmap.dal.DALLocator; |
11 |
import org.gvsig.fmap.dal.DataManager; |
12 |
import org.gvsig.fmap.dal.DataStoreParameters; |
13 |
import org.gvsig.fmap.dal.DataTypes; |
14 |
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_FLAGS; |
15 |
import org.gvsig.fmap.dal.StoresRepository; |
16 |
import org.gvsig.fmap.dal.feature.Feature; |
17 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
18 |
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_NAME; |
19 |
import org.gvsig.tools.exception.BaseException; |
20 |
import org.gvsig.tools.util.UnmodifiableBasicSet; |
21 |
import org.gvsig.tools.util.UnmodifiableBasicSetAdapter; |
22 |
import org.gvsig.tools.visitor.VisitCanceledException; |
23 |
import org.gvsig.tools.visitor.Visitor; |
24 |
import org.slf4j.Logger; |
25 |
import org.slf4j.LoggerFactory; |
26 |
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_PARAMETERS; |
27 |
import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
28 |
import org.gvsig.tools.dispose.DisposeUtils; |
29 |
import org.gvsig.tools.dynobject.DynClass; |
30 |
import org.gvsig.tools.dynobject.DynField; |
31 |
import org.gvsig.tools.util.Bitmask; |
32 |
import org.gvsig.tools.util.HasAFile; |
33 |
|
34 |
/**
|
35 |
*
|
36 |
* @author jjdelcerro
|
37 |
*/
|
38 |
@SuppressWarnings("UseSpecificCatch") |
39 |
public class DatabaseWorkspaceStoresRepository |
40 |
extends AbstractStoresRepository
|
41 |
implements StoresRepository
|
42 |
{ |
43 |
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDatabaseWorkspaceManager.class); |
44 |
|
45 |
private final DefaultDatabaseWorkspaceManager workspace; |
46 |
private Map<String,DataStoreParameters> repository; |
47 |
|
48 |
public static final int BIT_CHANGE_PORT_HOST = 0; |
49 |
public static final int BIT_CHANGE_USER = 1; |
50 |
public static final int BIT_CHANGE_DBNAME_CATALOG_SCHEMA = 2; |
51 |
|
52 |
/* Copied from DBParameters */
|
53 |
private static final String HOST_PARAMTER_NAME = "host"; |
54 |
private static final String PORT_PARAMTER_NAME = "port"; |
55 |
private static final String DBNAME_PARAMTER_NAME = "dbname"; |
56 |
private static final String USER_PARAMTER_NAME = "dbuser"; |
57 |
private static final String PASSWORD_PARAMTER_NAME = "password"; |
58 |
private static final String URL_PARAMTER_NAME = "url"; |
59 |
|
60 |
/* Copied from JDBCConnectionParameters */
|
61 |
private static final String CATALOG_PARAMTER_NAME = "catalog"; |
62 |
private static final String SCHEMA_PARAMTER_NAME = "schema"; |
63 |
|
64 |
|
65 |
|
66 |
public DatabaseWorkspaceStoresRepository(String name, String label, DatabaseWorkspaceManager workspace) { |
67 |
super(name, label);
|
68 |
this.workspace = (DefaultDatabaseWorkspaceManager) workspace;
|
69 |
this.repository = null; |
70 |
this.setServerParameters(this.workspace.getServerExplorerParameters()); |
71 |
} |
72 |
|
73 |
private void evaluateExpressionsInFiles(DataStoreParameters parameters) { |
74 |
DynClass dynClass = parameters.getDynClass(); |
75 |
if( dynClass == null ) { |
76 |
return;
|
77 |
} |
78 |
File theBaseFolder = this.workspace.getBaseFolder(); |
79 |
File theWorkspaceFile = this.workspace.getWorkspaceFile(); |
80 |
if( theBaseFolder==null && theWorkspaceFile==null ) { |
81 |
return;
|
82 |
} |
83 |
for (DynField dynField : dynClass.getDynFields()) {
|
84 |
switch(dynField.getType()) {
|
85 |
case DataTypes.FILE:
|
86 |
case DataTypes.FOLDER:
|
87 |
File f = (File) parameters.getDynValue(dynField.getName()); |
88 |
if( ExpressionUtils.isDynamicFilename(f) ) {
|
89 |
parameters.setDynValue(dynField.getName(), ExpressionUtils.evaluateFilename(this.workspace, f));
|
90 |
} |
91 |
break;
|
92 |
} |
93 |
} |
94 |
try {
|
95 |
if (parameters instanceof HasAFile) { |
96 |
HasAFile params = (HasAFile) parameters; |
97 |
params.setFile(ExpressionUtils.evaluateFilename(params.getFile())); |
98 |
} |
99 |
parameters.validate(); |
100 |
} catch (ValidateDataParametersException ex) {
|
101 |
LOGGER.warn("Not been able to validate parameters", ex);
|
102 |
} |
103 |
} |
104 |
|
105 |
private void load() { |
106 |
FeatureStore store = null;
|
107 |
try {
|
108 |
this.repository = new HashMap<>(); |
109 |
final DataManager dataManager = DALLocator.getDataManager();
|
110 |
store = this.workspace.getTable(DatabaseWorkspaceManager.TABLE_REPOSITORY);
|
111 |
if(store == null) { |
112 |
return;
|
113 |
} |
114 |
DataStoreParameters storeParameters = store.getParameters(); |
115 |
store.accept(new Visitor() {
|
116 |
@Override
|
117 |
public void visit(Object obj) throws VisitCanceledException, BaseException { |
118 |
Feature f = (Feature) obj; |
119 |
String name = f.getString(FIELD_REPOSITORY_NAME);
|
120 |
byte[] data = f.getByteArray(FIELD_REPOSITORY_PARAMETERS); |
121 |
// Compatibilidad con antiguos repositorios sin falgs
|
122 |
int flags = 0; |
123 |
if (f.getType().getAttributeDescriptor(FIELD_REPOSITORY_FLAGS)!=null) { |
124 |
flags = f.getInt(FIELD_REPOSITORY_FLAGS); |
125 |
} |
126 |
DataStoreParameters params = dataManager.createStoreParameters(data); |
127 |
if( params==null ) { |
128 |
LOGGER.warn("Can't restore parameters from repository entry '"+name+"'."); |
129 |
return;
|
130 |
} |
131 |
processParameters(params, storeParameters, Bitmask.createBitmask(flags)); |
132 |
evaluateExpressionsInFiles(params); |
133 |
repository.put(name, params); |
134 |
} |
135 |
}); |
136 |
} catch (Exception ex) { |
137 |
if(store == null) { |
138 |
LOGGER.warn("Can't open repository information");
|
139 |
LOGGER.debug("Can't open repository information", ex);
|
140 |
} else {
|
141 |
LOGGER.warn("Can't load repository information", ex);
|
142 |
} |
143 |
} finally {
|
144 |
DisposeUtils.disposeQuietly(store); |
145 |
} |
146 |
} |
147 |
|
148 |
private void processParameters(DataStoreParameters params, DataStoreParameters storeParameters, Bitmask mask) { |
149 |
if (mask.isEmpty()) {
|
150 |
return;
|
151 |
} |
152 |
|
153 |
if (mask.isSetBit(BIT_CHANGE_PORT_HOST)) {
|
154 |
try {
|
155 |
Object host = storeParameters.getDynValue(HOST_PARAMTER_NAME);
|
156 |
Object port = storeParameters.getDynValue(PORT_PARAMTER_NAME);
|
157 |
params.setDynValue(HOST_PARAMTER_NAME, host); |
158 |
params.setDynValue(PORT_PARAMTER_NAME, port); |
159 |
params.setDynValue(URL_PARAMTER_NAME, null);
|
160 |
} catch (Exception ex) { |
161 |
throw new RuntimeException("Unable to set host and port from actual connection", ex); |
162 |
} |
163 |
} |
164 |
if (mask.isSetBit(BIT_CHANGE_USER)) {
|
165 |
try {
|
166 |
Object dbuser = storeParameters.getDynValue(USER_PARAMTER_NAME);
|
167 |
Object password = storeParameters.getDynValue(PASSWORD_PARAMTER_NAME);
|
168 |
params.setDynValue(USER_PARAMTER_NAME, dbuser); |
169 |
params.setDynValue(PASSWORD_PARAMTER_NAME, password); |
170 |
} catch (Exception ex) { |
171 |
throw new RuntimeException("Unable to set user and passwrod from actual connection", ex); |
172 |
} |
173 |
} |
174 |
if (mask.isSetBit(BIT_CHANGE_DBNAME_CATALOG_SCHEMA)) {
|
175 |
try {
|
176 |
Object dbname = storeParameters.getDynValue(DBNAME_PARAMTER_NAME);
|
177 |
Object catalog = storeParameters.getDynValue(CATALOG_PARAMTER_NAME);
|
178 |
Object schema = storeParameters.getDynValue(SCHEMA_PARAMTER_NAME);
|
179 |
params.setDynValue(DBNAME_PARAMTER_NAME, dbname); |
180 |
params.setDynValue(CATALOG_PARAMTER_NAME, catalog); |
181 |
params.setDynValue(SCHEMA_PARAMTER_NAME, schema); |
182 |
params.setDynValue(URL_PARAMTER_NAME, null);
|
183 |
} catch (Exception ex) { |
184 |
throw new RuntimeException("Unable to set dbname and catalog, schema from actual connection", ex); |
185 |
} |
186 |
} |
187 |
} |
188 |
|
189 |
@Override
|
190 |
protected DataStoreParameters getMyParameters(String name) { |
191 |
if( this.repository==null ) { |
192 |
this.load();
|
193 |
} |
194 |
DataStoreParameters params = this.repository.get(name);
|
195 |
if (params!=null) { |
196 |
return params;
|
197 |
} |
198 |
for (String key : this.repository.keySet()) { |
199 |
if (StringUtils.equalsIgnoreCase(key, name)) {
|
200 |
return this.repository.get(key); |
201 |
} |
202 |
} |
203 |
return null; |
204 |
} |
205 |
|
206 |
@Override
|
207 |
protected boolean isEmptyMyRepository() { |
208 |
if( this.repository==null ) { |
209 |
this.load();
|
210 |
} |
211 |
return this.repository.isEmpty(); |
212 |
} |
213 |
|
214 |
@Override
|
215 |
protected int getMySize() { |
216 |
if( this.repository==null ) { |
217 |
this.load();
|
218 |
} |
219 |
return this.repository.size(); |
220 |
} |
221 |
|
222 |
@Override
|
223 |
protected UnmodifiableBasicSet<String> getMyKeySet() { |
224 |
if( this.repository==null ) { |
225 |
this.load();
|
226 |
} |
227 |
return new UnmodifiableBasicSetAdapter<>(this.repository.keySet()); |
228 |
} |
229 |
|
230 |
|
231 |
} |