/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.media.data;
import java.lang.reflect.Array;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.xml.stream.XMLStreamReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.core.api.media.data.TagW.TagType;
import org.weasis.core.api.util.LocalUtil;
public final class TagUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(TagUtil.class);
private TagUtil() {
}
public static Date toLocalDate(TemporalAccessor temporal) {
if (temporal != null) {
try {
TemporalAccessor t = temporal;
if (temporal instanceof LocalDate) {
t = ((LocalDate) temporal).atStartOfDay(ZoneId.systemDefault());
} else if (temporal instanceof LocalTime) {
t = ((LocalTime) temporal).atDate(LocalDate.ofEpochDay(0)).atZone(ZoneId.systemDefault());
} else if (temporal instanceof LocalDateTime) {
t = ((LocalDateTime) temporal).atZone(ZoneId.systemDefault());
}
return Date.from(Instant.from(t));
} catch (Exception e) {
LOGGER.error("Date conversion", e); //$NON-NLS-1$
}
}
return null;
}
public static Date[] toLocalDates(Object array) {
if (array != null && array.getClass().isArray()) {
Date[] dates = new Date[Array.getLength(array)];
for (int i = 0; i < dates.length; i++) {
dates[i] = toLocalDate((TemporalAccessor) Array.get(array, i));
}
return dates;
}
return null;
}
public static LocalDate toLocalDate(Date date) {
if (date != null) {
try {
LocalDateTime datetime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
return datetime.toLocalDate();
} catch (Exception e) {
LOGGER.error("Date conversion", e); //$NON-NLS-1$
}
}
return null;
}
public static LocalTime toLocalTime(Date date) {
if (date != null) {
try {
LocalDateTime datetime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
return datetime.toLocalTime();
} catch (Exception e) {
LOGGER.error("Time conversion", e); //$NON-NLS-1$
}
}
return null;
}
public static LocalDateTime toLocalDateTime(Date date) {
if (date != null) {
try {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
} catch (Exception e) {
LOGGER.error("DateTime conversion", e); //$NON-NLS-1$
}
}
return null;
}
public static Date dateTime(Date date, Date time) {
if (time == null) {
return date;
} else if (date == null) {
return time;
}
Calendar calendarA = Calendar.getInstance();
calendarA.setTime(date);
Calendar calendarB = Calendar.getInstance();
calendarB.setTime(time);
calendarA.set(Calendar.HOUR_OF_DAY, calendarB.get(Calendar.HOUR_OF_DAY));
calendarA.set(Calendar.MINUTE, calendarB.get(Calendar.MINUTE));
calendarA.set(Calendar.SECOND, calendarB.get(Calendar.SECOND));
calendarA.set(Calendar.MILLISECOND, calendarB.get(Calendar.MILLISECOND));
return calendarA.getTime();
}
public static String formatDateTime(TemporalAccessor date) {
if (date instanceof LocalDate) {
return LocalUtil.getDateFormatter().format(date);
} else if (date instanceof LocalTime) {
return LocalUtil.getTimeFormatter().format(date);
} else if (date instanceof LocalDateTime) {
return LocalUtil.getDateTimeFormatter().format(date);
} else if (date instanceof Instant) {
return LocalUtil.getDateTimeFormatter().format(((Instant) date).atZone(ZoneId.systemDefault()));
}
return ""; //$NON-NLS-1$
}
public static TagW[] getTagFromKeywords(String... tagKey) {
ArrayList<TagW> list = new ArrayList<>();
if (tagKey != null) {
for (String key : tagKey) {
TagW t = TagW.get(key);
if (t != null) {
list.add(t);
}
}
}
return list.toArray(new TagW[list.size()]);
}
public static String getTagAttribute(XMLStreamReader xmler, String attribute, String defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
return val;
}
}
return defaultValue;
}
public static String[] getStringArrayTagAttribute(XMLStreamReader xmler, String attribute, String[] defaultValue) {
return getStringArrayTagAttribute(xmler, attribute, defaultValue, "\\"); //$NON-NLS-1$
}
public static String[] getStringArrayTagAttribute(XMLStreamReader xmler, String attribute, String[] defaultValue,
String separator) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
return val.split(separator);
}
}
return defaultValue;
}
public static Boolean getBooleanTagAttribute(XMLStreamReader xmler, String attribute, Boolean defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
try {
if (val != null) {
return Boolean.valueOf(val);
}
} catch (NumberFormatException e) {
LOGGER.error("Cannot parse boolean {} of {}", val, attribute); //$NON-NLS-1$
}
}
return defaultValue;
}
public static Integer getIntegerTagAttribute(XMLStreamReader xmler, String attribute, Integer defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
try {
if (val != null) {
return Integer.valueOf(val);
}
} catch (NumberFormatException e) {
LOGGER.error("Cannot parse integer {} of {}", val, attribute); //$NON-NLS-1$
}
}
return defaultValue;
}
public static int[] getIntArrayTagAttribute(XMLStreamReader xmler, String attribute, int[] defaultValue) {
return getIntArrayTagAttribute(xmler, attribute, defaultValue, "\\"); //$NON-NLS-1$
}
public static int[] getIntArrayTagAttribute(XMLStreamReader xmler, String attribute, int[] defaultValue,
String separator) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
String[] strs = val.split(separator);
int[] vals = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
vals[i] = Integer.parseInt(strs[0], 10);
}
return vals;
}
}
return defaultValue;
}
public static Double getDoubleTagAttribute(XMLStreamReader xmler, String attribute, Double defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
try {
if (val != null) {
return Double.valueOf(val);
}
} catch (NumberFormatException e) {
LOGGER.error("Cannot parse double {} of {}", val, attribute); //$NON-NLS-1$
}
}
return defaultValue;
}
public static double[] getDoubleArrayTagAttribute(XMLStreamReader xmler, String attribute, double[] defaultValue) {
return getDoubleArrayTagAttribute(xmler, attribute, defaultValue, "\\"); //$NON-NLS-1$
}
public static double[] getDoubleArrayTagAttribute(XMLStreamReader xmler, String attribute, double[] defaultValue,
String separator) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
String[] strs = val.split(separator);
double[] vals = new double[strs.length];
for (int i = 0; i < strs.length; i++) {
vals[i] = Double.parseDouble(strs[0]);
}
return vals;
}
}
return defaultValue;
}
public static Float getFloatTagAttribute(XMLStreamReader xmler, String attribute, Float defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
try {
if (val != null) {
return Float.valueOf(val);
}
} catch (NumberFormatException e) {
LOGGER.error("Cannot parse float {} of {}", val, attribute); //$NON-NLS-1$
}
}
return defaultValue;
}
public static float[] getFloatArrayTagAttribute(XMLStreamReader xmler, String attribute, float[] defaultValue) {
return getFloatArrayTagAttribute(xmler, attribute, defaultValue, "\\"); //$NON-NLS-1$
}
public static float[] getFloatArrayTagAttribute(XMLStreamReader xmler, String attribute, float[] defaultValue,
String separator) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
String[] strs = val.split(separator);
float[] vals = new float[strs.length];
for (int i = 0; i < strs.length; i++) {
vals[i] = Float.parseFloat(strs[0]);
}
return vals;
}
}
return defaultValue;
}
public static TemporalAccessor getDateFromElement(XMLStreamReader xmler, String attribute, TagType type,
TemporalAccessor defaultValue) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
try {
if (TagType.TIME.equals(type)) {
return LocalTime.parse(val);
} else if (TagType.DATETIME.equals(type)) {
return LocalDateTime.parse(val);
} else {
return LocalDate.parse(val);
}
} catch (Exception e) {
LOGGER.error("Parse date", e); //$NON-NLS-1$
}
}
}
return defaultValue;
}
public static TemporalAccessor[] getDatesFromElement(XMLStreamReader xmler, String attribute, TagType type,
TemporalAccessor[] defaultValue) {
return getDatesFromElement(xmler, attribute, type, defaultValue, "\\"); //$NON-NLS-1$
}
public static TemporalAccessor[] getDatesFromElement(XMLStreamReader xmler, String attribute, TagType type,
TemporalAccessor[] defaultValue, String separator) {
if (attribute != null) {
String val = xmler.getAttributeValue(null, attribute);
if (val != null) {
String[] strs = val.split(separator);
TemporalAccessor[] vals = new TemporalAccessor[strs.length];
for (int i = 0; i < strs.length; i++) {
try {
if (TagType.TIME.equals(type)) {
vals[i] = LocalTime.parse(strs[i]);
} else if (TagType.DATETIME.equals(type)) {
vals[i] = LocalDateTime.parse(strs[i]);
} else {
vals[i] = LocalDate.parse(strs[i]);
}
} catch (Exception e) {
LOGGER.error("Parse date", e); //$NON-NLS-1$
}
}
return vals;
}
}
return defaultValue;
}
public static boolean isEquals(Object value1, Object value2) {
if (value1 == null && value2 == null) {
return true;
}
if (value1 == null || value2 == null) {
return false;
}
if (value1.getClass().isArray()) {
if (!value2.getClass().isArray()) {
return false;
}
int vm1 = Array.getLength(value1);
int vm2 = Array.getLength(value2);
if (vm1 != vm2) {
return false;
}
for (int i = 0; i < vm1; i++) {
Object o1 = Array.get(value1, i);
Object o2 = Array.get(value2, i);
if (o1 == null && o2 == null) {
continue;
}
if (o1 != null && !o1.equals(o2)) {
return false;
}
}
return true;
} else {
return value1.equals(value2);
}
}
public static Object getTagValue(TagW tag, TagReadable... tagable) {
for (TagReadable t : tagable) {
if (t != null) {
Object val = t.getTagValue(tag);
if (val != null) {
return val;
}
}
}
return null;
}
/**
*
*
* @param value1
* @param value2
* @param ignoreCase
* (only when values are String)
* @return
*/
public static boolean isEquals(Object value1, Object value2, boolean ignoreCase) {
if (value1 == null && value2 == null) {
return true;
}
if (value1 == null || value2 == null) {
return false;
}
if (value1.getClass().isArray()) {
if (!value2.getClass().isArray()) {
return false;
}
int vm1 = Array.getLength(value1);
int vm2 = Array.getLength(value2);
if (vm1 != vm2) {
return false;
}
for (int i = 0; i < vm1; i++) {
Object o1 = Array.get(value1, i);
Object o2 = Array.get(value2, i);
if (o1 == null && o2 == null) {
continue;
}
if (ignoreCase && o1 instanceof String && o2 instanceof String) {
if (!((String) o1).equalsIgnoreCase((String) o2)) {
return false;
}
} else if (o1 != null && !o1.equals(o2)) {
return false;
}
}
return true;
} else {
if (ignoreCase && value1 instanceof String && value2 instanceof String) {
return ((String) value1).equalsIgnoreCase((String) value2);
}
return value1.equals(value2);
}
}
public static boolean isContaining(Object value, String s, boolean ignoreCase) {
if (value == null && s == null || s == null) {
return true;
}
if (value == null) {
return false;
}
if (value.getClass().isArray()) {
int vm1 = Array.getLength(value);
for (int i = 0; i < vm1; i++) {
Object o1 = Array.get(value, i);
if (o1 != null) {
if (ignoreCase && o1.toString().toLowerCase().contains(s.toLowerCase())) {
return true;
}
if (o1.toString().contains(s)) {
return true;
}
}
}
return false;
} else {
if (ignoreCase) {
return value.toString().toLowerCase().contains(s.toLowerCase());
}
return value.toString().contains(s);
}
}
}