sascha@1015: package de.intevation.flys.artifacts.datacage; sascha@1015: sascha@1015: import java.util.Map; sascha@1015: import java.util.HashMap; sascha@1015: import java.util.List; sascha@1015: import java.util.ArrayList; sascha@1015: sascha@1015: import java.io.InputStream; sascha@1015: import java.io.IOException; sascha@1015: import java.io.File; sascha@1015: sascha@1015: import java.io.FileInputStream; sascha@1015: sascha@1015: import java.sql.Connection; sascha@1015: import java.sql.SQLException; sascha@1015: sascha@1015: import javax.sql.DataSource; sascha@1015: sascha@1015: import org.apache.log4j.Logger; sascha@1015: sascha@1015: import org.w3c.dom.Document; sascha@1015: import org.w3c.dom.Node; sascha@1015: sascha@1015: import org.hibernate.Session; sascha@1015: sascha@1015: import org.hibernate.jdbc.Work; sascha@1015: sascha@1015: import de.intevation.artifacts.common.utils.Config; sascha@1015: import de.intevation.artifacts.common.utils.XMLUtils; sascha@1015: sascha@1015: import de.intevation.flys.artifacts.FLYSArtifact; sascha@1015: sascha@1015: import de.intevation.flys.backend.SessionHolder; sascha@1015: sascha@1015: import de.intevation.artifactdatabase.data.StateData; sascha@1015: sascha@1015: import de.intevation.flys.artifacts.datacage.templating.Builder; sascha@1015: sascha@1015: public class Recommendations sascha@1015: { sascha@1015: private static Logger log = Logger.getLogger(Recommendations.class); sascha@1015: sascha@1015: public static final String XPATH_SYSTEM_TEMPLATE = sascha@1015: "/artifact-database/metadata/system/@template"; sascha@1015: sascha@1015: public static final String XPATH_USER_TEMPLATE = sascha@1015: "/artifact-database/metadata/user/@template"; sascha@1015: sascha@1015: private static Recommendations INSTANCE; sascha@1015: sascha@1015: protected Builder systemBuilder; sascha@1015: protected Builder userBuilder; sascha@1015: sascha@1015: public Recommendations() { sascha@1015: } sascha@1015: sascha@1015: public Recommendations(Builder systemBuilder, Builder userBuilder) { sascha@1015: this.systemBuilder = systemBuilder; sascha@1015: this.userBuilder = userBuilder; sascha@1015: } sascha@1015: sascha@1015: public Builder getUserBuilder() { sascha@1015: return userBuilder; sascha@1015: } sascha@1015: sascha@1015: public Builder getSystemBuilder() { sascha@1015: return systemBuilder; sascha@1015: } sascha@1015: sascha@1015: protected static void artifactToParameters( sascha@1015: FLYSArtifact artifact, sascha@1015: Map parameters sascha@1015: ) { sascha@1015: parameters.put("current-state-id", artifact.getCurrentStateId()); sascha@1015: sascha@1015: for (StateData sd: artifact.getAllData()) { sascha@1015: Object value = sd.getValue(); sascha@1015: if (value == null) { sascha@1015: continue; sascha@1015: } sascha@1015: String key = sd.getName().replace('.', '-'); sascha@1015: parameters.put(key, value); sascha@1015: } sascha@1015: } sascha@1015: sascha@1015: public void recommend( sascha@1015: FLYSArtifact artifact, sascha@1015: String userId, sascha@1015: String [] outs, sascha@1015: Map extraParameters, sascha@1015: Node result sascha@1015: ) { sascha@1015: Map parameters = new HashMap(); sascha@1015: sascha@1015: if (extraParameters != null) { sascha@1015: parameters.putAll(extraParameters); sascha@1015: } sascha@1015: sascha@1015: if (userId != null) { sascha@1015: parameters.put("user-id", userId); sascha@1015: } sascha@1015: sascha@1015: if (artifact != null) { sascha@1015: artifactToParameters(artifact, parameters); sascha@1015: } sascha@1015: sascha@1015: parameters.put("artifact-outs", outs); sascha@1015: sascha@1015: parameters.put("parameters", parameters); sascha@1015: sascha@1015: recommend(parameters, userId, result); sascha@1015: } sascha@1015: sascha@1015: public void recommend( sascha@1015: Map parameters, sascha@1015: String userId, sascha@1015: Node result sascha@1015: ) { sascha@1015: recommend(parameters, userId, result, SessionHolder.HOLDER.get()); sascha@1015: } sascha@1015: sascha@1015: public void recommend( sascha@1015: final Map parameters, sascha@1015: final String userId, sascha@1015: final Node result, sascha@1015: Session session sascha@1015: ) { sascha@1015: if (systemBuilder == null || userBuilder == null) { sascha@1015: log.error("builder not configured properly."); sascha@1015: return; sascha@1015: } sascha@1015: sascha@1015: session.doWork(new Work() { sascha@1015: @Override sascha@1015: public void execute(Connection systemConnection) sascha@1015: throws SQLException sascha@1015: { sascha@1015: List connections = sascha@1015: new ArrayList(2); sascha@1015: sascha@1015: if (userId != null) { // system and user templates sascha@1015: connections.add(new Builder.NamedConnection( sascha@1015: Builder.CONNECTION_USER, systemConnection)); sascha@1015: sascha@1015: // get connection to datacage db sascha@1015: DataSource dataSource = DBConfig sascha@1015: .getInstance() sascha@1015: .getDBConnection() sascha@1015: .getDataSource(); sascha@1015: sascha@1015: Connection userConnection = dataSource.getConnection(); sascha@1015: try { sascha@1015: connections.add(new Builder.NamedConnection( sascha@1015: Builder.CONNECTION_SYSTEM, userConnection, false)); sascha@1015: sascha@1015: userBuilder.build(connections, result, parameters); sascha@1015: } sascha@1015: finally { sascha@1015: userConnection.close(); sascha@1015: } sascha@1015: } sascha@1015: else { // system template only sascha@1015: connections.add(new Builder.NamedConnection( sascha@1015: Builder.CONNECTION_SYSTEM, systemConnection)); sascha@1015: sascha@1015: systemBuilder.build(connections, result, parameters); sascha@1015: } sascha@1015: } sascha@1015: }); sascha@1015: } sascha@1015: sascha@1015: public static synchronized Recommendations getInstance() { sascha@1015: if (INSTANCE == null) { sascha@1015: INSTANCE = createRecommendations(); sascha@1015: } sascha@1015: return INSTANCE; sascha@1015: } sascha@1015: sascha@1015: protected static Document loadTemplate(File file) throws IOException { sascha@1015: InputStream in = null; sascha@1015: sascha@1015: try { sascha@1015: in = new FileInputStream(file); sascha@1015: sascha@1015: Document template = XMLUtils.parseDocument(in); sascha@1015: sascha@1015: if (template == null) { sascha@1015: throw new IOException("cannot load template"); sascha@1015: } sascha@1015: return template; sascha@1015: } sascha@1015: finally { sascha@1015: if (in != null) { sascha@1015: try { sascha@1015: in.close(); sascha@1015: } sascha@1015: catch (IOException ioe) { sascha@1015: log.error(ioe); sascha@1015: } sascha@1015: } sascha@1015: } sascha@1015: } sascha@1015: sascha@1015: public static Recommendations createRecommendations( sascha@1015: File systemFile, sascha@1015: File userFile sascha@1015: ) { sascha@1015: log.debug("Recommendations.createBuilder"); sascha@1015: sascha@1015: if (!systemFile.isFile() || !systemFile.canRead()) { sascha@1015: log.error("Cannot open template file '" + systemFile + "'"); sascha@1015: return null; sascha@1015: } sascha@1015: sascha@1015: if (!userFile.isFile() || !userFile.canRead()) { sascha@1015: log.error("Cannot open template file '" + userFile + "'"); sascha@1015: return null; sascha@1015: } sascha@1015: sascha@1015: try { sascha@1015: Document systemTemplate = loadTemplate(systemFile); sascha@1015: Document userTemplate = loadTemplate(userFile); sascha@1015: return new Recommendations( sascha@1015: new Builder(systemTemplate), sascha@1015: new Builder(userTemplate)); sascha@1015: } sascha@1015: catch (IOException ioe) { sascha@1015: log.error(ioe); sascha@1015: return null; sascha@1015: } sascha@1015: } sascha@1015: sascha@1015: protected static Recommendations createRecommendations() { sascha@1015: log.debug("Recommendations.createRecommendations"); sascha@1015: sascha@1015: String systemPath = Config.getStringXPath(XPATH_SYSTEM_TEMPLATE); sascha@1015: String userPath = Config.getStringXPath(XPATH_USER_TEMPLATE); sascha@1015: sascha@1015: if (systemPath == null || userPath == null) { sascha@1015: log.error("no path to template file given"); sascha@1015: return null; sascha@1015: } sascha@1015: sascha@1015: systemPath = Config.replaceConfigDir(systemPath); sascha@1015: userPath = Config.replaceConfigDir(userPath); sascha@1015: sascha@1015: return createRecommendations( sascha@1015: new File(systemPath), sascha@1015: new File(userPath)); sascha@1015: } sascha@1015: } sascha@1015: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :