blob: 097b5d611ec08723ae95ea7db9c6e3a83ab6ecc6 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.openatfx.mdf.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.asam.ods.NameValue;
import org.asam.ods.NameValueUnit;
import org.asam.ods.TS_Union;
import org.asam.ods.TS_Value;
import org.asam.ods.T_DCOMPLEX;
import org.asam.ods.T_ExternalReference;
import org.asam.ods.T_LONGLONG;
/**
* Helper class with ODS specific functions.
*
* @author Christian Rechner
*/
public abstract class ODSHelper {
// prepare dateformats to avoid instantiation a single object every time
// parsing a date.
private static Map<Integer, DateFormat> ODS_DATEFORMATS = new HashMap<Integer, DateFormat>();
static {
ODS_DATEFORMATS.put(4, new SimpleDateFormat("yyyy"));
ODS_DATEFORMATS.put(6, new SimpleDateFormat("yyyyMM"));
ODS_DATEFORMATS.put(8, new SimpleDateFormat("yyyyMMdd"));
ODS_DATEFORMATS.put(10, new SimpleDateFormat("yyyyMMddHH"));
ODS_DATEFORMATS.put(12, new SimpleDateFormat("yyyyMMddHHmm"));
ODS_DATEFORMATS.put(14, new SimpleDateFormat("yyyyMMddHHmmss"));
ODS_DATEFORMATS.put(17, new SimpleDateFormat("yyyyMMddHHmmssSSS"));
}
/**
* Return an ODS date from a <code>java.util.Date</code>.
*
* @param date
* the <code>java.util.Date</code> to convert
* @return the date in ODS date-format (YYYYMMDDhhmmss)
*/
public static synchronized String asODSDate(Date date) {
if (date == null) {
return "";
}
return ODS_DATEFORMATS.get(14).format(date);
}
/**
* Returns the java date from an ODS date.
*
* @param odsDate
* the ODS date string
* @return the java <code>java.util.Date</code> object, null if empty date
* @throws IllegalArgumentException
* unable to parse
*/
public static synchronized Date asJDate(String odsDate) {
try {
if (odsDate == null || odsDate.length() < 1) {
return null;
}
DateFormat format = ODS_DATEFORMATS.get(odsDate.length());
if (format == null) {
throw new IllegalArgumentException("Invalid ODS date: " + odsDate);
}
return format.parse(odsDate);
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid ODS date: " + odsDate);
}
}
/**
* Returns a Java long from ODS T_LONGLONG.
*
* @param ll
* ODS T_LONGLONG value
* @return Java long with the same value as ll
*/
public static long asJLong(T_LONGLONG ll) {
long tmp;
if (ll.low >= 0) {
tmp = ll.high * 0x100000000L + ll.low;
} else {
tmp = (ll.high + 1) * 0x100000000L + ll.low;
}
return tmp;
}
/**
* Returns an array of Java long from ODS T_LONGLONG.
*
* @param ll
* array of ODS T_LONGLONG values
* @return array of Java long values
*/
public static long[] asJLong(T_LONGLONG[] ll) {
long[] ar = new long[ll.length];
for (int i = 0; i < ll.length; i++) {
ar[i] = asJLong(ll[i]);
}
return ar;
}
/**
* Return ODS T_LONGLONG from Java long.
*
* @param v
* Java long value
* @return ODS T_LONGLONG with the same value as v
*/
public static T_LONGLONG asODSLongLong(long v) {
return new T_LONGLONG((int) (v >> 32 & 0xffffffffL), (int) (v & 0xffffffffL));
}
/**
* Returns an array of ODS T_LONGLONG from Java longs.
*
* @param v
* array of Java long values
* @return array of ODS T_LONGLONG values
*/
public static T_LONGLONG[] asODSLongLong(long[] v) {
T_LONGLONG[] ar = new T_LONGLONG[v.length];
for (int i = 0; i < v.length; i++) {
ar[i] = asODSLongLong(v[i]);
}
return ar;
}
public static String getCurrentODSDate() {
return asODSDate(new Date());
}
private static NameValue createNV(String valName, TS_Union union) {
NameValue nv = new NameValue();
nv.valName = valName;
nv.value = new TS_Value();
nv.value.flag = 15;
nv.value.u = union;
return nv;
}
private static NameValueUnit createNVU(String attrName, TS_Union union) {
NameValueUnit nvu = new NameValueUnit();
nvu.valName = attrName;
nvu.value = new TS_Value();
nvu.unit = "";
nvu.value.flag = 15;
nvu.value.u = union;
return nvu;
}
private static NameValueUnit createNVU(String attrName, TS_Union union, String unit) {
NameValueUnit nvu = new NameValueUnit();
nvu.valName = attrName;
nvu.value = new TS_Value();
nvu.value.u = new TS_Union();
nvu.unit = unit;
nvu.value.flag = 15;
nvu.value.u = union;
return nvu;
}
public static NameValueUnit createCurrentDateNVU(String attrName) {
TS_Union union = new TS_Union();
union.dateVal(getCurrentODSDate());
return createNVU(attrName, union);
}
public static NameValue createStringNV(String valName, String value) {
NameValue nv = new NameValue();
nv.valName = valName;
nv.value = new TS_Value();
nv.value.u = new TS_Union();
if (value == null) {
nv.value.flag = 0;
nv.value.u.stringVal("");
} else {
nv.value.flag = 15;
nv.value.u.stringVal(value);
}
return nv;
}
public static NameValueUnit createStringNVU(String valName, String value) {
NameValueUnit nvu = new NameValueUnit();
nvu.valName = valName;
nvu.value = new TS_Value();
nvu.unit = "";
nvu.value.u = new TS_Union();
if (value == null || value.length() < 1) {
nvu.value.flag = 0;
nvu.value.u.stringVal("");
} else {
nvu.value.flag = 15;
nvu.value.u.stringVal(value);
}
return nvu;
}
public static NameValue createShortNV(String valName, short value) {
TS_Union union = new TS_Union();
union.shortVal(value);
return createNV(valName, union);
}
public static NameValueUnit createShortNVU(String valName, short value) {
TS_Union union = new TS_Union();
union.shortVal(value);
return createNVU(valName, union);
}
public static NameValueUnit createShortNVU(String valName, short value, String unit) {
TS_Union union = new TS_Union();
union.shortVal(value);
return createNVU(valName, union, unit);
}
public static NameValue createFloatNV(String valName, float value) {
TS_Union union = new TS_Union();
union.floatVal(value);
return createNV(valName, union);
}
public static NameValueUnit createFloatNVU(String valName, float value) {
TS_Union union = new TS_Union();
union.floatVal(value);
return createNVU(valName, union);
}
public static NameValueUnit createFloatNVU(String valName, float value, String unit) {
TS_Union union = new TS_Union();
union.floatVal(value);
return createNVU(valName, union, unit);
}
public static NameValue createBooleanNV(String valName, boolean value) {
TS_Union union = new TS_Union();
union.booleanVal(value);
return createNV(valName, union);
}
public static NameValueUnit createBooleanNVU(String valName, boolean value) {
TS_Union union = new TS_Union();
union.booleanVal(value);
return createNVU(valName, union);
}
public static NameValue createByteNV(String valName, byte value) {
TS_Union union = new TS_Union();
union.byteVal(value);
return createNV(valName, union);
}
public static NameValueUnit createByteNVU(String valName, byte value) {
TS_Union union = new TS_Union();
union.byteVal(value);
return createNVU(valName, union);
}
public static NameValue createBytestrNV(String valName, byte value[]) {
TS_Union union = new TS_Union();
union.bytestrVal(value);
return createNV(valName, union);
}
public static NameValueUnit createBytestrNVU(String valName, byte value[]) {
TS_Union union = new TS_Union();
union.bytestrVal(value);
return createNVU(valName, union);
}
public static NameValue createDoubleNV(String valName, double value) {
TS_Union union = new TS_Union();
union.doubleVal(value);
return createNV(valName, union);
}
public static NameValueUnit createDoubleNVU(String valName, Double value) {
NameValueUnit nvu = new NameValueUnit();
nvu.valName = valName;
nvu.value = new TS_Value();
nvu.unit = "";
nvu.value.u = new TS_Union();
if (value == null) {
nvu.value.flag = 0;
nvu.value.u.doubleVal(0);
} else {
nvu.value.flag = 15;
nvu.value.u.doubleVal(value);
}
return nvu;
}
public static NameValue createDComplexNV(String valName, T_DCOMPLEX value) {
TS_Union union = new TS_Union();
union.dcomplexVal(value);
return createNV(valName, union);
}
public static NameValueUnit createDComplexNVU(String valName, T_DCOMPLEX value) {
TS_Union union = new TS_Union();
union.dcomplexVal(value);
return createNVU(valName, union);
}
public static NameValueUnit createDoubleNVU(String valName, double value, String unit) {
TS_Union union = new TS_Union();
union.doubleVal(value);
return createNVU(valName, union, unit);
}
public static NameValue createLongNV(String valName, int value) {
TS_Union union = new TS_Union();
union.longVal(value);
return createNV(valName, union);
}
public static NameValueUnit createLongNVU(String valName, int value) {
TS_Union union = new TS_Union();
union.longVal(value);
return createNVU(valName, union);
}
public static NameValueUnit createLongNVU(String valName, int value, String unit) {
TS_Union union = new TS_Union();
union.longVal(value);
return createNVU(valName, union, unit);
}
public static NameValue createLongLongNV(String valName, T_LONGLONG value) {
TS_Union union = new TS_Union();
union.longlongVal(value);
return createNV(valName, union);
}
public static NameValue createLongLongNV(String valName, long value) {
return createLongLongNV(valName, asODSLongLong(value));
}
public static NameValueUnit createLongLongNVU(String valName, long value) {
TS_Union union = new TS_Union();
union.longlongVal(asODSLongLong(value));
return createNVU(valName, union);
}
public static NameValueUnit createLongLongNVU(String valName, long value, String unit) {
TS_Union union = new TS_Union();
union.longlongVal(asODSLongLong(value));
return createNVU(valName, union, unit);
}
public static NameValue createDateNV(String valName, String value) {
NameValue nv = new NameValue();
nv.valName = valName;
nv.value = new TS_Value();
nv.value.u = new TS_Union();
if (value == null || value.length() < 1) {
nv.value.flag = 0;
nv.value.u.dateVal("");
} else {
nv.value.flag = 15;
nv.value.u.dateVal(value);
}
return nv;
}
public static NameValue createDateNV(String valName, Date value) {
return createDateNV(valName, asODSDate(value));
}
public static NameValueUnit createDateNVU(String valName, String value) {
NameValueUnit nvu = new NameValueUnit();
nvu.valName = valName;
nvu.value = new TS_Value();
nvu.unit = "";
nvu.value.u = new TS_Union();
if (value == null || value.length() < 1) {
nvu.value.flag = 0;
nvu.value.u.dateVal("");
} else {
nvu.value.flag = 15;
nvu.value.u.dateVal(value);
}
return nvu;
}
public static NameValueUnit createDateNVU(String valName, Date value) {
return createDateNVU(valName, asODSDate(value));
}
public static NameValue createEnumNV(String valName, int value) {
TS_Union union = new TS_Union();
union.enumVal(value);
return createNV(valName, union);
}
public static NameValueUnit createEnumNVU(String valName, int value) {
TS_Union union = new TS_Union();
union.enumVal(value);
return createNVU(valName, union);
}
public static NameValue createExtRefNV(String valName, T_ExternalReference value) {
TS_Union union = new TS_Union();
union.extRefVal(value);
return createNV(valName, union);
}
public static NameValueUnit createExtRefNVU(String valName, T_ExternalReference value) {
TS_Union union = new TS_Union();
union.extRefVal(value);
return createNVU(valName, union);
}
public static NameValue createStringSeqNV(String valName, String values[]) {
TS_Union union = new TS_Union();
union.stringSeq(values);
return createNV(valName, union);
}
public static NameValueUnit createStringSeqNVU(String valName, String values[]) {
TS_Union union = new TS_Union();
union.stringSeq(values);
return createNVU(valName, union);
}
public static NameValue createShortSeqNV(String valName, short values[]) {
TS_Union union = new TS_Union();
union.shortSeq(values);
return createNV(valName, union);
}
public static NameValueUnit createShortSeqNVU(String attrName, short values[]) {
TS_Union union = new TS_Union();
union.shortSeq(values);
return createNVU(attrName, union);
}
public static NameValue createFloatSeqNV(String attrName, float values[]) {
TS_Union union = new TS_Union();
union.floatSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createFloatSeqNVU(String attrName, float values[]) {
TS_Union union = new TS_Union();
union.floatSeq(values);
return createNVU(attrName, union);
}
public static NameValue createBooleanSeqNV(String attrName, boolean values[]) {
TS_Union union = new TS_Union();
union.booleanSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createBooleanSeqNVU(String attrName, boolean values[]) {
TS_Union union = new TS_Union();
union.booleanSeq(values);
return createNVU(attrName, union);
}
public static NameValue createByteSeqNV(String attrName, byte values[]) {
TS_Union union = new TS_Union();
union.byteSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createByteSeqNVU(String attrName, byte values[]) {
TS_Union union = new TS_Union();
union.byteSeq(values);
return createNVU(attrName, union);
}
public static NameValue createBytestrSeqNV(String valName, byte value[][]) {
TS_Union union = new TS_Union();
union.bytestrSeq(value);
return createNV(valName, union);
}
public static NameValueUnit createBytestrSeqNVU(String valName, byte value[][]) {
TS_Union union = new TS_Union();
union.bytestrSeq(value);
return createNVU(valName, union);
}
public static NameValue createDComplexSeqNV(String valName, T_DCOMPLEX value[]) {
TS_Union union = new TS_Union();
union.dcomplexSeq(value);
return createNV(valName, union);
}
public static NameValueUnit createDComplexSeqNVU(String valName, T_DCOMPLEX value[]) {
TS_Union union = new TS_Union();
union.dcomplexSeq(value);
return createNVU(valName, union);
}
public static NameValue createDoubleSeqNV(String attrName, double values[]) {
TS_Union union = new TS_Union();
union.doubleSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createDoubleSeqNVU(String attrName, double values[]) {
TS_Union union = new TS_Union();
union.doubleSeq(values);
return createNVU(attrName, union);
}
public static NameValue createEnumSeqNV(String valName, int value[]) {
TS_Union union = new TS_Union();
union.enumSeq(value);
return createNV(valName, union);
}
public static NameValueUnit createEnumSeqNVU(String valName, int value[]) {
TS_Union union = new TS_Union();
union.enumSeq(value);
return createNVU(valName, union);
}
public static NameValue createLongSeqNV(String attrName, int values[]) {
TS_Union union = new TS_Union();
union.longSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createLongSeqNVU(String attrName, int values[]) {
TS_Union union = new TS_Union();
union.longSeq(values);
return createNVU(attrName, union);
}
public static NameValue createLongLongSeqNV(String attrName, T_LONGLONG values[]) {
TS_Union union = new TS_Union();
union.longlongSeq(values);
return createNV(attrName, union);
}
public static NameValue createLongLongSeqNV(String attrName, long values[]) {
TS_Union union = new TS_Union();
union.longlongSeq(asODSLongLong(values));
return createNV(attrName, union);
}
public static NameValueUnit createLongLongSeqNVU(String attrName, long values[]) {
TS_Union union = new TS_Union();
union.longlongSeq(asODSLongLong(values));
return createNVU(attrName, union);
}
public static NameValue createDateSeqNV(String attrName, String values[]) {
TS_Union union = new TS_Union();
union.dateSeq(values);
return createNV(attrName, union);
}
public static NameValue createDateSeqNV(String attrName, Date values[]) {
String[] valuesstr = new String[values.length];
for (int i = 0; i < values.length; i++) {
valuesstr[i] = ODSHelper.asODSDate(values[i]);
}
return createDateSeqNV(attrName, valuesstr);
}
public static NameValueUnit createDateSeqNVU(String attrName, String values[]) {
TS_Union union = new TS_Union();
union.dateSeq(values);
return createNVU(attrName, union);
}
public static NameValue createExtRefSeqNV(String attrName, T_ExternalReference values[]) {
TS_Union union = new TS_Union();
union.extRefSeq(values);
return createNV(attrName, union);
}
public static NameValueUnit createExtRefSeqNVU(String attrName, T_ExternalReference values[]) {
TS_Union union = new TS_Union();
union.extRefSeq(values);
return createNVU(attrName, union);
}
public static boolean isNullVal(TS_Value value) {
if (value.flag != 15) {
return true;
}
return false;
}
public static boolean isNullVal(NameValueUnit nvu) {
if (nvu.value.flag != 15) {
return true;
}
return false;
}
public static long getLongLongVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return 0;
} else {
return asJLong(nvu.value.u.longlongVal());
}
}
public static int getLongVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return 0;
} else {
return nvu.value.u.longVal();
}
}
public static double getDoubleVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return 0d;
} else {
return nvu.value.u.doubleVal();
}
}
public static short getShortVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return (short) 0;
} else {
return nvu.value.u.shortVal();
}
}
public static byte getByteVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return (byte) 0;
} else {
return nvu.value.u.byteVal();
}
}
public static float getFloatVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return 0f;
} else {
return nvu.value.u.floatVal();
}
}
public static String getStringVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return "";
} else {
return nvu.value.u.stringVal();
}
}
public static int getEnumVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return 0;
} else {
return nvu.value.u.enumVal();
}
}
public static String getDateVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return "";
} else {
return nvu.value.u.dateVal();
}
}
public static boolean getBooleanVal(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return false;
} else {
return nvu.value.u.booleanVal();
}
}
public static String[] getStringSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new String[0];
} else {
return nvu.value.u.stringSeq();
}
}
public static short[] getShortSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new short[0];
} else {
return nvu.value.u.shortSeq();
}
}
public static float[] getFloatSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new float[0];
} else {
return nvu.value.u.floatSeq();
}
}
public static boolean[] getBooleanSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new boolean[0];
} else {
return nvu.value.u.booleanSeq();
}
}
public static byte[] getByteSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new byte[0];
} else {
return nvu.value.u.byteSeq();
}
}
public static int[] getLongSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new int[0];
} else {
return nvu.value.u.longSeq();
}
}
public static double[] getDoubleSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new double[0];
} else {
return nvu.value.u.doubleSeq();
}
}
public static long[] getLongLongSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new long[0];
} else {
return asJLong(nvu.value.u.longlongSeq());
}
}
public static String[] getDateSeq(NameValueUnit nvu) {
if (isNullVal(nvu)) {
return new String[0];
} else {
return nvu.value.u.stringSeq();
}
}
public static void setBit(byte[] data, int pos, boolean val) {
int posByte = pos / 8;
int posBit = pos % 8;
byte oldByte = data[posByte];
if (val) {
data[posByte] = (byte) (oldByte | 1 << 7 - posBit);
} else {
data[posByte] = (byte) (oldByte | 0 << 7 - posBit);
}
}
}