Skip to content
This repository has been archived by the owner on Nov 3, 2020. It is now read-only.

Commit

Permalink
export
Browse files Browse the repository at this point in the history
  • Loading branch information
gaetancollaud committed Aug 21, 2015
1 parent 781384f commit a9df7c5
Show file tree
Hide file tree
Showing 12 changed files with 223 additions and 20 deletions.
27 changes: 20 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -192,11 +192,11 @@
</dependency>

<!-- ReCaptcha -->
<dependency>
<groupId>net.tanesha.recaptcha4j</groupId>
<artifactId>recaptcha4j</artifactId>
<version>0.0.7</version>
</dependency>
<dependency>
<groupId>net.tanesha.recaptcha4j</groupId>
<artifactId>recaptcha4j</artifactId>
<version>0.0.7</version>
</dependency>

<!-- FIxme remove ? -->
<dependency>
Expand All @@ -208,6 +208,19 @@
</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<remoteTagging>true</remoteTagging>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down Expand Up @@ -255,6 +268,6 @@
<url>https://github.com/gaetancollaud/fablab-manager</url>
<connection>scm:git:git://github.com/gaetancollaud/fablab-manager.git</connection>
<developerConnection>scm:git:[email protected]:gaetancollaud/fablab-manager.git</developerConnection>
<tag>HEAD</tag>
</scm>
<tag>HEAD</tag>
</scm>
</project>
13 changes: 13 additions & 0 deletions src/main/java/net/collaud/fablab/manager/data/UserEO.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import lombok.Setter;
import lombok.ToString;
import net.collaud.fablab.manager.data.type.Gender;
import net.collaud.fablab.manager.export.CsvExport;
import net.collaud.fablab.manager.export.CsvField;

/**
*
Expand All @@ -43,6 +45,7 @@
@ToString
@NoArgsConstructor
@AllArgsConstructor
@CsvExport(fileName = "users")
public class UserEO extends AbstractDataEO<Integer> implements Serializable {

private static final long serialVersionUID = 1L;
Expand All @@ -64,26 +67,33 @@ public class UserEO extends AbstractDataEO<Integer> implements Serializable {
@JsonProperty
private String passwordNew;

@CsvField(headerName="Firstname")
@Column(name = "firstname", nullable = false)
private String firstname;

@CsvField(headerName="Lastname")
@Column(name = "lastname", nullable = false)
private String lastname;

@CsvField(headerName="Email")
@Column(name = "email", nullable = false, unique = true)
private String email;

@CsvField(headerName="Inscription date")
@Column(name = "date_inscr", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date dateInscr;

@CsvField(headerName="Rfid")
@Column(name = "rfid", nullable = true)
private String rfid;

@CsvField(headerName="birthdate")
@Column(name = "birthdate", nullable = true)
@Temporal(TemporalType.DATE)
private Date birthdate;

@CsvField(headerName="Gender")
@Column(name = "gender", nullable = true)
@Enumerated(EnumType.ORDINAL)
private Gender gender;
Expand All @@ -92,12 +102,15 @@ public class UserEO extends AbstractDataEO<Integer> implements Serializable {
@Column(name = "enabled", nullable = false)
private boolean enabled;

@CsvField(headerName="Phone")
@Column(name = "phone", nullable = true)
private String phone;

@CsvField(headerName="Address")
@Column(name = "address", nullable = true)
private String address;

@CsvField(headerName="Comment")
@Column(name = "comment", nullable = true)
private String comment;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import net.collaud.fablab.manager.data.UsageEO;
import net.collaud.fablab.manager.data.UserEO;
import net.collaud.fablab.manager.data.type.HistoryEntryType;
import net.collaud.fablab.manager.export.CsvExport;
import net.collaud.fablab.manager.export.CsvField;

/**
*
Expand All @@ -17,14 +19,21 @@
@Getter
@Setter
@EqualsAndHashCode(of = {"id", "type"})
@CsvExport(fileName = "accounting")
public class HistoryEntry implements Comparable<HistoryEntry> {

private final int id;
@CsvField(headerName = "type")
private final HistoryEntryType type;
@CsvField(headerName = "comment")
private final String comment;
@CsvField(headerName = "date")
private final Date date;
@CsvField(headerName = "amount")
private final double amount;
@CsvField(headerName = "detail")
private final String detail;
@CsvField(headerName = "user")
private final HistoryEntryUser user;

public HistoryEntry(PaymentEO payment) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,9 @@ public HistoryEntryUser(UserEO user){
this.firstname = user.getFirstname();
}

@Override
public String toString() {
return firstname+" "+lastname;
}

}
17 changes: 17 additions & 0 deletions src/main/java/net/collaud/fablab/manager/export/CsvExport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.collaud.fablab.manager.export;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
*
* @author Gaetan Collaud
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface CsvExport {
public String fileName();

}
81 changes: 81 additions & 0 deletions src/main/java/net/collaud/fablab/manager/export/CsvExporter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package net.collaud.fablab.manager.export;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.BinaryOperator;
import lombok.extern.slf4j.Slf4j;

/**
*
* @author Gaetan Collaud
*/
@Slf4j
public class CsvExporter<T> {

public static final String FIELD_SEPARATOR = ";";
public static final String LINE_SEPARATOR = "\n";
public static final String ESCAPE_CHAR = "\"";

private final Map<Field, CsvField> fields;
private final CsvExport classAnnotation;
private final StringBuilder builder;

public CsvExporter(Class<T> type) {
fields = new LinkedHashMap<>();
builder = new StringBuilder();
classAnnotation = Optional.ofNullable(type.getAnnotation(CsvExport.class))
.orElseThrow(() -> new IllegalArgumentException("Class " + type.getSimpleName() + " has no CsvExport annotation"));
Arrays.stream(type.getDeclaredFields())
.filter(f -> f.getAnnotation(CsvField.class) != null)
.forEach(f -> fields.put(f, f.getAnnotation(CsvField.class)));
}

public CsvExporter writeHeader() {
return writeLine(fields.values().stream()
.map(f -> f.headerName())
.reduce(reduce())
.orElse(""));
}

public CsvExporter writeRow(T obj) {
return writeLine(fields.keySet().stream()
.map(f -> getFieldValue(obj, f))
.reduce(reduce())
.orElse(""));
}

private BinaryOperator<String> reduce() {
return (l, r) ->l + FIELD_SEPARATOR + r ;
}

@Override
public String toString() {
return builder.toString();
}

public String getFileName() {
return classAnnotation.fileName();
}

private String getFieldValue(T obj, Field f) {
try {
f.setAccessible(true);
return Optional.ofNullable(f.get(obj))
.map(v -> v.toString())
.orElse("");
} catch (IllegalAccessException ex) {
log.error("Cannot access field " + f.getName(), ex);
return "";
}
}

private CsvExporter writeLine(String l) {
builder.append(l);
builder.append(LINE_SEPARATOR);
return this;
}

}
16 changes: 16 additions & 0 deletions src/main/java/net/collaud/fablab/manager/export/CsvField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.collaud.fablab.manager.export;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
*
* @author Gaetan Collaud
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface CsvField {
public String headerName();
}
24 changes: 24 additions & 0 deletions src/main/java/net/collaud/fablab/manager/rest/v1/AccoutingWS.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package net.collaud.fablab.manager.rest.v1;

