# HG changeset patch # User Sascha L. Teichmann # Date 1312389604 0 # Node ID 9a1a3080ad98cc9e9f6182a6ee6453b159640071 # Parent 66473e72d3218ef300cf6c69ad6af215b2baf2e4 Bring user specific meta data service to life. flys-artifacts/trunk@2461 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/ChangeLog Wed Aug 03 16:40:04 2011 +0000 @@ -1,3 +1,42 @@ +2011-08-03 Sascha L. Teichmann + + Bring user specific meta data service to life. + + * doc/conf/conf.xml: There are now two templates to configure: + The system template (only the data from the backend) and the + user template (the datcage db and the backend db), + + * doc/conf/meta-data-template.xml: Deleted. + * doc/conf/meta-data-user.xml: New. The user specific template. TODO: Write it! + * doc/conf/meta-data-system.xml: New. The system template. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/NoneUserSpecific.java: + Deleted. + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + New. The logic to fill the templates. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + Adjusted to follow the new call signatures. + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Refactored. Removed the old code and only leave the new service. Following + XPaths are evaluated on the incomming document: + + "/art:meta/art:artifact-id/@value" The UUID of the artifact. Optional. + Used to fill the template enviroment. + "art:meta/art:user-id/@value" The UUID of the user. Optional. + If given the user specific template is filled. + "/art:meta/art:outs/@value" The list of outs used to recommend for the + various outputs. + "/art:meta/art:parameters/@value" A list of key/value pairs to inject more + filters to the templating. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java: + Change to follow the new recommendations semantics. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Added symbolic constants to distinguish "user" and "system" db connections. + 2011-08-03 Felix Wolfsteller * doc/conf/conf.xml: diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/doc/conf/conf.xml --- a/flys-artifacts/doc/conf/conf.xml Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/doc/conf/conf.xml Wed Aug 03 16:40:04 2011 +0000 @@ -98,7 +98,10 @@ - + + + + diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/doc/conf/meta-data-system.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/doc/conf/meta-data-system.xml Wed Aug 03 16:40:04 2011 +0000 @@ -0,0 +1,258 @@ + + + + + + SELECT id AS river_id, name as river_name FROM rivers + WHERE name ILIKE ${river} + + + + + + + + + + + SELECT id AS gauge_id, + name AS gauge_name + FROM gauges WHERE river_id = ${river_id} + + + + + + + + SELECT description AS gauge_desc, + d.id AS discharge_id, + ti.start_time AS g_start, + ti.stop_time AS g_stop + FROM discharge_tables d JOIN time_intervals ti + ON d.time_interval_id = ti.id + WHERE d.gauge_id = ${gauge_id} AND d.kind = 1 + + + + + + + + + + + + + + + + + + SELECT id AS fix_id, + description AS fix_description + FROM wsts WHERE kind = 2 AND river_id = ${river_id} + + + + + + + + + SELECT id AS fix_column_id, + name AS fix_column_name + FROM wst_columns WHERE wst_id = ${fix_id} + ORDER by position + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 5 AND river_id = ${river_id} + + + + + + + + + SELECT id AS prot_column_id, + name AS prot_column_name + FROM wst_columns WHERE wst_id = ${prot_id} + ORDER by position + + + + + + + + + + + + + + + + + SELECT id AS fw_id, + description AS fw_description + FROM wsts WHERE kind = 4 AND river_id = ${river_id} + + + + + + + + + SELECT id AS fw_column_id, + name AS fw_column_name + FROM wst_columns WHERE wst_id = ${fw_id} + ORDER by position + + + + + + + + + + + + + + + + + SELECT id AS wl_id, + description AS wl_description + FROM wsts WHERE kind = 0 AND river_id = ${river_id} + + + + + + + + + SELECT id AS wl_column_id, + name AS wl_column_name + FROM wst_columns WHERE wst_id = ${wl_id} + ORDER by position + + + + + + + + + + + + + + + + + SELECT id AS els_id, + description AS els_description + FROM wsts WHERE kind = 1 AND river_id = ${river_id} + + + + + + + + + SELECT id AS els_column_id, + name AS els_column_name + FROM wst_columns WHERE wst_id = ${els_id} + ORDER by position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/doc/conf/meta-data-template.xml --- a/flys-artifacts/doc/conf/meta-data-template.xml Wed Aug 03 11:23:13 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ - - - - - - SELECT id AS river_id, name as river_name FROM rivers - WHERE name ILIKE ${river} - - - - - - - - - - - SELECT id AS gauge_id, - name AS gauge_name - FROM gauges WHERE river_id = ${river_id} - - - - - - - - SELECT description AS gauge_desc, - d.id AS discharge_id, - ti.start_time AS g_start, - ti.stop_time AS g_stop - FROM discharge_tables d JOIN time_intervals ti - ON d.time_interval_id = ti.id - WHERE d.gauge_id = ${gauge_id} AND d.kind = 1 - - - - - - - - - - - - - - - - - - SELECT id AS fix_id, - description AS fix_description - FROM wsts WHERE kind = 2 AND river_id = ${river_id} - - - - - - - - - SELECT id AS fix_column_id, - name AS fix_column_name - FROM wst_columns WHERE wst_id = ${fix_id} - ORDER by position - - - - - - - - - - - - - - - - - SELECT id AS prot_id, - description AS prot_description - FROM wsts WHERE kind = 5 AND river_id = ${river_id} - - - - - - - - - SELECT id AS prot_column_id, - name AS prot_column_name - FROM wst_columns WHERE wst_id = ${prot_id} - ORDER by position - - - - - - - - - - - - - - - - - SELECT id AS fw_id, - description AS fw_description - FROM wsts WHERE kind = 4 AND river_id = ${river_id} - - - - - - - - - SELECT id AS fw_column_id, - name AS fw_column_name - FROM wst_columns WHERE wst_id = ${fw_id} - ORDER by position - - - - - - - - - - - - - - - - - SELECT id AS wl_id, - description AS wl_description - FROM wsts WHERE kind = 0 AND river_id = ${river_id} - - - - - - - - - SELECT id AS wl_column_id, - name AS wl_column_name - FROM wst_columns WHERE wst_id = ${wl_id} - ORDER by position - - - - - - - - - - - - - - - - - SELECT id AS els_id, - description AS els_description - FROM wsts WHERE kind = 1 AND river_id = ${river_id} - - - - - - - - - SELECT id AS els_column_id, - name AS els_column_name - FROM wst_columns WHERE wst_id = ${els_id} - ORDER by position - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/doc/conf/meta-data-user.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/doc/conf/meta-data-user.xml Wed Aug 03 16:40:04 2011 +0000 @@ -0,0 +1,6 @@ + + + + IMPLEMENT ME! + + diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java Wed Aug 03 16:40:04 2011 +0000 @@ -22,7 +22,7 @@ import de.intevation.artifactdatabase.state.Output; -import de.intevation.flys.artifacts.datacage.templating.NoneUserSpecific; +import de.intevation.flys.artifacts.datacage.Recommendations; public class CollectionMonitor implements Hook { @@ -60,8 +60,8 @@ String[] outs = extractOutputNames(flys, context); Map params = getNoneUserSpecificParameters(flys, context); - NoneUserSpecific dc = NoneUserSpecific.getInstance(); - dc.recommend(flys, outs, params, recommended); + Recommendations rec = Recommendations.getInstance(); + rec.recommend(flys, null, outs, params, recommended); } diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/DBConfig.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/DBConfig.java Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/DBConfig.java Wed Aug 03 16:40:04 2011 +0000 @@ -9,7 +9,7 @@ public class DBConfig { - private static Logger logger = Logger.getLogger(DBConnection.class); + private static Logger logger = Logger.getLogger(DBConfig.class); /** * XPath to access the database driver within the global configuration. diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java Wed Aug 03 16:40:04 2011 +0000 @@ -0,0 +1,252 @@ +package de.intevation.flys.artifacts.datacage; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +import java.io.InputStream; +import java.io.IOException; +import java.io.File; + +import java.io.FileInputStream; + +import java.sql.Connection; +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import org.hibernate.Session; + +import org.hibernate.jdbc.Work; + +import de.intevation.artifacts.common.utils.Config; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.flys.artifacts.FLYSArtifact; + +import de.intevation.flys.backend.SessionHolder; + +import de.intevation.artifactdatabase.data.StateData; + +import de.intevation.flys.artifacts.datacage.templating.Builder; + +public class Recommendations +{ + private static Logger log = Logger.getLogger(Recommendations.class); + + public static final String XPATH_SYSTEM_TEMPLATE = + "/artifact-database/metadata/system/@template"; + + public static final String XPATH_USER_TEMPLATE = + "/artifact-database/metadata/user/@template"; + + private static Recommendations INSTANCE; + + protected Builder systemBuilder; + protected Builder userBuilder; + + public Recommendations() { + } + + public Recommendations(Builder systemBuilder, Builder userBuilder) { + this.systemBuilder = systemBuilder; + this.userBuilder = userBuilder; + } + + public Builder getUserBuilder() { + return userBuilder; + } + + public Builder getSystemBuilder() { + return systemBuilder; + } + + protected static void artifactToParameters( + FLYSArtifact artifact, + Map parameters + ) { + parameters.put("current-state-id", artifact.getCurrentStateId()); + + for (StateData sd: artifact.getAllData()) { + Object value = sd.getValue(); + if (value == null) { + continue; + } + String key = sd.getName().replace('.', '-'); + parameters.put(key, value); + } + } + + public void recommend( + FLYSArtifact artifact, + String userId, + String [] outs, + Map extraParameters, + Node result + ) { + Map parameters = new HashMap(); + + if (extraParameters != null) { + parameters.putAll(extraParameters); + } + + if (userId != null) { + parameters.put("user-id", userId); + } + + if (artifact != null) { + artifactToParameters(artifact, parameters); + } + + parameters.put("artifact-outs", outs); + + parameters.put("parameters", parameters); + + recommend(parameters, userId, result); + } + + public void recommend( + Map parameters, + String userId, + Node result + ) { + recommend(parameters, userId, result, SessionHolder.HOLDER.get()); + } + + public void recommend( + final Map parameters, + final String userId, + final Node result, + Session session + ) { + if (systemBuilder == null || userBuilder == null) { + log.error("builder not configured properly."); + return; + } + + session.doWork(new Work() { + @Override + public void execute(Connection systemConnection) + throws SQLException + { + List connections = + new ArrayList(2); + + if (userId != null) { // system and user templates + connections.add(new Builder.NamedConnection( + Builder.CONNECTION_USER, systemConnection)); + + // get connection to datacage db + DataSource dataSource = DBConfig + .getInstance() + .getDBConnection() + .getDataSource(); + + Connection userConnection = dataSource.getConnection(); + try { + connections.add(new Builder.NamedConnection( + Builder.CONNECTION_SYSTEM, userConnection, false)); + + userBuilder.build(connections, result, parameters); + } + finally { + userConnection.close(); + } + } + else { // system template only + connections.add(new Builder.NamedConnection( + Builder.CONNECTION_SYSTEM, systemConnection)); + + systemBuilder.build(connections, result, parameters); + } + } + }); + } + + public static synchronized Recommendations getInstance() { + if (INSTANCE == null) { + INSTANCE = createRecommendations(); + } + return INSTANCE; + } + + protected static Document loadTemplate(File file) throws IOException { + InputStream in = null; + + try { + in = new FileInputStream(file); + + Document template = XMLUtils.parseDocument(in); + + if (template == null) { + throw new IOException("cannot load template"); + } + return template; + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException ioe) { + log.error(ioe); + } + } + } + } + + public static Recommendations createRecommendations( + File systemFile, + File userFile + ) { + log.debug("Recommendations.createBuilder"); + + if (!systemFile.isFile() || !systemFile.canRead()) { + log.error("Cannot open template file '" + systemFile + "'"); + return null; + } + + if (!userFile.isFile() || !userFile.canRead()) { + log.error("Cannot open template file '" + userFile + "'"); + return null; + } + + try { + Document systemTemplate = loadTemplate(systemFile); + Document userTemplate = loadTemplate(userFile); + return new Recommendations( + new Builder(systemTemplate), + new Builder(userTemplate)); + } + catch (IOException ioe) { + log.error(ioe); + return null; + } + } + + protected static Recommendations createRecommendations() { + log.debug("Recommendations.createRecommendations"); + + String systemPath = Config.getStringXPath(XPATH_SYSTEM_TEMPLATE); + String userPath = Config.getStringXPath(XPATH_USER_TEMPLATE); + + if (systemPath == null || userPath == null) { + log.error("no path to template file given"); + return null; + } + + systemPath = Config.replaceConfigDir(systemPath); + userPath = Config.replaceConfigDir(userPath); + + return createRecommendations( + new File(systemPath), + new File(userPath)); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java Wed Aug 03 16:40:04 2011 +0000 @@ -1,8 +1,5 @@ package de.intevation.flys.artifacts.datacage.templating; -import java.sql.Connection; -import java.sql.SQLException; - import java.util.Map; import java.util.HashMap; @@ -15,20 +12,26 @@ import org.hibernate.Session; -import org.hibernate.jdbc.Work; - import org.w3c.dom.Document; import org.apache.log4j.Logger; import de.intevation.artifacts.common.utils.XMLUtils; +import de.intevation.flys.artifacts.datacage.Recommendations; + public class App { private static Logger log = Logger.getLogger(App.class); - public static final String template = - System.getProperty("meta.data.template", "meta-data-template.xml"); + public static final String systemTemplate = + System.getProperty("meta.data.template", "meta-data-system.xml"); + + public static final String userTemplate = + System.getProperty("meta.data.template", "meta-data-user.xml"); + + public static final String userId = + System.getProperty("user.id"); public static final String PARAMETERS = System.getProperty("meta.data.parameters", ""); @@ -52,16 +55,16 @@ public static void main(String [] args) { - NoneUserSpecific dc = new NoneUserSpecific( - NoneUserSpecific.createBuilder(new File(template))); + Recommendations rec = Recommendations.createRecommendations( + new File(systemTemplate), + new File(userTemplate)); + + if (rec == null) { + System.err.println("No recommendations created"); + return; + } final Document result = XMLUtils.newDocument(); - final Builder builder = dc.getBuilder(); - - if (builder == null) { - System.err.println("No builder created"); - return; - } final Map parameters = getParameters(); @@ -70,15 +73,7 @@ .openSession(); try { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException - { - builder.build(connection, result, parameters); - } - - }); + rec.recommend(parameters, userId, result, session); } finally { session.close(); diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java Wed Aug 03 16:40:04 2011 +0000 @@ -31,6 +31,10 @@ { private static Logger log = Logger.getLogger(Builder.class); + public static final String CONNECTION_USER = "user"; + public static final String CONNECTION_SYSTEM = "system"; + public static final String DEFAULT_CONNECTION_NAME = CONNECTION_SYSTEM; + public static final Pattern STRIP_LINE_INDENT = Pattern.compile("\\s*\\r?\\n\\s*"); @@ -517,7 +521,7 @@ private static final List wrap(Connection connection) { List list = new ArrayList(1); - list.add(new NamedConnection("", connection)); + list.add(new NamedConnection(DEFAULT_CONNECTION_NAME, connection)); return list; } diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/NoneUserSpecific.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/NoneUserSpecific.java Wed Aug 03 11:23:13 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -package de.intevation.flys.artifacts.datacage.templating; - -import java.util.Map; -import java.util.HashMap; - -import java.io.InputStream; -import java.io.IOException; -import java.io.File; - -import java.io.FileInputStream; - -import java.sql.Connection; -import java.sql.SQLException; - -import org.apache.log4j.Logger; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -import org.hibernate.Session; - -import org.hibernate.jdbc.Work; - -import de.intevation.artifacts.common.utils.Config; -import de.intevation.artifacts.common.utils.XMLUtils; - -import de.intevation.flys.artifacts.FLYSArtifact; - -import de.intevation.flys.backend.SessionHolder; - -import de.intevation.artifactdatabase.data.StateData; - - -public class NoneUserSpecific -{ - private static Logger log = Logger.getLogger(NoneUserSpecific.class); - - public static final String XPATH_META_DATA_TEMPLATE = - "/artifact-database/metadata/@template"; - - private static NoneUserSpecific INSTANCE; - - protected Builder builder; - - public NoneUserSpecific() { - } - - public NoneUserSpecific(Builder builder) { - this.builder = builder; - } - - public Builder getBuilder() { - return builder; - } - - protected static void artifactToParameters( - FLYSArtifact artifact, - Map parameters - ) { - parameters.put("current-state-id", artifact.getCurrentStateId()); - - for (StateData sd: artifact.getAllData()) { - Object value = sd.getValue(); - if (value == null) { - continue; - } - String key = sd.getName().replace('.', '-'); - parameters.put(key, value); - } - } - - public void recommend( - FLYSArtifact artifact, - String [] outs, - Map extraParameters, - Node result - ) { - Map parameters = new HashMap(); - - if (extraParameters != null) { - parameters.putAll(extraParameters); - } - - if (artifact != null) { - artifactToParameters(artifact, parameters); - } - - parameters.put("artifact-outs", outs); - - parameters.put("parameters", parameters); - - recommend(parameters, result); - } - - public void recommend( - final Map parameters, - final Node result - ) { - if (builder == null) { - log.error("builder not configured properly."); - return; - } - - Session session = SessionHolder.HOLDER.get(); - - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException - { - builder.build(connection, result, parameters); - } - }); - } - - public static synchronized NoneUserSpecific getInstance() { - if (INSTANCE == null) { - INSTANCE = createNoneUserSpecific(); - } - return INSTANCE; - } - - protected static Builder createBuilder(File file) { - log.debug("NoneUserSpecific.createBuilder"); - - if (!file.isFile() || !file.canRead()) { - log.error("Cannot open template file '" + file + "'"); - return null; - } - - InputStream in = null; - - try { - in = new FileInputStream(file); - - Document template = XMLUtils.parseDocument(in); - - if (template == null) { - log.error("cannot parse meta data template"); - } - else { - return new Builder(template); - } - } - catch (IOException ioe) { - log.error(ioe); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException ioe) { - log.error(ioe); - } - } - } - return null; - } - - protected static NoneUserSpecific createNoneUserSpecific() { - log.debug("NoneUserSpecific.createNoneUserSpecific"); - - String path = Config.getStringXPath(XPATH_META_DATA_TEMPLATE); - if (path == null) { - log.error("no path to template file given"); - return null; - } - - path = Config.replaceConfigDir(path); - - return new NoneUserSpecific(createBuilder(new File(path))); - } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 66473e72d321 -r 9a1a3080ad98 flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Wed Aug 03 11:23:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Wed Aug 03 16:40:04 2011 +0000 @@ -1,8 +1,5 @@ package de.intevation.flys.artifacts.services; -import java.sql.Connection; -import java.sql.SQLException; - import org.w3c.dom.Document; import org.apache.log4j.Logger; @@ -23,29 +20,19 @@ import de.intevation.artifacts.common.ArtifactNamespaceContext; -import de.intevation.flys.artifacts.datacage.templating.Builder; -import de.intevation.flys.artifacts.datacage.templating.NoneUserSpecific; +import de.intevation.flys.artifacts.datacage.Recommendations; import de.intevation.flys.artifacts.FLYSArtifact; -import de.intevation.flys.backend.SessionHolder; - -import org.hibernate.Session; - -import org.hibernate.jdbc.Work; - public class MetaDataService extends DefaultService { private static Logger log = Logger.getLogger(MetaDataService.class); - // old service. To be removed - public static final String XPATH_RIVER = "/art:river/text()"; - - public static final String XPATH_UUID = "/art:meta/art:uuid/@value"; - public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; - public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; - public static final String XPATH_FILTERS = "/art:meta/art:filters/@value"; + public static final String XPATH_ARTIFACT_ID = "/art:meta/art:artifact-id/@value"; + public static final String XPATH_USER_ID = "/art:meta/art:user-id/@value"; + public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; + public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; /** The global context key of the artifact database */ public static final String ARTIFACT_DATA_BASE_KEY = @@ -54,56 +41,31 @@ public MetaDataService() { } - protected static Map extractParameters(Document data) { - HashMap parameters = new HashMap(); - - String river = XMLUtils.xpathString( - data, XPATH_RIVER, ArtifactNamespaceContext.INSTANCE); + @Override + public Document process( + Document data, + GlobalContext globalContext, + CallMeta callMeta + ) { + log.debug("MetaDataService.process"); - if (river == null || (river = river.trim()).length() == 0) { - river = "%"; // matches all rivers - } + String artifactId = XMLUtils.xpathString( + data, XPATH_ARTIFACT_ID, ArtifactNamespaceContext.INSTANCE); - parameters.put("river", river); + String userId = XMLUtils.xpathString( + data, XPATH_USER_ID, ArtifactNamespaceContext.INSTANCE); - return parameters; + String outs = XMLUtils.xpathString( + data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); + + String parameters = XMLUtils.xpathString( + data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); + + return doService( + artifactId, userId, outs, parameters, globalContext); } - /** The old service. To be removed. */ - protected Document oldService(Document data) { - - final Document result = XMLUtils.newDocument(); - - final Builder builder = NoneUserSpecific.getInstance().getBuilder(); - - if (builder == null) { - log.error("MetaDataService is not setup properly."); - return result; - } - - final Map parameters = extractParameters(data); - - Session session = SessionHolder.acquire(); - try { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException - { - log.debug("MetaDataService.execute"); - builder.build(connection, result, parameters); - } - }); - } - finally { - session.close(); - SessionHolder.release(); - } - - return result; - } - - protected static Map parameters( + protected static Map splitParameters( String parameters, Map data ) { @@ -121,23 +83,11 @@ return data; } - protected static Map filters( - String filters, - Map data - ) { - if (filters != null) { - for (String filter: filters.split("\\s*,\\*s")) { - data.put(filter, "true"); - } - } - return data; - } - - protected Document newService( - String uuid, + protected Document doService( + String artifactId, + String userId, String outsString, String parameters, - String filters, GlobalContext globalContext ) { Document result = XMLUtils.newDocument(); @@ -145,14 +95,20 @@ FLYSArtifact flysArtifact; if (log.isDebugEnabled()) { - log.debug("uuid: " + uuid); - log.debug("outs: " + outsString); - log.debug("filters: " + filters); + log.debug("artifact : " + artifactId); + log.debug("user : " + userId); + log.debug("outs : " + outsString); + log.debug("parameters: " + parameters); } - if (uuid != null && uuid.length() != 0) { - if (!StringUtils.checkUUID(uuid)) { - log.warn("'" + uuid + "' is not a UUID"); + if (userId != null && !StringUtils.checkUUID(userId)) { + log.warn("'" + userId + "' is not a UUID"); + return result; + } + + if (artifactId != null) { + if (!StringUtils.checkUUID(artifactId)) { + log.warn("'" + artifactId + "' is not a UUID"); return result; } @@ -169,7 +125,7 @@ Artifact artifact; try { - artifact = db.getRawArtifact(uuid); + artifact = db.getRawArtifact(artifactId); } catch (ArtifactDatabaseException adbe) { log.warn("fetching artifact failed", adbe); @@ -187,43 +143,17 @@ flysArtifact = null; } - Map data = - filters(filters, - parameters(parameters, - new HashMap())); + + Map data = splitParameters( + parameters, new HashMap()); String [] outs = outsString.split("\\s*,\\s*"); - NoneUserSpecific dc = NoneUserSpecific.getInstance(); - - dc.recommend(flysArtifact, outs, data, result); + Recommendations rec = Recommendations.getInstance(); + rec.recommend( + flysArtifact, userId, outs, data, result); return result; } - - @Override - public Document process( - Document data, - GlobalContext globalContext, - CallMeta callMeta - ) { - log.debug("MetaDataService.process"); - - String uuid = XMLUtils.xpathString( - data, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); - - String outs = XMLUtils.xpathString( - data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); - - String parameters = XMLUtils.xpathString( - data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); - - String filters = XMLUtils.xpathString( - data, XPATH_FILTERS, ArtifactNamespaceContext.INSTANCE); - - return outs != null - ? newService(uuid, outs, parameters, filters, globalContext) - : oldService(data); - } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :