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:
Saulo José Gil 2021-11-24 02:57:35 -03:00 committed by GitHub
parent d37993a992
commit 9e2922c7c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 355 additions and 137 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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(); s_log.info(() -> this.getClass().getSimpleName() + " loaded " + handlers.size() + " classes in "
if (s_log.isLoggable(Level.INFO)) + ((end-start)/1000f) + "s");
s_log.info(this.getClass().getSimpleName() + " loaded "+handlers.size() +" classes in " signalScanCompletion(true);
+((end-start)/1000f) + "s"); };
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
} }
private void simpleEventDelegate(ClassLoader classLoader, String className, String filter) { private void simpleEventDelegate(ClassLoader classLoader, String className, String filter) {

View File

@ -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;
}
}

View File

@ -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,43 +108,75 @@ 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);
};
for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Model.class)) { graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
String className = classInfo.getName(); }
AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Model.class);
String tableName = (String) annotationInfo.getParameterValues().getValue("table");
Class<?> existing = classCache.get(tableName); 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()));
// try to detect M classes only if we found an X class for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(Model.class)) {
if(existing == null && className.substring(className.lastIndexOf(".")).startsWith(".X")) { String className = classInfo.getName();
ClassInfoList subclasses = classInfo.getSubclasses().directOnly();
while(!subclasses.isEmpty()) { AnnotationInfo annotationInfo = classInfo.getAnnotationInfo(Model.class);
className = subclasses.get(0).getName(); String tableName = (String) annotationInfo.getParameterValues().getValue("table");
subclasses = subclasses.get(0).getSubclasses().directOnly();
} Class<?> existing = classCache.get(tableName);
// try to detect M classes only if we found an X class
if(existing == null && className.substring(className.lastIndexOf(".")).startsWith(".X")) {
ClassInfoList subclasses = classInfo.getSubclasses().directOnly();
while(!subclasses.isEmpty()) {
className = subclasses.get(0).getName();
subclasses = subclasses.get(0).getSubclasses().directOnly();
} }
}
if(existing==null) {
classCache.put(tableName, classLoader.loadClass(className));
} else if (className.substring(className.lastIndexOf(".")).startsWith(".M")) { if(existing==null) {
if(existing.getSimpleName().startsWith("X_")) { try {
classCache.put(tableName, classLoader.loadClass(className)); classCache.put(tableName, classLoader.loadClass(className));
} else { } catch (ClassNotFoundException e) {
Class<?> found = classLoader.loadClass(className); exceptionHandler.accept(className, e);
// replace existing entries only if found class has a lower hierarchy }
if(existing.isAssignableFrom(found)) } else if (className.substring(className.lastIndexOf(".")).startsWith(".M")) {
classCache.put(tableName, classLoader.loadClass(className)); if(existing.getSimpleName().startsWith("X_")) {
} try {
} classCache.put(tableName, classLoader.loadClass(className));
} } catch (ClassNotFoundException e) {
} exceptionHandler.accept(className, e);
long end = System.currentTimeMillis(); }
if (s_log.isLoggable(Level.INFO)) } else {
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in " Class<?> found = null;
+((end-start)/1000f) + "s"); try {
found = classLoader.loadClass(className);
} catch (ClassNotFoundException e) {
exceptionHandler.accept(className, e);
}
// replace existing entries only if found class has a lower hierarchy
if(found != null && existing.isAssignableFrom(found))
try {
classCache.put(tableName, classLoader.loadClass(className));
} catch (ClassNotFoundException e) {
exceptionHandler.accept(className, e);
}
}
}
}
} }
/** /**
@ -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);
}
} }

View File

@ -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(); s_log.info(() -> this.getClass().getSimpleName() + " loaded " + classCache.size() + " classes in "
if (s_log.isLoggable(Level.INFO)) + ((end-start)/1000f) + "s");
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in " signalScanCompletion(true);
+((end-start)/1000f) + "s"); };
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) {

View File

@ -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;

View File

@ -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
MIssue.create(record); new Thread(() -> {
} try {
catch (Throwable e) MIssue.create(record);
{ } 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
{ {

View File

@ -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(); s_log.info(() -> this.getClass().getSimpleName() + " loaded " + classCache.size() + " classes in "
if (s_log.isLoggable(Level.INFO)) + ((end-start)/1000f) + "s");
s_log.info(this.getClass().getSimpleName() + " loaded "+classCache.size() +" classes in " signalScanCompletion(true);
+((end-start)/1000f) + "s"); };
graph.scanAsync(getExecutorService(), getMaxThreads(), scanResultProcessor, getScanFailureHandler());
} }
} }

View File

@ -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,

View File

@ -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>

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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";

View File

@ -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";

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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());
} }

View File

@ -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());
} }

View File

@ -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());
} }

View File

@ -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());
} }

View File

@ -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());
} }

View File

@ -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());
} }

View File

@ -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