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