Project

General

Profile

1 15502 dimitra.ke
package eu.dnetlib.data.search.transform.formatter;
2
3 28341 katerina.i
import eu.dnetlib.data.search.transform.FormatterException;
4
import eu.dnetlib.data.search.transform.utils.VelocityUtil;
5
import eu.dnetlib.domain.data.SearchResult;
6 15508 katerina.i
import org.apache.commons.io.IOUtils;
7 18915 katerina.i
import org.apache.commons.lang.StringEscapeUtils;
8 15502 dimitra.ke
import org.apache.log4j.Logger;
9
import org.apache.velocity.Template;
10
import org.apache.velocity.VelocityContext;
11
import org.apache.velocity.app.VelocityEngine;
12
13 28341 katerina.i
import javax.xml.transform.TransformerFactory;
14
import javax.xml.transform.stream.StreamResult;
15
import javax.xml.transform.stream.StreamSource;
16
import java.io.InputStream;
17
import java.io.StringReader;
18
import java.io.StringWriter;
19 28468 katerina.i
import java.text.SimpleDateFormat;
20 28341 katerina.i
import java.util.ArrayList;
21 28468 katerina.i
import java.util.Date;
22 28341 katerina.i
import java.util.List;
23 15502 dimitra.ke
24 23743 antonis.le
public class SimpleFormatter implements Formatter {
25 15502 dimitra.ke
26
	private javax.xml.transform.Transformer xmlTransformer = null;
27
	private StringWriter xmlResultResource = new StringWriter();
28 23743 antonis.le
29 15502 dimitra.ke
	private Template t = null;
30
31 31692 katerina.i
	private final Logger logger = Logger.getLogger(SimpleFormatter.class);
32 15502 dimitra.ke
33 23743 antonis.le
	public SimpleFormatter() throws FormatterException{
34
        StringWriter writer = null;
35
        InputStream inputStream = null;
36
37
        try	{
38
            VelocityEngine ve = VelocityUtil.getEngine();
39
            String clean_xsl = "/eu/dnetlib/data/search/transform/config/omit-xml-declaration.xsl";
40
41 38159 katerina.i
			t = ve.getTemplate("/eu/dnetlib/data/search/transform/config/format.vm", "UTF-8");
42 23743 antonis.le
            inputStream = this.getClass().getResource(clean_xsl).openStream();
43
			writer = new StringWriter();
44
45 15508 katerina.i
			IOUtils.copy(inputStream, writer);
46 23743 antonis.le
47
            String xsl = writer.toString();
48
			synchronized(this) {
49 18012 dimitra.ke
				xmlTransformer = TransformerFactory.newInstance().newTemplates(new StreamSource(new StringReader(xsl))).newTransformer();
50 38159 katerina.i
                xmlTransformer.setOutputProperty("encoding", "UTF-8");
51 18012 dimitra.ke
			}
52 15502 dimitra.ke
		} catch (Exception e) {
53
			logger.error("Error while creating a velocity template.", e);
54
			throw new FormatterException("Error while creating a velocity template.", e);
55 23743 antonis.le
		} finally {
56
            IOUtils.closeQuietly(writer);
57
            IOUtils.closeQuietly(inputStream);
58
        }
59 15502 dimitra.ke
	}
60
61 28341 katerina.i
    public SimpleFormatter(String template) throws FormatterException {
62
        StringWriter writer = null;
63
        InputStream inputStream = null;
64
65 28468 katerina.i
        logger.debug("Creating formatter with template " + template);
66
67 28341 katerina.i
        try	{
68
            VelocityEngine ve = VelocityUtil.getEngine();
69
            String clean_xsl = "/eu/dnetlib/data/search/transform/config/omit-xml-declaration.xsl";
70 38159 katerina.i
            t = ve.getTemplate("/eu/dnetlib/data/search/transform/config/" + template, "UTF-8");
71 28341 katerina.i
72
            inputStream = this.getClass().getResource(clean_xsl).openStream();
73
            writer = new StringWriter();
74
75
            IOUtils.copy(inputStream, writer);
76
77
            String xsl = writer.toString();
78
            synchronized(this) {
79
                xmlTransformer = TransformerFactory.newInstance().newTemplates(new StreamSource(new StringReader(xsl))).newTransformer();
80
            }
81
        } catch (Exception e) {
82
            logger.error("Error while creating a velocity template.", e);
83
            throw new FormatterException("Error while creating a velocity template.", e);
84 28468 katerina.i
85 28341 katerina.i
        } finally {
86
            IOUtils.closeQuietly(writer);
87
            IOUtils.closeQuietly(inputStream);
88
        }
89
    }
90
91 15502 dimitra.ke
	@Override
92 15508 katerina.i
	public String format(SearchResult result) throws FormatterException {
93 15770 dimitra.ke
		VelocityContext context = null;
94 15502 dimitra.ke
		try {
95 15770 dimitra.ke
			context = new VelocityContext();
96
		} catch (Exception e) {
97
			logger.error("Error while creating a Velocity context.", e);
98
			FormatterException fe = new FormatterException("Error while creating a Velocity context.", e);
99
			throw fe;
100
		}
101
		try {
102
			context.put("page", result.getPage());
103 18915 katerina.i
			context.put("query", StringEscapeUtils.escapeXml(result.getQuery()));
104 15508 katerina.i
			context.put("size", result.getSize());
105
			context.put("total", result.getTotal());
106
			context.put("locale", result.getLocale());
107 15770 dimitra.ke
			context.put("fields", result.getFields());
108 23743 antonis.le
109 28468 katerina.i
            SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z");
110
            context.put("currentDate", sdf.format(new Date()));
111
112 15673 katerina.i
			if(result.getSearchResults() == null)
113 15633 dimitra.ke
				context.put("results",null);
114 28468 katerina.i
			else {
115 31692 katerina.i
             //   logger.debug("After: " + clearDeclarations(result.getSearchResults()));
116 28468 katerina.i
                context.put("results", clearDeclarations(result.getSearchResults()));
117
            }
118 23743 antonis.le
119
			if (result.getBrowseResults() == null)
120 15633 dimitra.ke
				context.put("bresults",null);
121
			else
122
				context.put("bresults", clearDeclarations(result.getBrowseResults()));
123 15502 dimitra.ke
124
			StringWriter writer = new StringWriter();
125 28988 katerina.i
            //logger.debug("formating with " + t.getName() + "and results " + result.getSearchResults());
126 28468 katerina.i
127 15502 dimitra.ke
			t.merge(context, writer);
128 28468 katerina.i
129 15502 dimitra.ke
130
			return writer.toString();
131
132
		} catch (Exception e) {
133 15770 dimitra.ke
			String text = "Error while formatting.";
134
			if(result == null)
135
				text += " And result is null.";
136
			logger.error(text, e);
137 15502 dimitra.ke
			FormatterException fe = new FormatterException("Error while formatting.", e);
138
			throw fe;
139 15508 katerina.i
		}
140 15502 dimitra.ke
	}
141
142
	public List<String> clearDeclarations(List<String> results) throws FormatterException{
143
		List<String> cleared = new ArrayList<String>();
144
		for(String result: results){
145
			xmlResultResource.getBuffer().setLength(0);
146
			try {
147
				xmlTransformer.transform(new StreamSource(new StringReader(result)), new StreamResult(xmlResultResource));
148 15508 katerina.i
149 15502 dimitra.ke
			} catch (Exception e) {
150
				logger.warn("Error transforming xml.", e);
151
				throw new FormatterException();
152
			}
153
154
			cleared.add(xmlResultResource.getBuffer().toString());
155
		}
156
157
		return cleared;
158
	}
159
160
}