// Path: src/main/java/example/domain/Document.java
// public class Document {
// 
//     private Identity identity;
//     private Map<Field, Property> properties;
// 
//     private LocalDateTime createdDateTime;
//     private LocalDateTime updatedDateTime;
// 
//     public Document() {
//         this(new Identity());
//     }
// 
//     public Document(Identity identity) {
//         this.properties = new HashMap<Field, Property>();
//         this.createdDateTime = new LocalDateTime();
//         this.updatedDateTime = new LocalDateTime();
//         this.identity = identity;
//     }
// 
//     public Identity getIdentity() {
//         return identity;
//     }
// 
//     public LocalDateTime getCreatedDateTime() {
//         return createdDateTime;
//     }
// 
//     public LocalDateTime getUpdatedDateTime() {
//         return updatedDateTime;
//     }
// 
//     public Property get(Field field) {
//         Property property = properties.get(field);
//         return (property != null) ? property : new Property();
//     }
// 
//     public void set(Field field, Property property) {
//         updatedDateTime = new LocalDateTime();
//         properties.put(field, property);
//     }
// 
//     public List<Field> getFields() {
//         return Arrays.asList(Field.values());
//     }
// 
//     public boolean isValid() {
//         return select(properties.values(), having(on(Property.class).isValid(), equalTo(false))).isEmpty();
//     }
// }
// 
// Path: src/main/java/example/domain/DocumentDetails.java
// public class DocumentDetails {
// 
//     private static final String DATE_TIME_PATTERN = "dd/MM/yyyy HH:mm:ss";
// 
//     private Identity id;
//     private LocalDateTime createdAt;
//     private LocalDateTime updatedAt;
// 
//     public DocumentDetails(Identity id, LocalDateTime createdAt, LocalDateTime updatedAt) {
//         this.id = id;
//         this.createdAt = createdAt;
//         this.updatedAt = updatedAt;
//     }
// 
//     public Identity getId() {
//         return id;
//     }
// 
//     public String getCreatedAt() {
//         return createdAt.toString(DATE_TIME_PATTERN);
//     }
// 
//     public String getUpdatedAt() {
//         return updatedAt.toString(DATE_TIME_PATTERN);
//     }
// 
//     @Override
//     public String toString() {
//         return Strings.toString(this);
//     }
// }
// 
// Path: src/main/java/example/domain/DocumentRepository.java
// public interface DocumentRepository {
// 
//     List<DocumentDetails> getDetails();
// 
//     Document get(Identity documentId);
// 
//     void set(Document document);
// }
// 
// Path: src/main/java/example/domain/Identity.java
// public final class Identity implements Serializable {
// 
//     public static final Identity NEW = new Identity("new");
// 
//     private final String value;
// 
//     public Identity() {
//         value = UUID.randomUUID().toString();
//     }
// 
//     private Identity(String value) {
//         this.value = value;
//     }
// 
//     public static Identity fromValue(String value) {
//         if (StringUtils.isEmpty(value)) {
//             throw new IllegalArgumentException("Cannot create Identity from empty value");
//         }
//         if (NEW.getValue().equalsIgnoreCase(value)) {
//             return NEW;
//         }
//         return new Identity(value);
//     }
// 
//     public boolean isNew() {
//         return NEW.equals(this);
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj instanceof Identity) {
//             Identity other = (Identity) obj;
//             return this.value.equals(other.value);
//         }
//         return false;
//     }
// 
//     public String toString() {
//         return getValue();
//     }
// }


import example.domain.Document;
import example.domain.DocumentDetails;
import example.domain.DocumentRepository;
import example.domain.Identity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateOperations;
import org.springframework.stereotype.Repository;
import java.util.List;
package example.domain.services.hibernate;



@Repository
@SuppressWarnings({"unchecked"})
public class HibernateDocumentRepository implements DocumentRepository {

    private final HibernateOperations hibernate;

    @Autowired
// Path: src/main/java/example/domain/Document.java
// public class Document {
// 
//     private Identity identity;
//     private Map<Field, Property> properties;
// 
//     private LocalDateTime createdDateTime;
//     private LocalDateTime updatedDateTime;
// 
//     public Document() {
//         this(new Identity());
//     }
// 
//     public Document(Identity identity) {
//         this.properties = new HashMap<Field, Property>();
//         this.createdDateTime = new LocalDateTime();
//         this.updatedDateTime = new LocalDateTime();
//         this.identity = identity;
//     }
// 
//     public Identity getIdentity() {
//         return identity;
//     }
// 
//     public LocalDateTime getCreatedDateTime() {
//         return createdDateTime;
//     }
// 
//     public LocalDateTime getUpdatedDateTime() {
//         return updatedDateTime;
//     }
// 
//     public Property get(Field field) {
//         Property property = properties.get(field);
//         return (property != null) ? property : new Property();
//     }
// 
//     public void set(Field field, Property property) {
//         updatedDateTime = new LocalDateTime();
//         properties.put(field, property);
//     }
// 
//     public List<Field> getFields() {
//         return Arrays.asList(Field.values());
//     }
// 
//     public boolean isValid() {
//         return select(properties.values(), having(on(Property.class).isValid(), equalTo(false))).isEmpty();
//     }
// }
// 
// Path: src/main/java/example/domain/DocumentDetails.java
// public class DocumentDetails {
// 
//     private static final String DATE_TIME_PATTERN = "dd/MM/yyyy HH:mm:ss";
// 
//     private Identity id;
//     private LocalDateTime createdAt;
//     private LocalDateTime updatedAt;
// 
//     public DocumentDetails(Identity id, LocalDateTime createdAt, LocalDateTime updatedAt) {
//         this.id = id;
//         this.createdAt = createdAt;
//         this.updatedAt = updatedAt;
//     }
// 
//     public Identity getId() {
//         return id;
//     }
// 
//     public String getCreatedAt() {
//         return createdAt.toString(DATE_TIME_PATTERN);
//     }
// 
//     public String getUpdatedAt() {
//         return updatedAt.toString(DATE_TIME_PATTERN);
//     }
// 
//     @Override
//     public String toString() {
//         return Strings.toString(this);
//     }
// }
// 
// Path: src/main/java/example/domain/DocumentRepository.java
// public interface DocumentRepository {
// 
//     List<DocumentDetails> getDetails();
// 
//     Document get(Identity documentId);
// 
//     void set(Document document);
// }
// 
// Path: src/main/java/example/domain/Identity.java
// public final class Identity implements Serializable {
// 
//     public static final Identity NEW = new Identity("new");
// 
//     private final String value;
// 
//     public Identity() {
//         value = UUID.randomUUID().toString();
//     }
// 
//     private Identity(String value) {
//         this.value = value;
//     }
// 
//     public static Identity fromValue(String value) {
//         if (StringUtils.isEmpty(value)) {
//             throw new IllegalArgumentException("Cannot create Identity from empty value");
//         }
//         if (NEW.getValue().equalsIgnoreCase(value)) {
//             return NEW;
//         }
//         return new Identity(value);
//     }
// 
//     public boolean isNew() {
//         return NEW.equals(this);
//     }
// 
//     public String getValue() {
//         return value;
//     }
// 
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj instanceof Identity) {
//             Identity other = (Identity) obj;
//             return this.value.equals(other.value);
//         }
//         return false;
//     }
// 
//     public String toString() {
//         return getValue();
//     }
// }


// Path: src/main/java/example/domain/services/hibernate/HibernateDocumentRepository.java
import example.domain.Document;
import example.domain.DocumentDetails;
import example.domain.DocumentRepository;
import example.domain.Identity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateOperations;
import org.springframework.stereotype.Repository;
import java.util.List;

package example.domain.services.hibernate;



@Repository
@SuppressWarnings({"unchecked"})
public class HibernateDocumentRepository implements DocumentRepository {

    private final HibernateOperations hibernate;

    @Autowired
    public HibernateDocumentRepository(HibernateOperations hibernate) {