sascha@998: package de.intevation.flys.artifacts.datacage.templating; sascha@998: sascha@998: import java.util.Map; sascha@998: import java.util.HashMap; sascha@998: sascha@998: import java.io.InputStream; sascha@998: import java.io.IOException; sascha@998: import java.io.File; sascha@998: sascha@998: import java.io.FileInputStream; sascha@998: sascha@998: import java.sql.Connection; sascha@998: import java.sql.SQLException; sascha@998: sascha@998: import org.apache.log4j.Logger; sascha@998: sascha@998: import org.w3c.dom.Document; sascha@998: import org.w3c.dom.Node; sascha@998: sascha@998: import org.hibernate.Session; sascha@998: sascha@998: import org.hibernate.jdbc.Work; sascha@998: sascha@998: import de.intevation.artifacts.common.utils.Config; sascha@998: import de.intevation.artifacts.common.utils.XMLUtils; sascha@998: sascha@998: import de.intevation.flys.artifacts.FLYSArtifact; sascha@998: sascha@998: import de.intevation.flys.backend.SessionHolder; sascha@998: sascha@998: import de.intevation.artifactdatabase.data.StateData; sascha@998: sascha@998: sascha@998: public class NoneUserSpecific sascha@998: { sascha@998: private static Logger log = Logger.getLogger(NoneUserSpecific.class); sascha@998: sascha@998: public static final String XPATH_META_DATA_TEMPLATE = sascha@998: "/artifact-database/metadata/@template"; sascha@998: sascha@998: private static NoneUserSpecific INSTANCE; sascha@998: sascha@998: protected Builder builder; sascha@998: sascha@998: public NoneUserSpecific() { sascha@998: } sascha@998: sascha@998: public NoneUserSpecific(Builder builder) { sascha@998: this.builder = builder; sascha@998: } sascha@998: sascha@998: public Builder getBuilder() { sascha@998: return builder; sascha@998: } sascha@998: sascha@998: protected static void artifactToParameters( sascha@998: FLYSArtifact artifact, sascha@998: Map parameters sascha@998: ) { sascha@998: parameters.put("current-state-id", artifact.getCurrentStateId()); sascha@998: sascha@998: for (StateData sd: artifact.getAllData()) { sascha@998: Object value = sd.getValue(); sascha@998: if (value == null) { sascha@998: continue; sascha@998: } sascha@998: String key = sd.getName().replace('.', '-'); sascha@998: parameters.put(key, value); sascha@998: } sascha@998: } sascha@998: sascha@998: public void recommend( sascha@998: FLYSArtifact artifact, sascha@998: String [] outs, sascha@998: Map extraParameters, sascha@998: Node result sascha@998: ) { sascha@998: Map parameters = new HashMap(); sascha@998: sascha@998: if (extraParameters != null) { sascha@998: parameters.putAll(extraParameters); sascha@998: } sascha@998: sascha@998: if (artifact != null) { sascha@998: artifactToParameters(artifact, parameters); sascha@998: } sascha@998: sascha@998: parameters.put("artifact-outs", outs); sascha@998: sascha@998: parameters.put("parameters", parameters); sascha@998: sascha@998: recommend(parameters, result); sascha@998: } sascha@998: sascha@998: public void recommend( sascha@998: final Map parameters, sascha@998: final Node result sascha@998: ) { sascha@998: if (builder == null) { sascha@998: log.error("builder not configured properly."); sascha@998: return; sascha@998: } sascha@998: sascha@998: Session session = SessionHolder.HOLDER.get(); sascha@998: sascha@998: session.doWork(new Work() { sascha@998: @Override sascha@998: public void execute(Connection connection) sascha@998: throws SQLException sascha@998: { sascha@998: builder.build(connection, result, parameters); sascha@998: } sascha@998: }); sascha@998: } sascha@998: sascha@998: public static synchronized NoneUserSpecific getInstance() { sascha@998: if (INSTANCE == null) { sascha@998: INSTANCE = createNoneUserSpecific(); sascha@998: } sascha@998: return INSTANCE; sascha@998: } sascha@998: sascha@998: protected static Builder createBuilder(File file) { sascha@998: log.debug("NoneUserSpecific.createBuilder"); sascha@998: sascha@998: if (!file.isFile() || !file.canRead()) { sascha@998: log.error("Cannot open template file '" + file + "'"); sascha@998: return null; sascha@998: } sascha@998: sascha@998: InputStream in = null; sascha@998: sascha@998: try { sascha@998: in = new FileInputStream(file); sascha@998: sascha@998: Document template = XMLUtils.parseDocument(in); sascha@998: sascha@998: if (template == null) { sascha@998: log.error("cannot parse meta data template"); sascha@998: } sascha@998: else { sascha@998: return new Builder(template); sascha@998: } sascha@998: } sascha@998: catch (IOException ioe) { sascha@998: log.error(ioe); sascha@998: } sascha@998: finally { sascha@998: if (in != null) { sascha@998: try { sascha@998: in.close(); sascha@998: } sascha@998: catch (IOException ioe) { sascha@998: log.error(ioe); sascha@998: } sascha@998: } sascha@998: } sascha@998: return null; sascha@998: } sascha@998: sascha@998: protected static NoneUserSpecific createNoneUserSpecific() { sascha@998: log.debug("NoneUserSpecific.createNoneUserSpecific"); sascha@998: sascha@998: String path = Config.getStringXPath(XPATH_META_DATA_TEMPLATE); sascha@998: if (path == null) { sascha@998: log.error("no path to template file given"); sascha@998: return null; sascha@998: } sascha@998: sascha@998: path = Config.replaceConfigDir(path); sascha@998: sascha@998: return new NoneUserSpecific(createBuilder(new File(path))); sascha@998: } sascha@998: } sascha@998: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :