diff --git a/0002-Port-to-Eclipse-Luna-OSGi.patch b/0002-Port-to-Eclipse-Luna-OSGi.patch new file mode 100644 index 0000000000000000000000000000000000000000..af2e7439f088f1144391d85e45743ce9ecf4c45b --- /dev/null +++ b/0002-Port-to-Eclipse-Luna-OSGi.patch @@ -0,0 +1,62 @@ +From 9e1bb9bfee86490163fb1e226556620aa8cdf7bc Mon Sep 17 00:00:00 2001 +From: Mikolaj Izdebski +Date: Fri, 21 Nov 2014 10:05:05 +0100 +Subject: [PATCH 2/3] Port to Eclipse Luna OSGi + +--- + xbean-bundleutils/pom.xml | 8 +------- + .../apache/xbean/osgi/bundle/util/DelegatingBundleContext.java | 10 ++++++++++ + 2 files changed, 11 insertions(+), 7 deletions(-) + +diff --git a/xbean-bundleutils/pom.xml b/xbean-bundleutils/pom.xml +index 72f4865..2b3459d 100644 +--- a/xbean-bundleutils/pom.xml ++++ b/xbean-bundleutils/pom.xml +@@ -35,15 +35,9 @@ + slf4j-api + + +- org.osgi +- org.osgi.core +- 4.3.1 +- provided +- +- + org.eclipse + osgi +- 3.6.0.v20100517 ++ 3.10.0-v20140606-1445 + provided + + +diff --git a/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundleContext.java b/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundleContext.java +index 58a392b..cc8d081 100644 +--- a/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundleContext.java ++++ b/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundleContext.java +@@ -31,7 +31,9 @@ import org.osgi.framework.BundleListener; + import org.osgi.framework.Filter; + import org.osgi.framework.FrameworkListener; + import org.osgi.framework.InvalidSyntaxException; ++import org.osgi.framework.ServiceFactory; + import org.osgi.framework.ServiceListener; ++import org.osgi.framework.ServiceObjects; + import org.osgi.framework.ServiceReference; + import org.osgi.framework.ServiceRegistration; + +@@ -153,5 +155,13 @@ public class DelegatingBundleContext implements BundleContext { + public Bundle getBundle(String location) { + return bundleContext.getBundle(location); + } ++ ++ public ServiceObjects getServiceObjects(ServiceReference reference) { ++ return bundleContext.getServiceObjects(reference); ++ } ++ ++ public ServiceRegistration registerService(Class clazz, ServiceFactory factory, Dictionary properties) { ++ return bundleContext.registerService(clazz, factory, properties); ++ } + + } +-- +2.9.3 + diff --git a/0003-Port-to-QDox-2.0.patch b/0003-Port-to-QDox-2.0.patch new file mode 100644 index 0000000000000000000000000000000000000000..95609a2b74271f24c307ac7d3fb83892b85aa110 --- /dev/null +++ b/0003-Port-to-QDox-2.0.patch @@ -0,0 +1,689 @@ +From 928bd5a98dc500a31197a56c8f6c5e19a3a273f8 Mon Sep 17 00:00:00 2001 +From: Mikolaj Izdebski +Date: Fri, 21 Nov 2014 10:51:38 +0100 +Subject: [PATCH 3/3] Port to QDox 2.0 + +--- + pom.xml | 2 +- + .../blueprint/generator/QdoxMappingLoader.java | 144 +++++++++++--------- + .../xbean/spring/generator/QdoxMappingLoader.java | 148 ++++++++++++--------- + .../org/apache/xbean/spring/generator/Type.java | 7 +- + 4 files changed, 166 insertions(+), 135 deletions(-) + +diff --git a/pom.xml b/pom.xml +index 6e53649..9132fe4 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -297,7 +297,7 @@ + + com.thoughtworks.qdox + qdox +- 1.6.3 ++ 2.0-M5 + + + +diff --git a/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java b/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java +index 6635937..e17fd08 100644 +--- a/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java ++++ b/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java +@@ -20,6 +20,7 @@ import java.io.File; + import java.io.IOException; + import java.net.URL; + import java.util.ArrayList; ++import java.util.Collection; + import java.util.Collections; + import java.util.Enumeration; + import java.util.HashMap; +@@ -31,14 +32,17 @@ import java.util.TreeSet; + import java.util.jar.JarEntry; + import java.util.jar.JarFile; + +-import com.thoughtworks.qdox.JavaDocBuilder; ++import com.thoughtworks.qdox.JavaProjectBuilder; + import com.thoughtworks.qdox.model.BeanProperty; + import com.thoughtworks.qdox.model.DocletTag; + import com.thoughtworks.qdox.model.JavaClass; ++import com.thoughtworks.qdox.model.JavaConstructor; + import com.thoughtworks.qdox.model.JavaMethod; ++import com.thoughtworks.qdox.model.JavaModel; + import com.thoughtworks.qdox.model.JavaParameter; + import com.thoughtworks.qdox.model.JavaSource; +-import com.thoughtworks.qdox.model.Type; ++import com.thoughtworks.qdox.model.JavaType; ++ + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + +@@ -62,7 +66,7 @@ public class QdoxMappingLoader implements MappingLoader { + private final String defaultNamespace; + private final File[] srcDirs; + private final String[] excludedClasses; +- private Type collectionType; ++ private JavaClass collectionType; + + public QdoxMappingLoader(String defaultNamespace, File[] srcDirs, String[] excludedClasses) { + this.defaultNamespace = defaultNamespace; +@@ -79,7 +83,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + + public Set loadNamespaces() throws IOException { +- JavaDocBuilder builder = new JavaDocBuilder(); ++ JavaProjectBuilder builder = new JavaProjectBuilder(); + + log.debug("Source directories: "); + +@@ -92,11 +96,11 @@ public class QdoxMappingLoader implements MappingLoader { + getSourceFiles(sourceDirectory, excludedClasses, builder); + } + +- collectionType = builder.getClassByName("java.util.Collection").asType(); ++ collectionType = builder.getClassByName("java.util.Collection"); + return loadNamespaces(builder); + } + +- private Set loadNamespaces(JavaDocBuilder builder) { ++ private Set loadNamespaces(JavaProjectBuilder builder) { + // load all of the elements + List elements = loadElements(builder); + +@@ -131,14 +135,14 @@ public class QdoxMappingLoader implements MappingLoader { + return Collections.unmodifiableSet(namespaces); + } + +- private List loadElements(JavaDocBuilder builder) { +- JavaSource[] javaSources = builder.getSources(); ++ private List loadElements(JavaProjectBuilder builder) { ++ Collection javaSources = builder.getSources(); + List elements = new ArrayList(); + for (JavaSource javaSource : javaSources) { +- if (javaSource.getClasses().length == 0) { ++ if (javaSource.getClasses().isEmpty()) { + log.info("No Java Classes defined in: " + javaSource.getURL()); + } else { +- JavaClass[] classes = javaSource.getClasses(); ++ Collection classes = javaSource.getClasses(); + for (JavaClass javaClass : classes) { + ElementMapping element = loadElement(builder, javaClass); + if (element != null && !javaClass.isAbstract()) { +@@ -152,7 +156,7 @@ public class QdoxMappingLoader implements MappingLoader { + return elements; + } + +- private ElementMapping loadElement(JavaDocBuilder builder, JavaClass javaClass) { ++ private ElementMapping loadElement(JavaProjectBuilder builder, JavaClass javaClass) { + DocletTag xbeanTag = javaClass.getTagByName(XBEAN_ANNOTATION); + if (xbeanTag == null) { + return null; +@@ -176,7 +180,7 @@ public class QdoxMappingLoader implements MappingLoader { + Map attributesByPropertyName = new HashMap(); + + for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) { +- BeanProperty[] beanProperties = jClass.getBeanProperties(); ++ Collection beanProperties = jClass.getBeanProperties(); + for (BeanProperty beanProperty : beanProperties) { + // we only care about properties with a setter + if (beanProperty.getMutator() != null) { +@@ -219,9 +223,9 @@ public class QdoxMappingLoader implements MappingLoader { + String destroyMethod = null; + String factoryMethod = null; + for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) { +- JavaMethod[] methods = javaClass.getMethods(); ++ Collection methods = javaClass.getMethods(); + for (JavaMethod method : methods) { +- if (method.isPublic() && !method.isConstructor()) { ++ if (method.isPublic()) { + if (initMethod == null && method.getTagByName(INIT_METHOD_ANNOTATION) != null) { + initMethod = method.getName(); + } +@@ -237,22 +241,43 @@ public class QdoxMappingLoader implements MappingLoader { + } + + List> constructorArgs = new ArrayList>(); +- JavaMethod[] methods = javaClass.getMethods(); +- for (JavaMethod method : methods) { +- JavaParameter[] parameters = method.getParameters(); +- if (isValidConstructor(factoryMethod, method, parameters)) { +- List args = new ArrayList(parameters.length); +- for (JavaParameter parameter : parameters) { +- AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); +- if (attributeMapping == null) { +- attributeMapping = loadParameter(parameter); +- +- attributes.add(attributeMapping); +- attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ if (factoryMethod == null) { ++ Collection constructors = javaClass.getConstructors(); ++ for (JavaConstructor constructor : constructors) { ++ Collection parameters = constructor.getParameters(); ++ if (constructor.isPublic() && parameters.size() > 0) { ++ List args = new ArrayList(parameters.size()); ++ for (JavaParameter parameter : parameters) { ++ AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); ++ if (attributeMapping == null) { ++ attributeMapping = loadParameter(parameter, constructor); ++ ++ attributes.add(attributeMapping); ++ attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ } ++ args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); + } +- args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); ++ constructorArgs.add(Collections.unmodifiableList(args)); ++ } ++ } ++ } else { ++ Collection methods = javaClass.getMethods(); ++ for (JavaMethod method : methods) { ++ Collection parameters = method.getParameters(); ++ if (method.isPublic() && parameters.size() > 0 && method.getName().equals(factoryMethod)) { ++ List args = new ArrayList(parameters.size()); ++ for (JavaParameter parameter : parameters) { ++ AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); ++ if (attributeMapping == null) { ++ attributeMapping = loadParameter(parameter, method); ++ ++ attributes.add(attributeMapping); ++ attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ } ++ args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); ++ } ++ constructorArgs.add(Collections.unmodifiableList(args)); + } +- constructorArgs.add(Collections.unmodifiableList(args)); + } + } + +@@ -303,7 +328,7 @@ public class QdoxMappingLoader implements MappingLoader { + interfaces); + } + +- private List getFullyQualifiedNames(JavaClass[] implementedInterfaces) { ++ private List getFullyQualifiedNames(Collection implementedInterfaces) { + ArrayList l = new ArrayList(); + for (JavaClass implementedInterface : implementedInterfaces) { + l.add(implementedInterface.getFullyQualifiedName()); +@@ -395,19 +420,19 @@ public class QdoxMappingLoader implements MappingLoader { + return defaultDescription; + } + +- private AttributeMapping loadParameter(JavaParameter parameter) { ++ private AttributeMapping loadParameter(JavaParameter parameter, JavaModel methodOrConstructor) { + String parameterName = parameter.getName(); + String parameterDescription = getParameterDescription(parameter); + + // first attempt to load the attribute from the java beans accessor methods +- JavaClass javaClass = parameter.getParentMethod().getParentClass(); ++ JavaClass javaClass = parameter.getParentClass(); + BeanProperty beanProperty = javaClass.getBeanProperty(parameterName); + if (beanProperty != null) { + AttributeMapping attributeMapping = loadAttribute(beanProperty, parameterDescription); + // if the attribute mapping is null, the property was tagged as hidden and this is an error + if (attributeMapping == null) { + throw new InvalidModelException("Hidden property usage: " + +- "The construction method " + toMethodLocator(parameter.getParentMethod()) + ++ "The construction method " + toMethodLocator(parameter.getParentClass(), methodOrConstructor) + + " can not use a hidded property " + parameterName); + } + return attributeMapping; +@@ -426,9 +451,9 @@ public class QdoxMappingLoader implements MappingLoader { + + private String getParameterDescription(JavaParameter parameter) { + String parameterName = parameter.getName(); +- DocletTag[] tags = parameter.getParentMethod().getTagsByName("param"); ++ Collection tags = parameter.getTagsByName("param"); + for (DocletTag tag : tags) { +- if (tag.getParameters()[0].equals(parameterName)) { ++ if (tag.getParameters().get(0).equals(parameterName)) { + String parameterDescription = tag.getValue().trim(); + if (parameterDescription.startsWith(parameterName)) { + parameterDescription = parameterDescription.substring(parameterName.length()).trim(); +@@ -439,18 +464,6 @@ public class QdoxMappingLoader implements MappingLoader { + return null; + } + +- private boolean isValidConstructor(String factoryMethod, JavaMethod method, JavaParameter[] parameters) { +- if (!method.isPublic() || parameters.length == 0) { +- return false; +- } +- +- if (factoryMethod == null) { +- return method.isConstructor(); +- } else { +- return method.getName().equals(factoryMethod); +- } +- } +- + private static String getProperty(DocletTag propertyTag, String propertyName) { + return getProperty(propertyTag, propertyName, null); + } +@@ -477,14 +490,17 @@ public class QdoxMappingLoader implements MappingLoader { + return false; + } + +- private org.apache.xbean.blueprint.generator.Type toMappingType(Type type, String nestedType) { ++ private org.apache.xbean.blueprint.generator.Type toMappingType(JavaType type, String nestedType) { + try { +- if (type.isArray()) { +- return org.apache.xbean.blueprint.generator.Type.newArrayType(type.getValue(), type.getDimensions()); +- } else if (type.isA(collectionType)) { +- if (nestedType == null) nestedType = "java.lang.Object"; +- return org.apache.xbean.blueprint.generator.Type.newCollectionType(type.getValue(), +- org.apache.xbean.blueprint.generator.Type.newSimpleType(nestedType)); ++ if (type instanceof JavaClass) { ++ JavaClass clazz = (JavaClass)type; ++ if (clazz.isArray()) { ++ return org.apache.xbean.blueprint.generator.Type.newArrayType(type.getValue(), clazz.getDimensions()); ++ } else if (clazz.isA(collectionType)) { ++ if (nestedType == null) nestedType = "java.lang.Object"; ++ return org.apache.xbean.blueprint.generator.Type.newCollectionType(type.getValue(), ++ org.apache.xbean.blueprint.generator.Type.newSimpleType(nestedType)); ++ } + } + } catch (Throwable t) { + log.debug("Could not load type mapping", t); +@@ -492,26 +508,28 @@ public class QdoxMappingLoader implements MappingLoader { + return org.apache.xbean.blueprint.generator.Type.newSimpleType(type.getValue()); + } + +- private static String toMethodLocator(JavaMethod method) { ++ private static String toMethodLocator(JavaClass parentClass, JavaModel methodOrConstructor) { ++ JavaMethod method = methodOrConstructor instanceof JavaMethod ? (JavaMethod) methodOrConstructor : null; ++ JavaConstructor constructor = methodOrConstructor instanceof JavaConstructor ? (JavaConstructor) methodOrConstructor : null; + StringBuffer buf = new StringBuffer(); +- buf.append(method.getParentClass().getFullyQualifiedName()); +- if (!method.isConstructor()) { ++ buf.append(parentClass.getFullyQualifiedName()); ++ if (method != null) { + buf.append(".").append(method.getName()); + } + buf.append("("); +- JavaParameter[] parameters = method.getParameters(); +- for (int i = 0; i < parameters.length; i++) { +- JavaParameter parameter = parameters[i]; ++ List parameters = method != null ? method.getParameters() : constructor.getParameters(); ++ for (int i = 0; i < parameters.size(); i++) { ++ JavaParameter parameter = parameters.get(i); + if (i > 0) { + buf.append(", "); + } + buf.append(parameter.getName()); + } +- buf.append(") : ").append(method.getLineNumber()); ++ buf.append(") : ").append(method != null ? method.getLineNumber() : constructor.getLineNumber()); + return buf.toString(); + } + +- private static void getSourceFiles(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void getSourceFiles(File base, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + if (base.isDirectory()) { + listAllFileNames(base, "", excludedClasses, builder); + } else { +@@ -519,7 +537,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + } + +- private static void listAllFileNames(File base, String prefix, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void listAllFileNames(File base, String prefix, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + if (!base.canRead() || !base.isDirectory()) { + throw new IllegalArgumentException(base.getAbsolutePath()); + } +@@ -536,7 +554,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + } + +- private static void listAllJarEntries(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void listAllJarEntries(File base, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + JarFile jarFile = new JarFile(base); + for (Enumeration entries = jarFile.entries(); entries.hasMoreElements(); ) { + JarEntry entry = (JarEntry) entries.nextElement(); +diff --git a/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java b/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java +index 94bd7a1..228117e 100644 +--- a/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java ++++ b/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java +@@ -20,6 +20,7 @@ import java.io.File; + import java.io.IOException; + import java.net.URL; + import java.util.ArrayList; ++import java.util.Collection; + import java.util.Collections; + import java.util.Enumeration; + import java.util.HashMap; +@@ -31,14 +32,17 @@ import java.util.TreeSet; + import java.util.jar.JarEntry; + import java.util.jar.JarFile; + +-import com.thoughtworks.qdox.JavaDocBuilder; ++import com.thoughtworks.qdox.JavaProjectBuilder; + import com.thoughtworks.qdox.model.BeanProperty; + import com.thoughtworks.qdox.model.DocletTag; + import com.thoughtworks.qdox.model.JavaClass; ++import com.thoughtworks.qdox.model.JavaConstructor; + import com.thoughtworks.qdox.model.JavaMethod; ++import com.thoughtworks.qdox.model.JavaModel; + import com.thoughtworks.qdox.model.JavaParameter; + import com.thoughtworks.qdox.model.JavaSource; +-import com.thoughtworks.qdox.model.Type; ++import com.thoughtworks.qdox.model.JavaType; ++ + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + +@@ -62,7 +66,7 @@ public class QdoxMappingLoader implements MappingLoader { + private final String defaultNamespace; + private final File[] srcDirs; + private final String[] excludedClasses; +- private Type collectionType; ++ private JavaClass collectionType; + + public QdoxMappingLoader(String defaultNamespace, File[] srcDirs, String[] excludedClasses) { + this.defaultNamespace = defaultNamespace; +@@ -79,7 +83,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + + public Set loadNamespaces() throws IOException { +- JavaDocBuilder builder = new JavaDocBuilder(); ++ JavaProjectBuilder builder = new JavaProjectBuilder(); + + log.debug("Source directories: "); + +@@ -92,11 +96,11 @@ public class QdoxMappingLoader implements MappingLoader { + getSourceFiles(sourceDirectory, excludedClasses, builder); + } + +- collectionType = builder.getClassByName("java.util.Collection").asType(); ++ collectionType = builder.getClassByName("java.util.Collection"); + return loadNamespaces(builder); + } + +- private Set loadNamespaces(JavaDocBuilder builder) { ++ private Set loadNamespaces(JavaProjectBuilder builder) { + // load all of the elements + List elements = loadElements(builder); + +@@ -131,14 +135,14 @@ public class QdoxMappingLoader implements MappingLoader { + return Collections.unmodifiableSet(namespaces); + } + +- private List loadElements(JavaDocBuilder builder) { +- JavaSource[] javaSources = builder.getSources(); ++ private List loadElements(JavaProjectBuilder builder) { ++ Collection javaSources = builder.getSources(); + List elements = new ArrayList(); + for (JavaSource javaSource : javaSources) { +- if (javaSource.getClasses().length == 0) { ++ if (javaSource.getClasses().isEmpty()) { + log.info("No Java Classes defined in: " + javaSource.getURL()); + } else { +- JavaClass[] classes = javaSource.getClasses(); ++ Collection classes = javaSource.getClasses(); + for (JavaClass javaClass : classes) { + ElementMapping element = loadElement(builder, javaClass); + if (element != null && !javaClass.isAbstract()) { +@@ -152,7 +156,7 @@ public class QdoxMappingLoader implements MappingLoader { + return elements; + } + +- private ElementMapping loadElement(JavaDocBuilder builder, JavaClass javaClass) { ++ private ElementMapping loadElement(JavaProjectBuilder builder, JavaClass javaClass) { + DocletTag xbeanTag = javaClass.getTagByName(XBEAN_ANNOTATION); + if (xbeanTag == null) { + return null; +@@ -176,7 +180,7 @@ public class QdoxMappingLoader implements MappingLoader { + Map attributesByPropertyName = new HashMap(); + + for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) { +- BeanProperty[] beanProperties = jClass.getBeanProperties(); ++ Collection beanProperties = jClass.getBeanProperties(); + for (BeanProperty beanProperty : beanProperties) { + // we only care about properties with a setter + if (beanProperty.getMutator() != null) { +@@ -219,9 +223,9 @@ public class QdoxMappingLoader implements MappingLoader { + String destroyMethod = null; + String factoryMethod = null; + for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) { +- JavaMethod[] methods = javaClass.getMethods(); ++ Collection methods = javaClass.getMethods(); + for (JavaMethod method : methods) { +- if (method.isPublic() && !method.isConstructor()) { ++ if (method.isPublic()) { + if (initMethod == null && method.getTagByName(INIT_METHOD_ANNOTATION) != null) { + initMethod = method.getName(); + } +@@ -237,27 +241,48 @@ public class QdoxMappingLoader implements MappingLoader { + } + + List> constructorArgs = new ArrayList>(); +- JavaMethod[] methods = javaClass.getMethods(); +- for (JavaMethod method : methods) { +- JavaParameter[] parameters = method.getParameters(); +- if (isValidConstructor(factoryMethod, method, parameters)) { +- List args = new ArrayList(parameters.length); +- for (JavaParameter parameter : parameters) { +- AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); +- if (attributeMapping == null) { +- attributeMapping = loadParameter(parameter); +- +- attributes.add(attributeMapping); +- attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ if (factoryMethod == null) { ++ Collection constructors = javaClass.getConstructors(); ++ for (JavaConstructor constructor : constructors) { ++ Collection parameters = constructor.getParameters(); ++ if (constructor.isPublic() && parameters.size() > 0) { ++ List args = new ArrayList(parameters.size()); ++ for (JavaParameter parameter : parameters) { ++ AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); ++ if (attributeMapping == null) { ++ attributeMapping = loadParameter(parameter, constructor); ++ ++ attributes.add(attributeMapping); ++ attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ } ++ args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); + } +- args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); ++ constructorArgs.add(Collections.unmodifiableList(args)); ++ } ++ } ++ } else { ++ Collection methods = javaClass.getMethods(); ++ for (JavaMethod method : methods) { ++ Collection parameters = method.getParameters(); ++ if (method.isPublic() && parameters.size() > 0 && method.getName().equals(factoryMethod)) { ++ List args = new ArrayList(parameters.size()); ++ for (JavaParameter parameter : parameters) { ++ AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName()); ++ if (attributeMapping == null) { ++ attributeMapping = loadParameter(parameter, method); ++ ++ attributes.add(attributeMapping); ++ attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping); ++ } ++ args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null))); ++ } ++ constructorArgs.add(Collections.unmodifiableList(args)); + } +- constructorArgs.add(Collections.unmodifiableList(args)); + } + } + + HashSet interfaces = new HashSet(); +- interfaces.addAll(getFullyQualifiedNames(javaClass.getImplementedInterfaces())); ++ interfaces.addAll(getFullyQualifiedNames(javaClass.getInterfaces())); + + JavaClass actualClass = javaClass; + if (factoryClass != null) { +@@ -282,7 +307,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + p = s; + superClasses.add(p.getFullyQualifiedName()); +- interfaces.addAll(getFullyQualifiedNames(p.getImplementedInterfaces())); ++ interfaces.addAll(getFullyQualifiedNames(p.getInterfaces())); + } + + return new ElementMapping(namespace, +@@ -303,7 +328,7 @@ public class QdoxMappingLoader implements MappingLoader { + interfaces); + } + +- private List getFullyQualifiedNames(JavaClass[] implementedInterfaces) { ++ private List getFullyQualifiedNames(Collection implementedInterfaces) { + ArrayList l = new ArrayList(); + for (JavaClass implementedInterface : implementedInterfaces) { + l.add(implementedInterface.getFullyQualifiedName()); +@@ -395,19 +420,19 @@ public class QdoxMappingLoader implements MappingLoader { + return defaultDescription; + } + +- private AttributeMapping loadParameter(JavaParameter parameter) { ++ private AttributeMapping loadParameter(JavaParameter parameter, JavaModel methodOrConstructor) { + String parameterName = parameter.getName(); + String parameterDescription = getParameterDescription(parameter); + + // first attempt to load the attribute from the java beans accessor methods +- JavaClass javaClass = parameter.getParentMethod().getParentClass(); ++ JavaClass javaClass = parameter.getDeclaringClass(); + BeanProperty beanProperty = javaClass.getBeanProperty(parameterName); + if (beanProperty != null) { + AttributeMapping attributeMapping = loadAttribute(beanProperty, parameterDescription); + // if the attribute mapping is null, the property was tagged as hidden and this is an error + if (attributeMapping == null) { + throw new InvalidModelException("Hidden property usage: " + +- "The construction method " + toMethodLocator(parameter.getParentMethod()) + ++ "The construction method " + toMethodLocator(parameter.getDeclaringClass(), methodOrConstructor) + + " can not use a hidded property " + parameterName); + } + return attributeMapping; +@@ -426,9 +451,9 @@ public class QdoxMappingLoader implements MappingLoader { + + private String getParameterDescription(JavaParameter parameter) { + String parameterName = parameter.getName(); +- DocletTag[] tags = parameter.getParentMethod().getTagsByName("param"); ++ Collection tags = parameter.getTagsByName("param"); + for (DocletTag tag : tags) { +- if (tag.getParameters()[0].equals(parameterName)) { ++ if (tag.getParameters().get(0).equals(parameterName)) { + String parameterDescription = tag.getValue().trim(); + if (parameterDescription.startsWith(parameterName)) { + parameterDescription = parameterDescription.substring(parameterName.length()).trim(); +@@ -439,18 +464,6 @@ public class QdoxMappingLoader implements MappingLoader { + return null; + } + +- private boolean isValidConstructor(String factoryMethod, JavaMethod method, JavaParameter[] parameters) { +- if (!method.isPublic() || parameters.length == 0) { +- return false; +- } +- +- if (factoryMethod == null) { +- return method.isConstructor(); +- } else { +- return method.getName().equals(factoryMethod); +- } +- } +- + private static String getProperty(DocletTag propertyTag, String propertyName) { + return getProperty(propertyTag, propertyName, null); + } +@@ -477,14 +490,17 @@ public class QdoxMappingLoader implements MappingLoader { + return false; + } + +- private org.apache.xbean.spring.generator.Type toMappingType(Type type, String nestedType) { ++ private org.apache.xbean.spring.generator.Type toMappingType(JavaType type, String nestedType) { + try { +- if (type.isArray()) { +- return org.apache.xbean.spring.generator.Type.newArrayType(type.getValue(), type.getDimensions()); +- } else if (type.isA(collectionType)) { +- if (nestedType == null) nestedType = "java.lang.Object"; +- return org.apache.xbean.spring.generator.Type.newCollectionType(type.getValue(), +- org.apache.xbean.spring.generator.Type.newSimpleType(nestedType)); ++ if (type instanceof JavaClass) { ++ JavaClass clazz = (JavaClass)type; ++ if (clazz.isArray()) { ++ return org.apache.xbean.spring.generator.Type.newArrayType(type.getValue(), clazz.getDimensions()); ++ } else if (clazz.isA(collectionType)) { ++ if (nestedType == null) nestedType = "java.lang.Object"; ++ return org.apache.xbean.spring.generator.Type.newCollectionType(type.getValue(), ++ org.apache.xbean.spring.generator.Type.newSimpleType(nestedType)); ++ } + } + } catch (Throwable t) { + log.debug("Could not load type mapping", t); +@@ -492,26 +508,28 @@ public class QdoxMappingLoader implements MappingLoader { + return org.apache.xbean.spring.generator.Type.newSimpleType(type.getValue()); + } + +- private static String toMethodLocator(JavaMethod method) { ++ private static String toMethodLocator(JavaClass parentClass, JavaModel methodOrConstructor) { ++ JavaMethod method = methodOrConstructor instanceof JavaMethod ? (JavaMethod) methodOrConstructor : null; ++ JavaConstructor constructor = methodOrConstructor instanceof JavaConstructor ? (JavaConstructor) methodOrConstructor : null; + StringBuffer buf = new StringBuffer(); +- buf.append(method.getParentClass().getFullyQualifiedName()); +- if (!method.isConstructor()) { ++ buf.append(parentClass.getFullyQualifiedName()); ++ if (method != null) { + buf.append(".").append(method.getName()); + } + buf.append("("); +- JavaParameter[] parameters = method.getParameters(); +- for (int i = 0; i < parameters.length; i++) { +- JavaParameter parameter = parameters[i]; ++ List parameters = method != null ? method.getParameters() : constructor.getParameters(); ++ for (int i = 0; i < parameters.size(); i++) { ++ JavaParameter parameter = parameters.get(i); + if (i > 0) { + buf.append(", "); + } + buf.append(parameter.getName()); + } +- buf.append(") : ").append(method.getLineNumber()); ++ buf.append(") : ").append(method != null ? method.getLineNumber() : constructor.getLineNumber()); + return buf.toString(); + } + +- private static void getSourceFiles(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void getSourceFiles(File base, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + if (base.isDirectory()) { + listAllFileNames(base, "", excludedClasses, builder); + } else { +@@ -519,7 +537,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + } + +- private static void listAllFileNames(File base, String prefix, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void listAllFileNames(File base, String prefix, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + if (!base.canRead() || !base.isDirectory()) { + throw new IllegalArgumentException(base.getAbsolutePath()); + } +@@ -536,7 +554,7 @@ public class QdoxMappingLoader implements MappingLoader { + } + } + +- private static void listAllJarEntries(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException { ++ private static void listAllJarEntries(File base, String[] excludedClasses, JavaProjectBuilder builder) throws IOException { + JarFile jarFile = new JarFile(base); + for (Enumeration entries = jarFile.entries(); entries.hasMoreElements(); ) { + JarEntry entry = (JarEntry) entries.nextElement(); +diff --git a/xbean-spring/src/main/java/org/apache/xbean/spring/generator/Type.java b/xbean-spring/src/main/java/org/apache/xbean/spring/generator/Type.java +index 5eac64c..0d9fa63 100644 +--- a/xbean-spring/src/main/java/org/apache/xbean/spring/generator/Type.java ++++ b/xbean-spring/src/main/java/org/apache/xbean/spring/generator/Type.java +@@ -41,12 +41,7 @@ public class Type { + public static Type newArrayType(String type, int dimensions) { + if (type == null) throw new NullPointerException("type"); + if (dimensions < 1) throw new IllegalArgumentException("dimensions must be atleast one"); +- StringBuffer buf = new StringBuffer(type.length() + (dimensions * 2)); +- buf.append(type); +- for (int i = 0; i < dimensions; i ++) { +- buf.append("[]"); +- } +- return new Type(buf.toString(), newSimpleType(type)); ++ return new Type(type, newSimpleType(type.replaceAll("\\[\\]", ""))); + } + + public static Type newCollectionType(String collectionType, Type elementType) { +-- +2.9.3 + diff --git a/xbean-4.9-source-release.zip b/xbean-4.9-source-release.zip new file mode 100644 index 0000000000000000000000000000000000000000..2d964329ca47f638b979a0ae6305e16822b7b748 Binary files /dev/null and b/xbean-4.9-source-release.zip differ diff --git a/xbean.spec b/xbean.spec new file mode 100644 index 0000000000000000000000000000000000000000..0fcdd5566d6e374f0987b29795229b9ad16ef4b4 --- /dev/null +++ b/xbean.spec @@ -0,0 +1,75 @@ +Name: xbean +Version: 4.9 +Release: 2 +Summary: A plugin based server +License: ASL 2.0 +URL: http://geronimo.apache.org/xbean/ +Source0: http://repo2.maven.org/maven2/org/apache/%{name}/%{name}/%{version}/%{name}-%{version}-source-release.zip +Patch0: 0002-Port-to-Eclipse-Luna-OSGi.patch +Patch1: 0003-Port-to-QDox-2.0.patch +BuildArch: noarch + +BuildRequires: maven-local, mvn(commons-logging:commons-logging-api), mvn(log4j:log4j:1.2.12), mvn(org.apache.felix:maven-bundle-plugin) +BuildRequires: mvn(org.apache.maven.plugins:maven-source-plugin), mvn(org.osgi:org.osgi.core), mvn(org.ow2.asm:asm), mvn(org.ow2.asm:asm-commons) +BuildRequires: mvn(org.slf4j:slf4j-api), mvn(org.eclipse:osgi), mvn(org.codehaus.groovy:groovy-all), mvn(ant:ant), mvn(commons-logging:commons-logging) +BuildRequires: mvn(com.thoughtworks.qdox:qdox), mvn(org.apache.maven:maven-archiver), mvn(org.apache.maven:maven-artifact), mvn(org.apache.maven:maven-plugin-api) +BuildRequires: mvn(org.apache.maven:maven-project), mvn(org.apache.maven.plugins:maven-antrun-plugin), mvn(org.apache.maven.plugins:maven-plugin-plugin) +BuildRequires: mvn(org.codehaus.plexus:plexus-archiver), mvn(org.codehaus.plexus:plexus-utils), mvn(org.springframework:spring-beans) +BuildRequires: mvn(org.springframework:spring-context), mvn(org.springframework:spring-web) +Provides: %{name}-classloader%{?_isa} %{name}-classloader +Obsoletes: %{name}-classloader +Provides: %{name}-spring%{?_isa} %{name}-spring +Obsoletes: %{name}-spring +Provides: maven-xbean-plugin%{?_isa} maven-xbean-plugin +Obsoletes: maven-xbean-plugin +Provides: %{name}-javadoc%{?_isa} %{name}-javadoc +Obsoletes: %{name}-javadoc + +%description +The goal of XBean project is to created a plugin based server analogous to Eclipse being a plugin based IDE. +XBean will be able to discover, download and install server plugins from an Internet based repository. +In addition, we include support for multiple IoC systems, support for running with no IoC system, JMX without +JMX code, lifecycle and class loader management, and a rock solid Spring integration. + +%prep +%autosetup -p1 +rm -rf src/site/site.xml + +%pom_remove_parent +%pom_remove_dep mx4j:mx4j +%pom_remove_dep -r :xbean-finder-shaded +%pom_remove_dep -r :xbean-asm6-shaded + +%pom_disable_module xbean-finder-shaded +%pom_disable_module xbean-asm6-shaded +%pom_disable_module xbean-blueprint + +%pom_add_dep org.apache.xbean:xbean-asm-util:%{version} xbean-reflect + +%pom_xpath_remove 'pom:scope[text()="provided"]' xbean-reflect xbean-asm-util +%pom_xpath_remove pom:optional xbean-reflect xbean-asm-util + +sed -i 's/org\.apache\.xbean\.asm6/org.objectweb.asm/g' `find xbean-reflect -name '*.java'` + +%pom_remove_plugin :apache-rat-plugin +%pom_remove_plugin :maven-xbean-plugin xbean-classloader + +sed -i "s|||" xbean-blueprint/pom.xml + +%build +%mvn_build -f + +%install +%mvn_install + +%files -f .mfiles +%doc NOTICE +%license LICENSE +%dir %{_javadir}/%{name} +%{_javadocdir}/%{name}/* +/usr/share/maven* + +%changelog +* Mon Dec 9 2019 openEuler Buildteam - 4.9-2 +- Package init