package edu.ucsf.mousedatabase;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang3.StringUtils;
import com.csvreader.CsvReader;
import edu.ucsf.mousedatabase.objects.MouseRecord;
public class HTMLUtilities {
private static Pattern emailValidationPtn = Pattern.compile("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}", Pattern.CASE_INSENSITIVE);
public static String p(String paragraphText)
{
return "<p>" + paragraphText + "</p>";
}
public static String table(String tableText)
{
return "<table>" + tableText + "</table>";
}
public static String tr(String tableText)
{
return "<tr>" + tableText + "</tr>";
}
public static String td(String tableText)
{
return "<td>" + tableText + "</td>";
}
public static void append(StringBuilder sb, Object o)
{
sb.append(o.toString());
}
public static void appendline(StringBuilder sb, Object o)
{
sb.append(o.toString());
sb.append("\r\n");
}
public static String extractFirstGroup(String regexPattern, String searchString)
{
if(searchString == null)
{
return null;
}
Pattern ptn = Pattern.compile(regexPattern);
Matcher match = ptn.matcher(searchString);
String result = null;
if (match.find())
{
if (match.groupCount() > 0) {
result = match.group(1);
}
}
return result;
}
public static String getCommentForDisplay(String generalComment)
{
if (generalComment == null)
{
return null;
}
String fixed = generalComment.replaceAll("<", "<");
fixed = fixed.replaceAll(">", ">");
fixed = fixed.replaceAll("\r\n", " <br>");
fixed = fixed.replaceAll("\n", " <br>");
fixed = fixed.replaceAll("\\[B](.*)\\[/B\\]","<b>$1</b>");
fixed = fixed.replaceAll("\\[URL\\](.*)\\[/URL\\]","<a href='$1'>$1</a>");
return fixed;
}
public static String getHttpResponse(URL url, String expectedContentType) throws Exception
{
URLConnection conn = url.openConnection();
// List all the response headers from the server.
// Note: The first call to getHeaderFieldKey() will implicit send
// the HTTP request to the server.
for (int i=0; ; i++) {
String headerName = conn.getHeaderFieldKey(i);
String headerValue = conn.getHeaderField(i);
if (headerName == null && headerValue == null) {
// No more headers
break;
}
if (headerName == null) {
if (headerValue.equals("HTTP/1.1 404 Not Found"))
{
throw new Exception(url.toString() + " returned a 404 error");
}
}
}
String contentType = conn.getContentType();
if (expectedContentType != null && !contentType.equals(expectedContentType))
{
throw new Exception("received invalid content type: " + contentType + ", expected: " + expectedContentType);
}
StringBuilder content = new StringBuilder();
BufferedReader in = new BufferedReader(
new InputStreamReader(
conn.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
content.append(inputLine + "\n");
}
in.close();
return content.toString();
}
public static ArrayList<HashMap<String,String>> readCSVFileFromStream(FileItem data, Charset encoding) throws Exception
{
ArrayList<HashMap<String,String>> csvData = new ArrayList<HashMap<String,String>>();
InputStream uploadedStream = data.getInputStream();
CsvReader reader = new CsvReader(uploadedStream,encoding);
if(!reader.readHeaders())
{
throw new Exception("No headers found in input file " + data.getName());
}
ArrayList<String> headers = new ArrayList<String>();
for(int i =0; i < reader.getHeaderCount();i++)
{
headers.add(i, reader.getHeader(i));
}
while(reader.readRecord())
{
HashMap<String,String> record = new HashMap<String,String>();
for(String header : headers)
{
record.put(header.toLowerCase(), reader.get(header));
}
if (isBlankRow(record)) continue;
csvData.add(record);
}
uploadedStream.close();
Log.Info("Read input file: " + data.getName() + ", " + data.getSize() + "bytes (" + csvData.size() + " records)");
return csvData;
}
private static boolean isBlankRow(HashMap<String,String> row)
{
for (String value : row.values())
{
if (value != null && !value.trim().equals("")) return false;
}
return true;
}
public static ArrayList<MouseRecord> addMice(ArrayList<MouseRecord> list, ArrayList<MouseRecord> mice) {
if (list == null || list.isEmpty()) return mice;
if (mice == null || mice.isEmpty()) return list;
for (MouseRecord newMouse : mice){
boolean exists = false;
for (MouseRecord exisiting : list) {
if (exisiting.getMouseID() == newMouse.getMouseID()) {
exists = true;
break;
}
}
if (exists) continue;
list.add(newMouse);
}
return list;
}
public static boolean validateEmail(String email){
if (email == null || email.isEmpty()) {
return false;
}
Matcher matcher = emailValidationPtn.matcher(email);
matcher.find();
if(matcher.matches()) {
return true;
}
return false;
}
public static void logRequest(HttpServletRequest request){
String params = "";
Map<String, String[]> parameters = request.getParameterMap();
for(String parameter : parameters.keySet()) {
String[] values = parameters.get(parameter);
params += " " + parameter + "=" + StringUtils.join(values, ",");
}
Log.Info(request.getMethod() + " " + request.getRequestURI() + " params: [" + params + " ]");
}
}