IDEMPIERE-4498 Performance: add cache for osgi services factory (#321)

* IDEMPIERE-4498 Performance: add cache for osgi services factory

add cache for tableName -> IModelFactory

* IDEMPIERE-4498 Performance: add cache for osgi services factory

implement cache for the discovery of osgi services

* IDEMPIERE-4498 Performance: add cache for osgi services factory

added unit test
This commit is contained in:
hengsin 2020-10-27 01:53:10 +08:00 committed by GitHub
parent e7fda64110
commit 9162b60af7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
64 changed files with 3156 additions and 455 deletions

View File

@ -45,9 +45,13 @@ import org.compiere.model.PaymentInterface;
import org.compiere.model.PaymentProcessor; import org.compiere.model.PaymentProcessor;
import org.compiere.model.StandardTaxProvider; import org.compiere.model.StandardTaxProvider;
import org.compiere.process.ProcessCall; import org.compiere.process.ProcessCall;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.PaymentExport; import org.compiere.util.PaymentExport;
import org.compiere.util.ReplenishInterface; import org.compiere.util.ReplenishInterface;
import org.idempiere.distributed.ICacheService;
import org.idempiere.distributed.IClusterService;
import org.idempiere.distributed.IMessageService;
import org.idempiere.fa.service.api.DepreciationFactoryLookupDTO; import org.idempiere.fa.service.api.DepreciationFactoryLookupDTO;
import org.idempiere.fa.service.api.IDepreciationMethod; import org.idempiere.fa.service.api.IDepreciationMethod;
import org.idempiere.fa.service.api.IDepreciationMethodFactory; import org.idempiere.fa.service.api.IDepreciationMethodFactory;
@ -63,6 +67,8 @@ public class Core {
private final static CLogger s_log = CLogger.getCLogger(Core.class); private final static CLogger s_log = CLogger.getCLogger(Core.class);
private static final CCache<String, IServiceReferenceHolder<IResourceFinder>> s_resourceFinderCache = new CCache<>(null, "IResourceFinder", 100, false);
/** /**
* @return list of active resource finder * @return list of active resource finder
*/ */
@ -70,16 +76,33 @@ public class Core {
return new IResourceFinder() { return new IResourceFinder() {
public URL getResource(String name) { public URL getResource(String name) {
List<IResourceFinder> f = Service.locator().list(IResourceFinder.class).getServices(); IServiceReferenceHolder<IResourceFinder> cache = s_resourceFinderCache.get(name);
for (IResourceFinder finder : f) { if (cache != null) {
URL url = finder.getResource(name); IResourceFinder service = cache.getService();
if (url!=null) if (service != null) {
return url; URL url = service.getResource(name);
if (url!=null)
return url;
}
s_resourceFinderCache.remove(name);
}
List<IServiceReferenceHolder<IResourceFinder>> f = Service.locator().list(IResourceFinder.class).getServiceReferences();
for (IServiceReferenceHolder<IResourceFinder> finder : f) {
IResourceFinder service = finder.getService();
if (service != null) {
URL url = service.getResource(name);
if (url!=null) {
s_resourceFinderCache.put(name, finder);
return url;
}
}
} }
return null; return null;
} }
}; };
} }
private static final CCache<String, List<IServiceReferenceHolder<IColumnCalloutFactory>>> s_columnCalloutFactoryCache = new CCache<>(null, "List<IColumnCalloutFactory>", 100, false);
/** /**
* *
@ -89,20 +112,56 @@ public class Core {
*/ */
public static List<IColumnCallout> findCallout(String tableName, String columnName) { public static List<IColumnCallout> findCallout(String tableName, String columnName) {
List<IColumnCallout> list = new ArrayList<IColumnCallout>(); List<IColumnCallout> list = new ArrayList<IColumnCallout>();
List<IColumnCalloutFactory> factories = Service.locator().list(IColumnCalloutFactory.class).getServices();
String cacheKey = tableName + "." + columnName;
List<IServiceReferenceHolder<IColumnCalloutFactory>> cache = s_columnCalloutFactoryCache.get(cacheKey);
if (cache != null) {
boolean staleReference = false;
for (IServiceReferenceHolder<IColumnCalloutFactory> factory : cache) {
IColumnCalloutFactory service = factory.getService();
if (service != null) {
IColumnCallout[] callouts = service.getColumnCallouts(tableName, columnName);
if (callouts != null && callouts.length > 0) {
for(IColumnCallout callout : callouts) {
list.add(callout);
}
} else {
staleReference = true;
break;
}
} else {
staleReference = true;
break;
}
}
if (!staleReference)
return list;
else
s_columnCalloutFactoryCache.remove(cacheKey);
}
List<IServiceReferenceHolder<IColumnCalloutFactory>> factories = Service.locator().list(IColumnCalloutFactory.class).getServiceReferences();
List<IServiceReferenceHolder<IColumnCalloutFactory>> found = new ArrayList<>();
if (factories != null) { if (factories != null) {
for(IColumnCalloutFactory factory : factories) { for(IServiceReferenceHolder<IColumnCalloutFactory> factory : factories) {
IColumnCallout[] callouts = factory.getColumnCallouts(tableName, columnName); IColumnCalloutFactory service = factory.getService();
if (callouts != null && callouts.length > 0) { if (service != null) {
for(IColumnCallout callout : callouts) { IColumnCallout[] callouts = service.getColumnCallouts(tableName, columnName);
list.add(callout); if (callouts != null && callouts.length > 0) {
for(IColumnCallout callout : callouts) {
list.add(callout);
}
found.add(factory);
} }
} }
} }
s_columnCalloutFactoryCache.put(cacheKey, found);
} }
return list; return list;
} }
private static final CCache<String, IServiceReferenceHolder<ICalloutFactory>> s_calloutFactoryCache = new CCache<>(null, "ICalloutFactory", 100, false);
// IDEMPIERE-2732 // IDEMPIERE-2732
/** /**
* *
@ -111,31 +170,65 @@ public class Core {
* @return callout for className * @return callout for className
*/ */
public static Callout getCallout(String className, String methodName) { public static Callout getCallout(String className, String methodName) {
List<ICalloutFactory> factories = Service.locator().list(ICalloutFactory.class).getServices(); String cacheKey = className + "::" + methodName;
if (factories != null) { IServiceReferenceHolder<ICalloutFactory> cache = s_calloutFactoryCache.get(cacheKey);
for(ICalloutFactory factory : factories) { if (cache != null) {
Callout callout = factory.getCallout(className, methodName); ICalloutFactory service = cache.getService();
if (service != null) {
Callout callout = service.getCallout(className, methodName);
if (callout != null) { if (callout != null) {
return callout; return callout;
} }
} }
s_calloutFactoryCache.remove(cacheKey);
}
List<IServiceReferenceHolder<ICalloutFactory>> factories = Service.locator().list(ICalloutFactory.class).getServiceReferences();
if (factories != null) {
for(IServiceReferenceHolder<ICalloutFactory> factory : factories) {
ICalloutFactory service = factory.getService();
if (service != null) {
Callout callout = service.getCallout(className, methodName);
if (callout != null) {
s_calloutFactoryCache.put(cacheKey, factory);
return callout;
}
}
}
} }
return null; return null;
} }
private static final CCache<String, IServiceReferenceHolder<IProcessFactory>> s_processFactoryCache = new CCache<>(null, "IProcessFactory", 100, false);
/** /**
* *
* @param processId Java class name or equinox extension id * @param processId Java class name or equinox extension id
* @return ProcessCall instance or null if processId not found * @return ProcessCall instance or null if processId not found
*/ */
public static ProcessCall getProcess(String processId) { public static ProcessCall getProcess(String processId) {
List<IProcessFactory> factories = getProcessFactories(); IServiceReferenceHolder<IProcessFactory> cache = s_processFactoryCache.get(processId);
if (factories != null && !factories.isEmpty()) { if (cache != null) {
for(IProcessFactory factory : factories) { IProcessFactory service = cache.getService();
ProcessCall process = factory.newProcessInstance(processId); if (service != null) {
ProcessCall process = service.newProcessInstance(processId);
if (process != null) if (process != null)
return process; return process;
} }
s_processFactoryCache.remove(processId);
}
List<IServiceReferenceHolder<IProcessFactory>> factories = getProcessFactories();
if (factories != null && !factories.isEmpty()) {
for(IServiceReferenceHolder<IProcessFactory> factory : factories) {
IProcessFactory service = factory.getService();
if (service != null) {
ProcessCall process = service.newProcessInstance(processId);
if (process != null) {
s_processFactoryCache.put(processId, factory);
return process;
}
}
}
} }
return null; return null;
} }
@ -144,18 +237,19 @@ public class Core {
* This method load the process factories waiting until the DefaultProcessFactory on base is loaded (IDEMPIERE-3829) * This method load the process factories waiting until the DefaultProcessFactory on base is loaded (IDEMPIERE-3829)
* @return List of factories implementing IProcessFactory * @return List of factories implementing IProcessFactory
*/ */
private static List<IProcessFactory> getProcessFactories() { private static List<IServiceReferenceHolder<IProcessFactory>> getProcessFactories() {
List<IProcessFactory> factories = null; List<IServiceReferenceHolder<IProcessFactory>> factories = null;
int maxIterations = 5; int maxIterations = 5;
int waitMillis = 1000; int waitMillis = 1000;
int iterations = 0; int iterations = 0;
boolean foundDefault = false; boolean foundDefault = false;
while (true) { while (true) {
factories = Service.locator().list(IProcessFactory.class).getServices(); factories = Service.locator().list(IProcessFactory.class).getServiceReferences();
if (factories != null && !factories.isEmpty()) { if (factories != null && !factories.isEmpty()) {
for(IProcessFactory factory : factories) { for(IServiceReferenceHolder<IProcessFactory> factory : factories) {
// wait until DefaultProcessFactory is loaded // wait until DefaultProcessFactory is loaded
if (factory instanceof DefaultProcessFactory) { IProcessFactory service = factory.getService();
if (service instanceof DefaultProcessFactory) {
foundDefault = true; foundDefault = true;
break; break;
} }
@ -173,32 +267,64 @@ public class Core {
return factories; return factories;
} }
private static final CCache<String, IServiceReferenceHolder<IModelValidatorFactory>> s_modelValidatorFactoryCache = new CCache<>(null, "IModelValidatorFactory", 100, false);
/** /**
* *
* @param validatorId Java class name or equinox extension Id * @param validatorId Java class name or equinox extension Id
* @return ModelValidator instance of null if validatorId not found * @return ModelValidator instance of null if validatorId not found
*/ */
public static ModelValidator getModelValidator(String validatorId) { public static ModelValidator getModelValidator(String validatorId) {
List<IModelValidatorFactory> factoryList = Service.locator().list(IModelValidatorFactory.class).getServices(); IServiceReferenceHolder<IModelValidatorFactory> cache = s_modelValidatorFactoryCache.get(validatorId);
if (factoryList != null) { if (cache != null) {
for(IModelValidatorFactory factory : factoryList) { IModelValidatorFactory service = cache.getService();
ModelValidator validator = factory.newModelValidatorInstance(validatorId); if (service != null) {
ModelValidator validator = service.newModelValidatorInstance(validatorId);
if (validator != null) if (validator != null)
return validator; return validator;
} }
s_modelValidatorFactoryCache.remove(validatorId);
}
List<IServiceReferenceHolder<IModelValidatorFactory>> factoryList = Service.locator().list(IModelValidatorFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IModelValidatorFactory> factory : factoryList) {
IModelValidatorFactory service = factory.getService();
if (service != null) {
ModelValidator validator = service.newModelValidatorInstance(validatorId);
if (validator != null) {
s_modelValidatorFactoryCache.put(validatorId, factory);
return validator;
}
}
}
} }
return null; return null;
} }
private static IServiceReferenceHolder<IKeyStore> s_keystoreServiceReference = null;
/** /**
* *
* @return keystore * @return {@link IKeyStore}
*/ */
public static IKeyStore getKeyStore(){ public static IKeyStore getKeyStore(){
return Service.locator().locate(IKeyStore.class).getService(); IKeyStore keystoreService = null;
if (s_keystoreServiceReference != null) {
keystoreService = s_keystoreServiceReference.getService();
if (keystoreService != null)
return keystoreService;
}
IServiceReferenceHolder<IKeyStore> serviceReference = Service.locator().locate(IKeyStore.class).getServiceReference();
if (serviceReference != null) {
keystoreService = serviceReference.getService();
s_keystoreServiceReference = serviceReference;
}
return keystoreService;
} }
private static final CCache<String, IServiceReferenceHolder<IPaymentProcessorFactory>> s_paymentProcessorFactoryCache = new CCache<>(null, "IPaymentProcessorFactory", 100, false);
/** /**
* Get payment processor instance * Get payment processor instance
* @param mbap payment processor model * @param mbap payment processor model
@ -216,14 +342,31 @@ public class Core {
} }
// //
PaymentProcessor myProcessor = null; PaymentProcessor myProcessor = null;
IServiceReferenceHolder<IPaymentProcessorFactory> cache = s_paymentProcessorFactoryCache.get(className);
List<IPaymentProcessorFactory> factoryList = Service.locator().list(IPaymentProcessorFactory.class).getServices(); if (cache != null) {
if (factoryList != null) { IPaymentProcessorFactory service = cache.getService();
for(IPaymentProcessorFactory factory : factoryList) { if (service != null) {
PaymentProcessor processor = factory.newPaymentProcessorInstance(className); PaymentProcessor processor = service.newPaymentProcessorInstance(className);
if (processor != null) { if (processor != null)
myProcessor = processor; myProcessor = processor;
break; }
if (myProcessor == null)
s_paymentProcessorFactoryCache.remove(className);
}
if (myProcessor == null) {
List<IServiceReferenceHolder<IPaymentProcessorFactory>> factoryList = Service.locator().list(IPaymentProcessorFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IPaymentProcessorFactory> factory : factoryList) {
IPaymentProcessorFactory service = factory.getService();
if (service != null) {
PaymentProcessor processor = service.newPaymentProcessorInstance(className);
if (processor != null) {
myProcessor = processor;
s_paymentProcessorFactoryCache.put(className, factory);
break;
}
}
} }
} }
} }
@ -239,6 +382,8 @@ public class Core {
return myProcessor; return myProcessor;
} }
private static final CCache<String, IServiceReferenceHolder<IBankStatementLoaderFactory>> s_bankStatementLoaderFactoryCache = new CCache<>(null, "IBankStatementLoaderFactory", 100, false);
/** /**
* get BankStatementLoader instance * get BankStatementLoader instance
* *
@ -252,15 +397,30 @@ public class Core {
} }
BankStatementLoaderInterface myBankStatementLoader = null; BankStatementLoaderInterface myBankStatementLoader = null;
IServiceReferenceHolder<IBankStatementLoaderFactory> cache = s_bankStatementLoaderFactoryCache.get(className);
List<IBankStatementLoaderFactory> factoryList = if (cache != null) {
Service.locator().list(IBankStatementLoaderFactory.class).getServices(); IBankStatementLoaderFactory service = cache.getService();
if (factoryList != null) { if (service != null) {
for(IBankStatementLoaderFactory factory : factoryList) { BankStatementLoaderInterface loader = service.newBankStatementLoaderInstance(className);
BankStatementLoaderInterface loader = factory.newBankStatementLoaderInstance(className); if (loader != null)
if (loader != null) {
myBankStatementLoader = loader; myBankStatementLoader = loader;
break; }
if (myBankStatementLoader == null)
s_bankStatementLoaderFactoryCache.remove(className);
}
if (myBankStatementLoader == null) {
List<IServiceReferenceHolder<IBankStatementLoaderFactory>> factoryList = Service.locator().list(IBankStatementLoaderFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IBankStatementLoaderFactory> factory : factoryList) {
IBankStatementLoaderFactory service = factory.getService();
if (service != null) {
BankStatementLoaderInterface loader = service.newBankStatementLoaderInstance(className);
if (loader != null) {
myBankStatementLoader = loader;
s_bankStatementLoaderFactoryCache.put(className, factory);
break;
}
}
} }
} }
} }
@ -273,6 +433,8 @@ public class Core {
return myBankStatementLoader; return myBankStatementLoader;
} }
private static final CCache<String, IServiceReferenceHolder<IBankStatementMatcherFactory>> s_bankStatementMatcherFactoryCache = new CCache<>(null, "IBankStatementMatcherFactory", 100, false);
/** /**
* get BankStatementMatcher instance * get BankStatementMatcher instance
* *
@ -286,15 +448,30 @@ public class Core {
} }
BankStatementMatcherInterface myBankStatementMatcher = null; BankStatementMatcherInterface myBankStatementMatcher = null;
IServiceReferenceHolder<IBankStatementMatcherFactory> cache = s_bankStatementMatcherFactoryCache.get(className);
List<IBankStatementMatcherFactory> factoryList = if (cache != null) {
Service.locator().list(IBankStatementMatcherFactory.class).getServices(); IBankStatementMatcherFactory service = cache.getService();
if (factoryList != null) { if (service != null) {
for(IBankStatementMatcherFactory factory : factoryList) { BankStatementMatcherInterface matcher = service.newBankStatementMatcherInstance(className);
BankStatementMatcherInterface matcher = factory.newBankStatementMatcherInstance(className); if (matcher != null)
if (matcher != null) {
myBankStatementMatcher = matcher; myBankStatementMatcher = matcher;
break; }
if (myBankStatementMatcher == null)
s_bankStatementMatcherFactoryCache.remove(className);
}
if (myBankStatementMatcher == null) {
List<IServiceReferenceHolder<IBankStatementMatcherFactory>> factoryList = Service.locator().list(IBankStatementMatcherFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IBankStatementMatcherFactory> factory : factoryList) {
IBankStatementMatcherFactory service = factory.getService();
if (service != null) {
BankStatementMatcherInterface matcher = service.newBankStatementMatcherInstance(className);
if (matcher != null) {
myBankStatementMatcher = matcher;
s_bankStatementMatcherFactoryCache.put(className, factory);
break;
}
}
} }
} }
} }
@ -307,6 +484,8 @@ public class Core {
return myBankStatementMatcher; return myBankStatementMatcher;
} }
private static final CCache<String, IServiceReferenceHolder<IShipmentProcessorFactory>> s_shipmentProcessorFactoryCache = new CCache<>(null, "IShipmentProcessorFactory", 100, false);
/** /**
* *
* @param sf * @param sf
@ -322,20 +501,37 @@ public class Core {
s_log.log(Level.SEVERE, "Shipment processor or class not defined for shipper " + sf); s_log.log(Level.SEVERE, "Shipment processor or class not defined for shipper " + sf);
return null; return null;
} }
List<IShipmentProcessorFactory> factoryList = Service.locator().list(IShipmentProcessorFactory.class).getServices(); IServiceReferenceHolder<IShipmentProcessorFactory> cache = s_shipmentProcessorFactoryCache.get(className);
if (cache != null) {
IShipmentProcessorFactory service = cache.getService();
if (service != null) {
IShipmentProcessor processor = service.newShipmentProcessorInstance(className);
if (processor != null)
return processor;
}
s_shipmentProcessorFactoryCache.remove(className);
}
List<IServiceReferenceHolder<IShipmentProcessorFactory>> factoryList = Service.locator().list(IShipmentProcessorFactory.class).getServiceReferences();
if (factoryList == null) if (factoryList == null)
return null; return null;
for (IShipmentProcessorFactory factory : factoryList) for (IServiceReferenceHolder<IShipmentProcessorFactory> factory : factoryList)
{ {
IShipmentProcessor processor = factory.newShipmentProcessorInstance(className); IShipmentProcessorFactory service = factory.getService();
if (processor != null) if (service != null) {
return processor; IShipmentProcessor processor = service.newShipmentProcessorInstance(className);
if (processor != null) {
s_shipmentProcessorFactoryCache.put(className, factory);
return processor;
}
}
} }
return null; return null;
} }
private static final CCache<String, IServiceReferenceHolder<IAddressValidationFactory>> s_addressValidationFactoryCache = new CCache<>(null, "IAddressValidationFactory", 100, false);
/** /**
* Get address validation instance * Get address validation instance
* @param validation * @param validation
@ -350,19 +546,36 @@ public class Core {
return null; return null;
} }
List<IAddressValidationFactory> factoryList = Service.locator().list(IAddressValidationFactory.class).getServices(); IServiceReferenceHolder<IAddressValidationFactory> cache = s_addressValidationFactoryCache.get(className);
if (cache != null) {
IAddressValidationFactory service = cache.getService();
if (service != null) {
IAddressValidation processor = service.newAddressValidationInstance(className);
if (processor != null)
return processor;
}
s_addressValidationFactoryCache.remove(className);
}
List<IServiceReferenceHolder<IAddressValidationFactory>> factoryList = Service.locator().list(IAddressValidationFactory.class).getServiceReferences();
if (factoryList == null) if (factoryList == null)
return null; return null;
for (IAddressValidationFactory factory : factoryList) for (IServiceReferenceHolder<IAddressValidationFactory> factory : factoryList)
{ {
IAddressValidation processor = factory.newAddressValidationInstance(className); IAddressValidationFactory service = factory.getService();
if (processor != null) if (service != null) {
return processor; IAddressValidation processor = service.newAddressValidationInstance(className);
if (processor != null) {
s_addressValidationFactoryCache.put(className, factory);
return processor;
}
}
} }
return null; return null;
} }
private static final CCache<String, IServiceReferenceHolder<ITaxProviderFactory>> s_taxProviderFactoryCache = new CCache<>(null, "ITaxProviderFactory", 100, false);
/** /**
* Get tax provider instance * Get tax provider instance
* @param provider * @param provider
@ -388,43 +601,75 @@ public class Core {
s_log.log(Level.SEVERE, "Tax provider class not defined: " + provider); s_log.log(Level.SEVERE, "Tax provider class not defined: " + provider);
return null; return null;
} }
List<ITaxProviderFactory> factoryList = Service.locator().list(ITaxProviderFactory.class).getServices(); IServiceReferenceHolder<ITaxProviderFactory> cache = s_taxProviderFactoryCache.get(className);
if (cache != null) {
ITaxProviderFactory service = cache.getService();
if (service != null) {
calculator = service.newTaxProviderInstance(className);
if (calculator != null)
return calculator;
}
s_taxProviderFactoryCache.remove(className);
}
List<IServiceReferenceHolder<ITaxProviderFactory>> factoryList = Service.locator().list(ITaxProviderFactory.class).getServiceReferences();
if (factoryList == null) if (factoryList == null)
return null; return null;
for (ITaxProviderFactory factory : factoryList) for (IServiceReferenceHolder<ITaxProviderFactory> factory : factoryList)
{ {
calculator = factory.newTaxProviderInstance(className); ITaxProviderFactory service = factory.getService();
if (calculator != null) if (service != null) {
return calculator; calculator = service.newTaxProviderInstance(className);
if (calculator != null) {
s_taxProviderFactoryCache.put(className, factory);
return calculator;
}
}
} }
} }
return null; return null;
} }
private static final CCache<String, IServiceReferenceHolder<IReplenishFactory>> s_replenishFactoryCache = new CCache<>(null, "IReplenishFactory", 100, false);
/** /**
* get Custom Replenish instance * get Custom Replenish instance
* *
* @param className * @param className
* @return instance of the ReplenishInterface or null * @return instance of the ReplenishInterface or null
*/ */
public static ReplenishInterface getReplenish(String className){ public static ReplenishInterface getReplenish(String className) {
if (className == null || className.length() == 0) { if (className == null || className.length() == 0) {
s_log.log(Level.SEVERE, "No ReplenishInterface class name"); s_log.log(Level.SEVERE, "No ReplenishInterface class name");
return null; return null;
} }
ReplenishInterface myReplenishInstance = null; ReplenishInterface myReplenishInstance = null;
IServiceReferenceHolder<IReplenishFactory> cache = s_replenishFactoryCache.get(className);
List<IReplenishFactory> factoryList = if (cache != null) {
Service.locator().list(IReplenishFactory.class).getServices(); IReplenishFactory service = cache.getService();
if (factoryList != null) { if (service != null) {
for(IReplenishFactory factory : factoryList) { ReplenishInterface loader = service.newReplenishInstance(className);
ReplenishInterface loader = factory.newReplenishInstance(className); if (loader != null)
if (loader != null) {
myReplenishInstance = loader; myReplenishInstance = loader;
break; }
if (myReplenishInstance == null)
s_replenishFactoryCache.remove(className);
}
if (myReplenishInstance == null) {
List<IServiceReferenceHolder<IReplenishFactory>> factoryList = Service.locator().list(IReplenishFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IReplenishFactory> factory : factoryList) {
IReplenishFactory service = factory.getService();
if (service != null) {
ReplenishInterface loader = service.newReplenishInstance(className);
if (loader != null) {
myReplenishInstance = loader;
s_replenishFactoryCache.put(className, factory);
break;
}
}
} }
} }
} }
@ -437,7 +682,8 @@ public class Core {
return myReplenishInstance; return myReplenishInstance;
} }
private final static CCache<String, IServiceReferenceHolder<ScriptEngineFactory>> s_scriptEngineFactoryCache = new CCache<>(null, "ScriptEngineFactory", 100, false);
/** Get script engine /** Get script engine
* *
* @param engineName * @param engineName
@ -450,13 +696,23 @@ public class Core {
if (engine != null) if (engine != null)
return engine; return engine;
List<ScriptEngineFactory> factoryList = IServiceReferenceHolder<ScriptEngineFactory> cache = s_scriptEngineFactoryCache.get(engineName);
Service.locator().list(ScriptEngineFactory.class).getServices(); if (cache != null) {
ScriptEngineFactory service = cache.getService();
if (service != null)
return service.getScriptEngine();
s_scriptEngineFactoryCache.remove(engineName);
}
List<IServiceReferenceHolder<ScriptEngineFactory>> factoryList = Service.locator().list(ScriptEngineFactory.class).getServiceReferences();
if (factoryList != null) { if (factoryList != null) {
for(ScriptEngineFactory factory : factoryList) { for(IServiceReferenceHolder<ScriptEngineFactory> factory : factoryList) {
for (String name : factory.getNames()) { ScriptEngineFactory service = factory.getService();
if (engineName.equals(name)) { if (service != null) {
return factory.getScriptEngine(); for (String name : service.getNames()) {
if (engineName.equals(name)) {
s_scriptEngineFactoryCache.put(engineName, factory);
return service.getScriptEngine();
}
} }
} }
} }
@ -465,6 +721,8 @@ public class Core {
return null; return null;
} }
private static final CCache<String, IServiceReferenceHolder<IPaymentExporterFactory>> s_paymentExporterFactory = new CCache<>(null, "IPaymentExporterFactory", 100, false);
/** /**
* get PaymentExporter instance * get PaymentExporter instance
* *
@ -478,15 +736,30 @@ public class Core {
} }
PaymentExport myPaymentExporter = null; PaymentExport myPaymentExporter = null;
IServiceReferenceHolder<IPaymentExporterFactory> cache = s_paymentExporterFactory.get(className);
List<IPaymentExporterFactory> factoryList = if (cache != null) {
Service.locator().list(IPaymentExporterFactory.class).getServices(); IPaymentExporterFactory service = cache.getService();
if (factoryList != null) { if (service != null) {
for(IPaymentExporterFactory factory : factoryList) { PaymentExport exporter = service.newPaymentExporterInstance(className);
PaymentExport exporter = factory.newPaymentExporterInstance(className); if (exporter != null)
if (exporter != null) {
myPaymentExporter = exporter; myPaymentExporter = exporter;
break; }
if (myPaymentExporter == null)
s_paymentExporterFactory.remove(className);
}
if (myPaymentExporter == null) {
List<IServiceReferenceHolder<IPaymentExporterFactory>> factoryList = Service.locator().list(IPaymentExporterFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IPaymentExporterFactory> factory : factoryList) {
IPaymentExporterFactory service = factory.getService();
if (service != null) {
PaymentExport exporter = service.newPaymentExporterInstance(className);
if (exporter != null) {
myPaymentExporter = exporter;
s_paymentExporterFactory.put(className, factory);
break;
}
}
} }
} }
} }
@ -499,19 +772,30 @@ public class Core {
return myPaymentExporter; return myPaymentExporter;
} }
private static IServiceReferenceHolder<IProductPricingFactory> s_productPricingFactoryCache = null;
/** /**
* get ProductPricing instance * get ProductPricing instance
* *
* @return instance of the IProductPricing or null * @return instance of the IProductPricing or null
*/ */
public static IProductPricing getProductPricing() { public static synchronized IProductPricing getProductPricing() {
if (s_productPricingFactoryCache != null) {
List<IProductPricingFactory> factoryList = IProductPricingFactory service = s_productPricingFactoryCache.getService();
Service.locator().list(IProductPricingFactory.class).getServices(); if (service != null) {
if (factoryList != null) { IProductPricing myProductPricing = service.newProductPricingInstance();
for(IProductPricingFactory factory : factoryList) { if (myProductPricing != null)
IProductPricing myProductPricing = factory.newProductPricingInstance(); return myProductPricing;
}
s_productPricingFactoryCache = null;
}
IServiceReferenceHolder<IProductPricingFactory> factoryReference = Service.locator().locate(IProductPricingFactory.class).getServiceReference();
if (factoryReference != null) {
IProductPricingFactory service = factoryReference.getService();
if (service != null) {
IProductPricing myProductPricing = service.newProductPricingInstance();
if (myProductPricing != null) { if (myProductPricing != null) {
s_productPricingFactoryCache = factoryReference;
return myProductPricing; return myProductPricing;
} }
} }
@ -520,20 +804,35 @@ public class Core {
return null; return null;
} }
private final static CCache<String, IServiceReferenceHolder<IDepreciationMethodFactory>> s_depreciationMethodFactoryCache = new CCache<>(null, "IDepreciationMethodFactory", 100, false);
/** /**
* lookup implement {@link IDepreciationMethod} * lookup implement {@link IDepreciationMethod}
* @param factoryLookupDTO * @param factoryLookupDTO
* @return * @return {@link IDepreciationMethod}
*/ */
public static IDepreciationMethod getDepreciationMethod(DepreciationFactoryLookupDTO factoryLookupDTO) { public static IDepreciationMethod getDepreciationMethod(DepreciationFactoryLookupDTO factoryLookupDTO) {
String cacheKey = factoryLookupDTO.depreciationType;
List<IDepreciationMethodFactory> factoryList = IServiceReferenceHolder<IDepreciationMethodFactory> cache = s_depreciationMethodFactoryCache.get(cacheKey);
Service.locator().list(IDepreciationMethodFactory.class).getServices(); if (cache != null) {
if (factoryList != null) { IDepreciationMethodFactory service = cache.getService();
for(IDepreciationMethodFactory factory : factoryList) { if (service != null) {
IDepreciationMethod depreciationMethod = factory.getDepreciationMethod(factoryLookupDTO); IDepreciationMethod depreciationMethod = service.getDepreciationMethod(factoryLookupDTO);
if (depreciationMethod != null) { if (depreciationMethod != null)
return depreciationMethod; return depreciationMethod;
}
s_depreciationMethodFactoryCache.remove(cacheKey);
}
List<IServiceReferenceHolder<IDepreciationMethodFactory>> factoryList = Service.locator().list(IDepreciationMethodFactory.class).getServiceReferences();
if (factoryList != null) {
for(IServiceReferenceHolder<IDepreciationMethodFactory> factory : factoryList) {
IDepreciationMethodFactory service = factory.getService();
if (service != null) {
IDepreciationMethod depreciationMethod = service.getDepreciationMethod(factoryLookupDTO);
if (depreciationMethod != null) {
s_depreciationMethodFactoryCache.put(cacheKey, factory);
return depreciationMethod;
}
} }
} }
} }
@ -541,4 +840,88 @@ public class Core {
return null; return null;
} }
private static IServiceReferenceHolder<IMessageService> s_messageServiceReference = null;
/**
*
* @return {@link IMessageService}
*/
public static synchronized IMessageService getMessageService() {
IMessageService messageService = null;
if (s_messageServiceReference != null) {
messageService = s_messageServiceReference.getService();
if (messageService != null)
return messageService;
}
IServiceReferenceHolder<IMessageService> serviceReference = Service.locator().locate(IMessageService.class).getServiceReference();
if (serviceReference != null) {
messageService = serviceReference.getService();
s_messageServiceReference = serviceReference;
}
return messageService;
}
private static IServiceReferenceHolder<IClusterService> s_clusterServiceReference = null;
/**
*
* @return {@link IClusterService}
*/
public static synchronized IClusterService getClusterService() {
IClusterService clusterService = null;
if (s_clusterServiceReference != null) {
clusterService = s_clusterServiceReference.getService();
if (clusterService != null)
return clusterService;
}
IServiceReferenceHolder<IClusterService> serviceReference = Service.locator().locate(IClusterService.class).getServiceReference();
if (serviceReference != null) {
clusterService = serviceReference.getService();
s_clusterServiceReference = serviceReference;
}
return clusterService;
}
private static IServiceReferenceHolder<ICacheService> s_cacheServiceReference = null;
/**
*
* @return {@link ICacheService}
*/
public static synchronized ICacheService getCacheService() {
ICacheService cacheService = null;
if (s_cacheServiceReference != null) {
cacheService = s_cacheServiceReference.getService();
if (cacheService != null)
return cacheService;
}
IServiceReferenceHolder<ICacheService> serviceReference = Service.locator().locate(ICacheService.class).getServiceReference();
if (serviceReference != null) {
cacheService = serviceReference.getService();
s_cacheServiceReference = serviceReference;
}
return cacheService;
}
private static IServiceReferenceHolder<IDictionaryService> s_dictionaryServiceReference = null;
/**
*
* @return {@link IDictionaryService}
*/
public static synchronized IDictionaryService getDictionaryService() {
IDictionaryService ids = null;
if (s_dictionaryServiceReference != null) {
ids = s_dictionaryServiceReference.getService();
if (ids != null)
return ids;
}
IServiceReferenceHolder<IDictionaryService> serviceReference = Service.locator().locate(IDictionaryService.class).getServiceReference();
if (serviceReference != null) {
ids = serviceReference.getService();
s_dictionaryServiceReference = serviceReference;
}
return ids;
}
} }

View File

@ -37,7 +37,7 @@ import org.compiere.util.Util;
*/ */
public class DefaultModelFactory implements IModelFactory { public class DefaultModelFactory implements IModelFactory {
private static CCache<String,Class<?>> s_classCache = new CCache<String,Class<?>>(null, "PO_Class", 20, false); private static CCache<String,Class<?>> s_classCache = new CCache<String,Class<?>>(null, "PO_Class", 100, 120, false, 2000);
private final static CLogger s_log = CLogger.getCLogger(DefaultModelFactory.class); private final static CLogger s_log = CLogger.getCLogger(DefaultModelFactory.class);
/** Packages for Model Classes */ /** Packages for Model Classes */

View File

@ -22,9 +22,14 @@ package org.adempiere.base;
public interface IServiceHolder<T> { public interface IServiceHolder<T> {
/** /**
* * Get service with highest service.ranking value
* @return service instance. null if not available or no matching service found * @return service instance. null if not available or no matching service found
*/ */
public T getService(); public T getService();
/**
* Get service reference for service with highest service.ranking value
* @return {@link IServiceReferenceHolder}
*/
public IServiceReferenceHolder<T> getServiceReference();
} }

View File

@ -0,0 +1,49 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.base;
import org.osgi.framework.ServiceReference;
/**
* Dynamic service reference holder for a service object.
* For cache usage, you should cache this instead of service object
* @author hengsin
*
* @param <T>
*/
public interface IServiceReferenceHolder<T> {
/**
* Get service object from cache service reference
* @return Service Object or null if the osgi service is no longer available
*/
public T getService();
/**
* Get the cache service reference
* @return ServiceReference
*/
public ServiceReference<T> getServiceReference();
}

View File

@ -24,9 +24,15 @@ import java.util.List;
public interface IServicesHolder<T> { public interface IServicesHolder<T> {
/** /**
* * Get list of service, sorted by service.ranking (from highest to lowest ranking)
* @return list of service instance. null if not available or no matching service found * @return list of service instance. null if not available or no matching service found
*/ */
public List<T> getServices(); public List<T> getServices();
/**
* Get list of service reference, sorted by service.ranking (from highest to lowest ranking).
* If you want to cache service, cache IServiceReferenceHolder instead of the actual service object
* @return list of {@link IServiceReferenceHolder}
*/
public List<IServiceReferenceHolder<T>> getServiceReferences();
} }

View File

@ -0,0 +1,129 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.base;
import java.util.ArrayList;
import java.util.List;
import org.compiere.model.GridFieldVO;
import org.compiere.model.Lookup;
import org.compiere.util.CCache;
import org.osgi.framework.Constants;
/**
* Static helper methods for working with {@link ILookupFactory}
* @author hengsin
*
*/
public final class LookupFactoryHelper {
private LookupFactoryHelper() {
}
private static final CCache<Long, IServiceReferenceHolder<ILookupFactory>> s_lookupFactoryCache = new CCache<Long, IServiceReferenceHolder<ILookupFactory>>(
null, "ILookupFactory", 10, false);
/**
* Get lookup from osgi factory
*
* @param gridFieldVO
* @return {@link Lookup}
*/
public static Lookup getLookup(GridFieldVO gridFieldVO) {
List<Long> visitedIds = new ArrayList<Long>();
if (!s_lookupFactoryCache.isEmpty()) {
Long[] keys = s_lookupFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<ILookupFactory> serviceReference = s_lookupFactoryCache.get(key);
if (serviceReference != null) {
ILookupFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
Lookup lookup = service.getLookup(gridFieldVO);
if (lookup != null)
return lookup;
} else {
s_lookupFactoryCache.remove(key);
}
}
}
}
List<IServiceReferenceHolder<ILookupFactory>> serviceReferences = Service.locator().list(ILookupFactory.class)
.getServiceReferences();
for (IServiceReferenceHolder<ILookupFactory> serviceReference : serviceReferences) {
Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (visitedIds.contains(serviceId))
continue;
ILookupFactory service = serviceReference.getService();
if (service != null) {
s_lookupFactoryCache.put(serviceId, serviceReference);
Lookup lookup = service.getLookup(gridFieldVO);
if (lookup != null)
return lookup;
}
}
return null;
}
/**
* Check lookup from osgi factory
*
* @param gridFieldVO
* @return true if gridFieldVO is a lookup field
*/
public static boolean isLookup(GridFieldVO gridFieldVO) {
List<Long> visitedIds = new ArrayList<Long>();
if (!s_lookupFactoryCache.isEmpty()) {
Long[] keys = s_lookupFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<ILookupFactory> serviceReference = s_lookupFactoryCache.get(key);
if (serviceReference != null) {
ILookupFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
if (service.isLookup(gridFieldVO))
return true;
} else {
s_lookupFactoryCache.remove(key);
}
}
}
}
List<IServiceReferenceHolder<ILookupFactory>> serviceReferences = Service.locator().list(ILookupFactory.class)
.getServiceReferences();
for (IServiceReferenceHolder<ILookupFactory> serviceReference : serviceReferences) {
Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (visitedIds.contains(serviceId))
continue;
ILookupFactory service = serviceReference.getService();
if (service != null) {
s_lookupFactoryCache.put(serviceId, serviceReference);
if (service.isLookup(gridFieldVO))
return true;
}
}
return false;
}
}

View File

@ -19,6 +19,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.IServiceHolder;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.IServicesHolder; import org.adempiere.base.IServicesHolder;
import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTracker;
@ -54,10 +55,36 @@ public class DynamicServiceHolder<T> implements IServiceHolder<T>, IServicesHold
if (objects != null && objects.length > 0) { if (objects != null && objects.length > 0) {
references = Arrays.asList(objects); references = Arrays.asList(objects);
} }
Collections.sort(references, Collections.reverseOrder()); if (references.size() > 1)
Collections.sort(references, ServiceRankingComparator.INSTANCE);
for(ServiceReference<T> reference : references) { for(ServiceReference<T> reference : references) {
services.add(serviceTracker.getService(reference)); services.add(serviceTracker.getService(reference));
} }
return services; return services;
} }
@Override
public IServiceReferenceHolder<T> getServiceReference() {
ServiceReference<T> v = serviceTracker.getServiceReference();
if (v != null)
return new DynamicServiceReference<T>(serviceTracker, v);
return null;
}
@Override
public List<IServiceReferenceHolder<T>> getServiceReferences() {
List<IServiceReferenceHolder<T>> services = new ArrayList<>();
ServiceReference<T>[] objects = serviceTracker.getServiceReferences();
List<ServiceReference<T>> references = new ArrayList<ServiceReference<T>>();
if (objects != null && objects.length > 0) {
references = Arrays.asList(objects);
}
if (references.size() > 1)
Collections.sort(references, ServiceRankingComparator.INSTANCE);
for(ServiceReference<T> reference : references) {
services.add(new DynamicServiceReference<T>(serviceTracker, reference));
}
return services;
}
} }

View File

@ -0,0 +1,61 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.base.ds;
import org.adempiere.base.IServiceReferenceHolder;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
/**
* IServiceReferenceHolder implementation using ServiceTracker
* @author hengsin
*
* @param <T>
*/
public class DynamicServiceReference<T> implements IServiceReferenceHolder<T> {
private ServiceTracker<T, T> serviceTracker;
private ServiceReference<T> serviceReference;
/**
*
* @param tracker
* @param serviceReference
*/
public DynamicServiceReference(ServiceTracker<T, T> tracker, ServiceReference<T> serviceReference) {
this.serviceTracker = tracker;
this.serviceReference = serviceReference;
}
@Override
public T getService() {
return serviceTracker.getService(serviceReference);
}
@Override
public ServiceReference<T> getServiceReference() {
return serviceReference;
}
}

View File

@ -0,0 +1,102 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.base.ds;
import java.io.Serializable;
import java.util.Comparator;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
/**
* Service Reference Comparator.
* This comparator follows OSGi Ranking policy.
* @author hengsin
*/
public final class ServiceRankingComparator implements Comparator<ServiceReference<?>>, Serializable {
/**
*
*/
private static final long serialVersionUID = 3444598255961708618L;
/**
* share service ranking comparator instance
*/
public static final ServiceRankingComparator INSTANCE = new ServiceRankingComparator();
private ServiceRankingComparator() {}
/**
* Compares two service reference.
* @param serviceReference1 service reference 1
* @param serviceReference2 service reference 2
* @return <code>-1</code> if service reference 1 service.ranking value
* is higher than service reference 2, <code>1</code> otherwise.
* (i.e for sorting in descending order of service.ranking value)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(ServiceReference<?> serviceReference1, ServiceReference<?> serviceReference2) {
if (serviceReference1.equals(serviceReference2)) { return 0; }
if (serviceReference2 != null) {
Object serviceRankingP1 = serviceReference1.getProperty(Constants.SERVICE_RANKING);
Object serviceRankingP2 = serviceReference2.getProperty(Constants.SERVICE_RANKING);
int serviceRanking1 = 0;
int serviceRanking2 = 0;
if (serviceRankingP1 instanceof Integer) {
serviceRanking1 = (Integer) serviceRankingP1;
}
if (serviceRankingP2 instanceof Integer) {
serviceRanking2 = (Integer) serviceRankingP2;
}
if (serviceRanking1 == serviceRanking2) {
// Check service.id
Object serviceIdP1 = serviceReference1.getProperty(Constants.SERVICE_ID);
Object serviceIdP2 = serviceReference2.getProperty(Constants.SERVICE_ID);
long serviceId1 = (Long) serviceIdP1;
long serviceId2 = (Long) serviceIdP2;
if (serviceId1 == serviceId2) {
return 0;
} else if (serviceId1 > serviceId2) {
return -1;
} else {
return 1;
}
} else if (serviceRanking1 > serviceRanking2) {
return -1;
} else {
return 1;
}
} else {
return 0;
}
}
}

View File

@ -1,5 +1,6 @@
package org.adempiere.process; package org.adempiere.process;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.compiere.model.MAttachment; import org.compiere.model.MAttachment;
import org.compiere.model.MPackage; import org.compiere.model.MPackage;
@ -27,7 +28,7 @@ public class PrintShippingLabel extends SvrProcess
if (labelId <= 0) if (labelId <= 0)
return "Label format not defined."; return "Label format not defined.";
IPrintShippingLabel service = Service.locator().locate(IPrintShippingLabel.class).getService(); IPrintShippingLabel service = getService();
if (service != null) if (service != null)
{ {
MShipperLabels label = new MShipperLabels(getCtx(), labelId, get_TrxName()); MShipperLabels label = new MShipperLabels(getCtx(), labelId, get_TrxName());
@ -39,4 +40,24 @@ public class PrintShippingLabel extends SvrProcess
else else
return "Not found in service/extension registry and classpath"; return "Not found in service/extension registry and classpath";
} }
private static IServiceReferenceHolder<IPrintShippingLabel> s_serviceReference = null;
private synchronized static IPrintShippingLabel getService() {
if (s_serviceReference != null) {
IPrintShippingLabel service = s_serviceReference.getService();
if (service != null)
return service;
}
IServiceReferenceHolder<IPrintShippingLabel> serviceReference = Service.locator().locate(IPrintShippingLabel.class).getServiceReference();
if (serviceReference != null) {
IPrintShippingLabel service = serviceReference.getService();
if (service != null) {
s_serviceReference = serviceReference;
return service;
}
}
return null;
}
} }

View File

@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.adempiere.base.IDocFactory; import org.adempiere.base.IDocFactory;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.base.ServiceQuery; import org.adempiere.base.ServiceQuery;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
@ -31,6 +32,7 @@ import org.adempiere.exceptions.DBException;
import org.compiere.model.MAcctSchema; import org.compiere.model.MAcctSchema;
import org.compiere.model.MTable; import org.compiere.model.MTable;
import org.compiere.util.AdempiereUserError; import org.compiere.util.AdempiereUserError;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -108,6 +110,8 @@ public class DocManager {
} }
} }
private static final CCache<String, IServiceReferenceHolder<IDocFactory>> s_DocFactoryCache = new CCache<>(null, "IDocFactory", 100, false);
/** /**
* Create Posting document * Create Posting document
* @param as accounting schema * @param as accounting schema
@ -133,29 +137,57 @@ public class DocManager {
return null; return null;
} }
ServiceQuery query = new ServiceQuery(); String cacheKey = as.getC_AcctSchema_ID() + "|" + AD_Table_ID;
query.put("gaap", as.getGAAP()); IServiceReferenceHolder<IDocFactory> cache = s_DocFactoryCache.get(cacheKey);
List<IDocFactory> factoryList = Service.locator().list(IDocFactory.class, query).getServices(); if (cache != null)
if (factoryList != null)
{ {
for(IDocFactory factory : factoryList) IDocFactory service = cache.getService();
if (service != null)
{ {
Doc doc = factory.getDocument(as, AD_Table_ID, Record_ID, trxName); Doc doc = service.getDocument(as, AD_Table_ID, Record_ID, trxName);
if (doc != null) if (doc != null)
return doc; return doc;
} }
s_DocFactoryCache.remove(cacheKey);
}
ServiceQuery query = new ServiceQuery();
query.put("gaap", as.getGAAP());
List<IServiceReferenceHolder<IDocFactory>> factoryList = Service.locator().list(IDocFactory.class, query).getServiceReferences();
if (factoryList != null)
{
for(IServiceReferenceHolder<IDocFactory> factory : factoryList)
{
IDocFactory service = factory.getService();
if (service != null)
{
Doc doc = service.getDocument(as, AD_Table_ID, Record_ID, trxName);
if (doc != null)
{
s_DocFactoryCache.put(cacheKey, factory);
return doc;
}
}
}
} }
query.clear(); query.clear();
query.put("gaap", "*"); query.put("gaap", "*");
factoryList = Service.locator().list(IDocFactory.class, query).getServices(); factoryList = Service.locator().list(IDocFactory.class, query).getServiceReferences();
if (factoryList != null) if (factoryList != null)
{ {
for(IDocFactory factory : factoryList) for(IServiceReferenceHolder<IDocFactory> factory : factoryList)
{ {
Doc doc = factory.getDocument(as, AD_Table_ID, Record_ID, trxName); IDocFactory service = factory.getService();
if (doc != null) if (service != null)
return doc; {
Doc doc = service.getDocument(as, AD_Table_ID, Record_ID, trxName);
if (doc != null)
{
s_DocFactoryCache.put(cacheKey, factory);
return doc;
}
}
} }
} }
@ -173,29 +205,57 @@ public class DocManager {
*/ */
public static Doc getDocument(MAcctSchema as, int AD_Table_ID, ResultSet rs, String trxName) public static Doc getDocument(MAcctSchema as, int AD_Table_ID, ResultSet rs, String trxName)
{ {
ServiceQuery query = new ServiceQuery(); String cacheKey = as.getC_AcctSchema_ID() + "|" + AD_Table_ID;
query.put("gaap", as.getGAAP()); IServiceReferenceHolder<IDocFactory> cache = s_DocFactoryCache.get(cacheKey);
List<IDocFactory> factoryList = Service.locator().list(IDocFactory.class,query).getServices(); if (cache != null)
if (factoryList != null)
{ {
for(IDocFactory factory : factoryList) IDocFactory service = cache.getService();
if (service != null)
{ {
Doc doc = factory.getDocument(as, AD_Table_ID, rs, trxName); Doc doc = service.getDocument(as, AD_Table_ID, rs, trxName);
if (doc != null) if (doc != null)
return doc; return doc;
} }
s_DocFactoryCache.remove(cacheKey);
}
ServiceQuery query = new ServiceQuery();
query.put("gaap", as.getGAAP());
List<IServiceReferenceHolder<IDocFactory>> factoryList = Service.locator().list(IDocFactory.class,query).getServiceReferences();
if (factoryList != null)
{
for(IServiceReferenceHolder<IDocFactory> factory : factoryList)
{
IDocFactory service = factory.getService();
if (service != null)
{
Doc doc = service.getDocument(as, AD_Table_ID, rs, trxName);
if (doc != null)
{
s_DocFactoryCache.put(cacheKey, factory);
return doc;
}
}
}
} }
query.clear(); query.clear();
query.put("gaap", "*"); query.put("gaap", "*");
factoryList = Service.locator().list(IDocFactory.class,query).getServices(); factoryList = Service.locator().list(IDocFactory.class,query).getServiceReferences();
if (factoryList != null) if (factoryList != null)
{ {
for(IDocFactory factory : factoryList) for(IServiceReferenceHolder<IDocFactory> factory : factoryList)
{ {
Doc doc = factory.getDocument(as, AD_Table_ID, rs, trxName); IDocFactory service = factory.getService();
if (doc != null) if (service != null)
return doc; {
Doc doc = service.getDocument(as, AD_Table_ID, rs, trxName);
if (doc != null)
{
s_DocFactoryCache.put(cacheKey, factory);
return doc;
}
}
} }
} }

View File

@ -19,8 +19,10 @@ package org.compiere.db;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.base.ServiceQuery; import org.adempiere.base.ServiceQuery;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Util; import org.compiere.util.Util;
@ -51,15 +53,29 @@ public class Database
/** Default Port */ /** Default Port */
public static final int DB_POSTGRESQL_DEFAULT_PORT = 5432; public static final int DB_POSTGRESQL_DEFAULT_PORT = 5432;
private static final CCache<String, IServiceReferenceHolder<AdempiereDatabase>> s_databaseReferenceCache = new CCache<>(null, "IDatabase", 2, false);
/** /**
* Get Database by database Id. * Get Database by database Id.
* @return database * @return database
*/ */
public static AdempiereDatabase getDatabase (String type) public static AdempiereDatabase getDatabase (String type)
{ {
AdempiereDatabase db = null;
IServiceReferenceHolder<AdempiereDatabase> cache = s_databaseReferenceCache.get(type);
if (cache != null) {
db = cache.getService();
if (db != null)
return db;
s_databaseReferenceCache.remove(type);
}
ServiceQuery query = new ServiceQuery(); ServiceQuery query = new ServiceQuery();
query.put("id", type); query.put("id", type);
AdempiereDatabase db = Service.locator().locate(AdempiereDatabase.class, query).getService(); IServiceReferenceHolder<AdempiereDatabase> serviceReference = Service.locator().locate(AdempiereDatabase.class, query).getServiceReference();
if (serviceReference != null) {
db = serviceReference.getService();
s_databaseReferenceCache.put(type, serviceReference);
}
return db; return db;
} }

View File

@ -35,8 +35,7 @@ import java.util.Properties;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.ILookupFactory; import org.adempiere.base.LookupFactoryHelper;
import org.adempiere.base.Service;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CLogMgt; import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
@ -195,15 +194,8 @@ public class GridField
} // m_lookup } // m_lookup
private void loadLookupFromFactory() { private void loadLookupFromFactory() {
//http://jira.idempiere.com/browse/IDEMPIERE-694 //http://jira.idempiere.com/browse/IDEMPIERE-694
//see DefaultLookupFactory.java for the other default Lookups m_lookup = LookupFactoryHelper.getLookup(m_vo);
List<ILookupFactory> factoryList = Service.locator().list(ILookupFactory.class).getServices();
for(ILookupFactory factory : factoryList)
{
m_lookup = factory.getLookup(m_vo);
if (m_lookup != null)
break;
}
} }
/*** /***
@ -263,14 +255,8 @@ public class GridField
// retValue = false; // retValue = false;
else { else {
//http://jira.idempiere.com/browse/IDEMPIERE-694 //http://jira.idempiere.com/browse/IDEMPIERE-694
//see DefaultLookupFactory.java for the other default Lookups if (LookupFactoryHelper.isLookup(m_vo))
List<ILookupFactory> factoryList = Service.locator().list(ILookupFactory.class).getServices(); retValue = true;
for(ILookupFactory factory : factoryList)
{
retValue = factory.isLookup(m_vo);
if (retValue == true)
break;
}
} }
return retValue; return retValue;
} // isLookup } // isLookup

View File

@ -41,6 +41,17 @@ public class GridWindowVO implements Serializable
*/ */
private static final long serialVersionUID = 6884332743173214735L; private static final long serialVersionUID = 6884332743173214735L;
/**
* Create Window Value Object
* @param WindowNo window no for ctx
* @param AD_Window_ID window id
* @return MWindowVO
*/
public static GridWindowVO create (int WindowNo, int AD_Window_ID)
{
return create(Env.getCtx(), WindowNo, AD_Window_ID);
}
/** /**
* Create Window Value Object * Create Window Value Object
* @param ctx context * @param ctx context

View File

@ -27,7 +27,7 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
@ -402,7 +402,7 @@ public class MPInstance extends X_AD_PInstance
} }
public static void publishChangedEvent(int AD_User_ID) { public static void publishChangedEvent(int AD_User_ID) {
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Integer> topic = service.getTopic(ON_RUNNING_JOB_CHANGED_TOPIC); ITopic<Integer> topic = service.getTopic(ON_RUNNING_JOB_CHANGED_TOPIC);
topic.publish(AD_User_ID); topic.publish(AD_User_ID);

View File

@ -24,7 +24,7 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
@ -244,7 +244,7 @@ public class MRecentItem extends X_AD_RecentItem implements ImmutablePOSupport
} }
public static void publishChangedEvent(int AD_User_ID) { public static void publishChangedEvent(int AD_User_ID) {
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Integer> topic = service.getTopic(ON_RECENT_ITEM_CHANGED_TOPIC); ITopic<Integer> topic = service.getTopic(ON_RECENT_ITEM_CHANGED_TOPIC);
topic.publish(AD_User_ID); topic.publish(AD_User_ID);

View File

@ -19,9 +19,11 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.base.ServiceQuery; import org.adempiere.base.ServiceQuery;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CCache;
public class MStorageProvider extends X_AD_StorageProvider { public class MStorageProvider extends X_AD_StorageProvider {
/** /**
@ -37,42 +39,132 @@ public class MStorageProvider extends X_AD_StorageProvider {
super(ctx, rs, trxName); super(ctx, rs, trxName);
} }
/**
*
* @return {@link IAttachmentStore}
*/
public IAttachmentStore getAttachmentStore() { public IAttachmentStore getAttachmentStore() {
ServiceQuery query=new ServiceQuery(); ServiceQuery query=new ServiceQuery();
String method = this.getMethod(); String method = this.getMethod();
if (method == null) if (method == null)
method = "DB"; method = "DB";
query.put("method", method); query.put("method", method);
IAttachmentStore store = Service.locator().locate(IAttachmentStore.class, query).getService(); IAttachmentStore store = getAttachmentStoreService(query);
if (store == null) { if (store == null) {
throw new AdempiereException("No attachment storage provider found"); throw new AdempiereException("No attachment storage provider found");
} }
return store; return store;
} }
private static CCache<ServiceQuery, IServiceReferenceHolder<IAttachmentStore>> s_attachmentStoreReference = new CCache<>(null, "IAttachmentStore", 3, false);
/**
*
* @param query
* @return {@link IAttachmentStore}
*/
public static IAttachmentStore getAttachmentStoreService(ServiceQuery query) {
IAttachmentStore store = null;
IServiceReferenceHolder<IAttachmentStore> cache = s_attachmentStoreReference.get(query);
if (cache != null) {
store = cache.getService();
if (store != null)
return store;
else
s_attachmentStoreReference.remove(query);
}
IServiceReferenceHolder<IAttachmentStore> serviceReference = Service.locator().locate(IAttachmentStore.class, query).getServiceReference();
if (serviceReference != null) {
store = serviceReference.getService();
if (store != null)
s_attachmentStoreReference.put(query, serviceReference);
}
return store;
}
/**
*
* @return {@link IArchiveStore}
*/
public IArchiveStore getArchiveStore() { public IArchiveStore getArchiveStore() {
ServiceQuery query=new ServiceQuery(); ServiceQuery query=new ServiceQuery();
String method = this.getMethod(); String method = this.getMethod();
if (method == null) if (method == null)
method = "DB"; method = "DB";
query.put("method", method); query.put("method", method);
IArchiveStore store = Service.locator().locate(IArchiveStore.class, query).getService(); IArchiveStore store = getArchiveStoreService(query);
if (store == null) { if (store == null) {
throw new AdempiereException("No archive storage provider found"); throw new AdempiereException("No archive storage provider found");
} }
return store; return store;
} }
private static CCache<ServiceQuery, IServiceReferenceHolder<IArchiveStore>> s_archiveStoreReference = new CCache<>(null, "IArchiveStore", 3, false);
/**
*
* @param query
* @return {@link IArchiveStore}
*/
public static IArchiveStore getArchiveStoreService(ServiceQuery query) {
IArchiveStore store = null;
IServiceReferenceHolder<IArchiveStore> cache = s_archiveStoreReference.get(query);
if (cache != null) {
store = cache.getService();
if (store != null)
return store;
else
s_archiveStoreReference.remove(query);
}
IServiceReferenceHolder<IArchiveStore> serviceReference = Service.locator().locate(IArchiveStore.class, query).getServiceReference();
if (serviceReference != null) {
store = serviceReference.getService();
if (store != null)
s_archiveStoreReference.put(query, serviceReference);
}
return store;
}
/**
*
* @return {@link IImageStore}
*/
public IImageStore getImageStore() { public IImageStore getImageStore() {
ServiceQuery query=new ServiceQuery(); ServiceQuery query=new ServiceQuery();
String method = this.getMethod(); String method = this.getMethod();
if (method == null) if (method == null)
method = "DB"; method = "DB";
query.put("method", method); query.put("method", method);
IImageStore store = Service.locator().locate(IImageStore.class, query).getService(); IImageStore store = getImageStoreService(query);
if (store == null) { if (store == null) {
throw new AdempiereException("No image storage provider found"); throw new AdempiereException("No image storage provider found");
} }
return store; return store;
} }
private static CCache<ServiceQuery, IServiceReferenceHolder<IImageStore>> s_imageStoreReference = new CCache<>(null, "IImageStore", 3, false);
/**
*
* @param query
* @return {@link IImageStore}
*/
public static IImageStore getImageStoreService(ServiceQuery query) {
IImageStore store = null;
IServiceReferenceHolder<IImageStore> cache = s_imageStoreReference.get(query);
if (cache != null) {
store = cache.getService();
if (store != null)
return store;
else
s_imageStoreReference.remove(query);
}
IServiceReferenceHolder<IImageStore> serviceReference = Service.locator().locate(IImageStore.class, query).getServiceReference();
if (serviceReference != null) {
store = serviceReference.getService();
s_imageStoreReference.put(query, serviceReference);
}
return store;
}
} }

View File

@ -31,10 +31,12 @@ import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IModelFactory; import org.adempiere.base.IModelFactory;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.model.GenericPO; import org.adempiere.model.GenericPO;
import org.compiere.db.AdempiereDatabase; import org.compiere.db.AdempiereDatabase;
import org.compiere.db.Database; import org.compiere.db.Database;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -207,7 +209,7 @@ public class MTable extends X_AD_Table implements ImmutablePOSupport
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MTable.class); private static CLogger s_log = CLogger.getCLogger (MTable.class);
private static final CCache<String, IServiceReferenceHolder<IModelFactory>> s_modelFactoryCache = new CCache<>(null, "IModelFactory", 100, 120, false, 2000);
/** /**
* Get Persistence Class for Table * Get Persistence Class for Table
@ -216,13 +218,32 @@ public class MTable extends X_AD_Table implements ImmutablePOSupport
*/ */
public static Class<?> getClass (String tableName) public static Class<?> getClass (String tableName)
{ {
List<IModelFactory> factoryList = Service.locator().list(IModelFactory.class).getServices(); IServiceReferenceHolder<IModelFactory> cache = s_modelFactoryCache.get(tableName);
if (cache != null)
{
IModelFactory service = cache.getService();
if (service != null)
{
Class<?> clazz = service.getClass(tableName);
if (clazz != null)
return clazz;
}
s_modelFactoryCache.remove(tableName);
}
List<IServiceReferenceHolder<IModelFactory>> factoryList = Service.locator().list(IModelFactory.class).getServiceReferences();
if (factoryList == null) if (factoryList == null)
return null; return null;
for(IModelFactory factory : factoryList) { for(IServiceReferenceHolder<IModelFactory> factory : factoryList) {
Class<?> clazz = factory.getClass(tableName); IModelFactory service = factory.getService();
if (clazz != null) if (service != null) {
return clazz; Class<?> clazz = service.getClass(tableName);
if (clazz != null)
{
s_modelFactoryCache.put(tableName, factory);
return clazz;
}
}
} }
return null; return null;
} // getClass } // getClass
@ -481,18 +502,43 @@ public class MTable extends X_AD_Table implements ImmutablePOSupport
} }
PO po = null; PO po = null;
List<IModelFactory> factoryList = Service.locator().list(IModelFactory.class).getServices(); IServiceReferenceHolder<IModelFactory> cache = s_modelFactoryCache.get(tableName);
if (factoryList != null) if (cache != null)
{ {
for(IModelFactory factory : factoryList) IModelFactory service = cache.getService();
if (service != null)
{ {
po = factory.getPO(tableName, Record_ID, trxName); po = service.getPO(tableName, Record_ID, trxName);
if (po != null) if (po != null)
{ {
if (po.get_ID() != Record_ID && Record_ID > 0) if (po.get_ID() != Record_ID && Record_ID > 0)
po = null; po = null;
else else
break; return po;
}
}
s_modelFactoryCache.remove(tableName);
}
List<IServiceReferenceHolder<IModelFactory>> factoryList = Service.locator().list(IModelFactory.class).getServiceReferences();
if (factoryList != null)
{
for(IServiceReferenceHolder<IModelFactory> factory : factoryList)
{
IModelFactory service = factory.getService();
if (service != null)
{
po = service.getPO(tableName, Record_ID, trxName);
if (po != null)
{
if (po.get_ID() != Record_ID && Record_ID > 0)
po = null;
else
{
s_modelFactoryCache.put(tableName, factory);
break;
}
}
} }
} }
} }
@ -518,13 +564,32 @@ public class MTable extends X_AD_Table implements ImmutablePOSupport
String tableName = getTableName(); String tableName = getTableName();
PO po = null; PO po = null;
List<IModelFactory> factoryList = Service.locator().list(IModelFactory.class).getServices(); IServiceReferenceHolder<IModelFactory> cache = s_modelFactoryCache.get(tableName);
if (cache != null)
{
IModelFactory service = cache.getService();
if (service != null)
{
po = service.getPO(tableName, rs, trxName);
if (po != null)
return po;
}
s_modelFactoryCache.remove(tableName);
}
List<IServiceReferenceHolder<IModelFactory>> factoryList = Service.locator().list(IModelFactory.class).getServiceReferences();
if (factoryList != null) if (factoryList != null)
{ {
for(IModelFactory factory : factoryList) { for(IServiceReferenceHolder<IModelFactory> factory : factoryList) {
po = factory.getPO(tableName, rs, trxName); IModelFactory service = factory.getService();
if (po != null) if (service != null)
break; {
po = service.getPO(tableName, rs, trxName);
if (po != null)
{
s_modelFactoryCache.put(tableName, factory);
break;
}
}
} }
} }

View File

@ -27,7 +27,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.idempiere.distributed.ICacheService; import org.idempiere.distributed.ICacheService;
/** /**
@ -112,7 +112,7 @@ public class CCache<K,V> implements CacheInterface, Map<K, V>, Serializable
cache = CacheMgt.get().register(this, distributed); cache = CacheMgt.get().register(this, distributed);
m_distributed = distributed; m_distributed = distributed;
if (distributed) { if (distributed) {
ICacheService provider = Service.locator().locate(ICacheService.class).getService(); ICacheService provider = Core.getCacheService();
if (provider != null) { if (provider != null) {
nullList = provider.getSet(name); nullList = provider.getSet(name);
} }

View File

@ -35,7 +35,7 @@ import java.util.logging.Level;
import java.util.logging.LogManager; import java.util.logging.LogManager;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.compiere.db.AdempiereDatabase; import org.compiere.db.AdempiereDatabase;
import org.compiere.db.CConnection; import org.compiere.db.CConnection;
@ -561,7 +561,7 @@ public class CLogMgt
// //
//cluster info //cluster info
if (Env.getAD_Client_ID(Env.getCtx()) == 0) { if (Env.getAD_Client_ID(Env.getCtx()) == 0) {
IClusterService service = Service.locator().locate(IClusterService.class).getService(); IClusterService service = Core.getClusterService();
if (service != null) { if (service != null) {
IClusterMember local = service.getLocalMember(); IClusterMember local = service.getLocalMember();
Collection<IClusterMember> members = service.getMembers(); Collection<IClusterMember> members = service.getMembers();

View File

@ -37,8 +37,7 @@ import java.util.Map.Entry;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.idempiere.distributed.IClusterMember; import org.idempiere.distributed.IClusterMember;
import org.idempiere.distributed.IClusterService; import org.idempiere.distributed.IClusterService;
@ -157,8 +156,7 @@ public class CacheInfo implements Serializable {
* @return cache infos * @return cache infos
*/ */
public static List<CacheInfo> getCacheInfos(boolean sortByName) { public static List<CacheInfo> getCacheInfos(boolean sortByName) {
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); IClusterService service = Core.getClusterService();
IClusterService service = holder != null ? holder.getService() : null;
if (service != null && service.getMembers().size() > 1) { if (service != null && service.getMembers().size() > 1) {
List<CacheInfo> instances = new ArrayList<>(); List<CacheInfo> instances = new ArrayList<>();
GetCacheInfoCallable callable = new GetCacheInfoCallable(); GetCacheInfoCallable callable = new GetCacheInfoCallable();

View File

@ -26,8 +26,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.idempiere.distributed.ICacheService; import org.idempiere.distributed.ICacheService;
import org.idempiere.distributed.IClusterMember; import org.idempiere.distributed.IClusterMember;
import org.idempiere.distributed.IClusterService; import org.idempiere.distributed.IClusterService;
@ -107,10 +106,10 @@ public class CacheMgt
Map<K, V> map = null; Map<K, V> map = null;
if (distributed) if (distributed)
{ {
ICacheService provider = Service.locator().locate(ICacheService.class).getService(); ICacheService provider = Core.getCacheService();
if (provider != null) if (provider != null)
{ {
IClusterService clusterService = Service.locator().locate(IClusterService.class).getService(); IClusterService clusterService = Core.getClusterService();
if (clusterService != null && !clusterService.isStandAlone()) if (clusterService != null && !clusterService.isStandAlone())
map = provider.getMap(name); map = provider.getMap(name);
} }
@ -162,8 +161,7 @@ public class CacheMgt
* @return number of deleted cache entries * @return number of deleted cache entries
*/ */
private int clusterReset(String tableName, int recordId) { private int clusterReset(String tableName, int recordId) {
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); IClusterService service = Core.getClusterService();
IClusterService service = holder.getService();
if (service != null) { if (service != null) {
ResetCacheCallable callable = new ResetCacheCallable(tableName, recordId); ResetCacheCallable callable = new ResetCacheCallable(tableName, recordId);
Map<IClusterMember, Future<Integer>> futureMap = service.execute(callable, service.getMembers()); Map<IClusterMember, Future<Integer>> futureMap = service.execute(callable, service.getMembers());
@ -203,8 +201,7 @@ public class CacheMgt
* @return number of deleted cache entries * @return number of deleted cache entries
*/ */
private void clusterNewRecord(String tableName, int recordId) { private void clusterNewRecord(String tableName, int recordId) {
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); IClusterService service = Core.getClusterService();
IClusterService service = holder.getService();
if (service != null) { if (service != null) {
CacheNewRecordCallable callable = new CacheNewRecordCallable(tableName, recordId); CacheNewRecordCallable callable = new CacheNewRecordCallable(tableName, recordId);
if (service.execute(callable, service.getMembers()) == null) { if (service.execute(callable, service.getMembers()) == null) {

View File

@ -64,9 +64,11 @@ import java.text.SimpleDateFormat;
import java.util.Currency; import java.util.Currency;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IDisplayTypeFactory; import org.adempiere.base.IDisplayTypeFactory;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.compiere.db.AdempiereDatabase; import org.compiere.db.AdempiereDatabase;
import org.compiere.db.Database; import org.compiere.db.Database;
@ -214,10 +216,18 @@ public final class DisplayType
|| displayType == Image || displayType == Chart) || displayType == Image || displayType == Chart)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isID(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isID(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isID(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
@ -235,10 +245,18 @@ public final class DisplayType
|| displayType == Integer || displayType == Quantity) || displayType == Integer || displayType == Quantity)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isNumeric(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isNumeric(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isNumeric(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
@ -260,13 +278,22 @@ public final class DisplayType
|| displayType == Quantity) || displayType == Quantity)
return 4; return 4;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.getDefaultPrecision(displayType) != null) IDisplayTypeFactory service = cache.getService();
return factory.getDefaultPrecision(displayType).intValue(); if (service != null) {
Integer v = service.getDefaultPrecision(displayType);
return v != null ? v.intValue() : 0;
}
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getDefaultPrecision(displayType) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
Integer v = found.get().getService().getDefaultPrecision(displayType);
return v != null ? v.intValue() : 0;
} }
return 0; return 0;
} // getDefaultPrecision } // getDefaultPrecision
@ -289,10 +316,18 @@ public final class DisplayType
|| displayType == ChosenMultipleSelectionSearch) || displayType == ChosenMultipleSelectionSearch)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isText(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isText(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isText(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
} // isText } // isText
@ -308,10 +343,18 @@ public final class DisplayType
if (displayType == Date || displayType == DateTime || displayType == Time) if (displayType == Date || displayType == DateTime || displayType == Time)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isDate(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isDate(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isDate(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
@ -332,10 +375,18 @@ public final class DisplayType
|| displayType == ChosenMultipleSelectionList) || displayType == ChosenMultipleSelectionList)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isLookup(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isLookup(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isLookup(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
@ -352,10 +403,18 @@ public final class DisplayType
|| displayType == TextLong) || displayType == TextLong)
return true; return true;
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
if(factory.isLOB(displayType)) IDisplayTypeFactory service = cache.getService();
return true; if (service != null)
return service.isLOB(displayType);
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().isLOB(displayType))
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return true;
} }
return false; return false;
@ -415,13 +474,22 @@ public final class DisplayType
} }
else else
{ {
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
DecimalFormat osgiFormat = factory.getNumberFormat(displayType, myLanguage, pattern); IDisplayTypeFactory service = cache.getService();
if(osgiFormat!=null){ if (service != null) {
return osgiFormat; DecimalFormat f = service.getNumberFormat(displayType, language, pattern);
if (f != null)
return f;
} }
} }
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getNumberFormat(displayType, language, pattern) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return found.get().getService().getNumberFormat(displayType, language, pattern);
}
format.setMaximumIntegerDigits(MAX_DIGITS); format.setMaximumIntegerDigits(MAX_DIGITS);
format.setMaximumFractionDigits(MAX_FRACTION); format.setMaximumFractionDigits(MAX_FRACTION);
@ -530,11 +598,21 @@ public final class DisplayType
} }
else { else {
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
SimpleDateFormat osgiFormat = factory.getDateFormat(displayType, myLanguage, pattern); IDisplayTypeFactory service = cache.getService();
if(osgiFormat!=null) if (service != null) {
return osgiFormat; SimpleDateFormat v = service.getDateFormat(displayType, language, pattern);
if (v != null)
return v;
}
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getDateFormat(displayType, language, pattern) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return found.get().getService().getDateFormat(displayType, language, pattern);
} }
} }
@ -593,11 +671,21 @@ public final class DisplayType
return byte[].class; return byte[].class;
else else
{ {
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
Class<?> osgiClass = factory.getClass(displayType, yesNoAsBoolean); IDisplayTypeFactory service = cache.getService();
if(osgiClass!=null) if (service != null) {
return osgiClass; Class<?> v = service.getClass(displayType, yesNoAsBoolean);
if (v != null)
return v;
}
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getClass(displayType, yesNoAsBoolean) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return found.get().getService().getClass(displayType, yesNoAsBoolean);
} }
} }
// //
@ -672,11 +760,21 @@ public final class DisplayType
return getDatabase().getCharacterDataType()+"(" + fieldLength + ")"; return getDatabase().getCharacterDataType()+"(" + fieldLength + ")";
} }
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
String osgiSQLDataType = factory.getSQLDataType(displayType, columnName, fieldLength); IDisplayTypeFactory service = cache.getService();
if(osgiSQLDataType!=null) if (service != null) {
return osgiSQLDataType; String v = service.getSQLDataType(displayType, columnName, fieldLength);
if (v != null)
return v;
}
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getSQLDataType(displayType, columnName, fieldLength) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return found.get().getService().getSQLDataType(displayType, columnName, fieldLength);
} }
if (!DisplayType.isText(displayType)) if (!DisplayType.isText(displayType))
@ -764,11 +862,21 @@ public final class DisplayType
if (displayType == Chart) if (displayType == Chart)
return "Chart"; return "Chart";
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices(); IServiceReferenceHolder<IDisplayTypeFactory> cache = s_displayTypeFactoryCache.get(displayType);
for(IDisplayTypeFactory factory : factoryList){ if (cache != null) {
String osgiDescription = factory.getDescription(displayType); IDisplayTypeFactory service = cache.getService();
if(osgiDescription!=null) if (service != null) {
return osgiDescription; String v = service.getDescription(displayType);
if (v != null)
return v;
}
}
Optional<IServiceReferenceHolder<IDisplayTypeFactory>> found = getDisplayTypeFactories().stream()
.filter(e -> e.getService() != null && e.getService().getDescription(displayType) != null)
.findFirst();
if (found.isPresent()) {
s_displayTypeFactoryCache.put(displayType, found.get());
return found.get().getService().getDescription(displayType);
} }
// //
@ -791,4 +899,9 @@ public final class DisplayType
} // getCurrencyFormat } // getCurrencyFormat
private final static CCache<Integer, IServiceReferenceHolder<IDisplayTypeFactory>> s_displayTypeFactoryCache = new CCache<>(null, "IDisplayTypeFactory", 100, false);
private static List<IServiceReferenceHolder<IDisplayTypeFactory>> getDisplayTypeFactories() {
return Service.locator().list(IDisplayTypeFactory.class).getServiceReferences();
}
} // DisplayType } // DisplayType

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.adempiere.pipo.srv.PipoDictionaryService"> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.adempiere.pipo.srv.PipoDictionaryService">
<implementation class="org.adempiere.pipo.srv.PipoDictionaryService"/> <implementation class="org.adempiere.pipo.srv.PipoDictionaryService"/>
<service> <service>
<provide interface="org.adempiere.base.IDictionaryService"/> <provide interface="org.adempiere.base.IDictionaryService"/>

