// Path: datomic/src/main/java/ske/folkeregister/datomic/feed/FeedGenerator.java
// @SuppressWarnings("unchecked")
// public class FeedGenerator implements Runnable {
// 
//    private static final Logger log = LoggerFactory.getLogger(FeedGenerator.class);
// 
//    private static final Abdera abdera = Abdera.getInstance();
//    private static final String attr_query =
//       "[:find ?attrname :in $ ?attr :where [?attr :db/ident ?attrname]]";
//    public static final String ssn_query =
//       "[:find ?ssn :in $ ?entity :where [?entity :person/ssn ?ssn]]";
// 
//    private final BlockingQueue<Map> txReportQueue;
//    private final WebResource feedResource;
// 
//    public FeedGenerator(Connection conn, WebResource feedResource) {
//       this.feedResource = feedResource;
//       txReportQueue = conn.txReportQueue();
//    }
// 
//    @Override
//    public void run() {
//       while (true) {
//          try {
//             final Map tx = txReportQueue.take();
//             final List<Datum> txData = (List<Datum>) tx.get(TX_DATA);
// 
//             log.info("Create feed entries tx: {}", txData.get(0).v());
// 
//             txData
//                .stream()
//                .skip(1)
//                .collect(Collectors.groupingBy(Datum::e))
//                .entrySet()
//                .stream()
//                .map(e -> {
//                   Entry entry = abdera.newEntry();
// 
//                   String ssn = queryForSSN(tx, e.getKey());
//                   entry.addLink(entry.addLink("/person/" + ssn, "person"));
//                   entry.setTitle("Person " + ssn + " oppdatert");
// 
//                   e.getValue().forEach(datum -> {
//                      if (datum.added()) {
//                         entry.addCategory(
//                            "added",
//                            queryForAttrName(tx.get(DB_AFTER), datum.a()),
//                            datum.v().toString()
//                         );
//                      } else {
//                         entry.addCategory(
//                            "removed",
//                            queryForAttrName(tx.get(DB_BEFORE), datum.a()),
//                            datum.v().toString()
//                         );
//                      }
//                   });
// 
//                   return entry;
//                })
//                .forEach(entry -> {
//                   try {
//                      feedResource.type(MediaType.APPLICATION_ATOM_XML_TYPE).post(entry);
//                   } catch (Exception e) {
//                      log.error("Problem posting feed entry: {} ({})", entry, e.getMessage());
//                   }
//                });
//          } catch (Exception e) {
//             log.error("Problem reading tx-report", e);
//          }
//       }
//    }
// 
//    private String queryForSSN(Map tx, Object entity) {
//       return Peer.q(ssn_query, tx.get(DB_AFTER), entity).iterator().next().get(0).toString();
//    }
// 
//    private String queryForAttrName(Object db, Object attr) {
//       return Peer.q(attr_query, db, attr).iterator().next().get(0).toString();
//    }
// }
// 
// Path: datomic/src/main/java/ske/folkeregister/datomic/util/IO.java
// @SuppressWarnings("unchecked")
// public class IO {
// 
//    public static void transactAllFromFile(Connection conn, String filename) throws InterruptedException, ExecutionException {
//       for (List tx : readData(filename)) {
//          conn.transact(tx).get();
//       }
//    }
// 
//    public static Connection newMemConnection() {
//       String uri = "datomic:mem://" + UUID.randomUUID();
//       Peer.createDatabase(uri);
//       return Peer.connect(uri);
//    }
// 
//    public static Map<String, Object> entityToMap(Entity entity) {
//       return entity
//          .keySet()
//          .stream()
//          .collect(Collectors.toMap(
//             key -> key.substring(key.lastIndexOf("/") + 1),
//             key -> attrToValue(entity, key)
//          ));
//    }
// 
//    public static Object attrToValue(Entity entity, Object key) {
//       Object value = entity.get(key);
//       if (value instanceof Entity) {
//          value = entityToMap((Entity) value);
//       } else if (value instanceof Keyword) {
//          value = ((Keyword) value).getName();
//       }
//       return value;
//    }
// 
//    private static List<List> readData(String filename) {
//       return Util.readAll(new InputStreamReader(
//          Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)));
//    }
// }


import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import datomic.Connection;
import org.junit.Test;
import ske.folkeregister.datomic.feed.FeedGenerator;
import ske.folkeregister.datomic.util.IO;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static datomic.Util.list;
import static datomic.Util.map;
package ske.folkeregister.datomic.person;




public class FeedGeneratorTest {

   @Test
   public void listenForChanges() throws Exception {
// Path: datomic/src/main/java/ske/folkeregister/datomic/feed/FeedGenerator.java
// @SuppressWarnings("unchecked")
// public class FeedGenerator implements Runnable {
// 
//    private static final Logger log = LoggerFactory.getLogger(FeedGenerator.class);
// 
//    private static final Abdera abdera = Abdera.getInstance();
//    private static final String attr_query =
//       "[:find ?attrname :in $ ?attr :where [?attr :db/ident ?attrname]]";
//    public static final String ssn_query =
//       "[:find ?ssn :in $ ?entity :where [?entity :person/ssn ?ssn]]";
// 
//    private final BlockingQueue<Map> txReportQueue;
//    private final WebResource feedResource;
// 
//    public FeedGenerator(Connection conn, WebResource feedResource) {
//       this.feedResource = feedResource;
//       txReportQueue = conn.txReportQueue();
//    }
// 
//    @Override
//    public void run() {
//       while (true) {
//          try {
//             final Map tx = txReportQueue.take();
//             final List<Datum> txData = (List<Datum>) tx.get(TX_DATA);
// 
//             log.info("Create feed entries tx: {}", txData.get(0).v());
// 
//             txData
//                .stream()
//                .skip(1)
//                .collect(Collectors.groupingBy(Datum::e))
//                .entrySet()
//                .stream()
//                .map(e -> {
//                   Entry entry = abdera.newEntry();
// 
//                   String ssn = queryForSSN(tx, e.getKey());
//                   entry.addLink(entry.addLink("/person/" + ssn, "person"));
//                   entry.setTitle("Person " + ssn + " oppdatert");
// 
//                   e.getValue().forEach(datum -> {
//                      if (datum.added()) {
//                         entry.addCategory(
//                            "added",
//                            queryForAttrName(tx.get(DB_AFTER), datum.a()),
//                            datum.v().toString()
//                         );
//                      } else {
//                         entry.addCategory(
//                            "removed",
//                            queryForAttrName(tx.get(DB_BEFORE), datum.a()),
//                            datum.v().toString()
//                         );
//                      }
//                   });
// 
//                   return entry;
//                })
//                .forEach(entry -> {
//                   try {
//                      feedResource.type(MediaType.APPLICATION_ATOM_XML_TYPE).post(entry);
//                   } catch (Exception e) {
//                      log.error("Problem posting feed entry: {} ({})", entry, e.getMessage());
//                   }
//                });
//          } catch (Exception e) {
//             log.error("Problem reading tx-report", e);
//          }
//       }
//    }
// 
//    private String queryForSSN(Map tx, Object entity) {
//       return Peer.q(ssn_query, tx.get(DB_AFTER), entity).iterator().next().get(0).toString();
//    }
// 
//    private String queryForAttrName(Object db, Object attr) {
//       return Peer.q(attr_query, db, attr).iterator().next().get(0).toString();
//    }
// }
// 
// Path: datomic/src/main/java/ske/folkeregister/datomic/util/IO.java
// @SuppressWarnings("unchecked")
// public class IO {
// 
//    public static void transactAllFromFile(Connection conn, String filename) throws InterruptedException, ExecutionException {
//       for (List tx : readData(filename)) {
//          conn.transact(tx).get();
//       }
//    }
// 
//    public static Connection newMemConnection() {
//       String uri = "datomic:mem://" + UUID.randomUUID();
//       Peer.createDatabase(uri);
//       return Peer.connect(uri);
//    }
// 
//    public static Map<String, Object> entityToMap(Entity entity) {
//       return entity
//          .keySet()
//          .stream()
//          .collect(Collectors.toMap(
//             key -> key.substring(key.lastIndexOf("/") + 1),
//             key -> attrToValue(entity, key)
//          ));
//    }
// 
//    public static Object attrToValue(Entity entity, Object key) {
//       Object value = entity.get(key);
//       if (value instanceof Entity) {
//          value = entityToMap((Entity) value);
//       } else if (value instanceof Keyword) {
//          value = ((Keyword) value).getName();
//       }
//       return value;
//    }
// 
//    private static List<List> readData(String filename) {
//       return Util.readAll(new InputStreamReader(
//          Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)));
//    }
// }


// Path: datomic/src/test/java/ske/folkeregister/datomic/person/FeedGeneratorTest.java
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import datomic.Connection;
import org.junit.Test;
import ske.folkeregister.datomic.feed.FeedGenerator;
import ske.folkeregister.datomic.util.IO;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static datomic.Util.list;
import static datomic.Util.map;

package ske.folkeregister.datomic.person;




public class FeedGeneratorTest {

   @Test
   public void listenForChanges() throws Exception {
      final Connection conn = IO.newMemConnection();