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 :

http://dive4elements.wald.intevation.org