Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java @ 1015:9a1a3080ad98
Bring user specific meta data service to life.
flys-artifacts/trunk@2461 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 03 Aug 2011 16:40:04 +0000 |
parents | b81626b10cb7 |
children | ff7b81cf9999 |
comparison
equal
deleted
inserted
replaced
1014:66473e72d321 | 1015:9a1a3080ad98 |
---|---|
1 package de.intevation.flys.artifacts.services; | 1 package de.intevation.flys.artifacts.services; |
2 | |
3 import java.sql.Connection; | |
4 import java.sql.SQLException; | |
5 | 2 |
6 import org.w3c.dom.Document; | 3 import org.w3c.dom.Document; |
7 | 4 |
8 import org.apache.log4j.Logger; | 5 import org.apache.log4j.Logger; |
9 | 6 |
21 import de.intevation.artifacts.common.utils.XMLUtils; | 18 import de.intevation.artifacts.common.utils.XMLUtils; |
22 import de.intevation.artifacts.common.utils.StringUtils; | 19 import de.intevation.artifacts.common.utils.StringUtils; |
23 | 20 |
24 import de.intevation.artifacts.common.ArtifactNamespaceContext; | 21 import de.intevation.artifacts.common.ArtifactNamespaceContext; |
25 | 22 |
26 import de.intevation.flys.artifacts.datacage.templating.Builder; | 23 import de.intevation.flys.artifacts.datacage.Recommendations; |
27 import de.intevation.flys.artifacts.datacage.templating.NoneUserSpecific; | |
28 | 24 |
29 import de.intevation.flys.artifacts.FLYSArtifact; | 25 import de.intevation.flys.artifacts.FLYSArtifact; |
30 | |
31 import de.intevation.flys.backend.SessionHolder; | |
32 | |
33 import org.hibernate.Session; | |
34 | |
35 import org.hibernate.jdbc.Work; | |
36 | 26 |
37 public class MetaDataService | 27 public class MetaDataService |
38 extends DefaultService | 28 extends DefaultService |
39 { | 29 { |
40 private static Logger log = Logger.getLogger(MetaDataService.class); | 30 private static Logger log = Logger.getLogger(MetaDataService.class); |
41 | 31 |
42 // old service. To be removed | 32 public static final String XPATH_ARTIFACT_ID = "/art:meta/art:artifact-id/@value"; |
43 public static final String XPATH_RIVER = "/art:river/text()"; | 33 public static final String XPATH_USER_ID = "/art:meta/art:user-id/@value"; |
44 | 34 public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; |
45 public static final String XPATH_UUID = "/art:meta/art:uuid/@value"; | 35 public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; |
46 public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; | |
47 public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; | |
48 public static final String XPATH_FILTERS = "/art:meta/art:filters/@value"; | |
49 | 36 |
50 /** The global context key of the artifact database */ | 37 /** The global context key of the artifact database */ |
51 public static final String ARTIFACT_DATA_BASE_KEY = | 38 public static final String ARTIFACT_DATA_BASE_KEY = |
52 "global.artifact.database"; | 39 "global.artifact.database"; |
53 | 40 |
54 public MetaDataService() { | 41 public MetaDataService() { |
55 } | 42 } |
56 | 43 |
57 protected static Map<String, Object> extractParameters(Document data) { | 44 @Override |
58 HashMap<String, Object> parameters = new HashMap<String, Object>(); | 45 public Document process( |
46 Document data, | |
47 GlobalContext globalContext, | |
48 CallMeta callMeta | |
49 ) { | |
50 log.debug("MetaDataService.process"); | |
59 | 51 |
60 String river = XMLUtils.xpathString( | 52 String artifactId = XMLUtils.xpathString( |
61 data, XPATH_RIVER, ArtifactNamespaceContext.INSTANCE); | 53 data, XPATH_ARTIFACT_ID, ArtifactNamespaceContext.INSTANCE); |
62 | 54 |
63 if (river == null || (river = river.trim()).length() == 0) { | 55 String userId = XMLUtils.xpathString( |
64 river = "%"; // matches all rivers | 56 data, XPATH_USER_ID, ArtifactNamespaceContext.INSTANCE); |
65 } | |
66 | 57 |
67 parameters.put("river", river); | 58 String outs = XMLUtils.xpathString( |
59 data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); | |
68 | 60 |
69 return parameters; | 61 String parameters = XMLUtils.xpathString( |
62 data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); | |
63 | |
64 return doService( | |
65 artifactId, userId, outs, parameters, globalContext); | |
70 } | 66 } |
71 | 67 |
72 /** The old service. To be removed. */ | 68 protected static Map<String, Object> splitParameters( |
73 protected Document oldService(Document data) { | |
74 | |
75 final Document result = XMLUtils.newDocument(); | |
76 | |
77 final Builder builder = NoneUserSpecific.getInstance().getBuilder(); | |
78 | |
79 if (builder == null) { | |
80 log.error("MetaDataService is not setup properly."); | |
81 return result; | |
82 } | |
83 | |
84 final Map<String, Object> parameters = extractParameters(data); | |
85 | |
86 Session session = SessionHolder.acquire(); | |
87 try { | |
88 session.doWork(new Work() { | |
89 @Override | |
90 public void execute(Connection connection) | |
91 throws SQLException | |
92 { | |
93 log.debug("MetaDataService.execute"); | |
94 builder.build(connection, result, parameters); | |
95 } | |
96 }); | |
97 } | |
98 finally { | |
99 session.close(); | |
100 SessionHolder.release(); | |
101 } | |
102 | |
103 return result; | |
104 } | |
105 | |
106 protected static Map<String, Object> parameters( | |
107 String parameters, | 69 String parameters, |
108 Map<String, Object> data | 70 Map<String, Object> data |
109 ) { | 71 ) { |
110 if (parameters != null) { | 72 if (parameters != null) { |
111 String [] parts = parameters.split("\\s*;\\s*"); | 73 String [] parts = parameters.split("\\s*;\\s*"); |
119 } | 81 } |
120 } | 82 } |
121 return data; | 83 return data; |
122 } | 84 } |
123 | 85 |
124 protected static Map<String, Object> filters( | 86 protected Document doService( |
125 String filters, | 87 String artifactId, |
126 Map<String, Object> data | 88 String userId, |
127 ) { | |
128 if (filters != null) { | |
129 for (String filter: filters.split("\\s*,\\*s")) { | |
130 data.put(filter, "true"); | |
131 } | |
132 } | |
133 return data; | |
134 } | |
135 | |
136 protected Document newService( | |
137 String uuid, | |
138 String outsString, | 89 String outsString, |
139 String parameters, | 90 String parameters, |
140 String filters, | |
141 GlobalContext globalContext | 91 GlobalContext globalContext |
142 ) { | 92 ) { |
143 Document result = XMLUtils.newDocument(); | 93 Document result = XMLUtils.newDocument(); |
144 | 94 |
145 FLYSArtifact flysArtifact; | 95 FLYSArtifact flysArtifact; |
146 | 96 |
147 if (log.isDebugEnabled()) { | 97 if (log.isDebugEnabled()) { |
148 log.debug("uuid: " + uuid); | 98 log.debug("artifact : " + artifactId); |
149 log.debug("outs: " + outsString); | 99 log.debug("user : " + userId); |
150 log.debug("filters: " + filters); | 100 log.debug("outs : " + outsString); |
101 log.debug("parameters: " + parameters); | |
151 } | 102 } |
152 | 103 |
153 if (uuid != null && uuid.length() != 0) { | 104 if (userId != null && !StringUtils.checkUUID(userId)) { |
154 if (!StringUtils.checkUUID(uuid)) { | 105 log.warn("'" + userId + "' is not a UUID"); |
155 log.warn("'" + uuid + "' is not a UUID"); | 106 return result; |
107 } | |
108 | |
109 if (artifactId != null) { | |
110 if (!StringUtils.checkUUID(artifactId)) { | |
111 log.warn("'" + artifactId + "' is not a UUID"); | |
156 return result; | 112 return result; |
157 } | 113 } |
158 | 114 |
159 Object dbObject = | 115 Object dbObject = |
160 (ArtifactDatabase)globalContext.get(ARTIFACT_DATA_BASE_KEY); | 116 (ArtifactDatabase)globalContext.get(ARTIFACT_DATA_BASE_KEY); |
167 ArtifactDatabase db = (ArtifactDatabase)dbObject; | 123 ArtifactDatabase db = (ArtifactDatabase)dbObject; |
168 | 124 |
169 Artifact artifact; | 125 Artifact artifact; |
170 | 126 |
171 try { | 127 try { |
172 artifact = db.getRawArtifact(uuid); | 128 artifact = db.getRawArtifact(artifactId); |
173 } | 129 } |
174 catch (ArtifactDatabaseException adbe) { | 130 catch (ArtifactDatabaseException adbe) { |
175 log.warn("fetching artifact failed", adbe); | 131 log.warn("fetching artifact failed", adbe); |
176 return result; | 132 return result; |
177 } | 133 } |
185 } | 141 } |
186 else { | 142 else { |
187 flysArtifact = null; | 143 flysArtifact = null; |
188 } | 144 } |
189 | 145 |
190 Map<String, Object> data = | 146 |
191 filters(filters, | 147 Map<String, Object> data = splitParameters( |
192 parameters(parameters, | 148 parameters, new HashMap<String, Object>()); |
193 new HashMap<String, Object>())); | |
194 | 149 |
195 String [] outs = outsString.split("\\s*,\\s*"); | 150 String [] outs = outsString.split("\\s*,\\s*"); |
196 | 151 |
197 NoneUserSpecific dc = NoneUserSpecific.getInstance(); | 152 Recommendations rec = Recommendations.getInstance(); |
198 | 153 rec.recommend( |
199 dc.recommend(flysArtifact, outs, data, result); | 154 flysArtifact, userId, outs, data, result); |
200 | 155 |
201 return result; | 156 return result; |
202 } | 157 } |
203 | |
204 @Override | |
205 public Document process( | |
206 Document data, | |
207 GlobalContext globalContext, | |
208 CallMeta callMeta | |
209 ) { | |
210 log.debug("MetaDataService.process"); | |
211 | |
212 String uuid = XMLUtils.xpathString( | |
213 data, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); | |
214 | |
215 String outs = XMLUtils.xpathString( | |
216 data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); | |
217 | |
218 String parameters = XMLUtils.xpathString( | |
219 data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); | |
220 | |
221 String filters = XMLUtils.xpathString( | |
222 data, XPATH_FILTERS, ArtifactNamespaceContext.INSTANCE); | |
223 | |
224 return outs != null | |
225 ? newService(uuid, outs, parameters, filters, globalContext) | |
226 : oldService(data); | |
227 } | |
228 } | 158 } |
229 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 159 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |