Implemented parsing free resource info from json.

Change-Id: I034a71e0c30f72e864df7288d938e6d74d762801
diff --git a/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java b/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java
index 865f7cf..ab3cd02 100644
--- a/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java
+++ b/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java
@@ -123,14 +123,21 @@
             Annotation layer = retrieveOrCreateAnnotation(code, annotationType,
                     null, array.get(0));
             try {
-                annotationDao.createAnnotationLayer(foundry, layer);
+                AnnotationLayer annotationLayer =
+                        annotationDao.retrieveAnnotationLayer(foundry.getCode(),
+                                layer.getCode());
+                if (annotationLayer == null) {
+                    annotationDao.createAnnotationLayer(foundry, layer);
+                }
             }
             catch (Exception e) {
                 log.debug("Duplicate annotation layer: " + foundry.getCode()
                         + "/" + layer.getCode());
             }
         }
-        else if (annotationType.equals(AnnotationType.KEY)) {
+        else if (annotationType.equals(AnnotationType.KEY))
+
+        {
             if (layer == null) {
                 computeLayer(annotationCode);
             }
diff --git a/full/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java b/full/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java
new file mode 100644
index 0000000..1d7bc76
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/annotation/FreeResourceParser.java
@@ -0,0 +1,67 @@
+package de.ids_mannheim.korap.annotation;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import de.ids_mannheim.korap.dao.AnnotationDao;
+import de.ids_mannheim.korap.dao.ResourceDao;
+import de.ids_mannheim.korap.entity.AnnotationLayer;
+import de.ids_mannheim.korap.entity.Resource;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+
+@Component
+public class FreeResourceParser {
+    private Logger log = LogManager.getLogger(FreeResourceParser.class);
+
+    @Autowired
+    private ResourceDao resourceDao;
+    @Autowired
+    private AnnotationDao annotationDao;
+
+    public static String FREE_RESOURCE_FILE = "free-resources.json";
+    public static ObjectMapper mapper = new ObjectMapper();
+
+    public void run () throws IOException, KustvaktException {
+        InputStream is = FreeResourceParser.class.getClassLoader()
+                .getResourceAsStream(FREE_RESOURCE_FILE);
+        JsonNode node = mapper.readTree(is);
+        for (JsonNode resource : node) {
+            String resourceId = resource.at("/id").asText();
+            log.debug(resourceId);
+            Set<AnnotationLayer> layers = parseLayers(resource.at("/layers"));
+            try {
+                Resource r = resourceDao.retrieveResource(resourceId);
+                if (r == null) {
+                    resourceDao.createResource(resource.at("/id").asText(),
+                            resource.at("/de_title").asText(),
+                            resource.at("/en_title").asText(),
+                            resource.at("/en_description").asText(), layers);
+                }
+            }
+            catch (Exception e) {
+                log.warn("Failed creating resource: " + e.getMessage());
+            }
+        }
+    }
+
+    private Set<AnnotationLayer> parseLayers (JsonNode layers) {
+        Set<AnnotationLayer> layerSet = new HashSet<>(layers.size());
+        for (JsonNode layer : layers) {
+            String[] codes = layer.asText().split("/");
+            AnnotationLayer annotationLayer =
+                    annotationDao.retrieveAnnotationLayer(codes[0], codes[1]);
+            layerSet.add(annotationLayer);
+        }
+        return layerSet;
+    }
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java b/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
index f0cace9..1cccb4f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/Initializator.java
@@ -6,6 +6,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 
 import de.ids_mannheim.korap.annotation.AnnotationParser;
+import de.ids_mannheim.korap.annotation.FreeResourceParser;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.dao.AccessScopeDao;
@@ -26,7 +27,9 @@
     private NamedVCLoader loader;
     @Autowired
     private AnnotationParser annotationParser;
-
+    @Autowired
+    private FreeResourceParser resourceParser;
+    
     public Initializator () {}
 
     public void init () throws IOException, QueryException, KustvaktException {
@@ -39,6 +42,7 @@
         setInitialAccessScope();
         loader.loadVCToCache();
         annotationParser.run();
+        resourceParser.run();
     }
 
     public void initTest () {
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
index 0de5c9c..ff3ffd0 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
@@ -1,6 +1,7 @@
 package de.ids_mannheim.korap.dao;
 
 import java.util.List;
+import java.util.Set;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -10,9 +11,13 @@
 import javax.persistence.criteria.Root;
 
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
+import de.ids_mannheim.korap.entity.AnnotationLayer;
 import de.ids_mannheim.korap.entity.Resource;
 import de.ids_mannheim.korap.entity.Resource_;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.utils.ParameterChecker;
 
 /**
  * ResourceDao manages SQL queries regarding resource info and layers.
@@ -20,14 +25,16 @@
  * @author margaretha
  *
  */
+@Transactional
 @Repository
 public class ResourceDao {
 
     @PersistenceContext
     private EntityManager entityManager;
 
-    /** Select all from the resource table  
-     *  
+    /**
+     * Select all from the resource table
+     * 
      * @return a list of resources
      */
     @SuppressWarnings("unchecked")
@@ -36,9 +43,34 @@
         CriteriaQuery<Resource> query =
                 criteriaBuilder.createQuery(Resource.class);
         Root<Resource> resource = query.from(Resource.class);
-        resource.fetch(Resource_.layers);
         query.select(resource);
+        
         Query q = entityManager.createQuery(query);
         return q.getResultList();
     }
+
+    public Resource retrieveResource (String id) {
+        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+        CriteriaQuery<Resource> query =
+                criteriaBuilder.createQuery(Resource.class);
+        Root<Resource> resource = query.from(Resource.class);
+        query.select(resource);
+        query.where(criteriaBuilder.equal(resource.get(Resource_.id), id));
+
+        Query q = entityManager.createQuery(query);
+        return (Resource) q.getSingleResult();
+    }
+
+    public void createResource (String id, String germanTitle,
+            String englishTitle, String englishDescription, Set<AnnotationLayer> layers)
+            throws KustvaktException {
+        ParameterChecker.checkStringValue(id, "id");
+        ParameterChecker.checkStringValue(englishTitle, "en_title");
+        ParameterChecker.checkStringValue(germanTitle, "de_title");
+
+        Resource r = new Resource(id, germanTitle, englishTitle,
+                englishDescription, layers);
+        entityManager.persist(r);
+
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java b/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java
index aa461c2..fbe3f92 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java
@@ -14,9 +14,11 @@
 import lombok.Getter;
 import lombok.Setter;
 
-/** Describes resources having free licenses. Primarily for accommodating 
- *  clients in providing data without login such as KorapSRU. 
- *  
+/**
+ * Describes resources having free licenses. Primarily for
+ * accommodating
+ * clients in providing data without login such as KorapSRU.
+ * 
  * @author margaretha
  *
  */
@@ -38,7 +40,7 @@
     @Column(name = "en_description")
     private String englishDescription;
 
-    @ManyToMany(fetch = FetchType.LAZY)
+    @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(name = "resource_layer",
             joinColumns = @JoinColumn(name = "resource_id",
                     referencedColumnName = "id"),
@@ -46,6 +48,16 @@
                     referencedColumnName = "id"))
     private Set<AnnotationLayer> layers;
 
+    public Resource () {}
+
+    public Resource (String id, String germanTitle, String englishTitle,
+                     String englishDescription, Set<AnnotationLayer> layers) {
+        this.id = id;
+        this.germanTitle = germanTitle;
+        this.englishTitle = englishTitle;
+        this.englishDescription = englishDescription;
+        this.layers = layers;
+    }
 
     @Override
     public String toString () {