blob: 9065f12ce914101d15c4253731c175e451b57626 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2009 IBM Corporation 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:
* IBM Corporation - initial implementation
*******************************************************************************/
package org.eclipse.epf.msproject.util;
import java.text.FieldPosition;
import java.text.ParseException;
import java.util.Date;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
import org.eclipse.emf.ecore.xml.type.internal.XMLCalendar;
import org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.SimpleDateFormat;
/**
* Create a slightly customized XMLHelperImpl class
*
* @author Bingxue Xu
* @since 1.0
*/
public class MsprojectXMLHelperImpl extends XMLHelperImpl implements XMLHelper {
protected static final DateFormat [] EDATE_FORMATS =
{
new SafeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"),
new SafeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"),
new SafeSimpleDateFormat("yyyy-MM-ddZ")
};
/**
* Constructor
* @param resource
*/
public MsprojectXMLHelperImpl(XMLResource resource) {
super(resource);
}
/**
* Convert boolean value to either "0" or "1"
* Convert DateTime value to be compatible with MS project
*/
public String convertToString(EFactory factory, EDataType dataType, Object value)
{
// org.eclipse.emf.ecore.xml.type.impl.XMLTypeFactoryImpl aFactory = new org.eclipse.emf.ecore.xml.type.impl.XMLTypeFactoryImpl();
// System.out.println("$$$$$ dataType name = " + dataType.getName());
if ("Boolean".equalsIgnoreCase(dataType.getName())) {
// System.out.println("$$$ need to override the Boolean: " + value);
if (value != null) {
String rs = "0";
try {
Boolean bObject = (Boolean)value;
if (bObject.booleanValue())
rs = "1";
} catch (Exception e) {}
// System.out.println("$$$ converted string = " + rs);
return rs;
}
return null;
} else if ("DateTime".equalsIgnoreCase(dataType.getName())) {
// System.out.println("$$$ need to override the DateTime: " + value.getClass() + "," + value);
if (value != null) {
String rs = value.toString();
if (value instanceof Date)
{
rs = EDATE_FORMATS[0].format((Date)value);
} else if (value instanceof XMLCalendar){
rs = ((XMLCalendar)value).toString();
int idx = rs.indexOf('.');
if (idx > 0)
rs = rs.substring(0, idx);
}
// System.out.println("$$$ converted string = " + rs);
return rs;
}
return null;
}
// System.out.println("$$$ EFactory, EDataType, value = " + factory + "," + dataType + "," + value);
String rs = super.convertToString( factory, dataType, value);
// System.out.println("$$$ converted string (out) = " + rs);
return rs;
}
/**
* Convert the 1 or 0 boolean value to an Boolean Object
* convert the datetime string into XMLCalendar object.
*/
protected Object createFromString(EFactory eFactory, EDataType eDataType, String value)
{
if ("Boolean".equalsIgnoreCase(eDataType.getName())) {
// System.out.println("$$$ need to convert from Boolean: " + value);
if (value != null) {
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("1"))
return Boolean.TRUE;
else
return Boolean.FALSE;
}
return null;
} else if ("DateTime".equalsIgnoreCase(eDataType.getName())) {
// System.out.println("$$$ need to convert from DateTime: " + value);
if (value != null) {
return new XMLCalendar(collapseWhiteSpace(value), XMLCalendar.DATETIME);
}
return null;
}
// System.out.println("$$$ EFactory, EDataType, value = " + eFactory + "," + eDataType + "," + value);
Object ro = super.createFromString( eFactory, eDataType, value);
// System.out.println("$$$ converted object (in) = " + ro);
return ro;
}
protected String collapseWhiteSpace(String value)
{
return XMLTypeUtil.normalize(value, true);
}
private static class SafeSimpleDateFormat extends SimpleDateFormat
{
private static final long serialVersionUID = 1L;
public SafeSimpleDateFormat(String pattern)
{
super(pattern);
}
public synchronized Date parse(String source) throws ParseException
{
return super.parse(source);
}
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos)
{
StringBuffer result = super.format(date, toAppendTo, pos);
// result.insert(result.length() - 2, ":");
return result;
}
}
}