Skip to content

Commit

Permalink
Added Mapstruct
Browse files Browse the repository at this point in the history
  • Loading branch information
saw303 committed Mar 28, 2017
1 parent de175da commit 00b7caa
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 96 deletions.
Expand Up @@ -16,15 +16,15 @@

package ch.silviowangler.dox.api.rest;

import ch.silviowangler.dox.api.AbstractTranslatable;
import ch.silviowangler.dox.api.Attribute;
import ch.silviowangler.dox.api.TranslateProperties;
import static com.google.common.base.MoreObjects.toStringHelper;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import static com.google.common.base.MoreObjects.toStringHelper;
import ch.silviowangler.dox.api.AbstractTranslatable;
import ch.silviowangler.dox.api.Attribute;
import ch.silviowangler.dox.api.TranslateProperties;

/**
* @author Silvio Wangler
Expand All @@ -38,6 +38,10 @@ public class DocumentClass extends AbstractTranslatable implements Serializable
private List<Attribute> attributes;
private String client;


public DocumentClass() {
}

public DocumentClass(String shortName, String translatedText, List<Attribute> attributes, String client) {
this.shortName = shortName;
this.translatedText = translatedText;
Expand All @@ -46,7 +50,7 @@ public DocumentClass(String shortName, String translatedText, List<Attribute> at
}

public DocumentClass(String shortName, String client) {
this(shortName, null, new ArrayList<Attribute>(), client);
this(shortName, null, new ArrayList<>(), client);
}

public String getShortName() {
Expand Down
12 changes: 9 additions & 3 deletions build.gradle
Expand Up @@ -17,17 +17,20 @@ buildscript {
repositories {
jcenter()
}
dependencies {
classpath "net.ltgt.gradle:gradle-apt-plugin:0.9"
}
}

plugins {
id 'idea'
id 'com.github.ben-manes.versions' version '0.14.0'
id 'com.jfrog.bintray' version '1.7.3'
// id "com.github.hierynomus.license" version "0.13.1"
}

configure(allprojects) {

apply plugin: 'idea'
apply plugin: 'project-report'
apply plugin: 'jacoco'

Expand Down Expand Up @@ -94,7 +97,7 @@ configure(subprojects) { subproject ->
apply plugin: 'groovy'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'
apply plugin: "net.ltgt.apt"

compileJava.options.compilerArgs = ['-Xlint:unchecked', '-Xlint:deprecation']
compileTestJava.options.compilerArgs = ['-Xlint:unchecked', '-Xlint:deprecation']
Expand All @@ -103,9 +106,12 @@ configure(subprojects) { subproject ->
targetCompatibility = 8

dependencies {
compile "org.slf4j:slf4j-api:${slf4jVersion}"
compile "org.mapstruct:mapstruct-jdk8:${mapstructVersion}"
apt "org.mapstruct:mapstruct-processor:${mapstructVersion}"

testCompile "org.codehaus.groovy:groovy:${groovyVersion}"
testCompile "org.spockframework:spock-core:${spockVersion}"
compile "org.slf4j:slf4j-api:${slf4jVersion}"
testCompile "junit:junit:${junitVersion}",
"org.mockito:mockito-core:${mockitoVersion}",
"org.hamcrest:hamcrest-core:${hamcrestVersion}",
Expand Down
144 changes: 73 additions & 71 deletions core/src/main/java/ch/silviowangler/dox/DocumentServiceImpl.java
Expand Up @@ -16,22 +16,28 @@

package ch.silviowangler.dox;

import ch.silviowangler.dox.api.*;
import ch.silviowangler.dox.api.Domain;
import ch.silviowangler.dox.api.rest.DocumentClass;
import ch.silviowangler.dox.document.DocumentInspector;
import ch.silviowangler.dox.document.DocumentInspectorFactory;
import ch.silviowangler.dox.domain.*;
import ch.silviowangler.dox.domain.Attribute;
import ch.silviowangler.dox.domain.AttributeDataType;
import ch.silviowangler.dox.domain.Range;
import ch.silviowangler.dox.domain.security.DoxUser;
import ch.silviowangler.dox.domain.stats.Tag;
import ch.silviowangler.dox.repository.*;
import ch.silviowangler.dox.repository.security.DoxUserRepository;
import static ch.silviowangler.dox.domain.AttributeDataType.CURRENCY;
import static ch.silviowangler.dox.domain.AttributeDataType.DATE;
import static ch.silviowangler.dox.domain.AttributeDataType.DOUBLE;
import static ch.silviowangler.dox.domain.AttributeDataType.INTEGER;
import static ch.silviowangler.dox.domain.AttributeDataType.LONG;
import static ch.silviowangler.dox.domain.AttributeDataType.SHORT;
import static ch.silviowangler.dox.domain.AttributeDataType.STRING;
import static ch.silviowangler.dox.domain.DomainUtils.containsWildcardCharacters;
import static ch.silviowangler.dox.domain.DomainUtils.replaceWildcardCharacters;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
import static com.google.common.collect.Maps.newHashMapWithExpectedSize;
import static org.springframework.transaction.annotation.Propagation.REQUIRED;
import static org.springframework.transaction.annotation.Propagation.SUPPORTS;
import static org.springframework.util.Assert.isTrue;
import static org.springframework.util.Assert.notEmpty;
import static org.springframework.util.Assert.notNull;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
Expand All @@ -58,19 +64,52 @@
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.util.*;

import static ch.silviowangler.dox.domain.AttributeDataType.*;
import static ch.silviowangler.dox.domain.DomainUtils.containsWildcardCharacters;
import static ch.silviowangler.dox.domain.DomainUtils.replaceWildcardCharacters;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
import static com.google.common.collect.Maps.newHashMapWithExpectedSize;
import static org.springframework.transaction.annotation.Propagation.REQUIRED;
import static org.springframework.transaction.annotation.Propagation.SUPPORTS;
import static org.springframework.util.Assert.*;

import java.util.Currency;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;
import java.util.SortedSet;

import ch.silviowangler.dox.api.DescriptiveIndex;
import ch.silviowangler.dox.api.DocumentClassNotFoundException;
import ch.silviowangler.dox.api.DocumentDuplicationException;
import ch.silviowangler.dox.api.DocumentNotFoundException;
import ch.silviowangler.dox.api.DocumentNotInStoreException;
import ch.silviowangler.dox.api.DocumentReference;
import ch.silviowangler.dox.api.DocumentService;
import ch.silviowangler.dox.api.Money;
import ch.silviowangler.dox.api.PhysicalDocument;
import ch.silviowangler.dox.api.TranslatableKey;
import ch.silviowangler.dox.api.ValidationException;
import ch.silviowangler.dox.api.ValueNotInDomainException;
import ch.silviowangler.dox.api.rest.DocumentClass;
import ch.silviowangler.dox.document.DocumentInspector;
import ch.silviowangler.dox.document.DocumentInspectorFactory;
import ch.silviowangler.dox.domain.AmountOfMoney;
import ch.silviowangler.dox.domain.Attribute;
import ch.silviowangler.dox.domain.AttributeDataType;
import ch.silviowangler.dox.domain.Client;
import ch.silviowangler.dox.domain.Document;
import ch.silviowangler.dox.domain.IndexMapEntry;
import ch.silviowangler.dox.domain.IndexStore;
import ch.silviowangler.dox.domain.Range;
import ch.silviowangler.dox.domain.security.DoxUser;
import ch.silviowangler.dox.domain.stats.Tag;
import ch.silviowangler.dox.mappers.DocumentClassMapper;
import ch.silviowangler.dox.repository.AttributeRepository;
import ch.silviowangler.dox.repository.ClientRepository;
import ch.silviowangler.dox.repository.DocumentClassRepository;
import ch.silviowangler.dox.repository.DocumentRepository;
import ch.silviowangler.dox.repository.DomainRepository;
import ch.silviowangler.dox.repository.IndexMapEntryRepository;
import ch.silviowangler.dox.repository.IndexStoreRepository;
import ch.silviowangler.dox.repository.TagRepository;
import ch.silviowangler.dox.repository.security.DoxUserRepository;

/**
* @author Silvio Wangler
Expand Down Expand Up @@ -109,6 +148,8 @@ public class DocumentServiceImpl implements DocumentService, InitializingBean {
private DoxUserRepository doxUserRepository;
@Autowired
private TagRepository tagRepository;
@Autowired
private DocumentClassMapper documentClassMapper;
/* @Autowired
private ElasticDocumentStoreService elasticDocumentStoreService;*/

