IDEMPIERE-5050 Service startup freeze (#996)
* IDEMPIERE-5050 Service startup freeze Switched all annotation-based factories to asynchronous class scan. * Deferred MIssue record creation Log errors on the database after all model factories are initialized. * Moved webservice model classes over to its own package Model factories WS_ModelFactory and AnnotationBasedModelFactory were overlapping on the org.compiere.model package. This produced class loading problems since the base bundle has no visibility over the webservices bundle (e.g.: MWebservice). * Minor changes
This commit is contained in:
parent
d37993a992
commit
9e2922c7c8
|
@ -42,7 +42,10 @@ public abstract class AbstractModelFactory implements IModelFactory {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PO getPO(String tableName, int Record_ID, String trxName) {
|
public PO getPO(String tableName, int Record_ID, String trxName) {
|
||||||
Class<?> clazz = getClass(tableName);
|
return getPO(getClass(tableName), tableName, Record_ID, trxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PO getPO(Class<?> clazz, String tableName, int Record_ID, String trxName) {
|
||||||
if (clazz == null)
|
if (clazz == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
@ -97,7 +100,10 @@ public abstract class AbstractModelFactory implements IModelFactory {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PO getPO(String tableName, ResultSet rs, String trxName) {
|
public PO getPO(String tableName, ResultSet rs, String trxName) {
|
||||||
Class<?> clazz = getClass(tableName);
|
return getPO(getClass(tableName), tableName, rs, trxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PO getPO(Class<?> clazz, String tableName, ResultSet rs, String trxName) {
|
||||||
if (clazz == null)
|
if (clazz == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -43,15 +43,15 @@ import org.osgi.service.component.annotations.Activate;
|
||||||
import io.github.classgraph.AnnotationInfo;
|
import io.github.classgraph.AnnotationInfo;
|
||||||
import io.github.classgraph.AnnotationInfoList;
|
import io.github.classgraph.AnnotationInfoList;
|
||||||
import io.github.classgraph.ClassGraph;
|
import io.github.classgraph.ClassGraph;
|
||||||
|
import io.github.classgraph.ClassGraph.ScanResultProcessor;
|
||||||
import io.github.classgraph.ClassInfo;
|
import io.github.classgraph.ClassInfo;
|
||||||
import io.github.classgraph.ScanResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author hengsin
|
* @author hengsin
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AnnotationBasedColumnCalloutFactory implements IColumnCalloutFactory {
|
public abstract class AnnotationBasedColumnCalloutFactory extends AnnotationBasedFactory implements IColumnCalloutFactory {
|
||||||
|
|
||||||
private final static CLogger s_log = CLogger.getCLogger(AnnotationBasedColumnCalloutFactory.class);
|
private final static CLogger s_log = CLogger.getCLogger(AnnotationBasedColumnCalloutFactory.class);
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ public abstract class AnnotationBasedColumnCalloutFactory implements IColumnCall
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IColumnCallout[] getColumnCallouts(String tableName, String columnName) {
|
public IColumnCallout[] getColumnCallouts(String tableName, String columnName) {
|
||||||
|
blockWhileScanning();
|
||||||
List<IColumnCallout> callouts = new ArrayList<IColumnCallout>();
|
List<IColumnCallout> callouts = new ArrayList<IColumnCallout>();
|
||||||
ClassLoader classLoader = bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader();
|
ClassLoader classLoader = bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader();
|
||||||
Map<String, List<String>> columnNameMap = tableNameMap.get(tableName);
|
Map<String, List<String>> columnNameMap = tableNameMap.get(tableName);
|
||||||
|
@ -148,7 +149,7 @@ public abstract class AnnotationBasedColumnCalloutFactory implements IColumnCall
|
||||||
.disableModuleScanning()
|
.disableModuleScanning()
|
||||||
.acceptPackagesNonRecursive(getPackages());
|
.acceptPackagesNonRecursive(getPackages());
|
||||||
|
|
||||||
try (ScanResult scanResult = graph.scan()) {
|
ScanResultProcessor scanResultProcessor = scanResult -> {
|
||||||
List<String> processed = new ArrayList<String>();
|
List<String> processed = new ArrayList<String>();
|
||||||
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Callouts.class)) {
|
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Callouts.class)) {
|
||||||
if (classInfo.isAbstract())
|
if (classInfo.isAbstract())
|
||||||
|
@ -169,11 +170,13 @@ public abstract class AnnotationBasedColumnCalloutFactory implements IColumnCall
|
||||||
AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Callout.class);
|
AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Callout.class);
|
||||||
processAnnotation(className, annotationInfo);
|
processAnnotation(className, annotationInfo);
|
||||||
}
|
}
|
||||||
}
|
signalScanCompletion(true);
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
if (s_log.isLoggable(Level.INFO))
|
s_log.info(() -> this.getClass().getSimpleName() + " loaded "+tableNameMap.size() +" classes in "
|
||||||
s_log.info(this.getClass().getSimpleName() + " loaded "+tableNameMap.size() +" classes in "
|
+ ((end-start)/1000f) + "s");
|
||||||
+((end-start)/1000f) + "s");
|
};
|
||||||
|
|
||||||
|
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processAnnotation(String className, AnnotationInfo annotationInfo) {
|
private void processAnnotation(String className, AnnotationInfo annotationInfo) {
|
||||||
|
|
|
@ -61,15 +61,15 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
|
||||||
import io.github.classgraph.AnnotationClassRef;
|
import io.github.classgraph.AnnotationClassRef;
|
||||||
import io.github.classgraph.AnnotationInfo;
|
import io.github.classgraph.AnnotationInfo;
|
||||||
import io.github.classgraph.ClassGraph;
|
import io.github.classgraph.ClassGraph;
|
||||||
|
import io.github.classgraph.ClassGraph.ScanResultProcessor;
|
||||||
import io.github.classgraph.ClassInfo;
|
import io.github.classgraph.ClassInfo;
|
||||||
import io.github.classgraph.ScanResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan, discover and register classes with {@link EventTopicDelegate} annotation
|
* Scan, discover and register classes with {@link EventTopicDelegate} annotation
|
||||||
* @author hengsin
|
* @author hengsin
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AnnotationBasedEventManager {
|
public abstract class AnnotationBasedEventManager extends AnnotationBasedFactory {
|
||||||
|
|
||||||
private static final CLogger s_log = CLogger.getCLogger(AnnotationBasedEventManager.class);
|
private static final CLogger s_log = CLogger.getCLogger(AnnotationBasedEventManager.class);
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ public abstract class AnnotationBasedEventManager {
|
||||||
.disableModuleScanning()
|
.disableModuleScanning()
|
||||||
.acceptPackagesNonRecursive(getPackages());
|
.acceptPackagesNonRecursive(getPackages());
|
||||||
|
|
||||||
try (ScanResult scanResult = graph.scan())
|
ScanResultProcessor scanResultProcessor = scanResult ->
|
||||||
{
|
{
|
||||||
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(EventTopicDelegate.class)) {
|
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(EventTopicDelegate.class)) {
|
||||||
if (classInfo.isAbstract())
|
if (classInfo.isAbstract())
|
||||||
|
@ -171,12 +171,13 @@ public abstract class AnnotationBasedEventManager {
|
||||||
simpleEventDelegate(classLoader, className, filter);
|
simpleEventDelegate(classLoader, className, filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
if (s_log.isLoggable(Level.INFO))
|
s_log.info(() -> this.getClass().getSimpleName() + " loaded " + handlers.size() + " classes in "
|
||||||
s_log.info(this.getClass().getSimpleName() + " loaded "+handlers.size() +" classes in "
|
+ ((end-start)/1000f) + "s");
|
||||||
+((end-start)/1000f) + "s");
|
signalScanCompletion(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void simpleEventDelegate(ClassLoader classLoader, String className, String filter) {
|
private void simpleEventDelegate(ClassLoader classLoader, String className, String filter) {
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Product: iDempiere ERP & CRM Smart Business Solution *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms version 2 of the GNU General Public License as published *
|
||||||
|
* by the Free Software Foundation. This program is distributed in the hope *
|
||||||
|
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* See the GNU General Public License for more details. *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.base;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import org.compiere.Adempiere;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.compiere.util.Ini;
|
||||||
|
|
||||||
|
import io.github.classgraph.ClassGraph.FailureHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for factories that discover their classes by means of annotation scanning.
|
||||||
|
* @author Saulo Gil
|
||||||
|
*/
|
||||||
|
public abstract class AnnotationBasedFactory {
|
||||||
|
|
||||||
|
private boolean scanSuccessful;
|
||||||
|
|
||||||
|
private final AtomicBoolean scanCompleted = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bogus {@link Future} used only to block the calling thread.
|
||||||
|
* @see #blockWhileScanning()
|
||||||
|
*/
|
||||||
|
private CompletableFuture<Void> threadBlockerFuture = new CompletableFuture<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Executor} to be used for asynchronous class scanning. It never gets shut down
|
||||||
|
* since there's no way to tell when it wouldn't be needed anymore. However, footprint
|
||||||
|
* should be minimal when unused.
|
||||||
|
*/
|
||||||
|
private static final ExecutorService executorService = Executors.newCachedThreadPool();
|
||||||
|
|
||||||
|
private final static CLogger s_log = CLogger.getCLogger(AnnotationBasedFactory.class);
|
||||||
|
|
||||||
|
private final FailureHandler defaultScanFailureHandler = throwable -> {
|
||||||
|
s_log.severe(throwable.getMessage());
|
||||||
|
signalScanCompletion(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
protected void signalScanCompletion(boolean succeeded) {
|
||||||
|
scanSuccessful = succeeded;
|
||||||
|
scanCompleted.set(true);
|
||||||
|
try {
|
||||||
|
threadBlockerFuture.complete(null);
|
||||||
|
} catch (Exception e) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void blockWhileScanning() {
|
||||||
|
String className = this.getClass().getSimpleName();
|
||||||
|
if(!scanCompleted.get())
|
||||||
|
try {
|
||||||
|
Instant start = Instant.now();
|
||||||
|
threadBlockerFuture.get();
|
||||||
|
s_log.fine(() -> String.format("%s waited %d(ms) for class scanning to end"
|
||||||
|
, className, Duration.between(start, Instant.now()).toMillis()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!scanSuccessful)
|
||||||
|
throw new RuntimeException(className + " - annotation scan unsuccessful");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ExecutorService getExecutorService() {
|
||||||
|
return executorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suggests a maximum amount of threads to be allocated to annotation scanning
|
||||||
|
* for each individual factory.
|
||||||
|
* @return suggested maximum amount of threads
|
||||||
|
* @see #executorService
|
||||||
|
* @see Adempiere#getThreadPoolExecutor()
|
||||||
|
*/
|
||||||
|
protected int getMaxThreads() {
|
||||||
|
int max = Runtime.getRuntime().availableProcessors() * 5;
|
||||||
|
int defaultMax = max;
|
||||||
|
Properties properties = Ini.getProperties();
|
||||||
|
String maxSize = properties.getProperty("MaxThreadPoolSize");
|
||||||
|
if (maxSize != null) {
|
||||||
|
try {
|
||||||
|
max = Integer.parseInt(maxSize) / 5;
|
||||||
|
} catch (Exception e) {}
|
||||||
|
}
|
||||||
|
if (max <= 0)
|
||||||
|
max = defaultMax;
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected FailureHandler getScanFailureHandler() {
|
||||||
|
return defaultScanFailureHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -12,10 +12,11 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.adempiere.base;
|
package org.adempiere.base;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
import java.util.function.BiConsumer;
|
||||||
|
import org.compiere.model.PO;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.osgi.framework.wiring.BundleWiring;
|
import org.osgi.framework.wiring.BundleWiring;
|
||||||
import org.osgi.service.component.ComponentContext;
|
import org.osgi.service.component.ComponentContext;
|
||||||
|
@ -24,6 +25,7 @@ import org.osgi.service.component.annotations.Component;
|
||||||
|
|
||||||
import io.github.classgraph.AnnotationInfo;
|
import io.github.classgraph.AnnotationInfo;
|
||||||
import io.github.classgraph.ClassGraph;
|
import io.github.classgraph.ClassGraph;
|
||||||
|
import io.github.classgraph.ClassGraph.ScanResultProcessor;
|
||||||
import io.github.classgraph.ClassInfo;
|
import io.github.classgraph.ClassInfo;
|
||||||
import io.github.classgraph.ClassInfoList;
|
import io.github.classgraph.ClassInfoList;
|
||||||
import io.github.classgraph.ScanResult;
|
import io.github.classgraph.ScanResult;
|
||||||
|
@ -37,7 +39,7 @@ import io.github.classgraph.ScanResult;
|
||||||
* @author Heng Sin
|
* @author Heng Sin
|
||||||
*/
|
*/
|
||||||
@Component(immediate = true, service = IModelFactory.class, property = {"service.ranking:Integer=0"})
|
@Component(immediate = true, service = IModelFactory.class, property = {"service.ranking:Integer=0"})
|
||||||
public class AnnotationBasedModelFactory extends AbstractModelFactory implements IModelFactory
|
public class AnnotationBasedModelFactory extends AnnotationBasedFactory implements IModelFactory
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Table name to class cache
|
* Table name to class cache
|
||||||
|
@ -106,11 +108,30 @@ public class AnnotationBasedModelFactory extends AbstractModelFactory implements
|
||||||
graph.acceptClasses(acceptClasses);
|
graph.acceptClasses(acceptClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
try (ScanResult scanResult = graph.scan())
|
ScanResultProcessor scanResultProcessor = scanResult -> {
|
||||||
{
|
try {
|
||||||
|
processResults(classLoader, scanResult);
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_log.severe("exception found while scanning classes" + e.getMessage());
|
||||||
|
signalScanCompletion(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
s_log.info(() -> this.getClass().getSimpleName() + " loaded " + classCache.size() + " classes in "
|
||||||
|
+ ((end-start)/1000f) + "s");
|
||||||
|
signalScanCompletion(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processResults(ClassLoader classLoader, ScanResult scanResult ) {
|
||||||
|
BiConsumer<String,ClassNotFoundException> exceptionHandler = (className, exception) ->
|
||||||
|
s_log.severe(String.format("exception while loading class %s - %s", className, exception.getMessage()));
|
||||||
|
|
||||||
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Model.class)) {
|
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Model.class)) {
|
||||||
String className = classInfo.getName();
|
String className = classInfo.getName();
|
||||||
|
|
||||||
AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Model.class);
|
AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Model.class);
|
||||||
String tableName = (String) annotationInfo.getParameterValues().getValue("table");
|
String tableName = (String) annotationInfo.getParameterValues().getValue("table");
|
||||||
|
|
||||||
|
@ -125,24 +146,37 @@ public class AnnotationBasedModelFactory extends AbstractModelFactory implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(existing==null) {
|
if(existing==null) {
|
||||||
|
try {
|
||||||
classCache.put(tableName, classLoader.loadClass(className));
|
classCache.put(tableName, classLoader.loadClass(className));
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
exceptionHandler.accept(className, e);
|
||||||
|
}
|
||||||
} else if (className.substring(className.lastIndexOf(".")).startsWith(".M")) {
|
} else if (className.substring(className.lastIndexOf(".")).startsWith(".M")) {
|
||||||
if(existing.getSimpleName().startsWith("X_")) {
|
if(existing.getSimpleName().startsWith("X_")) {
|
||||||
|
try {
|
||||||
classCache.put(tableName, classLoader.loadClass(className));
|
classCache.put(tableName, classLoader.loadClass(className));
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
exceptionHandler.accept(className, e);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Class<?> found = classLoader.loadClass(className);
|
Class<?> found = null;
|
||||||
|
try {
|
||||||
|
found = classLoader.loadClass(className);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
exceptionHandler.accept(className, e);
|
||||||
|
}
|
||||||
// replace existing entries only if found class has a lower hierarchy
|
// replace existing entries only if found class has a lower hierarchy
|
||||||
if(existing.isAssignableFrom(found))
|
if(found != null && existing.isAssignableFrom(found))
|
||||||
|
try {
|
||||||
classCache.put(tableName, classLoader.loadClass(className));
|
classCache.put(tableName, classLoader.loadClass(className));
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
exceptionHandler.accept(className, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
long end = System.currentTimeMillis();
|
|
||||||
if (s_log.isLoggable(Level.INFO))
|
|
||||||
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in "
|
|
||||||
+((end-start)/1000f) + "s");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,6 +184,7 @@ public class AnnotationBasedModelFactory extends AbstractModelFactory implements
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getClass(String tableName) {
|
public Class<?> getClass(String tableName) {
|
||||||
|
blockWhileScanning();
|
||||||
return classCache.get(tableName);
|
return classCache.get(tableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,4 +196,20 @@ public class AnnotationBasedModelFactory extends AbstractModelFactory implements
|
||||||
return getClass().equals(AnnotationBasedModelFactory.class);
|
return getClass().equals(AnnotationBasedModelFactory.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PO getPO(String tableName, int Record_ID, String trxName) {
|
||||||
|
return AbstractModelFactory.getPO(getClass(tableName), tableName, Record_ID, trxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PO getPO(String tableName, ResultSet rs, String trxName) {
|
||||||
|
return AbstractModelFactory.getPO(getClass(tableName), tableName, rs, trxName);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -40,8 +40,8 @@ import org.osgi.service.component.annotations.Activate;
|
||||||
|
|
||||||
import io.github.classgraph.AnnotationInfo;
|
import io.github.classgraph.AnnotationInfo;
|
||||||
import io.github.classgraph.ClassGraph;
|
import io.github.classgraph.ClassGraph;
|
||||||
|
import io.github.classgraph.ClassGraph.ScanResultProcessor;
|
||||||
import io.github.classgraph.ClassInfo;
|
import io.github.classgraph.ClassInfo;
|
||||||
import io.github.classgraph.ScanResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan, discover and register process classes.
|
* Scan, discover and register process classes.
|
||||||
|
@ -51,7 +51,7 @@ import io.github.classgraph.ScanResult;
|
||||||
* @author hengsin
|
* @author hengsin
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AnnotationBasedProcessFactory implements IProcessFactory
|
public abstract class AnnotationBasedProcessFactory extends AnnotationBasedFactory implements IProcessFactory
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Name to class cache
|
* Name to class cache
|
||||||
|
@ -88,8 +88,7 @@ public abstract class AnnotationBasedProcessFactory implements IProcessFactory
|
||||||
String[] packages = getPackages();
|
String[] packages = getPackages();
|
||||||
graph.acceptPackagesNonRecursive(packages);
|
graph.acceptPackagesNonRecursive(packages);
|
||||||
|
|
||||||
try (ScanResult scanResult = graph.scan()) {
|
ScanResultProcessor scanResultProcessor = scanResult -> {
|
||||||
|
|
||||||
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Process.class)) {
|
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Process.class)) {
|
||||||
if (classInfo.isAbstract())
|
if (classInfo.isAbstract())
|
||||||
continue;
|
continue;
|
||||||
|
@ -103,16 +102,19 @@ public abstract class AnnotationBasedProcessFactory implements IProcessFactory
|
||||||
if (alternateName != null)
|
if (alternateName != null)
|
||||||
classCache.put(alternateName, className);
|
classCache.put(alternateName, className);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
if (s_log.isLoggable(Level.INFO))
|
s_log.info(() -> this.getClass().getSimpleName() + " loaded " + classCache.size() + " classes in "
|
||||||
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in "
|
+ ((end-start)/1000f) + "s");
|
||||||
+((end-start)/1000f) + "s");
|
signalScanCompletion(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public ProcessCall newProcessInstance(String className) {
|
public ProcessCall newProcessInstance(String className) {
|
||||||
|
blockWhileScanning();
|
||||||
ProcessCall pc = null;
|
ProcessCall pc = null;
|
||||||
String realClassName = classCache.get(className);
|
String realClassName = classCache.get(className);
|
||||||
if (realClassName != null) {
|
if (realClassName != null) {
|
||||||
|
|
|
@ -15,7 +15,6 @@ package org.adempiere.base.annotation;
|
||||||
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
import static java.lang.annotation.ElementType.FIELD;
|
import static java.lang.annotation.ElementType.FIELD;
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
|
|
@ -225,16 +225,17 @@ public class CLogErrorBuffer extends Handler
|
||||||
&& loggerName.indexOf("CConnection") == -1
|
&& loggerName.indexOf("CConnection") == -1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
try
|
// create issue on a separate thread in order to eventually
|
||||||
{
|
// wait until all model factories are initialized
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
MIssue.create(record);
|
MIssue.create(record);
|
||||||
}
|
} catch (Throwable e) {
|
||||||
catch (Throwable e)
|
// failed to save exception to db, print to console
|
||||||
{
|
|
||||||
//failed to save exception to db, print to console
|
|
||||||
System.err.println(getFormatter().format(record));
|
System.err.println(getFormatter().format(record));
|
||||||
setIssueError(false);
|
setIssueError(false);
|
||||||
}
|
}
|
||||||
|
}).start();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,7 @@ import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.base.AnnotationBasedFactory;
|
||||||
import org.adempiere.webui.panel.ADForm;
|
import org.adempiere.webui.panel.ADForm;
|
||||||
import org.adempiere.webui.panel.IFormController;
|
import org.adempiere.webui.panel.IFormController;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
|
@ -42,15 +43,15 @@ import org.osgi.service.component.annotations.Activate;
|
||||||
|
|
||||||
import io.github.classgraph.AnnotationInfo;
|
import io.github.classgraph.AnnotationInfo;
|
||||||
import io.github.classgraph.ClassGraph;
|
import io.github.classgraph.ClassGraph;
|
||||||
|
import io.github.classgraph.ClassGraph.ScanResultProcessor;
|
||||||
import io.github.classgraph.ClassInfo;
|
import io.github.classgraph.ClassInfo;
|
||||||
import io.github.classgraph.ScanResult;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan, discover and regiser classes with {@link Form} annotation.
|
* Scan, discover and regiser classes with {@link Form} annotation.
|
||||||
* @author hengsin
|
* @author hengsin
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AnnotationBasedFormFactory implements IFormFactory {
|
public abstract class AnnotationBasedFormFactory extends AnnotationBasedFactory implements IFormFactory {
|
||||||
|
|
||||||
private final Map<String, String> classCache = new HashMap<>();
|
private final Map<String, String> classCache = new HashMap<>();
|
||||||
|
|
||||||
|
@ -65,6 +66,7 @@ public abstract class AnnotationBasedFormFactory implements IFormFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ADForm newFormInstance(String formName) {
|
public ADForm newFormInstance(String formName) {
|
||||||
|
blockWhileScanning();
|
||||||
ADForm form = null;
|
ADForm form = null;
|
||||||
String realClassName = classCache.get(formName);
|
String realClassName = classCache.get(formName);
|
||||||
if (realClassName != null) {
|
if (realClassName != null) {
|
||||||
|
@ -139,9 +141,7 @@ public abstract class AnnotationBasedFormFactory implements IFormFactory {
|
||||||
.disableModuleScanning()
|
.disableModuleScanning()
|
||||||
.acceptPackagesNonRecursive(getPackages());
|
.acceptPackagesNonRecursive(getPackages());
|
||||||
|
|
||||||
try (ScanResult scanResult = graph.scan())
|
ScanResultProcessor scanResultProcessor = scanResult -> {
|
||||||
{
|
|
||||||
|
|
||||||
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Form.class)) {
|
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Form.class)) {
|
||||||
if (classInfo.isAbstract())
|
if (classInfo.isAbstract())
|
||||||
continue;
|
continue;
|
||||||
|
@ -153,10 +153,13 @@ public abstract class AnnotationBasedFormFactory implements IFormFactory {
|
||||||
if (!Util.isEmpty(alternateName, true))
|
if (!Util.isEmpty(alternateName, true))
|
||||||
classCache.put(alternateName, className);
|
classCache.put(alternateName, className);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
if (s_log.isLoggable(Level.INFO))
|
s_log.info(() -> this.getClass().getSimpleName() + " loaded " + classCache.size() + " classes in "
|
||||||
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in "
|
+ ((end-start)/1000f) + "s");
|
||||||
+((end-start)/1000f) + "s");
|
signalScanCompletion(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ Require-Bundle: org.adempiere.base;bundle-version="0.0.0",
|
||||||
org.codehaus.jettison.jettison;bundle-version="1.4.1"
|
org.codehaus.jettison.jettison;bundle-version="1.4.1"
|
||||||
Bundle-ClassPath: .,
|
Bundle-ClassPath: .,
|
||||||
lib/idempiere-xmlbeans.jar
|
lib/idempiere-xmlbeans.jar
|
||||||
Export-Package: org.compiere.model,
|
Export-Package: org.idempiere.webservices.model,
|
||||||
org.idempiere.adInterface.x10,
|
org.idempiere.adInterface.x10,
|
||||||
org.idempiere.adInterface.x10.impl,
|
org.idempiere.adInterface.x10.impl,
|
||||||
org.idempiere.adinterface,
|
org.idempiere.adinterface,
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
<service>
|
<service>
|
||||||
<provide interface="org.adempiere.base.IModelFactory"/>
|
<provide interface="org.adempiere.base.IModelFactory"/>
|
||||||
</service>
|
</service>
|
||||||
<implementation class="org.compiere.model.WS_ModelFactory"/>
|
<implementation class="org.idempiere.webservices.model.WS_ModelFactory"/>
|
||||||
</scr:component>
|
</scr:component>
|
|
@ -55,11 +55,10 @@ import org.compiere.model.MRefTable;
|
||||||
import org.compiere.model.MReference;
|
import org.compiere.model.MReference;
|
||||||
import org.compiere.model.MRole;
|
import org.compiere.model.MRole;
|
||||||
import org.compiere.model.MTable;
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.model.MWebServiceType;
|
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
import org.compiere.model.POInfo;
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.model.X_WS_WebServiceFieldInput;
|
import org.idempiere.webservices.model.X_WS_WebServiceFieldInput;
|
||||||
import org.compiere.model.X_WS_WebService_Para;
|
import org.idempiere.webservices.model.X_WS_WebService_Para;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.DisplayType;
|
import org.compiere.util.DisplayType;
|
||||||
|
@ -93,6 +92,7 @@ import org.idempiere.adInterface.x10.WindowTabDataDocument;
|
||||||
import org.idempiere.webservices.AbstractService;
|
import org.idempiere.webservices.AbstractService;
|
||||||
import org.idempiere.webservices.IWSValidator;
|
import org.idempiere.webservices.IWSValidator;
|
||||||
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
||||||
|
import org.idempiere.webservices.model.MWebServiceType;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ADEMPIERE/COMPIERE
|
* ADEMPIERE/COMPIERE
|
||||||
|
|
|
@ -34,13 +34,11 @@ import org.adempiere.exceptions.AdempiereException;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.compiere.model.Lookup;
|
import org.compiere.model.Lookup;
|
||||||
import org.compiere.model.MUser;
|
import org.compiere.model.MUser;
|
||||||
import org.compiere.model.MWebService;
|
|
||||||
import org.compiere.model.MWebServiceType;
|
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
import org.compiere.model.POInfo;
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.model.Query;
|
import org.compiere.model.Query;
|
||||||
import org.compiere.model.X_WS_WebServiceMethod;
|
import org.idempiere.webservices.model.X_WS_WebServiceMethod;
|
||||||
import org.compiere.model.X_WS_WebServiceTypeAccess;
|
import org.idempiere.webservices.model.X_WS_WebServiceTypeAccess;
|
||||||
import org.compiere.util.CCache;
|
import org.compiere.util.CCache;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
@ -57,6 +55,8 @@ import org.idempiere.adInterface.x10.StandardResponseDocument;
|
||||||
import org.idempiere.adinterface.CompiereService;
|
import org.idempiere.adinterface.CompiereService;
|
||||||
import org.idempiere.cache.ImmutablePOCache;
|
import org.idempiere.cache.ImmutablePOCache;
|
||||||
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
||||||
|
import org.idempiere.webservices.model.MWebService;
|
||||||
|
import org.idempiere.webservices.model.MWebServiceType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,10 +16,9 @@ package org.idempiere.webservices;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.compiere.model.MWebServiceType;
|
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
import org.idempiere.webservices.fault.IdempiereServiceFault;
|
||||||
|
import org.idempiere.webservices.model.MWebServiceType;
|
||||||
import org.idempiere.adInterface.x10.ADLoginRequest;
|
import org.idempiere.adInterface.x10.ADLoginRequest;
|
||||||
import org.idempiere.adInterface.x10.DataField;
|
import org.idempiere.adInterface.x10.DataField;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -227,5 +227,5 @@ public interface I_WS_WebServiceFieldInput
|
||||||
/** Get Web Service Type */
|
/** Get Web Service Type */
|
||||||
public int getWS_WebServiceType_ID();
|
public int getWS_WebServiceType_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -149,5 +149,5 @@ public interface I_WS_WebServiceFieldOutput
|
||||||
/** Get Web Service Type */
|
/** Get Web Service Type */
|
||||||
public int getWS_WebServiceType_ID();
|
public int getWS_WebServiceType_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -168,7 +168,7 @@ public interface I_WS_WebServiceMethod
|
||||||
/** Get Web Service */
|
/** Get Web Service */
|
||||||
public int getWS_WebService_ID();
|
public int getWS_WebService_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebService getWS_WebService() throws RuntimeException;
|
public I_WS_WebService getWS_WebService() throws RuntimeException;
|
||||||
|
|
||||||
/** Column name WS_WebServiceMethod_ID */
|
/** Column name WS_WebServiceMethod_ID */
|
||||||
public static final String COLUMNNAME_WS_WebServiceMethod_ID = "WS_WebServiceMethod_ID";
|
public static final String COLUMNNAME_WS_WebServiceMethod_ID = "WS_WebServiceMethod_ID";
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -192,7 +192,7 @@ public interface I_WS_WebServiceType
|
||||||
/** Get Web Service */
|
/** Get Web Service */
|
||||||
public int getWS_WebService_ID();
|
public int getWS_WebService_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebService getWS_WebService() throws RuntimeException;
|
public I_WS_WebService getWS_WebService() throws RuntimeException;
|
||||||
|
|
||||||
/** Column name WS_WebServiceMethod_ID */
|
/** Column name WS_WebServiceMethod_ID */
|
||||||
public static final String COLUMNNAME_WS_WebServiceMethod_ID = "WS_WebServiceMethod_ID";
|
public static final String COLUMNNAME_WS_WebServiceMethod_ID = "WS_WebServiceMethod_ID";
|
||||||
|
@ -203,7 +203,7 @@ public interface I_WS_WebServiceType
|
||||||
/** Get Web Service Method */
|
/** Get Web Service Method */
|
||||||
public int getWS_WebServiceMethod_ID();
|
public int getWS_WebServiceMethod_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceMethod getWS_WebServiceMethod() throws RuntimeException;
|
public I_WS_WebServiceMethod getWS_WebServiceMethod() throws RuntimeException;
|
||||||
|
|
||||||
/** Column name WS_WebServiceType_ID */
|
/** Column name WS_WebServiceType_ID */
|
||||||
public static final String COLUMNNAME_WS_WebServiceType_ID = "WS_WebServiceType_ID";
|
public static final String COLUMNNAME_WS_WebServiceType_ID = "WS_WebServiceType_ID";
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -153,5 +153,5 @@ public interface I_WS_WebServiceTypeAccess
|
||||||
/** Get Web Service Type */
|
/** Get Web Service Type */
|
||||||
public int getWS_WebServiceType_ID();
|
public int getWS_WebServiceType_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -165,5 +165,5 @@ public interface I_WS_WebService_Para
|
||||||
/** Get Web Service Type */
|
/** Get Web Service Type */
|
||||||
public int getWS_WebServiceType_ID();
|
public int getWS_WebServiceType_ID();
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException;
|
||||||
}
|
}
|
|
@ -27,7 +27,7 @@
|
||||||
* - GlobalQSS (http://www.globalqss.com) *
|
* - GlobalQSS (http://www.globalqss.com) *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
|
@ -23,7 +23,7 @@
|
||||||
* - Trek Global Corporation *
|
* - Trek Global Corporation *
|
||||||
* - Heng Sin Low *
|
* - Heng Sin Low *
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
|
@ -27,7 +27,7 @@
|
||||||
* - GlobalQSS (http://www.globalqss.com) *
|
* - GlobalQSS (http://www.globalqss.com) *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
|
@ -27,7 +27,7 @@
|
||||||
* - GlobalQSS (http://www.globalqss.com) *
|
* - GlobalQSS (http://www.globalqss.com) *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -37,6 +37,9 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.Query;
|
||||||
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;
|
|
@ -23,7 +23,7 @@
|
||||||
* - Carlos Ruiz - globalqss *
|
* - Carlos Ruiz - globalqss *
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import org.adempiere.base.AnnotationBasedModelFactory;
|
import org.adempiere.base.AnnotationBasedModelFactory;
|
||||||
import org.adempiere.base.IModelFactory;
|
import org.adempiere.base.IModelFactory;
|
|
@ -15,10 +15,14 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
|
||||||
/** Generated Model for WS_WebService
|
/** Generated Model for WS_WebService
|
|
@ -15,10 +15,15 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
|
||||||
/** Generated Model for WS_WebServiceFieldInput
|
/** Generated Model for WS_WebServiceFieldInput
|
||||||
|
@ -280,9 +285,9 @@ public class X_WS_WebServiceFieldInput extends PO implements I_WS_WebServiceFiel
|
||||||
return (String)get_Value(COLUMNNAME_WS_WebServiceFieldInput_UU);
|
return (String)get_Value(COLUMNNAME_WS_WebServiceFieldInput_UU);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebServiceType)MTable.get(getCtx(), org.compiere.model.I_WS_WebServiceType.Table_ID)
|
return (I_WS_WebServiceType)MTable.get(getCtx(), I_WS_WebServiceType.Table_ID)
|
||||||
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,15 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
|
||||||
/** Generated Model for WS_WebServiceFieldOutput
|
/** Generated Model for WS_WebServiceFieldOutput
|
||||||
|
@ -143,9 +148,9 @@ public class X_WS_WebServiceFieldOutput extends PO implements I_WS_WebServiceFie
|
||||||
return (String)get_Value(COLUMNNAME_WS_WebServiceFieldOutput_UU);
|
return (String)get_Value(COLUMNNAME_WS_WebServiceFieldOutput_UU);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebServiceType)MTable.get(getCtx(), org.compiere.model.I_WS_WebServiceType.Table_ID)
|
return (I_WS_WebServiceType)MTable.get(getCtx(), I_WS_WebServiceType.Table_ID)
|
||||||
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,15 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
|
||||||
/** Generated Model for WS_WebServiceMethod
|
/** Generated Model for WS_WebServiceMethod
|
||||||
|
@ -141,9 +146,9 @@ public class X_WS_WebServiceMethod extends PO implements I_WS_WebServiceMethod,
|
||||||
return (String)get_Value(COLUMNNAME_Value);
|
return (String)get_Value(COLUMNNAME_Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebService getWS_WebService() throws RuntimeException
|
public I_WS_WebService getWS_WebService() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebService)MTable.get(getCtx(), org.compiere.model.I_WS_WebService.Table_ID)
|
return (I_WS_WebService)MTable.get(getCtx(), I_WS_WebService.Table_ID)
|
||||||
.getPO(getWS_WebService_ID(), get_TrxName());
|
.getPO(getWS_WebService_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,15 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
import org.compiere.util.KeyNamePair;
|
import org.compiere.util.KeyNamePair;
|
||||||
|
|
||||||
/** Generated Model for WS_WebServiceType
|
/** Generated Model for WS_WebServiceType
|
||||||
|
@ -194,9 +199,9 @@ public class X_WS_WebServiceType extends PO implements I_WS_WebServiceType, I_Pe
|
||||||
return (String)get_Value(COLUMNNAME_Value);
|
return (String)get_Value(COLUMNNAME_Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebService getWS_WebService() throws RuntimeException
|
public I_WS_WebService getWS_WebService() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebService)MTable.get(getCtx(), org.compiere.model.I_WS_WebService.Table_ID)
|
return (I_WS_WebService)MTable.get(getCtx(), I_WS_WebService.Table_ID)
|
||||||
.getPO(getWS_WebService_ID(), get_TrxName());
|
.getPO(getWS_WebService_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,9 +225,9 @@ public class X_WS_WebServiceType extends PO implements I_WS_WebServiceType, I_Pe
|
||||||
return ii.intValue();
|
return ii.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceMethod getWS_WebServiceMethod() throws RuntimeException
|
public I_WS_WebServiceMethod getWS_WebServiceMethod() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebServiceMethod)MTable.get(getCtx(), org.compiere.model.I_WS_WebServiceMethod.Table_ID)
|
return (I_WS_WebServiceMethod)MTable.get(getCtx(), I_WS_WebServiceMethod.Table_ID)
|
||||||
.getPO(getWS_WebServiceMethod_ID(), get_TrxName());
|
.getPO(getWS_WebServiceMethod_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,16 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
|
|
||||||
/** Generated Model for WS_WebServiceTypeAccess
|
/** Generated Model for WS_WebServiceTypeAccess
|
||||||
* @author iDempiere (generated)
|
* @author iDempiere (generated)
|
||||||
* @version Development 9.0 - $Id$ */
|
* @version Development 9.0 - $Id$ */
|
||||||
|
@ -140,9 +145,9 @@ public class X_WS_WebServiceTypeAccess extends PO implements I_WS_WebServiceType
|
||||||
return (String)get_Value(COLUMNNAME_WS_WebServiceTypeAccess_UU);
|
return (String)get_Value(COLUMNNAME_WS_WebServiceTypeAccess_UU);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebServiceType)MTable.get(getCtx(), org.compiere.model.I_WS_WebServiceType.Table_ID)
|
return (I_WS_WebServiceType)MTable.get(getCtx(), I_WS_WebServiceType.Table_ID)
|
||||||
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,16 @@
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/** Generated Model - DO NOT CHANGE */
|
/** Generated Model - DO NOT CHANGE */
|
||||||
package org.compiere.model;
|
package org.idempiere.webservices.model;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.model.I_Persistent;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.POInfo;
|
||||||
|
|
||||||
/** Generated Model for WS_WebService_Para
|
/** Generated Model for WS_WebService_Para
|
||||||
* @author iDempiere (generated)
|
* @author iDempiere (generated)
|
||||||
* @version Development 9.0 - $Id$ */
|
* @version Development 9.0 - $Id$ */
|
||||||
|
@ -158,9 +163,9 @@ public class X_WS_WebService_Para extends PO implements I_WS_WebService_Para, I_
|
||||||
return (String)get_Value(COLUMNNAME_WS_WebService_Para_UU);
|
return (String)get_Value(COLUMNNAME_WS_WebService_Para_UU);
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.compiere.model.I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
public I_WS_WebServiceType getWS_WebServiceType() throws RuntimeException
|
||||||
{
|
{
|
||||||
return (org.compiere.model.I_WS_WebServiceType)MTable.get(getCtx(), org.compiere.model.I_WS_WebServiceType.Table_ID)
|
return (I_WS_WebServiceType)MTable.get(getCtx(), I_WS_WebServiceType.Table_ID)
|
||||||
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
.getPO(getWS_WebServiceType_ID(), get_TrxName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
|
|
||||||
package org.idempiere.webservices.process;
|
package org.idempiere.webservices.process;
|
||||||
|
|
||||||
import org.compiere.model.MWebServiceType;
|
|
||||||
import org.compiere.process.SvrProcess;
|
import org.compiere.process.SvrProcess;
|
||||||
|
import org.idempiere.webservices.model.MWebServiceType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Nicolas Micoud - TGI
|
* @author Nicolas Micoud - TGI
|
||||||
|
|
Loading…
Reference in New Issue