// Path: src/org/sortdc/sortdc/dao/Category.java
// public class Category {
// 
//     private String id;
//     private String name;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// }
// 
// Path: src/org/sortdc/sortdc/dao/Document.java
// public class Document {
// 
//     private String id;
//     private String category_id;
//     private Map<String, Integer> tokens;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getCategoryId() {
//         return this.category_id;
//     }
// 
//     public void setCategoryId(String category_id) {
//         this.category_id = category_id;
//     }
// 
//     public Map<String, Integer> getTokensOccurrences() {
//         return this.tokens;
//     }
// 
//     public void setTokensOccurrences(Map<String, Integer> tokens) {
//         this.tokens = tokens;
//     }
// }
// 
// Path: src/org/sortdc/sortdc/dao/Token.java
// public class Token {
// 
//     private String id;
//     private String name;
//     private Map<String, Integer> occurences_by_cat;
//     private Integer occurences = null;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return this.name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public Map<String, Integer> getOccurrencesByCategory() {
//         return this.occurences_by_cat;
//     }
// 
//     public void setOccurrencesByCategory(Map<String, Integer> occurences) {
//         this.occurences_by_cat = occurences;
//     }
// 
//     public int getOccurrences() {
//         if (this.occurences == null) {
//             this.occurences = 0;
//             for (int n : this.occurences_by_cat.values()) {
//                 this.occurences += n;
//             }
//         }
//         return this.occurences;
//     }
// }


import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.sortdc.sortdc.dao.Category;
import org.sortdc.sortdc.dao.Document;
import org.sortdc.sortdc.dao.Token;

    /**
     * Deletes tokens' occurrences of a document in a category
     *
     * @throws Exception
     */
    private void deleteDocumentTokensOcurrences(Document document) throws Exception {
        Map<String, Integer> occurences = document.getTokensOccurrences();

        for (Map.Entry<String, Integer> doc_occurences : occurences.entrySet()) {
            try {
                Token token = this.findTokenByName(doc_occurences.getKey());
                for (Map.Entry<String, Integer> token_occurences : token.getOccurrencesByCategory().entrySet()) {
                    if (token_occurences.getKey().equals(document.getCategoryId())) {
                        token_occurences.setValue(token_occurences.getValue() - doc_occurences.getValue());
                    }
                }
                this.saveToken(token);
            } catch (ObjectNotFoundException e) {
            }
        }
    }

    /**
     * Deletes a document given its id
     *
     * @param document_id
     * @throws Exception
     */
    public void deleteDocumentById(String document_id) throws Exception {
// Path: src/org/sortdc/sortdc/dao/Category.java
// public class Category {
// 
//     private String id;
//     private String name;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// }
// 
// Path: src/org/sortdc/sortdc/dao/Document.java
// public class Document {
// 
//     private String id;
//     private String category_id;
//     private Map<String, Integer> tokens;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getCategoryId() {
//         return this.category_id;
//     }
// 
//     public void setCategoryId(String category_id) {
//         this.category_id = category_id;
//     }
// 
//     public Map<String, Integer> getTokensOccurrences() {
//         return this.tokens;
//     }
// 
//     public void setTokensOccurrences(Map<String, Integer> tokens) {
//         this.tokens = tokens;
//     }
// }
// 
// Path: src/org/sortdc/sortdc/dao/Token.java
// public class Token {
// 
//     private String id;
//     private String name;
//     private Map<String, Integer> occurences_by_cat;
//     private Integer occurences = null;
// 
//     public String getId() {
//         return this.id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return this.name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public Map<String, Integer> getOccurrencesByCategory() {
//         return this.occurences_by_cat;
//     }
// 
//     public void setOccurrencesByCategory(Map<String, Integer> occurences) {
//         this.occurences_by_cat = occurences;
//     }
// 
//     public int getOccurrences() {
//         if (this.occurences == null) {
//             this.occurences = 0;
//             for (int n : this.occurences_by_cat.values()) {
//                 this.occurences += n;
//             }
//         }
//         return this.occurences;
//     }
// }


// Path: src/org/sortdc/sortdc/database/DatabaseMongo.java
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.sortdc.sortdc.dao.Category;
import org.sortdc.sortdc.dao.Document;
import org.sortdc.sortdc.dao.Token;


    /**
     * Deletes tokens' occurrences of a document in a category
     *
     * @throws Exception
     */
    private void deleteDocumentTokensOcurrences(Document document) throws Exception {
        Map<String, Integer> occurences = document.getTokensOccurrences();

        for (Map.Entry<String, Integer> doc_occurences : occurences.entrySet()) {
            try {
                Token token = this.findTokenByName(doc_occurences.getKey());
                for (Map.Entry<String, Integer> token_occurences : token.getOccurrencesByCategory().entrySet()) {
                    if (token_occurences.getKey().equals(document.getCategoryId())) {
                        token_occurences.setValue(token_occurences.getValue() - doc_occurences.getValue());
                    }
                }
                this.saveToken(token);
            } catch (ObjectNotFoundException e) {
            }
        }
    }

    /**
     * Deletes a document given its id
     *
     * @param document_id
     * @throws Exception
     */
    public void deleteDocumentById(String document_id) throws Exception {
        Document document = this.findDocumentById(document_id);