Expand Down Expand Up @@ -158,8 +199,9 @@ public List<DocumentClass> findAllDocumentClasses() {
Iterable<ch.silviowangler.dox.domain.DocumentClass> documentClassEntities = documentClassRepository.findAllByClients(clients);

for (ch.silviowangler.dox.domain.DocumentClass documentClassEntity : documentClassEntities) {
DocumentClass documentClass = toDocumentClassWithAttributesApi(documentClassEntity);
documentClass.setAttributes(newArrayList(toAttributeApi(attributeRepository.findAttributesForDocumentClass(documentClassEntity))));

DocumentClass documentClass = documentClassMapper.toDocumentClassRestApi(documentClassEntity);
documentClass.setAttributes(newArrayList(documentClassMapper.toAttributeApi(attributeRepository.findAttributesForDocumentClass(documentClassEntity))));
documentClasses.add(documentClass);
}
return documentClasses;
Expand Down Expand Up @@ -210,7 +252,7 @@ public SortedSet<ch.silviowangler.dox.api.Attribute> findAttributes(ch.silviowan

ch.silviowangler.dox.domain.DocumentClass docClass = findDocumentClass(documentClass.getShortName());
List<Attribute> attributes = attributeRepository.findAttributesForDocumentClass(docClass);
return toAttributeApi(attributes);
return this.documentClassMapper.toAttributeApi(attributes);
}

@Override
Expand All @@ -223,7 +265,7 @@ public Set<ch.silviowangler.dox.api.DocumentClass> findDocumentClasses() {

for (ch.silviowangler.dox.domain.DocumentClass documentClass : documentClasses) {
logger.debug("Processing document class '{}' with id {}", documentClass.getShortName(), documentClass.getId());
result.add(toDocumentClassApi(documentClass));
result.add(this.documentClassMapper.toDocumentClassApi(documentClass));
}
logger.info("Found {} document classes in DOX", result.size());
return result;
Expand Down Expand Up @@ -704,7 +746,7 @@ private DocumentReference toDocumentReference(Document document, Locale locale)
document.getId(),
document.getPageCount(),
document.getMimeType(),
toDocumentClassApi(document.getDocumentClass()),
this.documentClassMapper.toDocumentClassApi(document.getDocumentClass()),
toIndexMap(document.getIndexStore(), attributeRepository.findAttributesForDocumentClass(document.getDocumentClass()), locale),
document.getOriginalFilename(), document.getUserReference(), document.getFileSize());

Expand All @@ -725,7 +767,7 @@ private Map<TranslatableKey, DescriptiveIndex> toIndexMap(IndexStore indexStore,
for (Attribute attribute : attributes) {

DescriptiveIndex index = new DescriptiveIndex();
index.setAttribute(toAttributeApi(attribute));
index.setAttribute(documentClassMapper.toAttributeApi(attribute));

try {
final String fieldName = attribute.getMappingColumn();
Expand Down Expand Up @@ -769,16 +811,6 @@ private void setFieldValue(IndexStore indexStore, String fieldName, Object value

}

private ch.silviowangler.dox.api.DocumentClass toDocumentClassApi(ch.silviowangler.dox.domain.DocumentClass documentClass) {
ch.silviowangler.dox.api.DocumentClass docClassApi = new ch.silviowangler.dox.api.DocumentClass(documentClass.getShortName());
docClassApi.setClient(documentClass.getClient().getShortName());
return docClassApi;
}

private DocumentClass toDocumentClassWithAttributesApi(ch.silviowangler.dox.domain.DocumentClass documentClass) {
return new DocumentClass(documentClass.getShortName(), documentClass.getClient().getShortName());
}

private Map<String, Attribute> toAttributeMap(List<Attribute> attributes) {
Map<String, Attribute> map = newHashMapWithExpectedSize(attributes.size());

Expand All @@ -788,36 +820,6 @@ private Map<String, Attribute> toAttributeMap(List<Attribute> attributes) {
return map;
}

private SortedSet<ch.silviowangler.dox.api.Attribute> toAttributeApi(List<Attribute> attributes) {
SortedSet<ch.silviowangler.dox.api.Attribute> result = new TreeSet<>();

for (Attribute attribute : attributes) {
ch.silviowangler.dox.api.Attribute attr = toAttributeApi(attribute);
result.add(attr);
}
return result;
}

private ch.silviowangler.dox.api.Attribute toAttributeApi(Attribute attribute) {
return new ch.silviowangler.dox.api.Attribute(
attribute.getShortName(),
attribute.isOptional(),
attribute.getDomain() != null ? toDomainApi(attribute.getDomain()) : null,
ch.silviowangler.dox.api.AttributeDataType.valueOf(attribute.getDataType().toString()),
attribute.isUpdateable(), attribute.getMappingColumn());
}

private Domain toDomainApi(ch.silviowangler.dox.domain.Domain domain) {

Domain domainApi = new Domain();
domainApi.setShortName(domain.getShortName());
for (String domainValue : domain.getValues()) {
domainApi.getValues().add(domainValue);
}
return domainApi;
}


private ch.silviowangler.dox.domain.DocumentClass findDocumentClass(String documentClassShortName) throws DocumentClassNotFoundException {
ch.silviowangler.dox.domain.DocumentClass documentClassEntity = documentClassRepository.findByShortName(documentClassShortName);

Expand Down
@@ -0,0 +1,49 @@
package ch.silviowangler.dox.mappers;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import java.util.List;
import java.util.SortedSet;

import ch.silviowangler.dox.api.Attribute;
import ch.silviowangler.dox.api.AttributeDataType;
import ch.silviowangler.dox.api.Domain;
import ch.silviowangler.dox.api.rest.DocumentClass;


/**
* @author Silvio Wangler
*/
@Mapper(config = MappingConfig.class)
public interface DocumentClassMapper {

@Mappings({
@Mapping(target = "client", source = "client.shortName"),
@Mapping(target = "attributes", ignore = true),
@Mapping(target = "translation", ignore = true)
})
DocumentClass toDocumentClassRestApi(ch.silviowangler.dox.domain.DocumentClass domain);

@Mappings({
@Mapping(target = "client", source = "client.shortName"),
@Mapping(target = "translation", ignore = true)
})
ch.silviowangler.dox.api.DocumentClass toDocumentClassApi(ch.silviowangler.dox.domain.DocumentClass documentClass);

@Mappings({
@Mapping(target = "modifiable", source = "updateable"),
@Mapping(target = "translation", ignore = true)
})
Attribute toAttributeApi(ch.silviowangler.dox.domain.Attribute domain);

SortedSet<Attribute> toAttributeApi(List<ch.silviowangler.dox.domain.Attribute> attributes);

@Mappings({
@Mapping(target = "translation", ignore = true)
})
Domain toDomainApi(ch.silviowangler.dox.domain.Domain domain);

AttributeDataType toAttributeDataTypeApi(ch.silviowangler.dox.domain.AttributeDataType domain);
}
11 changes: 11 additions & 0 deletions core/src/main/java/ch/silviowangler/dox/mappers/MappingConfig.java
@@ -0,0 +1,11 @@
package ch.silviowangler.dox.mappers;

import org.mapstruct.MapperConfig;
import org.mapstruct.ReportingPolicy;

/**
* @author Silvio Wangler
*/
@MapperConfig(unmappedTargetPolicy = ReportingPolicy.ERROR, componentModel = "spring")
public class MappingConfig {
}
13 changes: 3 additions & 10 deletions docs/build.gradle
@@ -1,14 +1,7 @@
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.asciidoctor:asciidoctor-gradle-plugin:${asciidocVersion}"
}
plugins {
id "org.asciidoctor.gradle.asciidoctor" version "1.5.1"
}

apply plugin: 'org.asciidoctor.convert'

asciidoctor {

sources {
Expand All @@ -24,4 +17,4 @@ asciidoctor {
idprefix: '',
idseparator: '-',
icons: 'font'
}
}

0 comments on commit 00b7caa

Please sign in to comment.