IDEMPIERE-878 WebServices casts wrong / Custom DisplayType / Load DisplayTypes via OSGI. Merge custom display type patch from Jan Thielemann.

This commit is contained in:
Heng Sin Low 2013-05-03 16:38:50 +08:00
parent ff9ced3152
commit 870bf1e773
2 changed files with 147 additions and 1 deletions

View File

@ -0,0 +1,51 @@
/******************************************************************************
* Copyright (C) 2013 Jan Thielemann - jan.thielemann@evenos-consulting.de *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.adempiere.base;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import org.compiere.util.Language;
/**
* @author Jan Thielemann - jan.thielemann@evenos-consulting.de
* @author evenos Consulting GmbH - www.evenos.org
*/
public interface IDisplayTypeFactory {
public boolean isID(int displayType);
public boolean isNumeric(int displayType);
public Integer getDefaultPrecision(int displayType);
public boolean isText(int displayType);
public boolean isDate (int displayType);
public boolean isLookup(int displayType);
public boolean isLOB (int displayType);
public DecimalFormat getNumberFormat(int displayType, Language language, String pattern);
public SimpleDateFormat getDateFormat (int displayType, Language language, String pattern);
public Class<?> getClass (int displayType, boolean yesNoAsBoolean);
public String getSQLDataType (int displayType, String columnName, int fieldLength);
public String getDescription (int displayType);
}

View File

@ -50,12 +50,16 @@ import static org.compiere.model.SystemIDs.REFERENCE_DATATYPE_TIME;
import static org.compiere.model.SystemIDs.REFERENCE_DATATYPE_URL;
import static org.compiere.model.SystemIDs.REFERENCE_DATATYPE_YES_NO;
import org.adempiere.base.IDisplayTypeFactory;
import org.adempiere.base.Service;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.List;
/**
* System Display Types.
@ -184,6 +188,13 @@ public final class DisplayType
|| displayType == Account || displayType == Assignment || displayType == PAttribute
|| displayType == Image || displayType == Color)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isID(displayType))
return true;
}
return false;
} // isID
@ -198,6 +209,13 @@ public final class DisplayType
if (displayType == Amount || displayType == Number || displayType == CostPrice
|| displayType == Integer || displayType == Quantity)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isNumeric(displayType))
return true;
}
return false;
} // isNumeric
@ -216,6 +234,14 @@ public final class DisplayType
if (displayType == CostPrice
|| displayType == Quantity)
return 4;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.getDefaultPrecision(displayType) != null)
return factory.getDefaultPrecision(displayType).intValue();
}
return 0;
} // getDefaultPrecision
@ -232,6 +258,12 @@ public final class DisplayType
|| displayType == FilePath || displayType == FileName
|| displayType == URL || displayType == PrinterName)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isText(displayType))
return true;
}
return false;
} // isText
@ -245,6 +277,13 @@ public final class DisplayType
{
if (displayType == Date || displayType == DateTime || displayType == Time)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isDate(displayType))
return true;
}
return false;
} // isDate
@ -259,6 +298,13 @@ public final class DisplayType
if (displayType == List || displayType == Table
|| displayType == TableDir || displayType == Search)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isLookup(displayType))
return true;
}
return false;
} // isLookup
@ -272,6 +318,13 @@ public final class DisplayType
if (displayType == Binary
|| displayType == TextLong)
return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
if(factory.isLOB(displayType))
return true;
}
return false;
} // isLOB
@ -327,8 +380,16 @@ public final class DisplayType
format.setMaximumFractionDigits(MAX_FRACTION);
format.setMinimumFractionDigits(AMOUNT_FRACTION);
}
else // if (displayType == Number)
else
{
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
DecimalFormat osgiFormat = factory.getNumberFormat(displayType, myLanguage, pattern);
if(osgiFormat!=null){
return osgiFormat;
}
}
format.setMaximumIntegerDigits(MAX_DIGITS);
format.setMaximumFractionDigits(MAX_FRACTION);
format.setMinimumFractionDigits(1);
@ -426,6 +487,15 @@ public final class DisplayType
return myLanguage.getDateTimeFormat();
else if (displayType == Time)
return myLanguage.getTimeFormat();
else{
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
SimpleDateFormat osgiFormat = factory.getDateFormat(displayType, myLanguage, pattern);
if(osgiFormat!=null)
return osgiFormat;
}
}
// else if (displayType == Date)
return myLanguage.getDateFormat(); // default
} // getDateFormat
@ -476,6 +546,15 @@ public final class DisplayType
return String.class;
else if (isLOB(displayType)) // CLOB is String
return byte[].class;
else
{
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
Class<?> osgiClass = factory.getClass(displayType, yesNoAsBoolean);
if(osgiClass!=null)
return osgiClass;
}
}
//
return Object.class;
} // getClass
@ -542,6 +621,14 @@ public final class DisplayType
else
return "CHAR(" + fieldLength + ")";
}
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
String osgiSQLDataType = factory.getSQLDataType(displayType, columnName, fieldLength);
if(osgiSQLDataType!=null)
return osgiSQLDataType;
}
if (!DisplayType.isText(displayType))
s_log.severe("Unhandled Data Type = " + displayType);
@ -621,6 +708,14 @@ public final class DisplayType
return "PrinterName";
if (displayType == Payment)
return "Payment";
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
for(IDisplayTypeFactory factory : factoryList){
String osgiDescription = factory.getDescription(displayType);
if(osgiDescription!=null)
return osgiDescription;
}
//
return "UNKNOWN DisplayType=" + displayType;
} // getDescription