Project

General

Profile

1
package eu.dnetlib.data.search.transform.formatter;
2

    
3
import eu.dnetlib.data.search.transform.FormatterException;
4
import eu.dnetlib.data.search.transform.utils.VelocityUtil;
5
import eu.dnetlib.domain.data.SearchResult;
6
import org.apache.commons.io.IOUtils;
7
import org.apache.commons.lang.StringEscapeUtils;
8
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
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
import java.text.SimpleDateFormat;
20
import java.util.ArrayList;
21
import java.util.Date;
22
import java.util.List;
23

    
24
public class SimpleFormatter implements Formatter {
25

    
26
	private javax.xml.transform.Transformer xmlTransformer = null;
27
	private StringWriter xmlResultResource = new StringWriter();
28

    
29
	private Template t = null;
30
	
31
	private final Logger logger = Logger.getLogger(SimpleFormatter.class);
32
	
33
	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
			t = ve.getTemplate("/eu/dnetlib/data/search/transform/config/format.vm", "UTF-8");
42
            inputStream = this.getClass().getResource(clean_xsl).openStream();
43
			writer = new StringWriter();
44

    
45
			IOUtils.copy(inputStream, writer);		
46

    
47
            String xsl = writer.toString();
48
			synchronized(this) {
49
				xmlTransformer = TransformerFactory.newInstance().newTemplates(new StreamSource(new StringReader(xsl))).newTransformer();
50
                xmlTransformer.setOutputProperty("encoding", "UTF-8");
51
			}
52
		} 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
		} finally {
56
            IOUtils.closeQuietly(writer);
57
            IOUtils.closeQuietly(inputStream);
58
        }
59
	}
60

    
61
    public SimpleFormatter(String template) throws FormatterException {
62
        StringWriter writer = null;
63
        InputStream inputStream = null;
64

    
65
        logger.debug("Creating formatter with template " + template);
66

    
67
        try	{
68
            VelocityEngine ve = VelocityUtil.getEngine();
69
            String clean_xsl = "/eu/dnetlib/data/search/transform/config/omit-xml-declaration.xsl";
70
            t = ve.getTemplate("/eu/dnetlib/data/search/transform/config/" + template, "UTF-8");
71

    
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

    
85
        } finally {
86
            IOUtils.closeQuietly(writer);
87
            IOUtils.closeQuietly(inputStream);
88
        }
89
    }
90

    
91
	@Override
92
	public String format(SearchResult result) throws FormatterException {
93
		VelocityContext context = null;
94
		try {
95
			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
			context.put("query", StringEscapeUtils.escapeXml(result.getQuery()));
104
			context.put("size", result.getSize());
105
			context.put("total", result.getTotal());
106
			context.put("locale", result.getLocale());
107
			context.put("fields", result.getFields());
108

    
109
            SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z");
110
            context.put("currentDate", sdf.format(new Date()));
111

    
112
			if(result.getSearchResults() == null)
113
				context.put("results",null);
114
			else {
115
             //   logger.debug("After: " + clearDeclarations(result.getSearchResults()));
116
                context.put("results", clearDeclarations(result.getSearchResults()));
117
            }
118

    
119
			if (result.getBrowseResults() == null)
120
				context.put("bresults",null);
121
			else
122
				context.put("bresults", clearDeclarations(result.getBrowseResults()));
123
			
124
			StringWriter writer = new StringWriter();
125
            //logger.debug("formating with " + t.getName() + "and results " + result.getSearchResults());
126

    
127
			t.merge(context, writer);
128

    
129
			
130
			return writer.toString();
131
		
132
		} catch (Exception e) {
133
			String text = "Error while formatting.";
134
			if(result == null)
135
				text += " And result is null.";
136
			logger.error(text, e);
137
			FormatterException fe = new FormatterException("Error while formatting.", e);
138
			throw fe;
139
		}
140
	}
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
				
149
			} 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
}
(4-4/6)