All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nl.tno.bim.nmd.services.Nmd2DataService Maven / Gradle / Ivy

The newest version!
package nl.tno.bim.nmd.services;

import java.io.FileNotFoundException;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import nl.tno.bim.nmd.config.NmdConfig;
import nl.tno.bim.nmd.config.NmdConfigImpl;
import nl.tno.bim.nmd.domain.NlsfbCode;
import nl.tno.bim.nmd.domain.NmdElement;
import nl.tno.bim.nmd.domain.NmdElementImpl;
import nl.tno.bim.nmd.domain.NmdFaseProfielImpl;
import nl.tno.bim.nmd.domain.NmdMilieuCategorie;
import nl.tno.bim.nmd.domain.NmdProductCard;
import nl.tno.bim.nmd.domain.NmdBaseProductCard;
import nl.tno.bim.nmd.domain.NmdProfileSet;
import nl.tno.bim.nmd.domain.NmdProfileSetImpl;
import nl.tno.bim.nmd.domain.NmdReferenceResources;

public class Nmd2DataService extends SqliteDataService implements BaseNmdDataService {

	private List data;
	private NmdReferenceResources resources;
	private NmdConfig config;
	
	public Nmd2DataService() throws FileNotFoundException {
		this.config = new NmdConfigImpl();
		
		// ToDo: test existence of nmd 2 db file
		
		this.data = new ArrayList();
	}
	
	public Nmd2DataService(NmdConfig config) {
		this.config = config;
		this.data = new ArrayList();
	}
	
	@Override
	public void login() {
		try {
			connection = DriverManager.getConnection("jdbc:sqlite:" + config.getNmd2DbPath());
		} catch (SQLException e) {
			// if the error message is "out of memory",
			// it probably means no database file is found
			System.err.println(e.getMessage());
		}
		
		loadResources();
	}

	@Override
	public void preLoadData() {
		if (!getIsConnected()) {
			login();
		}
		data = this.getAllElements();
	}
	
	private void loadResources() {
		if (resources == null) {
			resources = new NmdReferenceResources();
			resources.setMilieuCategorieMapping(getMilieuWaardeMapping());
		}
		
	}

	@Override
	public Calendar getRequestDate() {
		return Calendar.getInstance();
	}

	@Override
	public void setRequestDate(Calendar newDate) {
		// do nothing
	}

	@Override
	public List getAllElements() {
		if (!getIsConnected()) {login();}
		
		List elements = new ArrayList();
		try {
			Statement statement = connection.createStatement();
			statement.setQueryTimeout(30); // set timeout to 30 sec.

			ResultSet rs = statement.executeQuery("select * from Element");
			while (rs.next()) {
				NmdElementImpl el = new NmdElementImpl();
				el.setElementId(rs.getInt("id"));
				el.setElementName(rs.getString("elementnaam"));
				el.setIsMandatory(true);
				el.setParentId(0);
				el.setNlsfbCode(new NlsfbCode(rs.getString("code").trim()));
				elements.add(el);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}

		for (NmdElement el : elements) {
			el.addProductCards(this.getProductsForElement(el));
		}

		return elements;
	}

	@Override
	public List getData() {
		return data;
	}

	@Override
	public HashMap getProfileSetsByIds(List ids) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List getProductsForElement(NmdElement element) {
		List products = new ArrayList();
		try {
			Statement statement = connection.createStatement();
			statement.setQueryTimeout(30); // set timeout to 30 sec.

			// first get all product ids that fall under the element
			ResultSet rs = statement
					.executeQuery("select * from Product " + "where element_id = " + element.getElementId().toString());
			while (rs.next()) {
				NmdBaseProductCard prod = new NmdBaseProductCard();
				prod.setProductId(rs.getInt("id"));
				prod.setCategory(rs.getInt("type_kaart_id"));
				prod.setDescription(rs.getString("productnaam"));
				prod.setLifetime(rs.getInt("productlevensduur"));
				prod.setUnit(rs.getString("functionele_eenheid"));
				prod.setNlsfbCode(new NlsfbCode(rs.getString("productcode")));
				products.add(prod);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}

		return products;
	}
	
	@Override
	public Boolean getAdditionalProfileDataForCard(NmdProductCard c) {

		// check if data has already been loaded
		if (c.getProfileSets().size() > 0) {
			return true;
		}

		try {
			Statement statement = connection.createStatement();
			statement.setQueryTimeout(30); // set timeout to 30 sec.

			// retrieve profielSets that belong to the product
			ResultSet rs = statement.executeQuery(
					"select * from Productonderdeel " + "where product_id = " + c.getProductId().toString());
			while (rs.next()) {
				NmdProfileSetImpl pset = new NmdProfileSetImpl();
				pset.setName(rs.getString("omschrijving"));
				pset.setProfielId(rs.getInt("basisprofiel_id"));
				pset.setProfileLifetime(rs.getInt("levensduur"));
				pset.setQuantity(rs.getDouble("hoeveelheid"));
				pset.setUnit(rs.getString("eenheid"));
				pset.setIsScalable(true);
				pset.setScaler(null);
				c.addProfileSet(pset);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			return false;
		}

		try {
			Statement statement = connection.createStatement();
			statement.setQueryTimeout(30); // set timeout to 30 sec.
			for (NmdProfileSet ps : c.getProfileSets()) {
				// get the milieuwaarde categorie data per profielset.
				// ToDo: load transport, application and disposal profielen separately.
				ResultSet rsMC = statement.executeQuery("select * from Profielmilieueffect as pme "
						+ "inner join Milieucategorie as mc on pme.milieucategorie_id = mc.id " + "where profiel_id = "
						+ ps.getProfielId().toString());
				
				NmdFaseProfielImpl fp = new NmdFaseProfielImpl("Construction", this.resources);
				while (rsMC.next()) {
					
					String name = rsMC.getString("milieueffect");
					Double value = rsMC.getDouble("waarde");
					fp.setProfielCoefficient(name, value);
				}
				ps.addFaseProfiel("Construction", fp);

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			return false;
		}
		return true;
	}
	
	private HashMap getMilieuWaardeMapping() {
		HashMap map = new HashMap();
		
		try {
			Statement statement = connection.createStatement();
			statement.setQueryTimeout(30); // set timeout to 30 sec.

			ResultSet rs = statement.executeQuery("select * from Milieucategorie");
			while (rs.next()) {
				Integer id = rs.getInt("id");
				String description = rs.getString("milieueffect");
				String unit = rs.getString("eenheid");
				Double weight = 1.0;
				
				map.put(id, new NmdMilieuCategorie(description, unit, weight));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}
		return map;

	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy