public void read(AbstractBuilding building, long parentId) throws SQLException {
    ResultSet rs = null;

    try {
      psBuildingInstallation.setLong(1, parentId);
      rs = psBuildingInstallation.executeQuery();

      while (rs.next()) {
        long installationId = rs.getLong("ID");
        int isExternal = rs.getInt("IS_EXTERNAL");

        BuildingInstallation buildingInstallation = null;
        IntBuildingInstallation intBuildingInstallation = null;

        if (isExternal == 1) buildingInstallation = new BuildingInstallationImpl();
        else intBuildingInstallation = new IntBuildingInstallationImpl();

        String gmlName = rs.getString("NAME");
        String gmlNameCodespace = rs.getString("NAME_CODESPACE");

        if (buildingInstallation != null)
          Util.dbGmlName2featureName(buildingInstallation, gmlName, gmlNameCodespace);
        else Util.dbGmlName2featureName(intBuildingInstallation, gmlName, gmlNameCodespace);

        String description = rs.getString("DESCRIPTION");
        if (description != null) {
          StringOrRef stringOrRef = new StringOrRefImpl();
          stringOrRef.setValue(description);

          if (buildingInstallation != null) buildingInstallation.setDescription(stringOrRef);
          else intBuildingInstallation.setDescription(stringOrRef);
        }

        String clazz = rs.getString("CLASS");
        if (clazz != null) {
          if (buildingInstallation != null) buildingInstallation.setClazz(clazz);
          else intBuildingInstallation.setClazz(clazz);
        }

        String function = rs.getString("FUNCTION");
        if (function != null) {
          Pattern p = Pattern.compile("\\s+");
          String[] functionList = p.split(function.trim());

          if (buildingInstallation != null)
            buildingInstallation.setFunction(Arrays.asList(functionList));
          else intBuildingInstallation.setFunction(Arrays.asList(functionList));
        }

        String usage = rs.getString("USAGE");
        if (usage != null) {
          Pattern p = Pattern.compile("\\s+");
          String[] usageList = p.split(usage.trim());

          if (buildingInstallation != null) buildingInstallation.setUsage(Arrays.asList(usageList));
          else intBuildingInstallation.setUsage(Arrays.asList(usageList));
        }

        for (int lod = 2; lod < 5; lod++) {
          long lodSurfaceGeometryId = rs.getLong("LOD" + lod + "_GEOMETRY_ID");

          if (!rs.wasNull() && lodSurfaceGeometryId != 0) {
            DBSurfaceGeometryResult geometry = surfaceGeometryExporter.read(lodSurfaceGeometryId);

            if (geometry != null) {
              GeometryProperty<AbstractGeometry> geometryProperty =
                  new GeometryPropertyImpl<AbstractGeometry>();

              if (geometry.getAbstractGeometry() != null)
                geometryProperty.setGeometry(geometry.getAbstractGeometry());
              else geometryProperty.setHref(geometry.getTarget());

              switch (lod) {
                case 2:
                  if (buildingInstallation != null)
                    buildingInstallation.setLod2Geometry(geometryProperty);
                  break;
                case 3:
                  if (buildingInstallation != null)
                    buildingInstallation.setLod3Geometry(geometryProperty);
                  break;
                case 4:
                  if (buildingInstallation != null)
                    buildingInstallation.setLod4Geometry(geometryProperty);
                  else intBuildingInstallation.setLod4Geometry(geometryProperty);
                  break;
              }
            }
          }
        }

        if (buildingInstallation != null) {
          cityObjectReader.read(buildingInstallation, installationId);

          BuildingInstallationProperty buildInstProp = new BuildingInstallationPropertyImpl();
          buildInstProp.setObject(buildingInstallation);
          building.addOuterBuildingInstallation(buildInstProp);
        } else {
          cityObjectReader.read(intBuildingInstallation, installationId);

          IntBuildingInstallationProperty intInstProp = new IntBuildingInstallationPropertyImpl();
          intInstProp.setObject(intBuildingInstallation);
          building.addInteriorBuildingInstallation(intInstProp);
        }
      }
    } finally {
      if (rs != null) rs.close();
    }
  }
  public void read(Room room, long parentId) throws SQLException {
    ResultSet rs = null;

    try {
      psRoomInstallation.setLong(1, parentId);
      rs = psRoomInstallation.executeQuery();

      while (rs.next()) {
        long installationId = rs.getLong("ID");
        IntBuildingInstallation intBuildingInstallation = new IntBuildingInstallationImpl();

        String gmlName = rs.getString("NAME");
        String gmlNameCodespace = rs.getString("NAME_CODESPACE");

        Util.dbGmlName2featureName(intBuildingInstallation, gmlName, gmlNameCodespace);

        String description = rs.getString("DESCRIPTION");
        if (description != null) {
          StringOrRef stringOrRef = new StringOrRefImpl();
          stringOrRef.setValue(description);

          intBuildingInstallation.setDescription(stringOrRef);
        }

        String clazz = rs.getString("CLASS");
        if (clazz != null) {
          intBuildingInstallation.setClazz(clazz);
        }

        String function = rs.getString("FUNCTION");
        if (function != null) {
          Pattern p = Pattern.compile("\\s+");
          String[] functionList = p.split(function.trim());

          intBuildingInstallation.setFunction(Arrays.asList(functionList));
        }

        String usage = rs.getString("USAGE");
        if (usage != null) {
          Pattern p = Pattern.compile("\\s+");
          String[] usageList = p.split(usage.trim());

          intBuildingInstallation.setUsage(Arrays.asList(usageList));
        }

        long lodSurfaceGeometryId = rs.getLong("LOD4_GEOMETRY_ID");
        if (!rs.wasNull() && lodSurfaceGeometryId != 0) {
          DBSurfaceGeometryResult geometry = surfaceGeometryExporter.read(lodSurfaceGeometryId);

          if (geometry != null) {
            GeometryProperty<AbstractGeometry> geometryProperty =
                new GeometryPropertyImpl<AbstractGeometry>();

            if (geometry.getAbstractGeometry() != null)
              geometryProperty.setGeometry(geometry.getAbstractGeometry());
            else geometryProperty.setHref(geometry.getTarget());

            intBuildingInstallation.setLod4Geometry(geometryProperty);
          }
        }

        cityObjectReader.read(intBuildingInstallation, installationId);

        IntBuildingInstallationProperty intInstProp = new IntBuildingInstallationPropertyImpl();
        intInstProp.setObject(intBuildingInstallation);
        room.addRoomInstallation(intInstProp);
      }
    } finally {
      if (rs != null) rs.close();
    }
  }