View File

@ -18,8 +18,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Core;
import org.adempiere.base.IDictionaryService; import org.adempiere.base.IDictionaryService;
import org.adempiere.base.Service;
import org.adempiere.util.IProcessUI; import org.adempiere.util.IProcessUI;
import org.compiere.model.MClient; import org.compiere.model.MClient;
import org.compiere.model.MSysConfig; import org.compiere.model.MSysConfig;
@ -93,9 +93,8 @@ public abstract class AbstractActivator implements BundleActivator, ServiceTrack
boolean success = false; boolean success = false;
if (!installedPackage(version)) { if (!installedPackage(version)) {
List<IDictionaryService> list = Service.locator().list(IDictionaryService.class).getServices(); IDictionaryService ids = Core.getDictionaryService();
if (list != null) { if (ids != null) {
IDictionaryService ids = list.get(0);
ids.merge(null, zipfile); ids.merge(null, zipfile);
success = true; success = true;
if (ids.getAD_Package_Imp_Proc() != null) { if (ids.getAD_Package_Imp_Proc() != null) {

View File

@ -1,3 +1,30 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
* - carlos *
* - deepak *
* - thomas *
**********************************************************************/
package org.adempiere.report.jasper; package org.adempiere.report.jasper;
import org.compiere.model.PrintInfo; import org.compiere.model.PrintInfo;
@ -5,11 +32,29 @@ import org.compiere.model.PrintInfo;
import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperPrint;
/**
*
* @author hengsin
*
*/
public interface JRViewerProvider { public interface JRViewerProvider {
/**
*
* @param jasperPrint
* @param title
* @param printInfo
* @throws JRException
*/
public void openViewer(JasperPrint jasperPrint, String title, PrintInfo printInfo) throws JRException; public void openViewer(JasperPrint jasperPrint, String title, PrintInfo printInfo) throws JRException;
default void openViewer(JasperPrint jasperPrint, String title) throws JRException { /**
*
* @param jasperPrint
* @param title
* @throws JRException
*/
public default void openViewer(JasperPrint jasperPrint, String title) throws JRException {
openViewer(jasperPrint, title, null); openViewer(jasperPrint, title, null);
} }

View File

@ -1,3 +1,28 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - carlos *
* - deepak *
**********************************************************************/
package org.adempiere.report.jasper; package org.adempiere.report.jasper;
import java.util.List; import java.util.List;
@ -7,11 +32,23 @@ import org.compiere.model.PrintInfo;
import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperPrint;
/**
*
* @author carlos
*
*/
public interface JRViewerProviderList { public interface JRViewerProviderList {
/**
*
* @param jasperPrintList
* @param title
* @param printInfo
* @throws JRException
*/
public void openViewer(List<JasperPrint> jasperPrintList, String title, PrintInfo printInfo) throws JRException; public void openViewer(List<JasperPrint> jasperPrintList, String title, PrintInfo printInfo) throws JRException;
default void openViewer(List<JasperPrint> jasperPrintList, String title) throws JRException { public default void openViewer(List<JasperPrint> jasperPrintList, String title) throws JRException {
openViewer(jasperPrintList, title, null); openViewer(jasperPrintList, title, null);
} }

View File

@ -50,6 +50,7 @@ import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName; import javax.print.attribute.standard.JobName;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException; import org.adempiere.exceptions.DBException;
@ -755,7 +756,7 @@ public class ReportStarter implements ProcessCall, ClientProcess
printInfo = new PrintInfo(pi); printInfo = new PrintInfo(pi);
if (reportPathList.length == 1) { if (reportPathList.length == 1) {
if (log.isLoggable(Level.INFO)) log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName()); if (log.isLoggable(Level.INFO)) log.info( "ReportStarter.startProcess run report -"+jasperPrint.getName());
JRViewerProvider viewerLauncher = Service.locator().locate(JRViewerProvider.class).getService(); JRViewerProvider viewerLauncher = getViewerProvider();
if (!Util.isEmpty(processInfo.getReportType())) { if (!Util.isEmpty(processInfo.getReportType())) {
jasperPrint.setProperty("IDEMPIERE_REPORT_TYPE", processInfo.getReportType()); jasperPrint.setProperty("IDEMPIERE_REPORT_TYPE", processInfo.getReportType());
} }
@ -763,7 +764,7 @@ public class ReportStarter implements ProcessCall, ClientProcess
} else { } else {
jasperPrintList.add(jasperPrint); jasperPrintList.add(jasperPrint);
if (idx+1 == reportPathList.length) { if (idx+1 == reportPathList.length) {
JRViewerProviderList viewerLauncher = Service.locator().locate(JRViewerProviderList.class).getService(); JRViewerProviderList viewerLauncher = getViewerProviderList();
if (viewerLauncher == null) { if (viewerLauncher == null) {
throw new AdempiereException("Can not find a viewer provider for multiple jaspers"); throw new AdempiereException("Can not find a viewer provider for multiple jaspers");
} }
@ -886,7 +887,49 @@ public class ReportStarter implements ProcessCall, ClientProcess
reportResult( AD_PInstance_ID, null, trxName); reportResult( AD_PInstance_ID, null, trxName);
pi.setSummary(Msg.getMsg(Env.getCtx(), "Success"), false); pi.setSummary(Msg.getMsg(Env.getCtx(), "Success"), false);
return true; return true;
} }
private static IServiceReferenceHolder<JRViewerProviderList> s_viewerProviderListReference = null;
/**
*
* @return {@link JRViewerProviderList}
*/
public static synchronized JRViewerProviderList getViewerProviderList() {
JRViewerProviderList viewerLauncher = null;
if (s_viewerProviderListReference != null) {
viewerLauncher = s_viewerProviderListReference.getService();
if (viewerLauncher != null)
return viewerLauncher;
}
IServiceReferenceHolder<JRViewerProviderList> viewerReference = Service.locator().locate(JRViewerProviderList.class).getServiceReference();
if (viewerReference != null) {
viewerLauncher = viewerReference.getService();
s_viewerProviderListReference = viewerReference;
}
return viewerLauncher;
}
private static IServiceReferenceHolder<JRViewerProvider> s_viewerProviderReference = null;
/**
*
* @return {@link JRViewerProvider}
*/
public static synchronized JRViewerProvider getViewerProvider() {
JRViewerProvider viewerLauncher = null;
if (s_viewerProviderReference != null) {
viewerLauncher = s_viewerProviderReference.getService();
if (viewerLauncher != null)
return viewerLauncher;
}
IServiceReferenceHolder<JRViewerProvider> viewerReference = Service.locator().locate(JRViewerProvider.class).getServiceReference();
if (viewerReference != null) {
viewerLauncher = viewerReference.getService();
s_viewerProviderReference = viewerReference;
}
return viewerLauncher;
}
private String makePrefix(String name) { private String makePrefix(String name) {
StringBuilder prefix = new StringBuilder(); StringBuilder prefix = new StringBuilder();

View File

@ -27,7 +27,7 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.server.AdempiereServerActivator; import org.adempiere.server.AdempiereServerActivator;
import org.adempiere.server.IServerFactory; import org.adempiere.server.IServerFactory;
@ -142,7 +142,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer<IServerFacto
if (clusterId != null) { if (clusterId != null) {
Map<String, String> map = getServerOwnerMap(); Map<String, String> map = getServerOwnerMap();
if (map != null) { if (map != null) {
ICacheService cacheService = getCacheService(); ICacheService cacheService = Core.getCacheService();
try { try {
String reloadLockKey = "cluster.server.owner.map.reload"; String reloadLockKey = "cluster.server.owner.map.reload";
if (cacheService.tryLock(map, reloadLockKey, 30, TimeUnit.SECONDS)) { if (cacheService.tryLock(map, reloadLockKey, 30, TimeUnit.SECONDS)) {
@ -200,7 +200,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer<IServerFacto
if (clusterId != null) { if (clusterId != null) {
Map<String, String> map = getServerOwnerMap(); Map<String, String> map = getServerOwnerMap();
if (map != null) { if (map != null) {
ICacheService cacheService = getCacheService(); ICacheService cacheService = Core.getCacheService();
try { try {
if (cacheService.tryLock(map, server.getServerID(), 30, TimeUnit.SECONDS)) { if (cacheService.tryLock(map, server.getServerID(), 30, TimeUnit.SECONDS)) {
try { try {
@ -257,7 +257,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer<IServerFacto
if (clusterId != null) { if (clusterId != null) {
Map<String, String> map = getServerOwnerMap(); Map<String, String> map = getServerOwnerMap();
if (map != null) { if (map != null) {
ICacheService cacheService = getCacheService(); ICacheService cacheService = Core.getCacheService();
try { try {
if (cacheService.tryLock(map, server.getServerID(), 30, TimeUnit.SECONDS)) { if (cacheService.tryLock(map, server.getServerID(), 30, TimeUnit.SECONDS)) {
try { try {
@ -853,14 +853,8 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer<IServerFacto
return null; return null;
} }
private ICacheService getCacheService( ) {
IServiceHolder<ICacheService> holder = Service.locator().locate(ICacheService.class);
ICacheService service = holder != null ? holder.getService() : null;
return service;
}
private Map<String, String> getServerOwnerMap() { private Map<String, String> getServerOwnerMap() {
ICacheService service = getCacheService(); ICacheService service = Core.getCacheService();
if (service != null) { if (service != null) {
return service.getMap("cluster.server.owner.map"); return service.getMap("cluster.server.owner.map");
} }

View File

@ -36,8 +36,7 @@ import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.compiere.model.MScheduler; import org.compiere.model.MScheduler;
import org.compiere.server.IServerManager; import org.compiere.server.IServerManager;
@ -84,9 +83,7 @@ public class ClusterServerMgr implements IServerManager {
* @return cluster service * @return cluster service
*/ */
public static IClusterService getClusterService() { public static IClusterService getClusterService() {
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); return Core.getClusterService();
IClusterService service = holder != null ? holder.getService() : null;
return service;
} }
/** /**

View File

@ -20,13 +20,25 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.webui; package org.adempiere.webui;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.base.ServiceQuery; import org.adempiere.base.ServiceQuery;
import org.adempiere.webui.apps.IProcessParameterListener; import org.adempiere.webui.apps.IProcessParameterListener;
import org.adempiere.webui.apps.graph.IChartRendererService;
import org.adempiere.webui.factory.IDashboardGadgetFactory;
import org.adempiere.webui.factory.IFormFactory; import org.adempiere.webui.factory.IFormFactory;
import org.adempiere.webui.panel.ADForm; import org.adempiere.webui.panel.ADForm;
import org.compiere.grid.ICreateFrom;
import org.compiere.grid.ICreateFromFactory;
import org.compiere.grid.IPaymentForm;
import org.compiere.grid.IPaymentFormFactory;
import org.compiere.model.GridTab;
import org.compiere.util.CCache;
import org.zkoss.zk.ui.Component;
/** /**
* *
@ -36,23 +48,42 @@ import org.adempiere.webui.panel.ADForm;
*/ */
public class Extensions { public class Extensions {
private final static CCache<String, IServiceReferenceHolder<IFormFactory>> s_formFactoryCache = new CCache<>(null, "IFormFactory", 100, false);
/** /**
* *
* @param formId Java class name or equinox extension Id * @param formId Java class name or equinox extension Id
* @return IFormController instance or null if formId not found * @return IFormController instance or null if formId not found
*/ */
public static ADForm getForm(String formId) { public static ADForm getForm(String formId) {
List<IFormFactory> factories = Service.locator().list(IFormFactory.class).getServices(); IServiceReferenceHolder<IFormFactory> cache = s_formFactoryCache.get(formId);
if (factories != null) { if (cache != null) {
for(IFormFactory factory : factories) { IFormFactory service = cache.getService();
ADForm form = factory.newFormInstance(formId); if (service != null) {
ADForm form = service.newFormInstance(formId);
if (form != null) if (form != null)
return form; return form;
} }
s_formFactoryCache.remove(formId);
}
List<IServiceReferenceHolder<IFormFactory>> factories = Service.locator().list(IFormFactory.class).getServiceReferences();
if (factories != null) {
for(IServiceReferenceHolder<IFormFactory> factory : factories) {
IFormFactory service = factory.getService();
if (service != null) {
ADForm form = service.newFormInstance(formId);
if (form != null) {
s_formFactoryCache.put(formId, factory);
return form;
}
}
}
} }
return null; return null;
} }
private final static CCache<String, List<IServiceReferenceHolder<IProcessParameterListener>>> s_processParameterListenerCache = new CCache<>(null, "List<IProcessParameterListener>", 100, false);
/** /**
* *
* @param processClass * @param processClass
@ -60,10 +91,133 @@ public class Extensions {
* @return list of parameter listener * @return list of parameter listener
*/ */
public static List<IProcessParameterListener> getProcessParameterListeners(String processClass, String columnName) { public static List<IProcessParameterListener> getProcessParameterListeners(String processClass, String columnName) {
String cacheKey = processClass + "|" + columnName;
List<IServiceReferenceHolder<IProcessParameterListener>> listeners = s_processParameterListenerCache.get(cacheKey);
if (listeners != null)
return listeners.stream().filter(e -> e.getService() != null).map(e -> e.getService()).collect(Collectors.toCollection(ArrayList::new));
ServiceQuery query = new ServiceQuery(); ServiceQuery query = new ServiceQuery();
query.put("ProcessClass", processClass); query.put("ProcessClass", processClass);
if (columnName != null) if (columnName != null)
query.put("|(ColumnName", columnName+")(ColumnName="+columnName+",*)(ColumnName="+"*,"+columnName+",*)(ColumnName=*,"+columnName+")"); query.put("|(ColumnName", columnName+")(ColumnName="+columnName+",*)(ColumnName="+"*,"+columnName+",*)(ColumnName=*,"+columnName+")");
return Service.locator().list(IProcessParameterListener.class, null, query).getServices(); listeners = Service.locator().list(IProcessParameterListener.class, null, query).getServiceReferences();
if (listeners == null)
listeners = new ArrayList<>();
s_processParameterListenerCache.put(cacheKey, listeners);
return listeners.stream().filter(e -> e.getService() != null).map(e -> e.getService()).collect(Collectors.toCollection(ArrayList::new));
} }
private final static CCache<String, IServiceReferenceHolder<ICreateFromFactory>> s_createFromFactoryCache = new CCache<>(null, "ICreateFromFactory", 100, false);
/**
*
* @param mTab
* @return ICreateFrom instance
*/
public static ICreateFrom getCreateFrom(GridTab mTab) {
ICreateFrom createFrom = null;
String cacheKey = Integer.toString(mTab.getAD_Tab_ID());
IServiceReferenceHolder<ICreateFromFactory> cache = s_createFromFactoryCache.get(cacheKey);
if (cache != null) {
ICreateFromFactory service = cache.getService();
if (service != null) {
createFrom = service.create(mTab);
if (createFrom != null) {
return createFrom;
}
}
s_createFromFactoryCache.remove(cacheKey);
}
List<IServiceReferenceHolder<ICreateFromFactory>> factories = Service.locator().list(ICreateFromFactory.class).getServiceReferences();
for (IServiceReferenceHolder<ICreateFromFactory> factory : factories)
{
ICreateFromFactory service = factory.getService();
if (service != null) {
createFrom = service.create(mTab);
if (createFrom != null) {
s_createFromFactoryCache.put(cacheKey, factory);
return createFrom;
}
}
}
return null;
}
private static final CCache<String, IServiceReferenceHolder<IPaymentFormFactory>> s_paymentFormFactoryCache = new CCache<>(null, "IPaymentFormFactory", 100, false);
/**
*
* @param windowNo
* @param mTab
* @param paymentRule
* @return IPaymentForm instance
*/
public static IPaymentForm getPaymentForm(int windowNo, GridTab mTab, String paymentRule) {
String cacheKey = mTab.getAD_Tab_ID() + "|" + paymentRule;
IServiceReferenceHolder<IPaymentFormFactory> cache = s_paymentFormFactoryCache.get(cacheKey);
if (cache != null) {
IPaymentFormFactory service = cache.getService();
if (service != null) {
IPaymentForm paymentForm = service.create(windowNo, mTab, paymentRule);
if (paymentForm != null)
return paymentForm;
}
s_paymentFormFactoryCache.remove(cacheKey);
}
IPaymentForm paymentForm = null;
List<IServiceReferenceHolder<IPaymentFormFactory>> factories = Service.locator().list(IPaymentFormFactory.class).getServiceReferences();
for (IServiceReferenceHolder<IPaymentFormFactory> factory : factories) {
IPaymentFormFactory service = factory.getService();
if (service != null) {
paymentForm = service.create(windowNo, mTab, paymentRule);
if (paymentForm != null) {
s_paymentFormFactoryCache.put(cacheKey, factory);
return paymentForm;
}
}
}
return null;
}
private static final CCache<String, IServiceReferenceHolder<IDashboardGadgetFactory>> s_dashboardGadgetFactoryCache = new CCache<>(null, "IDashboardGadgetFactory", 100, false);
/**
*
* @param url
* @param parent
* @return Gadget component
*/
public static final Component getDashboardGadget(String url, Component parent) {
IServiceReferenceHolder<IDashboardGadgetFactory> cache = s_dashboardGadgetFactoryCache.get(url);
if (cache != null) {
IDashboardGadgetFactory service = cache.getService();
if (service != null) {
Component component = service.getGadget(url,parent);
if(component != null)
return component;
}
s_dashboardGadgetFactoryCache.remove(url);
}
List<IServiceReferenceHolder<IDashboardGadgetFactory>> f = Service.locator().list(IDashboardGadgetFactory.class).getServiceReferences();
for (IServiceReferenceHolder<IDashboardGadgetFactory> factory : f) {
IDashboardGadgetFactory service = factory.getService();
if (service != null) {
Component component = service.getGadget(url,parent);
if(component != null)
return component;
}
}
return null;
}
/**
*
* @return list of {@link IChartRendererService}
*/
public static final List<IChartRendererService> getChartRendererServices() {
return Service.locator().list(IChartRendererService.class).getServices();
}
} }

View File

@ -37,7 +37,7 @@ public class Actions {
synchronized (trackerCache) { synchronized (trackerCache) {
action = trackerCache.get(actionId); action = trackerCache.get(actionId);
} }
if (action != null) if (action != null && action.getService() != null)
return action; return action;
action = Service.locator().locate(IAction.class, actionId, null); action = Service.locator().locate(IAction.class, actionId, null);
@ -57,7 +57,7 @@ public class Actions {
if (aImage != null) if (aImage != null)
return aImage; return aImage;
IServiceHolder<IAction> action = Service.locator().locate(IAction.class, actionId, null); IServiceHolder<IAction> action = getAction(actionId);
if (action.getService() != null) { if (action.getService() != null) {
String path = ACTION_IMAGES_PATH + actionId + "24.png"; String path = ACTION_IMAGES_PATH + actionId + "24.png";
InputStream inputStream = action.getService().getClass().getClassLoader().getResourceAsStream(path); InputStream inputStream = action.getService().getClass().getClassLoader().getResourceAsStream(path);

View File

@ -16,7 +16,8 @@ package org.adempiere.webui.apps;
import org.adempiere.webui.editor.WEditor; import org.adempiere.webui.editor.WEditor;
/** /**
* Listener interface for process parameter panel * Listener interface for process parameter panel.
* Implementation must be thread safe
* @author hengsin * @author hengsin
* *
*/ */

View File

@ -13,25 +13,24 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.webui.apps.form; package org.adempiere.webui.apps.form;
import java.util.List; import org.adempiere.webui.Extensions;
import org.adempiere.base.Service;
import org.compiere.grid.ICreateFrom; import org.compiere.grid.ICreateFrom;
import org.compiere.grid.ICreateFromFactory;
import org.compiere.model.GridTab; import org.compiere.model.GridTab;
/**
*
* @author hengsin
*
*/
public class WCreateFromFactory public class WCreateFromFactory
{ {
/**
*
* @param mTab
* @return ICreateFrom instance
*/
public static ICreateFrom create (GridTab mTab) public static ICreateFrom create (GridTab mTab)
{ {
ICreateFrom createFrom = null; return Extensions.getCreateFrom(mTab);
List<ICreateFromFactory> factories = Service.locator().list(ICreateFromFactory.class).getServices();
for (ICreateFromFactory factory : factories)
{
createFrom = factory.create(mTab);
if (createFrom != null)
break;
}
return createFrom;
} }
} }

View File

@ -13,11 +13,8 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.webui.apps.form; package org.adempiere.webui.apps.form;
import java.util.List; import org.adempiere.webui.Extensions;
import org.adempiere.base.Service;
import org.compiere.grid.IPaymentForm; import org.compiere.grid.IPaymentForm;
import org.compiere.grid.IPaymentFormFactory;
import org.compiere.model.GridTab; import org.compiere.model.GridTab;
/** /**
@ -27,15 +24,15 @@ import org.compiere.model.GridTab;
*/ */
public class WPaymentFormFactory { public class WPaymentFormFactory {
/**
*
* @param windowNo
* @param mTab
* @param paymentRule
* @return IPaymentForm instance
*/
public static IPaymentForm create(int windowNo, GridTab mTab, String paymentRule) public static IPaymentForm create(int windowNo, GridTab mTab, String paymentRule)
{ {
IPaymentForm paymentForm = null; return Extensions.getPaymentForm(windowNo, mTab, paymentRule);
List<IPaymentFormFactory> factories = Service.locator().list(IPaymentFormFactory.class).getServices();
for (IPaymentFormFactory factory : factories) {
paymentForm = factory.create(windowNo, mTab, paymentRule);
if (paymentForm != null)
break;
}
return paymentForm;
} }
} }

View File

@ -22,8 +22,8 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import org.adempiere.apps.graph.GraphColumn; import org.adempiere.apps.graph.GraphColumn;
import org.adempiere.base.Service;
import org.adempiere.webui.ClientInfo; import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.Extensions;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.apps.graph.model.GoalModel; import org.adempiere.webui.apps.graph.model.GoalModel;
import org.adempiere.webui.editor.WTableDirEditor; import org.adempiere.webui.editor.WTableDirEditor;
@ -277,7 +277,7 @@ public class WGraph extends Div implements IdSpace {
goalModel.xAxisLabel = m_xAxisLabel; goalModel.xAxisLabel = m_xAxisLabel;
goalModel.yAxisLabel = m_yAxisLabel; goalModel.yAxisLabel = m_yAxisLabel;
goalModel.zoomFactor = zoomFactor; goalModel.zoomFactor = zoomFactor;
List<IChartRendererService> list = Service.locator().list(IChartRendererService.class).getServices(); List<IChartRendererService> list = Extensions.getChartRendererServices();
for (IChartRendererService renderer : list) { for (IChartRendererService renderer : list) {
if (renderer.renderPerformanceGraph(panel.getPanelchildren(), width, height, goalModel)) if (renderer.renderPerformanceGraph(panel.getPanelchildren(), width, height, goalModel))
break; break;

View File

@ -18,7 +18,7 @@ import java.text.DecimalFormat;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.adempiere.base.Service; import org.adempiere.webui.Extensions;
import org.adempiere.webui.apps.graph.model.IndicatorModel; import org.adempiere.webui.apps.graph.model.IndicatorModel;
import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Panel;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
@ -199,7 +199,7 @@ public class WPerformanceIndicator extends Panel implements EventListener<Event>
model.dialBackground = dialBackground; model.dialBackground = dialBackground;
model.needleColor = needleColor; model.needleColor = needleColor;
model.tickColor = tickColor; model.tickColor = tickColor;
List<IChartRendererService> list = Service.locator().list(IChartRendererService.class).getServices(); List<IChartRendererService> list = Extensions.getChartRendererServices();
for (IChartRendererService renderer : list) { for (IChartRendererService renderer : list) {
if (renderer.renderPerformanceIndicator(this, chartWidth, chartHeight, model)) if (renderer.renderPerformanceIndicator(this, chartWidth, chartHeight, model))
break; break;

View File

@ -26,7 +26,7 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.adempiere.base.event.AbstractEventHandler; import org.adempiere.base.event.AbstractEventHandler;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
import org.adempiere.base.event.IEventTopics; import org.adempiere.base.event.IEventTopics;
@ -167,7 +167,7 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
if (subscriber == null) { if (subscriber == null) {
subscriber = new TopicSubscriber(); subscriber = new TopicSubscriber();
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Map<String,String>> topic = service.getTopic("onRequestChanged"); ITopic<Map<String,String>> topic = service.getTopic("onRequestChanged");
topic.subscribe(subscriber); topic.subscribe(subscriber);
@ -562,7 +562,7 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
@Override @Override
public void run() { public void run() {
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Map<String,String>> topic = service.getTopic(ON_REQUEST_CHANGED_TOPIC); ITopic<Map<String,String>> topic = service.getTopic(ON_REQUEST_CHANGED_TOPIC);
topic.publish(message); topic.publish(message);

View File

@ -16,7 +16,7 @@ package org.adempiere.webui.dashboard;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.session.SessionManager;
@ -154,7 +154,7 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
private static synchronized void createTopicSubscriber() { private static synchronized void createTopicSubscriber() {
if (topicSubscriber == null) { if (topicSubscriber == null) {
topicSubscriber = new TopicSubscriber(); topicSubscriber = new TopicSubscriber();
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Integer> topic = service.getTopic(MRecentItem.ON_RECENT_ITEM_CHANGED_TOPIC); ITopic<Integer> topic = service.getTopic(MRecentItem.ON_RECENT_ITEM_CHANGED_TOPIC);
topic.subscribe(topicSubscriber); topic.subscribe(topicSubscriber);

View File

@ -17,7 +17,7 @@ package org.adempiere.webui.dashboard;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
import org.adempiere.base.Service; import org.adempiere.base.Core;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.component.ToolBarButton;
@ -126,7 +126,7 @@ public class DPRunningJobs extends DashboardPanel implements EventListener<Event
{ {
if (topicSubscriber == null) { if (topicSubscriber == null) {
topicSubscriber = new TopicSubscriber(); topicSubscriber = new TopicSubscriber();
IMessageService service = Service.locator().locate(IMessageService.class).getService(); IMessageService service = Core.getMessageService();
if (service != null) { if (service != null) {
ITopic<Integer> topic = service.getTopic(MPInstance.ON_RUNNING_JOB_CHANGED_TOPIC); ITopic<Integer> topic = service.getTopic(MPInstance.ON_RUNNING_JOB_CHANGED_TOPIC);
topic.subscribe(topicSubscriber); topic.subscribe(topicSubscriber);

View File

@ -26,9 +26,9 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Service;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.webui.ClientInfo; import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.Extensions;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.apps.graph.IChartRendererService; import org.adempiere.webui.apps.graph.IChartRendererService;
import org.adempiere.webui.apps.graph.WGraph; import org.adempiere.webui.apps.graph.WGraph;
@ -37,7 +37,6 @@ import org.adempiere.webui.apps.graph.model.ChartModel;
import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.dashboard.DashboardPanel; import org.adempiere.webui.dashboard.DashboardPanel;
import org.adempiere.webui.dashboard.DashboardRunnable; import org.adempiere.webui.dashboard.DashboardRunnable;
import org.adempiere.webui.factory.IDashboardGadgetFactory;
import org.adempiere.webui.report.HTMLExtension; import org.adempiere.webui.report.HTMLExtension;
import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
@ -472,14 +471,7 @@ public class DashboardController implements EventListener<Event> {
{ {
try { try {
Component component = null; Component component = Extensions.getDashboardGadget(url, content);
List<IDashboardGadgetFactory> f = Service.locator().list(IDashboardGadgetFactory.class).getServices();
for (IDashboardGadgetFactory factory : f) {
component = factory.getGadget(url.toString(),content);
if(component != null)
break;
}
if(component != null) if(component != null)
{ {
if (component instanceof Include) if (component instanceof Include)
@ -528,11 +520,7 @@ public class DashboardController implements EventListener<Event> {
chartPanel.getChildren().clear(); chartPanel.getChildren().clear();
ChartModel model = new ChartModel(); ChartModel model = new ChartModel();
model.chart = chartModel; model.chart = chartModel;
List<IChartRendererService> list = Service.locator().list(IChartRendererService.class).getServices(); renderChart(chartPanel, width, height, model);
for (IChartRendererService renderer : list) {
if (renderer.renderChart(chartPanel, width, height, model))
break;
}
} }
}); });
} }
@ -967,4 +955,12 @@ public class DashboardController implements EventListener<Event> {
} }
} }
} }
private void renderChart(final Div chartPanel, int width, int height, ChartModel model) {
List<IChartRendererService> list = Extensions.getChartRendererServices();
for (IChartRendererService renderer : list) {
if (renderer.renderChart(chartPanel, width, height, model))
break;
}
}
} }

View File

@ -16,7 +16,7 @@ package org.adempiere.webui.editor;
import java.util.List; import java.util.List;
import org.adempiere.base.Service; import org.adempiere.webui.Extensions;
import org.adempiere.webui.apps.graph.IChartRendererService; import org.adempiere.webui.apps.graph.IChartRendererService;
import org.adempiere.webui.apps.graph.model.ChartModel; import org.adempiere.webui.apps.graph.model.ChartModel;
import org.compiere.model.GridField; import org.compiere.model.GridField;
@ -66,7 +66,7 @@ public class WChartEditor extends WEditor
chartDiv.getChildren().clear(); chartDiv.getChildren().clear();
ChartModel model = new ChartModel(); ChartModel model = new ChartModel();
model.chart = chartModel; model.chart = chartModel;
List<IChartRendererService> list = Service.locator().list(IChartRendererService.class).getServices(); List<IChartRendererService> list = Extensions.getChartRendererServices();
for (IChartRendererService renderer : list) { for (IChartRendererService renderer : list) {
if (renderer.renderChart(chartDiv, chartWidth, chartHeight, model)) if (renderer.renderChart(chartDiv, chartWidth, chartHeight, model))
break; break;
@ -156,7 +156,7 @@ public class WChartEditor extends WEditor
chartDiv.getChildren().clear(); chartDiv.getChildren().clear();
ChartModel model = new ChartModel(); ChartModel model = new ChartModel();
model.chart = chartModel; model.chart = chartModel;
List<IChartRendererService> list = Service.locator().list(IChartRendererService.class).getServices(); List<IChartRendererService> list = Extensions.getChartRendererServices();
for (IChartRendererService renderer : list) { for (IChartRendererService renderer : list) {
if (renderer.renderChart(chartDiv, chartWidth, chartHeight, model)) if (renderer.renderChart(chartDiv, chartWidth, chartHeight, model))
break; break;

View File

@ -17,13 +17,16 @@
package org.adempiere.webui.editor; package org.adempiere.webui.editor;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.webui.factory.IEditorFactory; import org.adempiere.webui.factory.IEditorFactory;
import org.compiere.model.GridField; import org.compiere.model.GridField;
import org.compiere.model.GridTab; import org.compiere.model.GridTab;
import org.compiere.util.CLogger; import org.compiere.util.CCache;
import org.osgi.framework.Constants;
/** /**
* *
@ -36,29 +39,61 @@ import org.compiere.util.CLogger;
*/ */
public class WebEditorFactory public class WebEditorFactory
{ {
/**
@SuppressWarnings("unused") *
private final static CLogger logger; * @param gridField
* @param tableEditor
static * @return WEditor for GridField
{ */
logger = CLogger.getCLogger(WebEditorFactory.class);
}
public static WEditor getEditor(GridField gridField, boolean tableEditor) public static WEditor getEditor(GridField gridField, boolean tableEditor)
{ {
return getEditor(gridField.getGridTab(), gridField, tableEditor); return getEditor(gridField.getGridTab(), gridField, tableEditor);
} }
private static final CCache<Long, IServiceReferenceHolder<IEditorFactory>> s_editorFactoryCache = new CCache<>(null, "IEditorFactory", 10, false);
/**
*
* @param gridTab
* @param gridField
* @param tableEditor
* @return WEditor for GridField
*/
public static WEditor getEditor(GridTab gridTab, GridField gridField, boolean tableEditor) public static WEditor getEditor(GridTab gridTab, GridField gridField, boolean tableEditor)
{ {
List<Long> visitedIds = new ArrayList<Long>();
if (!s_editorFactoryCache.isEmpty()) {
Long[] keys = s_editorFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<IEditorFactory> serviceReference = s_editorFactoryCache.get(key);
if (serviceReference != null) {
IEditorFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
WEditor editor = service.getEditor(gridTab, gridField, tableEditor);
if (editor != null)
return editor;
} else {
s_editorFactoryCache.remove(key);
}
}
}
}
WEditor editor = null; WEditor editor = null;
List<IEditorFactory> factoryList = Service.locator().list(IEditorFactory.class).getServices(); List<IServiceReferenceHolder<IEditorFactory>> serviceReferences = Service.locator().list(IEditorFactory.class).getServiceReferences();
for(IEditorFactory factory : factoryList) for(IServiceReferenceHolder<IEditorFactory> serviceReference : serviceReferences)
{ {
editor = factory.getEditor(gridTab, gridField, tableEditor); Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (editor != null) if (visitedIds.contains(serviceId))
break; continue;
IEditorFactory service = serviceReference.getService();
if (service != null)
{
s_editorFactoryCache.put(serviceId, serviceReference);
editor = service.getEditor(gridTab, gridField, tableEditor);
if (editor != null)
break;
}
} }
return editor; return editor;
} }

View File

@ -13,14 +13,18 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.webui.factory; package org.adempiere.webui.factory;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.webui.info.InfoWindow; import org.adempiere.webui.info.InfoWindow;
import org.adempiere.webui.panel.InfoPanel; import org.adempiere.webui.panel.InfoPanel;
import org.compiere.model.GridField; import org.compiere.model.GridField;
import org.compiere.model.Lookup; import org.compiere.model.Lookup;
import org.compiere.model.MLookup; import org.compiere.model.MLookup;
import org.compiere.util.CCache;
import org.osgi.framework.Constants;
/** /**
* *
@ -29,23 +33,74 @@ import org.compiere.model.MLookup;
*/ */
public class InfoManager public class InfoManager
{ {
private final static CCache<Long, IServiceReferenceHolder<IInfoFactory>> s_infoFactoryCache = new CCache<Long, IServiceReferenceHolder<IInfoFactory>>(null, "IInfoFactory", 10, false);
/**
*
* @param WindowNo
* @param tableName
* @param keyColumn
* @param value
* @param multiSelection
* @param whereClause
* @param lookup
* @return {@link InfoPanel}
*/
public static InfoPanel create (int WindowNo, public static InfoPanel create (int WindowNo,
String tableName, String keyColumn, String value, String tableName, String keyColumn, String value,
boolean multiSelection, String whereClause, boolean lookup) boolean multiSelection, String whereClause, boolean lookup)
{ {
InfoPanel info = null; InfoPanel info = null;
List<IInfoFactory> factoryList = Service.locator().list(IInfoFactory.class).getServices(); List<Long> visitedIds = new ArrayList<Long>();
for(IInfoFactory factory : factoryList) if (!s_infoFactoryCache.isEmpty()) {
Long[] keys = s_infoFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<IInfoFactory> serviceReference = s_infoFactoryCache.get(key);
if (serviceReference != null) {
IInfoFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
info = service.create(WindowNo, tableName, keyColumn, value, multiSelection, whereClause, 0, lookup);
if (info != null)
return info;
} else {
s_infoFactoryCache.remove(key);
}
}
}
}
List<IServiceReferenceHolder<IInfoFactory>> serviceReferences = Service.locator().list(IInfoFactory.class).getServiceReferences();
for(IServiceReferenceHolder<IInfoFactory> serviceReference : serviceReferences)
{ {
info = factory.create(WindowNo, tableName, keyColumn, value, multiSelection, whereClause, 0, lookup); Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (info != null) if (visitedIds.contains(serviceId))
break; continue;
IInfoFactory service = serviceReference.getService();
if (service != null)
{
s_infoFactoryCache.put(serviceId, serviceReference);
info = service.create(WindowNo, tableName, keyColumn, value, multiSelection, whereClause, 0, lookup);
if (info != null)
break;
}
} }
// //
return info; return info;
} }
/**
*
* @param lookup
* @param field
* @param tableName
* @param keyColumn
* @param queryValue
* @param multiSelection
* @param whereClause
* @return {@link InfoPanel}
*/
public static InfoPanel create(Lookup lookup, GridField field, String tableName, public static InfoPanel create(Lookup lookup, GridField field, String tableName,
String keyColumn, String queryValue, boolean multiSelection, String keyColumn, String queryValue, boolean multiSelection,
String whereClause) String whereClause)
@ -56,26 +111,86 @@ public class InfoManager
{ {
AD_InfoWindow_ID = ((MLookup)lookup).getAD_InfoWindow_ID(); AD_InfoWindow_ID = ((MLookup)lookup).getAD_InfoWindow_ID();
} }
List<IInfoFactory> factoryList = Service.locator().list(IInfoFactory.class).getServices();
for(IInfoFactory factory : factoryList) List<Long> visitedIds = new ArrayList<Long>();
if (!s_infoFactoryCache.isEmpty()) {
Long[] keys = s_infoFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<IInfoFactory> serviceReference = s_infoFactoryCache.get(key);
if (serviceReference != null) {
IInfoFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
ip = service.create(lookup, field, tableName, keyColumn, queryValue, false, whereClause, AD_InfoWindow_ID);
if (ip != null)
return ip;
} else {
s_infoFactoryCache.remove(key);
}
}
}
}
List<IServiceReferenceHolder<IInfoFactory>> serviceReferences = Service.locator().list(IInfoFactory.class).getServiceReferences();
for(IServiceReferenceHolder<IInfoFactory> serviceReference : serviceReferences)
{ {
ip = factory.create(lookup, field, tableName, keyColumn, queryValue, false, whereClause, AD_InfoWindow_ID); Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (ip != null) if (visitedIds.contains(serviceId))
break; continue;
IInfoFactory service = serviceReference.getService();
if (service != null)
{
s_infoFactoryCache.put(serviceId, serviceReference);
ip = service.create(lookup, field, tableName, keyColumn, queryValue, false, whereClause, AD_InfoWindow_ID);
if (ip != null)
break;
}
} }
return ip; return ip;
} }
/**
*
* @param AD_InfoWindow_ID
* @return {@link InfoWindow}
*/
public static InfoWindow create (int AD_InfoWindow_ID) public static InfoWindow create (int AD_InfoWindow_ID)
{ {
InfoWindow info = null; InfoWindow info = null;
List<IInfoFactory> factoryList = Service.locator().list(IInfoFactory.class).getServices(); List<Long> visitedIds = new ArrayList<Long>();
for(IInfoFactory factory : factoryList) if (!s_infoFactoryCache.isEmpty()) {
Long[] keys = s_infoFactoryCache.keySet().toArray(new Long[0]);
for (Long key : keys) {
IServiceReferenceHolder<IInfoFactory> serviceReference = s_infoFactoryCache.get(key);
if (serviceReference != null) {
IInfoFactory service = serviceReference.getService();
if (service != null) {
visitedIds.add(key);
info = service.create(AD_InfoWindow_ID);
if (info != null)
return info;
} else {
s_infoFactoryCache.remove(key);
}
}
}
}
List<IServiceReferenceHolder<IInfoFactory>> serviceReferences = Service.locator().list(IInfoFactory.class).getServiceReferences();
for(IServiceReferenceHolder<IInfoFactory> serviceReference : serviceReferences)
{ {
info = factory.create(AD_InfoWindow_ID); Long serviceId = (Long) serviceReference.getServiceReference().getProperty(Constants.SERVICE_ID);
if (info != null) if (visitedIds.contains(serviceId))
break; continue;
IInfoFactory service = serviceReference.getService();
if (service != null)
{
s_infoFactoryCache.put(serviceId, serviceReference);
info = service.create(AD_InfoWindow_ID);
if (info != null)
break;
}
} }
// //
return info; return info;

View File

@ -25,8 +25,7 @@
**********************************************************************/ **********************************************************************/
package org.adempiere.webui.scheduler; package org.adempiere.webui.scheduler;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.adempiere.util.Callback; import org.adempiere.util.Callback;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.action.IAction; import org.adempiere.webui.action.IAction;
@ -156,8 +155,7 @@ public class ChangeStateAction implements IAction, EventListener<Event> {
private IServerManager getServerMgr() { private IServerManager getServerMgr() {
IServerManager serverMgr = null; IServerManager serverMgr = null;
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); IClusterService service = Core.getClusterService();
IClusterService service = holder != null ? holder.getService() : null;
if (service != null) if (service != null)
serverMgr = ClusterServerMgr.getInstance(); serverMgr = ClusterServerMgr.getInstance();
else else

View File

@ -25,8 +25,7 @@
**********************************************************************/ **********************************************************************/
package org.adempiere.webui.scheduler; package org.adempiere.webui.scheduler;
import org.adempiere.base.IServiceHolder; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.adempiere.util.Callback; import org.adempiere.util.Callback;
import org.adempiere.webui.adwindow.ADWindow; import org.adempiere.webui.adwindow.ADWindow;
import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Button;
@ -329,8 +328,7 @@ public class SchedulerStateEditor extends WEditor {
private IServerManager getServerMgr() { private IServerManager getServerMgr() {
IServerManager serverMgr = null; IServerManager serverMgr = null;
IServiceHolder<IClusterService> holder = Service.locator().locate(IClusterService.class); IClusterService service = Core.getClusterService();
IClusterService service = holder != null ? holder.getService() : null;
if (service != null) if (service != null)
serverMgr = ClusterServerMgr.getInstance(); serverMgr = ClusterServerMgr.getInstance();
else else

View File

@ -15,6 +15,7 @@ package org.adempiere.webui.util;
import javax.activation.DataSource; import javax.activation.DataSource;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.webui.ClientInfo; import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.factory.IFeedbackService; import org.adempiere.webui.factory.IFeedbackService;
@ -52,9 +53,30 @@ public class FeedbackManager {
*/ */
public static void emailSupport(boolean errorOnly) public static void emailSupport(boolean errorOnly)
{ {
IFeedbackService service = Service.locator().locate(IFeedbackService.class).getService(); IFeedbackService service = getFeedbackService();
if (service != null) if (service != null)
service.emailSupport(errorOnly); service.emailSupport(errorOnly);
}
private static IServiceReferenceHolder<IFeedbackService> s_feedbackServiceReference = null;
/**
*
* @return {@link IFeedbackService}
*/
public static synchronized IFeedbackService getFeedbackService() {
IFeedbackService service = null;
if (s_feedbackServiceReference != null) {
service = s_feedbackServiceReference.getService();
if (service != null)
return service;
}
IServiceReferenceHolder<IFeedbackService> serviceReference = Service.locator().locate(IFeedbackService.class).getServiceReference();
if (serviceReference != null) {
service = serviceReference.getService();
s_feedbackServiceReference = serviceReference;
}
return service;
} }
/** /**
@ -62,7 +84,7 @@ public class FeedbackManager {
*/ */
public static void createNewRequest() public static void createNewRequest()
{ {
IFeedbackService service = Service.locator().locate(IFeedbackService.class).getService(); IFeedbackService service = getFeedbackService();
if (service != null) if (service != null)
service.createNewRequest(); service.createNewRequest();
} }

View File

@ -31,6 +31,7 @@ import org.zkoss.zk.ui.Executions;
*/ */
public class ZkReportViewerProvider implements ReportViewerProvider { public class ZkReportViewerProvider implements ReportViewerProvider {
@Override
public void openViewer(final ReportEngine report) { public void openViewer(final ReportEngine report) {
// IDEMPIERE-2499 // IDEMPIERE-2499
// detect ui thread by value of Executions.getCurrent(), not office method but work // detect ui thread by value of Executions.getCurrent(), not office method but work

View File

@ -25,11 +25,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IPaymentExporterFactory; import org.adempiere.base.Core;
import org.adempiere.base.Service;
import org.compiere.model.MLookupFactory; import org.compiere.model.MLookupFactory;
import org.compiere.model.MLookupInfo; import org.compiere.model.MLookupInfo;
import org.compiere.model.MPaySelectionCheck; import org.compiere.model.MPaySelectionCheck;
@ -252,15 +250,7 @@ public class PayPrint {
} }
try try
{ {
List<IPaymentExporterFactory> factories = Service.locator().list(IPaymentExporterFactory.class).getServices(); m_PaymentExport = Core.getPaymentExporter(m_PaymentExportClass);
if (factories != null && !factories.isEmpty()) {
for(IPaymentExporterFactory factory : factories) {
m_PaymentExport = factory.newPaymentExporterInstance(m_PaymentExportClass);
if (m_PaymentExport != null)
break;
}
}
if (m_PaymentExport == null) if (m_PaymentExport == null)
{ {
Class<?> clazz = Class.forName (m_PaymentExportClass); Class<?> clazz = Class.forName (m_PaymentExportClass);

View File

@ -31,6 +31,7 @@ import static org.compiere.model.SystemIDs.PROCESS_RPT_M_MOVEMENT;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.IServiceReferenceHolder;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.IProcessUI; import org.adempiere.util.IProcessUI;
@ -463,8 +464,29 @@ public class ReportCtl
*/ */
public static void preview(ReportEngine re) public static void preview(ReportEngine re)
{ {
ReportViewerProvider viewer = Service.locator().locate(ReportViewerProvider.class).getService(); ReportViewerProvider viewer = getReportViewerProvider();
viewer.openViewer(re); viewer.openViewer(re);
} }
private static IServiceReferenceHolder<ReportViewerProvider> s_reportViewerProviderReference = null;
/**
*
* @return {@link ReportViewerProvider}
*/
public static synchronized ReportViewerProvider getReportViewerProvider() {
ReportViewerProvider viewer = null;
if (s_reportViewerProviderReference != null) {
viewer = s_reportViewerProviderReference.getService();
if (viewer != null)
return viewer;
}
IServiceReferenceHolder<ReportViewerProvider> viewerReference = Service.locator().locate(ReportViewerProvider.class).getServiceReference();
if (viewerReference != null) {
s_reportViewerProviderReference = viewerReference;
viewer = viewerReference.getService();
}
return viewer;
}
} // ReportCtl } // ReportCtl

View File

@ -23,5 +23,9 @@ package org.compiere.print;
* *
*/ */
public interface ReportViewerProvider { public interface ReportViewerProvider {
/**
* Open report viewer
* @param re
*/
public void openViewer(ReportEngine re); public void openViewer(ReportEngine re);
} }

View File

@ -33,7 +33,6 @@ import java.sql.DriverManager;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Properties; import java.util.Properties;
import java.util.Random; import java.util.Random;

View File

@ -16,5 +16,11 @@ Import-Package: org.junit.jupiter.api;version="5.6.0",
org.junit.jupiter.params.aggregator;version="5.6.0", org.junit.jupiter.params.aggregator;version="5.6.0",
org.junit.jupiter.params.converter;version="5.6.0", org.junit.jupiter.params.converter;version="5.6.0",
org.junit.jupiter.params.provider;version="5.6.0", org.junit.jupiter.params.provider;version="5.6.0",
org.junit.jupiter.params.support;version="5.6.0" org.junit.jupiter.params.support;version="5.6.0",
Require-Bundle: org.adempiere.base;bundle-version="7.1.0" org.osgi.framework;version="1.9.0"
Require-Bundle: org.adempiere.base;bundle-version="7.1.0",
org.adempiere.base.callout;bundle-version="7.1.0",
org.adempiere.base.process;bundle-version="7.1.0",
org.adempiere.payment.processor;bundle-version="7.1.0"
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.idempiere.test.TestActivator

View File

@ -480,9 +480,6 @@
<setEntry value="org.hamcrest.core@default:default"/> <setEntry value="org.hamcrest.core@default:default"/>
<setEntry value="org.hamcrest.library@default:default"/> <setEntry value="org.hamcrest.library@default:default"/>
<setEntry value="org.hsqldb@default:default"/> <setEntry value="org.hsqldb@default:default"/>
<setEntry value="org.jacoco.agent@default:default"/>
<setEntry value="org.jacoco.core@default:default"/>
<setEntry value="org.jacoco.report@default:default"/>
<setEntry value="org.jaxen@default:default"/> <setEntry value="org.jaxen@default:default"/>
<setEntry value="org.jcodings@default:default"/> <setEntry value="org.jcodings@default:default"/>
<setEntry value="org.jdom2@default:default"/> <setEntry value="org.jdom2@default:default"/>
@ -509,16 +506,11 @@
<setEntry value="org.mortbay.jasper.apache-el@default:default"/> <setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/> <setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mozilla.javascript@default:default"/> <setEntry value="org.mozilla.javascript@default:default"/>
<setEntry value="org.objectweb.asm*7.0.0@default:default"/> <setEntry value="org.objectweb.asm*7.3.1@default:default"/>
<setEntry value="org.objectweb.asm*7.2.0.v20191010-1910@default:default"/> <setEntry value="org.objectweb.asm.commons*7.3.1@default:default"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/> <setEntry value="org.objectweb.asm.tree*7.3.1@default:default"/>
<setEntry value="org.objectweb.asm.commons*7.0.0@default:default"/>
<setEntry value="org.objectweb.asm.commons*7.2.0.v20191010-1910@default:default"/>
<setEntry value="org.objectweb.asm.tree*7.0.0@default:default"/>
<setEntry value="org.objectweb.asm.tree*7.2.0.v20191010-1910@default:default"/>
<setEntry value="org.objectweb.asm.tree.analysis@default:default"/> <setEntry value="org.objectweb.asm.tree.analysis@default:default"/>
<setEntry value="org.objectweb.asm.util*7.0.0@default:default"/> <setEntry value="org.objectweb.asm.util*7.3.1@default:default"/>
<setEntry value="org.objectweb.asm.util*7.2.0.v20191010-1910@default:default"/>
<setEntry value="org.objenesis@default:default"/> <setEntry value="org.objenesis@default:default"/>
<setEntry value="org.opentest4j@default:default"/> <setEntry value="org.opentest4j@default:default"/>
<setEntry value="org.passay@default:default"/> <setEntry value="org.passay@default:default"/>
@ -547,7 +539,7 @@
<setEntry value="org.adempiere.install@default:default"/> <setEntry value="org.adempiere.install@default:default"/>
<setEntry value="org.adempiere.payment.processor@default:default"/> <setEntry value="org.adempiere.payment.processor@default:default"/>
<setEntry value="org.adempiere.pipo.handlers@default:default"/> <setEntry value="org.adempiere.pipo.handlers@default:default"/>
<setEntry value="org.adempiere.pipo@default:default"/> <setEntry value="org.adempiere.pipo@default:true"/>
<setEntry value="org.adempiere.plugin.utils@default:default"/> <setEntry value="org.adempiere.plugin.utils@default:default"/>
<setEntry value="org.adempiere.report.jasper.library@default:false"/> <setEntry value="org.adempiere.report.jasper.library@default:false"/>
<setEntry value="org.adempiere.report.jasper@default:default"/> <setEntry value="org.adempiere.report.jasper@default:default"/>

View File

@ -0,0 +1,48 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/**
* @author hengsin
*
*/
public class TestActivator implements BundleActivator {
public static BundleContext context = null;
@Override
public void start(BundleContext context) throws Exception {
TestActivator.context = context;
}
@Override
public void stop(BundleContext context) throws Exception {
TestActivator.context = null;
}
}

View File

@ -25,22 +25,99 @@
package org.idempiere.test.performance; package org.idempiere.test.performance;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Timestamp;
import java.util.List;
import java.util.Optional;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import org.adempiere.base.Core;
import org.adempiere.base.DefaultPaymentExporterFactory;
import org.adempiere.base.IAddressValidationFactory;
import org.adempiere.base.IBankStatementLoaderFactory;
import org.adempiere.base.IBankStatementMatcherFactory;
import org.adempiere.base.IColumnCallout;
import org.adempiere.base.IDisplayTypeFactory;
import org.adempiere.base.IPaymentExporterFactory;
import org.adempiere.base.IReplenishFactory;
import org.adempiere.base.IResourceFinder;
import org.adempiere.base.LookupFactoryHelper;
import org.adempiere.base.ServiceQuery;
import org.adempiere.model.IAddressValidation;
import org.adempiere.model.IShipmentProcessor;
import org.adempiere.model.ITaxProvider;
import org.adempiere.model.MShipperFacade;
import org.adempiere.model.ProductPriceValidator;
import org.compiere.acct.Doc;
import org.compiere.acct.DocManager;
import org.compiere.db.AdempiereDatabase;
import org.compiere.db.Database;
import org.compiere.impexp.BankStatementLoaderInterface;
import org.compiere.impexp.BankStatementMatcherInterface;
import org.compiere.impexp.OFXFileBankStatementLoader;
import org.compiere.model.Callout;
import org.compiere.model.GridFieldVO;
import org.compiere.model.GridTabVO;
import org.compiere.model.GridWindowVO;
import org.compiere.model.IArchiveStore;
import org.compiere.model.IAttachmentStore;
import org.compiere.model.IImageStore;
import org.compiere.model.I_AD_Table; import org.compiere.model.I_AD_Table;
import org.compiere.model.I_M_InventoryLine;
import org.compiere.model.Lookup;
import org.compiere.model.MAcctSchema;
import org.compiere.model.MAddressValidation;
import org.compiere.model.MBPartner;
import org.compiere.model.MBankAccountProcessor;
import org.compiere.model.MClientInfo;
import org.compiere.model.MColumn; import org.compiere.model.MColumn;
import org.compiere.model.MDocType;
import org.compiere.model.MInvoice;
import org.compiere.model.MInvoiceLine;
import org.compiere.model.MOrder; import org.compiere.model.MOrder;
import org.compiere.model.MProduct; import org.compiere.model.MProduct;
import org.compiere.model.MRefTable; import org.compiere.model.MRefTable;
import org.compiere.model.MShipper;
import org.compiere.model.MStorageProvider;
import org.compiere.model.MTable; import org.compiere.model.MTable;
import org.compiere.model.MTaxProvider;
import org.compiere.model.MWarehouse; import org.compiere.model.MWarehouse;
import org.compiere.model.MZoomCondition; import org.compiere.model.MZoomCondition;
import org.compiere.model.ModelValidator;
import org.compiere.model.PaymentProcessor;
import org.compiere.model.StandardTaxProvider;
import org.compiere.model.X_C_AddressValidationCfg;
import org.compiere.model.X_C_TaxProviderCfg;
import org.compiere.process.BPartnerValidate;
import org.compiere.process.DocAction;
import org.compiere.process.DocumentEngine;
import org.compiere.process.ProcessCall;
import org.compiere.process.ProcessInfo;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CacheInterface; import org.compiere.util.CacheInterface;
import org.compiere.util.CacheMgt; import org.compiere.util.CacheMgt;
import org.compiere.util.DisplayType;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.GenericPaymentExport;
import org.compiere.util.PaymentExport;
import org.compiere.util.ReplenishInterface;
import org.compiere.util.TimeUtil;
import org.compiere.wf.MWorkflow;
import org.eevolution.model.CalloutBOM;
import org.idempiere.fa.service.api.DepreciationFactoryLookupDTO;
import org.idempiere.fa.service.api.IDepreciationMethod;
import org.idempiere.fa.service.api.IDepreciationMethodFactory;
import org.idempiere.test.AbstractTestCase; import org.idempiere.test.AbstractTestCase;
import org.idempiere.test.TestActivator;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** /**
@ -77,22 +154,7 @@ public class CacheTest extends AbstractTestCase {
MTable table = MTable.get(Env.getCtx(), MOrder.Table_ID); MTable table = MTable.get(Env.getCtx(), MOrder.Table_ID);
//find table cache instance //find table cache instance
@SuppressWarnings("rawtypes") CCache<?, ?> tblCache = findByTableNameAndKey(MTable.Table_Name, MOrder.Table_ID);
CCache tblCache = null;
CacheInterface[] cis = CacheMgt.get().getInstancesAsArray();
for(CacheInterface ci : cis) {
if (ci instanceof CCache<?, ?>) {
@SuppressWarnings("rawtypes")
CCache ccache = (CCache) ci;
if (ccache.getName().equals(ccache.getTableName()) && ccache.getTableName().equals(MTable.Table_Name)) {
if (ccache.containsKey(MOrder.Table_ID)) {
tblCache = ccache;
break;
}
}
}
}
if (tblCache == null) if (tblCache == null)
fail("Table cache instance missing"); fail("Table cache instance missing");
@ -107,20 +169,7 @@ public class CacheTest extends AbstractTestCase {
table = MTable.get(Env.getCtx(), MWarehouse.Table_ID); table = MTable.get(Env.getCtx(), MWarehouse.Table_ID);
MRefTable refTable = MRefTable.get(Env.getCtx(), 197); MRefTable refTable = MRefTable.get(Env.getCtx(), 197);
tblCache = null; tblCache = findByTableNameAndKey(MTable.Table_Name, MWarehouse.Table_ID);
for(CacheInterface ci : cis) {
if (ci instanceof CCache<?, ?>) {
@SuppressWarnings("rawtypes")
CCache ccache = (CCache) ci;
if (ccache.getName().equals(ccache.getTableName()) && ccache.getTableName().equals(MTable.Table_Name)) {
if (ccache.containsKey(MWarehouse.Table_ID)) {
tblCache = ccache;
break;
}
}
}
}
if (tblCache == null) if (tblCache == null)
fail("Table cache instance missing"); fail("Table cache instance missing");
@ -129,28 +178,14 @@ public class CacheTest extends AbstractTestCase {
assertEquals(hit+1, tblCache.getHit()); assertEquals(hit+1, tblCache.getHit());
} }
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked"})
@Test @Test
public void testPOCacheAfterUpdate() { public void testPOCacheAfterUpdate() {
int mulch = 137; int mulch = 137;
int oak = 123; int oak = 123;
//init cache //init cache
MProduct p1 = MProduct.get(Env.getCtx(), mulch); MProduct p1 = MProduct.get(Env.getCtx(), mulch);
CCache<Integer, MProduct> pc = null; CCache<Integer, MProduct> pc = (CCache<Integer, MProduct>) findByTableNameAndKey(MProduct.Table_Name, mulch);
CacheInterface[] cis = CacheMgt.get().getInstancesAsArray();
//find product cache instance
for(CacheInterface ci : cis) {
if (ci instanceof CCache<?, ?>) {
CCache ccache = (CCache) ci;
if (ccache.getName().equals(ccache.getTableName()) && ccache.getTableName().equals(MProduct.Table_Name)) {
if (ccache.containsKey(mulch)) {
pc = ccache;
break;
}
}
}
}
if (pc == null) if (pc == null)
fail("Product cache instance missing"); fail("Product cache instance missing");
@ -214,4 +249,455 @@ public class CacheTest extends AbstractTestCase {
rollback(); rollback();
} }
@Test
public void testServices() {
//IResourceFinder
TestActivator.context.registerService(IResourceFinder.class, new FakeResourceFinder(), null);
IResourceFinder resourceFinder = Core.getResourceFinder();
assertNotNull(resourceFinder, "Can't find resource finder service");
String cacheKey = FakeResourceFinder.class.getName();
URL url = Core.getResourceFinder().getResource(cacheKey);
assertNotNull(url);
String cacheName = "IResourceFinder";
CCache<?, ?> cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
long hit = cache.getHit();
url = Core.getResourceFinder().getResource(cacheKey);
assertNotNull(url);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IColumnCalloutFactory
List<IColumnCallout> callouts = Core.findCallout(I_M_InventoryLine.Table_Name, I_M_InventoryLine.COLUMNNAME_M_Product_ID);
assertTrue(callouts.size() > 0, "Can't find callouts for " + I_M_InventoryLine.Table_Name + ", " + I_M_InventoryLine.COLUMNNAME_M_Product_ID);
cacheKey = I_M_InventoryLine.Table_Name + "." + I_M_InventoryLine.COLUMNNAME_M_Product_ID;
cacheName = "List<IColumnCalloutFactory>";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
callouts = Core.findCallout(I_M_InventoryLine.Table_Name, I_M_InventoryLine.COLUMNNAME_M_Product_ID);
assertTrue(callouts.size() > 0, "Can't find callouts for " + I_M_InventoryLine.Table_Name + ", " + I_M_InventoryLine.COLUMNNAME_M_Product_ID);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//ICalloutFactory
cacheKey = CalloutBOM.class.getName() + "::" + "parent";
Callout callout = Core.getCallout(CalloutBOM.class.getName(), "parent");
assertNotNull(callout, "Can't find callout for " + cacheKey);
cacheName = "ICalloutFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
callout = Core.getCallout(CalloutBOM.class.getName(), "parent");
assertNotNull(callout, "Can't find callout for " + cacheKey);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IProcessFactory
cacheKey = BPartnerValidate.class.getName();
ProcessCall process = Core.getProcess(cacheKey);
assertNotNull(process, "Can't find process for " + cacheKey);
cacheName = "IProcessFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
process = Core.getProcess(cacheKey);
assertNotNull(process, "Can't find process for " + cacheKey);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IModelValidatorFactory
cacheKey = ProductPriceValidator.class.getName();
ModelValidator modelValidator = Core.getModelValidator(cacheKey);
assertNotNull(modelValidator, "Can't find model validator for " + cacheKey);
cacheName = "IModelValidatorFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
modelValidator = Core.getModelValidator(cacheKey);
assertNotNull(modelValidator, "Can't find model validator for " + cacheKey);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IKeyStore
assertNotNull(Core.getKeyStore(), "Can't find key store service");
//second call to check service reference cache is working
assertNotNull(Core.getKeyStore(), "Can't find key store service");
//IPaymentProcessorFactory
int pp_payflowpro_id = 100;
MBankAccountProcessor bankAccountProcessor = MBankAccountProcessor.get(Env.getCtx(), pp_payflowpro_id, pp_payflowpro_id, getTrxName());
assertNotNull(bankAccountProcessor, "Can't load bank account processor for PP_PayFlowPro");
PaymentProcessor paymentProcessor = Core.getPaymentProcessor(bankAccountProcessor, null);
assertNotNull(paymentProcessor, "Can't load payment processor for PP_PayFlowPro");
cacheKey = "org.compiere.model.PP_PayFlowPro";
cacheName = "IPaymentProcessorFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
paymentProcessor = Core.getPaymentProcessor(bankAccountProcessor, null);
assertNotNull(paymentProcessor, "Can't load payment processor for PP_PayFlowPro");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IBankStatementLoaderFactory
TestActivator.context.registerService(IBankStatementLoaderFactory.class, new FakeBankStatementLoaderFactory(), null);
cacheKey = OFXFileBankStatementLoader.class.getName();
BankStatementLoaderInterface bankStatementLoader = Core.getBankStatementLoader(cacheKey);
assertNotNull(bankStatementLoader, "Can't find BankStatementLoader for " + cacheKey);
cacheName = "IBankStatementLoaderFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
bankStatementLoader = Core.getBankStatementLoader(cacheKey);
assertNotNull(bankStatementLoader, "Can't find BankStatementLoader for " + cacheKey);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IBankStatementMatcherFactory
TestActivator.context.registerService(IBankStatementMatcherFactory.class, new FakeBankStatementMatcherFactory(), null);
cacheKey = FakeBankStatementMatcherFactory.class.getName();
BankStatementMatcherInterface bankStatementMatcher = Core.getBankStatementMatcher(cacheKey);
assertNotNull(bankStatementMatcher, "Can't find bank statement matcher service");
cacheName = "IBankStatementMatcherFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
bankStatementMatcher = Core.getBankStatementMatcher(cacheKey);
assertNotNull(bankStatementMatcher, "Can't find bank statement matcher service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IShipmentProcessorFactory
int m_shipper_id=100;
MShipperFacade shipperFacade = new MShipperFacade(new MShipper(Env.getCtx(), m_shipper_id, getTrxName()));
cacheKey = shipperFacade.getShippingProcessorClass();
cacheName = "IShipmentProcessorFactory";
IShipmentProcessor shipmentProcessor = Core.getShipmentProcessor(shipperFacade);
assertNotNull(shipmentProcessor, "Can't find shipment processor");
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
shipmentProcessor = Core.getShipmentProcessor(shipperFacade);
assertNotNull(shipmentProcessor, "Can't find shipment processor");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IAddressValidationFactory
X_C_AddressValidationCfg cfg = new X_C_AddressValidationCfg(Env.getCtx(), 0, getTrxName());
cfg.setHostAddress("10.8.0.1");
cfg.setHostPort(433);
cfg.setName("Test Cfg");
cacheKey = FakeAddressValidationFactory.class.getName();
cfg.setAddressValidationClass(cacheKey);
cfg.saveEx();
MAddressValidation addressValidation = new MAddressValidation(Env.getCtx(), 0, getTrxName());
addressValidation.setC_AddressValidationCfg_ID(cfg.get_ID());
addressValidation.setConnectionPassword("password");
addressValidation.setName("Test Address Validation");
addressValidation.setUserID("userid");
addressValidation.setSeqNo(10);
addressValidation.saveEx();
TestActivator.context.registerService(IAddressValidationFactory.class, new FakeAddressValidationFactory(), null);
IAddressValidation addressValidationService = Core.getAddressValidation(addressValidation);
assertNotNull(addressValidationService, "Can't find address validation service");
cacheName = "IAddressValidationFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
addressValidationService = Core.getAddressValidation(addressValidation);
assertNotNull(addressValidationService, "Can't find address validation service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//ITaxProviderFactory
X_C_TaxProviderCfg taxProviderCfg = new X_C_TaxProviderCfg(Env.getCtx(), 0, getTrxName());
taxProviderCfg.setName("Standard Provider Configuration");
taxProviderCfg.setTaxProviderClass(StandardTaxProvider.class.getName());
taxProviderCfg.saveEx();
MTaxProvider taxProvider = new MTaxProvider(Env.getCtx(), 0, getTrxName());
taxProvider.setC_TaxProviderCfg_ID(taxProviderCfg.get_ID());
taxProvider.setName("Standard Provider");
taxProvider.saveEx();
ITaxProvider taxProviderService = Core.getTaxProvider(taxProvider);
assertNotNull(taxProviderService, "Can't find tax provider service");
cacheKey = StandardTaxProvider.class.getName();
cacheName = "ITaxProviderFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
taxProviderService = Core.getTaxProvider(taxProvider);
assertNotNull(taxProviderService, "Can't find tax provider service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IReplenishFactory
TestActivator.context.registerService(IReplenishFactory.class, new FakeReplenishFactory(), null);
cacheKey = FakeReplenishFactory.class.getName();
ReplenishInterface replenishService = Core.getReplenish(cacheKey);
assertNotNull(replenishService, "Can't find replenish service");
cacheName = "IReplenishFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
replenishService = Core.getReplenish(cacheKey);
assertNotNull(replenishService, "Can't find replenish service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//ScriptEngineFactory
TestActivator.context.registerService(ScriptEngineFactory.class, new FakeScriptEngineFactory(), null);
cacheKey = FakeScriptEngineFactory.class.getName();
ScriptEngine scriptEngine = Core.getScriptEngine(cacheKey);
assertNotNull(scriptEngine, "Can't find script engine service");
cacheName = "ScriptEngineFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
scriptEngine = Core.getScriptEngine(cacheKey);
assertNotNull(scriptEngine, "Can't find script engine service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IPaymentExporterFactory
TestActivator.context.registerService(IPaymentExporterFactory.class, new DefaultPaymentExporterFactory(), null);
cacheKey = GenericPaymentExport.class.getName();
PaymentExport paymentExportService = Core.getPaymentExporter(cacheKey);
assertNotNull(paymentExportService, "Can't find payment exporter service");
cacheName = "IPaymentExporterFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
paymentExportService = Core.getPaymentExporter(cacheKey);
assertNotNull(paymentExportService, "Can't find payment exporter service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IProductPricing
assertNotNull(Core.getProductPricing(), "Can't find product pricing service");
//second call to check service reference cache is working
assertNotNull(Core.getProductPricing(), "Can't find product pricing service");
//IDepreciationMethodFactory
TestActivator.context.registerService(IDepreciationMethodFactory.class, new FakeDepreciationMethodFactory(), null);
cacheKey = FakeDepreciationMethodFactory.class.getName();
DepreciationFactoryLookupDTO dto = new DepreciationFactoryLookupDTO();
dto.depreciationType = cacheKey;
IDepreciationMethod depreciationMethod = Core.getDepreciationMethod(dto);
assertNotNull(depreciationMethod, "Can't find depreciation method service");
cacheName = "IDepreciationMethodFactory";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
depreciationMethod = Core.getDepreciationMethod(dto);
assertNotNull(depreciationMethod, "Can't find depreciation method service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IMessageService
assertNotNull(Core.getMessageService(), "Can't find message service");
//second call to check service reference cache is working
assertNotNull(Core.getMessageService(), "Can't find message service");
//IClusterService
assertNotNull(Core.getClusterService(), "Can't find cluster service");
//second call to check service reference cache is working
assertNotNull(Core.getClusterService(), "Can't find cluster service");
//ICacheService
assertNotNull(Core.getCacheService(), "Can't find cache service");
//second call to check service reference cache is working
assertNotNull(Core.getCacheService(), "Can't find cache service");
//IDictionaryService
assertNotNull(Core.getDictionaryService(), "Can't find dictionary service");
//second call to check service reference cache is working
assertNotNull(Core.getDictionaryService(), "Can't find dictionary service");
//ILookupFactory
int ad_window_id=143; //sales order window
int ad_tab_id=187; //sales order line
int ad_field_id=1127; //product
GridFieldVO gridField = null;
Lookup lookup = null;
GridWindowVO gridWindow = GridWindowVO.create(1, ad_window_id);
Optional<GridTabVO> optional = gridWindow.Tabs.stream().filter(e -> e.AD_Tab_ID == ad_tab_id).findFirst();
if (optional.isPresent()) {
GridTabVO gridTabVO = optional.get();
Optional<GridFieldVO> optional1 = gridTabVO.getFields().stream().filter(e -> e.AD_Field_ID == ad_field_id).findFirst();
if (optional1.isPresent()) {
gridField = optional1.get();
}
}
assertNotNull(gridField, "Can't find grid field");
lookup = LookupFactoryHelper.getLookup(gridField);
assertNotNull(lookup, "Can't find lookup service");
cacheName = "ILookupFactory";
cacheKey = null;
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
lookup = LookupFactoryHelper.getLookup(gridField);
assertNotNull(lookup, "Can't find lookup service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
hit = cache.getHit();
assertTrue(LookupFactoryHelper.isLookup(gridField), "Lookup should be true for " + gridField.toString());
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IDocFactory
int C_AcctSchema_ID = MClientInfo.get().getC_AcctSchema1_ID();
cacheKey = C_AcctSchema_ID + "|" + MInvoice.Table_ID;
cacheName = "IDocFactory";
MInvoice invoice = new MInvoice(Env.getCtx(), 0, getTrxName());
invoice.setBPartner(MBPartner.get(Env.getCtx(), 117)); // C&W
invoice.setC_DocTypeTarget_ID(MDocType.DOCBASETYPE_ARInvoice);
invoice.setC_DocType_ID(invoice.getC_DocTypeTarget_ID()); // required to avoid runDocumentActionWorkflow exception
invoice.setPaymentRule(MInvoice.PAYMENTRULE_Check);
invoice.setC_PaymentTerm_ID(105); // Immediate
Timestamp today = TimeUtil.getDay(System.currentTimeMillis());
invoice.setDateInvoiced(today);
invoice.setDateAcct(today);
invoice.setDocStatus(DocAction.STATUS_Drafted);
invoice.setDocAction(DocAction.ACTION_Complete);
invoice.saveEx();
MInvoiceLine line1 = new MInvoiceLine(invoice);
line1.setLine(10);
line1.setC_Charge_ID(100); // Bank Charge
line1.setQty(new BigDecimal("1"));
line1.setPrice(Env.ONEHUNDRED);
line1.saveEx();
ProcessInfo info = MWorkflow.runDocumentActionWorkflow(invoice, DocAction.ACTION_Complete);
invoice.load(getTrxName());
assertFalse(info.isError());
assertEquals(DocAction.STATUS_Completed, invoice.getDocStatus());
if (!invoice.isPosted()) {
String error = DocumentEngine.postImmediate(Env.getCtx(), invoice.getAD_Client_ID(), MInvoice.Table_ID, invoice.get_ID(), true, getTrxName());
assertNull(error, "Error posting invoice: " + error);
}
MAcctSchema as = MAcctSchema.get(C_AcctSchema_ID);
Doc doc = DocManager.getDocument(as, MInvoice.Table_ID, invoice.get_ID(), getTrxName());
assertNotNull(doc, "Failed load acct doc for invoice");
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
doc = DocManager.getDocument(as, MInvoice.Table_ID, invoice.get_ID(), getTrxName());
assertNotNull(doc, "Failed load acct doc for invoice");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IDatabase
AdempiereDatabase db = Database.getDatabase(Database.DB_POSTGRESQL);
assertNotNull(db, "Failed to load db service for " + Database.DB_POSTGRESQL);
cacheKey = Database.DB_POSTGRESQL;
cacheName = "IDatabase";
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
db = Database.getDatabase(Database.DB_POSTGRESQL);
assertNotNull(db, "Failed to load db service for " + Database.DB_POSTGRESQL);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IArchiveStore
ServiceQuery dbServiceQuery = new ServiceQuery();
dbServiceQuery.put("method", "DB");
IArchiveStore archiveStoreService = MStorageProvider.getArchiveStoreService(dbServiceQuery);
assertNotNull(archiveStoreService, "Can't find archive store service");
cacheName = "IArchiveStore";
cache = findByNameAndKey(cacheName, dbServiceQuery);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
archiveStoreService = MStorageProvider.getArchiveStoreService(dbServiceQuery);
assertNotNull(archiveStoreService, "Can't find archive store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
ServiceQuery fileSystemServiceQuery = new ServiceQuery();
fileSystemServiceQuery.put("method", "FileSystem");
archiveStoreService = MStorageProvider.getArchiveStoreService(fileSystemServiceQuery);
assertNotNull(archiveStoreService, "Can't find archive store service");
hit = cache.getHit();
archiveStoreService = MStorageProvider.getArchiveStoreService(fileSystemServiceQuery);
assertNotNull(archiveStoreService, "Can't find archive store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
assertTrue(cache.size() == 2, "Size for " + cacheName + " != 2");
//IAttachmentStore
IAttachmentStore attachmentStoreService = MStorageProvider.getAttachmentStoreService(dbServiceQuery);
assertNotNull(attachmentStoreService, "Can't find attachment store service");
cacheName = "IAttachmentStore";
cache = findByNameAndKey(cacheName, dbServiceQuery);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
attachmentStoreService = MStorageProvider.getAttachmentStoreService(dbServiceQuery);
assertNotNull(attachmentStoreService, "Can't find attachment store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
attachmentStoreService = MStorageProvider.getAttachmentStoreService(fileSystemServiceQuery);
assertNotNull(attachmentStoreService, "Can't find attachment store service");
hit = cache.getHit();
attachmentStoreService = MStorageProvider.getAttachmentStoreService(fileSystemServiceQuery);
assertNotNull(attachmentStoreService, "Can't find attachment store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
assertTrue(cache.size() == 2, "Size for " + cacheName + " != 2");
//IImageStore
IImageStore imagetStoreService = MStorageProvider.getImageStoreService(dbServiceQuery);
assertNotNull(imagetStoreService, "Can't find image store service");
cacheName = "IImageStore";
cache = findByNameAndKey(cacheName, dbServiceQuery);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
imagetStoreService = MStorageProvider.getImageStoreService(dbServiceQuery);
assertNotNull(imagetStoreService, "Can't find image store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
imagetStoreService = MStorageProvider.getImageStoreService(fileSystemServiceQuery);
assertNotNull(imagetStoreService, "Can't find image store service");
hit = cache.getHit();
imagetStoreService = MStorageProvider.getImageStoreService(fileSystemServiceQuery);
assertNotNull(imagetStoreService, "Can't find image store service");
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
assertTrue(cache.size() == 2, "Size for " + cacheName + " != 2");
//IModelFactory
cacheName = "IModelFactory";
cacheKey = MInvoice.Table_Name;
Class<?> modelClass = MTable.getClass(cacheKey);
assertNotNull(modelClass, "Can't find model class for " + cacheKey);
cache = findByNameAndKey(cacheName, cacheKey);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
modelClass = MTable.getClass(cacheKey);
assertNotNull(modelClass, "Can't find model class for " + cacheKey);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
//IDisplayTypeFactory
TestActivator.context.registerService(IDisplayTypeFactory.class, new FakeDisplayTypeFactory(), null);
cacheName = "IDisplayTypeFactory";
boolean isText = DisplayType.isText(FakeDisplayTypeFactory.DISPLAY_TYPE);
assertTrue(isText);
cache = findByNameAndKey(cacheName, FakeDisplayTypeFactory.DISPLAY_TYPE);
assertNotNull(cache, "Can't find cache for " + cacheName);
hit = cache.getHit();
isText = DisplayType.isText(FakeDisplayTypeFactory.DISPLAY_TYPE);
assertTrue(isText);
assertTrue(cache.getHit() > hit, "Hit for " + cacheName + " doesn't increase as expected");
}
private CCache<?, ?> findByTableNameAndKey(String tableName, Object key) {
CacheInterface[] cis = CacheMgt.get().getInstancesAsArray();
for(CacheInterface ci : cis) {
if (ci instanceof CCache<?, ?>) {
@SuppressWarnings("rawtypes")
CCache ccache = (CCache) ci;
if (ccache.getName().equals(ccache.getTableName()) && ccache.getTableName().equals(tableName)) {
if (ccache.containsKey(key)) {
return ccache;
}
}
}
}
return null;
}
private CCache<?, ?> findByNameAndKey(String name, Object key) {
CacheInterface[] cis = CacheMgt.get().getInstancesAsArray();
for(CacheInterface ci : cis) {
if (ci instanceof CCache<?, ?>) {
@SuppressWarnings("rawtypes")
CCache ccache = (CCache) ci;
if (ccache.getTableName() == null && ccache.getName().equals(name)) {
if (key != null) {
if (ccache.containsKey(key)) {
return ccache;
}
} else {
return ccache;
}
}
}
}
return null;
}
} }

View File

@ -0,0 +1,58 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import java.util.Properties;
import org.adempiere.base.IAddressValidationFactory;
import org.adempiere.model.IAddressValidation;
import org.compiere.model.MAddressTransaction;
/**
* @author hengsin
*
*/
public class FakeAddressValidationFactory implements IAddressValidationFactory {
/**
*
*/
public FakeAddressValidationFactory() {
}
@Override
public IAddressValidation newAddressValidationInstance(String className) {
if (FakeAddressValidationFactory.class.getName().equals(className)) {
return new IAddressValidation() {
@Override
public boolean onlineValidate(Properties ctx, MAddressTransaction addressTransaction, String trxName) {
return false;
}
};
}
return null;
}
}

View File

@ -0,0 +1,50 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import org.adempiere.base.IBankStatementLoaderFactory;
import org.compiere.impexp.BankStatementLoaderInterface;
import org.compiere.impexp.OFXFileBankStatementLoader;
/**
* @author hengsin
*
*/
public class FakeBankStatementLoaderFactory implements IBankStatementLoaderFactory {
/**
*
*/
public FakeBankStatementLoaderFactory() {
}
@Override
public BankStatementLoaderInterface newBankStatementLoaderInstance(String className) {
if (OFXFileBankStatementLoader.class.getName().equals(className))
return new OFXFileBankStatementLoader();
return null;
}
}

View File

@ -0,0 +1,64 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import org.adempiere.base.IBankStatementMatcherFactory;
import org.compiere.impexp.BankStatementMatchInfo;
import org.compiere.impexp.BankStatementMatcherInterface;
import org.compiere.model.MBankStatementLine;
import org.compiere.model.X_I_BankStatement;
/**
* @author hengsin
*
*/
public class FakeBankStatementMatcherFactory implements IBankStatementMatcherFactory {
/**
*
*/
public FakeBankStatementMatcherFactory() {
}
@Override
public BankStatementMatcherInterface newBankStatementMatcherInstance(String className) {
if (FakeBankStatementMatcherFactory.class.getName().equals(className)) {
return new BankStatementMatcherInterface() {
@Override
public BankStatementMatchInfo findMatch(X_I_BankStatement ibs) {
return null;
}
@Override
public BankStatementMatchInfo findMatch(MBankStatementLine bsl) {
return null;
}
};
}
return null;
}
}

View File

@ -0,0 +1,69 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import java.math.BigDecimal;
import org.idempiere.fa.service.api.DepreciationDTO;
import org.idempiere.fa.service.api.DepreciationFactoryLookupDTO;
import org.idempiere.fa.service.api.IDepreciationMethod;
import org.idempiere.fa.service.api.IDepreciationMethodFactory;
/**
*
* @author hengsin
*
*/
public class FakeDepreciationMethodFactory implements IDepreciationMethodFactory {
public FakeDepreciationMethodFactory() {
}
@Override
public IDepreciationMethod getDepreciationMethod(DepreciationFactoryLookupDTO factoryLookupDTO) {
if (FakeDepreciationMethodFactory.class.getName().equals(factoryLookupDTO.depreciationType)) {
return new IDepreciationMethod() {
@Override
public BigDecimal caclulateDepreciation(DepreciationDTO depreciationDTO) {
return null;
}
@Override
public long getCountPeriod(DepreciationDTO depreciationDTO) {
return 0;
}
@Override
public boolean isPeriodAdjustment() {
return false;
}
};
}
return null;
}
}

View File

@ -0,0 +1,77 @@
package org.idempiere.test.performance;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import org.adempiere.base.IDisplayTypeFactory;
import org.compiere.util.Language;
public class FakeDisplayTypeFactory implements IDisplayTypeFactory {
public final static int DISPLAY_TYPE = 9876543;
public FakeDisplayTypeFactory() {
}
@Override
public boolean isID(int displayType) {
return false;
}
@Override
public boolean isNumeric(int displayType) {
return false;
}
@Override
public Integer getDefaultPrecision(int displayType) {
return null;
}
@Override
public boolean isText(int displayType) {
if (displayType == DISPLAY_TYPE)
return true;
return false;
}
@Override
public boolean isDate(int displayType) {
return false;
}
@Override
public boolean isLookup(int displayType) {
return false;
}
@Override
public boolean isLOB(int displayType) {
return false;
}
@Override
public DecimalFormat getNumberFormat(int displayType, Language language, String pattern) {
return null;
}
@Override
public SimpleDateFormat getDateFormat(int displayType, Language language, String pattern) {
return null;
}
@Override
public Class<?> getClass(int displayType, boolean yesNoAsBoolean) {
return null;
}
@Override
public String getSQLDataType(int displayType, String columnName, int fieldLength) {
return null;
}
@Override
public String getDescription(int displayType) {
return null;
}
}

View File

@ -0,0 +1,58 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import java.math.BigDecimal;
import org.adempiere.base.IReplenishFactory;
import org.compiere.model.MWarehouse;
import org.compiere.model.X_T_Replenish;
import org.compiere.util.ReplenishInterface;
/**
*
* @author hengsin
*
*/
public class FakeReplenishFactory implements IReplenishFactory {
public FakeReplenishFactory() {
}
@Override
public ReplenishInterface newReplenishInstance(String className) {
if (FakeReplenishFactory.class.getName().equals(className)) {
return new ReplenishInterface() {
@Override
public BigDecimal getQtyToOrder(MWarehouse wh, X_T_Replenish replenish) {
return null;
}
};
}
return null;
}
}

View File

@ -0,0 +1,52 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import java.net.MalformedURLException;
import java.net.URL;
import org.adempiere.base.IResourceFinder;
/**
*
* @author hengsin
*
*/
public class FakeResourceFinder implements IResourceFinder {
public FakeResourceFinder() {
}
@Override
public URL getResource(String name) {
if (getClass().getName().equals(name)) {
try {
return new URL("file:///TestResourceFinder.txt");
} catch (MalformedURLException e) {
}
}
return null;
}
}

View File

@ -0,0 +1,174 @@
/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.performance;
import java.io.Reader;
import java.util.Arrays;
import java.util.List;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;
/**
*
* @author hengsin
*
*/
public class FakeScriptEngineFactory implements ScriptEngineFactory {
public FakeScriptEngineFactory() {
}
@Override
public String getEngineName() {
return null;
}
@Override
public String getEngineVersion() {
return null;
}
@Override
public List<String> getExtensions() {
return null;
}
@Override
public List<String> getMimeTypes() {
return null;
}
@Override
public List<String> getNames() {
return Arrays.asList(FakeScriptEngineFactory.class.getName());
}
@Override
public String getLanguageName() {
return null;
}
@Override
public String getLanguageVersion() {
return null;
}
@Override
public Object getParameter(String key) {
return null;
}
@Override
public String getMethodCallSyntax(String obj, String m, String... args) {
return null;
}
@Override
public String getOutputStatement(String toDisplay) {
return null;
}
@Override
public String getProgram(String... statements) {
return null;
}
@Override
public ScriptEngine getScriptEngine() {
return new ScriptEngine() {
@Override
public void setContext(ScriptContext context) {
}
@Override
public void setBindings(Bindings bindings, int scope) {
}
@Override
public void put(String key, Object value) {
}
@Override
public ScriptEngineFactory getFactory() {
return null;
}
@Override
public ScriptContext getContext() {
return null;
}
@Override
public Bindings getBindings(int scope) {
return null;
}
@Override
public Object get(String key) {
return null;
}
@Override
public Object eval(Reader reader, Bindings n) throws ScriptException {
return null;
}
@Override
public Object eval(String script, Bindings n) throws ScriptException {
return null;
}
@Override
public Object eval(Reader reader, ScriptContext context) throws ScriptException {
return null;
}
@Override
public Object eval(String script, ScriptContext context) throws ScriptException {
return null;
}
@Override
public Object eval(Reader reader) throws ScriptException {
return null;
}
@Override
public Object eval(String script) throws ScriptException {
return null;
}
@Override
public Bindings createBindings() {
return null;
}
};
}
}