import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import net.collaud.fablab.manager.annotation.JavascriptAPIConstant;
import net.collaud.fablab.manager.data.virtual.HistoryEntry;
import net.collaud.fablab.manager.export.CsvExporter;
import net.collaud.fablab.manager.rest.v1.criteria.PeriodSearchCriteria;
import net.collaud.fablab.manager.rest.v1.model.BaseModel;
import net.collaud.fablab.manager.rest.v1.model.DataModel;
Expand All @@ -10,6 +15,8 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
Expand All @@ -29,4 +36,21 @@ public BaseModel search(@Validated @RequestBody PeriodSearchCriteria search) {
return new DataModel(paymentService.getPaymentEntries(search));
}

@RequestMapping(value = "export", method = RequestMethod.GET, produces = "text/csv")
@ResponseBody
public String export(@RequestParam("dateFrom") Long dateFrom,@RequestParam("dateTo") Long dateTo, HttpServletResponse response) {
response.setContentType("text/csv");
Date from = new Date(dateFrom*1000);
Date to = new Date(dateTo*1000);
final List<HistoryEntry> list = paymentService.getPaymentEntries(new PeriodSearchCriteria(from, to));
if (list.isEmpty()) {
return "";
}
CsvExporter exporter = new CsvExporter<>(list.get(0).getClass());
response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s.csv\"",exporter.getFileName()));
exporter.writeHeader();
list.forEach(l -> exporter.writeRow(l));
return exporter.toString();
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package net.collaud.fablab.manager.rest.v1.base;

import java.util.List;
import javax.servlet.http.HttpServletResponse;
import lombok.Getter;
import lombok.Setter;
import net.collaud.fablab.manager.data.AbstractDataEO;
import net.collaud.fablab.manager.export.CsvExporter;
import net.collaud.fablab.manager.rest.v1.model.BaseModel;
import net.collaud.fablab.manager.rest.v1.model.DataModel;
import net.collaud.fablab.manager.service.global.ReadService;
Expand All @@ -19,11 +21,11 @@
* @param <SERVICE> repository
*/
abstract public class ReadRestWebservice<ENTITY extends AbstractDataEO, SERVICE extends ReadService<ENTITY>> {

@Setter
@Getter
private SERVICE service;

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public BaseModel list() {
Expand All @@ -32,6 +34,22 @@ public BaseModel list() {
return model;
}

@RequestMapping(value = "/export", method = RequestMethod.GET, produces = "text/csv")
@ResponseBody
public String export(HttpServletResponse response) {
response.setContentType("text/csv");

List<ENTITY> list = service.findAll();
if (list.isEmpty()) {
return "";
}
CsvExporter exporter = new CsvExporter<>(list.get(0).getClass());
response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s.csv\"",exporter.getFileName()));
exporter.writeHeader();
list.forEach(l -> exporter.writeRow(l));
return exporter.toString();
}

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public BaseModel get(@PathVariable("id") Integer id) {
Expand Down
Loading

0 comments on commit a9df7c5

Please sign in to comment.