diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/Type.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/Type.java index e25bfed301..0dae772a1f 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/Type.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/Type.java @@ -12,14 +12,17 @@ import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; - -import org.springframework.ide.vscode.commons.java.IType; -import org.springframework.ide.vscode.commons.java.Signature; -import org.springframework.ide.vscode.commons.util.ArrayUtils; +import java.util.stream.Collectors; + +import org.springframework.ide.vscode.commons.java.IArrayType; +import org.springframework.ide.vscode.commons.java.IClassType; +import org.springframework.ide.vscode.commons.java.IJavaType; +import org.springframework.ide.vscode.commons.java.IParameterizedType; +import org.springframework.ide.vscode.commons.java.IPrimitiveType; +import org.springframework.ide.vscode.commons.java.IVoidType; import org.springframework.ide.vscode.commons.util.Assert; -import org.springframework.ide.vscode.commons.util.Log; -import org.springframework.ide.vscode.commons.util.StringUtil; import org.springframework.ide.vscode.commons.yaml.schema.YType; /** @@ -76,51 +79,74 @@ private void toString(StringBuilder buf) { * Not all valid typeSig have a representation as a Type object. This may * return null if no corresponding representation can be constructed. */ - public static Type fromSignature(String typeSig, IType context) { - //TODO: does this work correctly with nested types (i.e like Map$Entry) - Type type = TYPE_FROM_SIG.get(typeSig); - if (type!=null) { - return type; - } - int kind = Signature.getTypeSignatureKind(typeSig); - //Essentially, Type object only able to represent class types with with generic parameters - // as long as these generic parameters are fully concrete (i.e. do not contain unbound type - // variables. For now only support the simplest case (no generics) and bail out returning null if we - // see something we don't understand. - if (kind==Signature.CLASS_TYPE_SIGNATURE) { - boolean shouldResolve = typeSig.charAt(0)==Signature.C_UNRESOLVED; - String erasure = Signature.getTypeErasure(typeSig); - String pkg = Signature.getSignatureQualifier(erasure); - String nam = Signature.getSignatureSimpleName(erasure); - String[] params = Signature.getTypeParameters(typeSig); - String[] args = Signature.getTypeArguments(typeSig); - if (shouldResolve) { - erasure = tryToResolve(qualifiedName(pkg, nam), context); - } else { - erasure = qualifiedName(pkg, nam); - } - if (ArrayUtils.hasElements(params)) { - //TODO: handle this case - return null; - } else if (ArrayUtils.hasElements(args)) { - Type[] argTypes = new Type[args.length]; - for (int i = 0; i < argTypes.length; i++) { - argTypes[i] = fromSignature(args[i], context); - } - return new Type(erasure, argTypes); - } else { - return new Type(erasure, null); +// public static Type fromSignature(String typeSig, IType context) { +// //TODO: does this work correctly with nested types (i.e like Map$Entry) +// Type type = TYPE_FROM_SIG.get(typeSig); +// if (type!=null) { +// return type; +// } +// int kind = Signature.getTypeSignatureKind(typeSig); +// //Essentially, Type object only able to represent class types with with generic parameters +// // as long as these generic parameters are fully concrete (i.e. do not contain unbound type +// // variables. For now only support the simplest case (no generics) and bail out returning null if we +// // see something we don't understand. +// if (kind==Signature.CLASS_TYPE_SIGNATURE) { +// boolean shouldResolve = typeSig.charAt(0)==Signature.C_UNRESOLVED; +// String erasure = Signature.getTypeErasure(typeSig); +// String pkg = Signature.getSignatureQualifier(erasure); +// String nam = Signature.getSignatureSimpleName(erasure); +// String[] params = Signature.getTypeParameters(typeSig); +// String[] args = Signature.getTypeArguments(typeSig); +// if (shouldResolve) { +// erasure = tryToResolve(qualifiedName(pkg, nam), context); +// } else { +// erasure = qualifiedName(pkg, nam); +// } +// if (ArrayUtils.hasElements(params)) { +// //TODO: handle this case +// return null; +// } else if (ArrayUtils.hasElements(args)) { +// Type[] argTypes = new Type[args.length]; +// for (int i = 0; i < argTypes.length; i++) { +// argTypes[i] = fromSignature(args[i], context); +// } +// return new Type(erasure, argTypes); +// } else { +// return new Type(erasure, null); +// } +// } else if (kind==Signature.ARRAY_TYPE_SIGNATURE) { +// Type elementType = fromSignature(Signature.getElementType(typeSig), context); +// if (elementType!=null) { +// int arrayCount = Signature.getArrayCount(typeSig); +// return elementType.asArray(arrayCount); +// } +// } +// return null; +// } + + public static Type fromJavaType(IJavaType javaType) { + if (javaType instanceof IPrimitiveType || javaType instanceof IVoidType) { + Type type = TYPE_FROM_SIG.get(javaType.name()); + if (type != null) { + return type; } - } else if (kind==Signature.ARRAY_TYPE_SIGNATURE) { - Type elementType = fromSignature(Signature.getElementType(typeSig), context); + } else if (javaType instanceof IClassType) { + return new Type(javaType.name(), null); + } else if (javaType instanceof IParameterizedType) { + IParameterizedType parameterizedType = (IParameterizedType) javaType; + List arguments = parameterizedType.arguments().map(Type::fromJavaType).collect(Collectors.toList()); + return new Type(parameterizedType.name(), arguments.toArray(new Type[arguments.size()])); + } else if (javaType instanceof IArrayType) { + IArrayType arrayType = (IArrayType) javaType; + Type elementType = fromJavaType(arrayType.component()); if (elementType!=null) { - int arrayCount = Signature.getArrayCount(typeSig); - return elementType.asArray(arrayCount); + return elementType.asArray(arrayType.dimensions()); } } + return null; } - + public Type asArray(int arrayCount) { Assert.isLegal(arrayCount>0); StringBuilder arrayErasure = new StringBuilder(erasure); @@ -130,32 +156,32 @@ public Type asArray(int arrayCount) { return new Type(arrayErasure.toString(), params); } - private static String qualifiedName(String pkg, String nam) { - if (StringUtil.hasText(pkg)) { - return pkg + "." + nam; - } else { - return nam; - } - } - - private static String tryToResolve(String typeName, IType context) { - try { - String[][] resolved = context.resolveType(typeName); - if (ArrayUtils.hasElements(resolved)) { - String pkg = resolved[0][0]; - String nam = resolved[0][1]; - if (StringUtil.hasText(pkg)) { - return pkg+"."+nam; - } else { - //No . in front of default package - return nam; - } - } - } catch (Exception e) { - Log.log(e); - } - return typeName; - } +// private static String qualifiedName(String pkg, String nam) { +// if (StringUtil.hasText(pkg)) { +// return pkg + "." + nam; +// } else { +// return nam; +// } +// } +// +// private static String tryToResolve(String typeName, IType context) { +// try { +// String[][] resolved = context.resolveType(typeName); +// if (ArrayUtils.hasElements(resolved)) { +// String pkg = resolved[0][0]; +// String nam = resolved[0][1]; +// if (StringUtil.hasText(pkg)) { +// return pkg+"."+nam; +// } else { +// //No . in front of default package +// return nam; +// } +// } +// } catch (Exception e) { +// Log.log(e); +// } +// return typeName; +// } ////////////////////////////////////////////////// @@ -179,7 +205,7 @@ private static String tryToResolve(String typeName, IType context) { private static void sig2type(String sig, Class cls) { TYPE_FROM_SIG.put(sig, TypeParser.parse(cls.getName())); } - + @Override public int hashCode() { final int prime = 31; diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/TypeUtil.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/TypeUtil.java index 02d0ad5aa4..62a6950eec 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/TypeUtil.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/types/TypeUtil.java @@ -17,9 +17,11 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.inject.Provider; @@ -33,7 +35,6 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IMethod; import org.springframework.ide.vscode.commons.java.IType; -import org.springframework.ide.vscode.commons.java.Signature; import org.springframework.ide.vscode.commons.util.AlwaysFailingParser; import org.springframework.ide.vscode.commons.util.ArrayUtils; import org.springframework.ide.vscode.commons.util.Assert; @@ -274,27 +275,20 @@ public Collection getAllowedValues(Type enumType, EnumCaseMode cas } IType type = findType(enumType.getErasure()); if (type!=null && type.isEnum()) { - IField[] fields = type.getFields(); - - if (fields!=null) { - ImmutableList.Builder enums = ImmutableList.builder(); - boolean addOriginal = caseMode==EnumCaseMode.ORIGNAL||caseMode==EnumCaseMode.ALIASED; - boolean addLowerCased = caseMode==EnumCaseMode.LOWER_CASE||caseMode==EnumCaseMode.ALIASED; - for (int i = 0; i < fields.length; i++) { - IField f = fields[i]; - Provider jdoc = StsValueHint.javaDocSnippet(f); - if (f.isEnumConstant()) { - String rawName = f.getElementName(); - if (addOriginal) { - enums.add(StsValueHint.create(rawName, f)); - } - if (addLowerCased) { - enums.add(StsValueHint.create(StringUtil.upperCaseToHyphens(rawName), f)); - } - } + ImmutableList.Builder enums = ImmutableList.builder(); + boolean addOriginal = caseMode == EnumCaseMode.ORIGNAL || caseMode == EnumCaseMode.ALIASED; + boolean addLowerCased = caseMode == EnumCaseMode.LOWER_CASE || caseMode == EnumCaseMode.ALIASED; + + type.getFields().filter(f -> f.isEnumConstant()).forEach(f -> { + String rawName = f.getElementName(); + if (addOriginal) { + enums.add(StsValueHint.create(rawName, f)); } - return enums.build(); - } + if (addLowerCased) { + enums.add(StsValueHint.create(StringUtil.upperCaseToHyphens(rawName), f)); + } + }); + return enums.build(); } } catch (Exception e) { Log.log(e); @@ -544,7 +538,6 @@ private IType findType(Type beanType) { return findType(beanType.getErasure()); } - private static final String[] NO_PARAMS = new String[0]; private static final Map VALUE_HINTERS = new HashMap<>(); static { valueHints("java.nio.charset.Charset", new LazyProvider() { @@ -623,31 +616,29 @@ public List getProperties(Type type, EnumCaseMode enumMode, BeanP } } else { String typename = type.getErasure(); - IType eclipseType = findType(typename); + IType typeFromIndex = findType(typename); //TODO: handle type parameters. - if (eclipseType!=null) { - List getters = getGetterMethods(eclipseType); - //TODO: getters inherited from super classes? - if (getters!=null && !getters.isEmpty()) { - ArrayList properties = new ArrayList<>(getters.size()); - for (IMethod m : getters) { - Deprecation deprecation = DeprecationUtil.extract(m); - Type propType = null; - try { - propType = Type.fromSignature(m.getReturnType(), eclipseType); - } catch (Exception e) { - Log.log(e); - } - if (beanMode.includesHyphenated()) { - properties.add(new TypedProperty(getterOrSetterNameToProperty(m.getElementName()), propType, deprecation)); - } - if (beanMode.includesCamelCase()) { - properties.add(new TypedProperty(getterOrSetterNameToCamelName(m.getElementName()), propType, deprecation)); - } + if (typeFromIndex != null) { + ArrayList properties = new ArrayList<>(); + getGetterMethods(typeFromIndex).forEach(m -> { + Deprecation deprecation = DeprecationUtil.extract(m); + Type propType = null; + try { + propType = Type.fromJavaType(m.getReturnType()); + } catch (Exception e) { + Log.log(e); } - return properties; - } + if (beanMode.includesHyphenated()) { + properties.add(new TypedProperty(getterOrSetterNameToProperty(m.getElementName()), propType, + deprecation)); + } + if (beanMode.includesCamelCase()) { + properties.add(new TypedProperty(getterOrSetterNameToCamelName(m.getElementName()), propType, + deprecation)); + } + }); + return properties; } } return null; @@ -692,35 +683,24 @@ public String getterOrSetterNameToCamelName(String name) { return camelName; } - private List getGetterMethods(IType eclipseType) { - try { - if (eclipseType!=null && eclipseType.isClass()) { - IMethod[] allMethods = eclipseType.getMethods(); - if (ArrayUtils.hasElements(allMethods)) { - ArrayList getters = new ArrayList<>(); - for (IMethod m : allMethods) { - if (!isStatic(m) && isPublic(m)) { - String mname = m.getElementName(); - if ( - (mname.startsWith("get") && mname.length()>=4) || - (mname.startsWith("is") && mname.length()>=3) - ) { - //Need at least x chars or the property name will be empty. - String sig = m.getSignature(); - int numParams = Signature.getParameterCount(sig); - if (numParams==0) { - getters.add(m); - } - } + private Stream getGetterMethods(IType eclipseType) { + if (eclipseType != null && eclipseType.isClass()) { + return eclipseType.getMethods().filter(m -> { + if (!isStatic(m) && isPublic(m)) { + String mname = m.getElementName(); + if ((mname.startsWith("get") && mname.length() >= 4) + || (mname.startsWith("is") && mname.length() >= 3)) { + // Need at least x chars or the property name will be + // empty. + if (m.parameters().count() == 0) { + return true; } } - return getters; } - } - } catch (Exception e) { - Log.log(e); + return false; + }); } - return null; + return Stream.empty(); } // private List getSetterMethods(IType eclipseType) { @@ -819,26 +799,22 @@ public IField getEnumConstant(Type enumType, String propName) { } - public IMethod getSetter(Type beanType, String propName) { + public Optional getSetter(Type beanType, String propName) { try { String setterName = "set" + StringUtil.hyphensToCamelCase(propName, true); IType type = findType(beanType); - for (IMethod m : type.getMethods()) { - if (setterName.equals(m.getElementName())) { - return m; - } - } + return type.getMethods().filter(m -> setterName.equals(m.getElementName())).findFirst(); } catch (Exception e) { Log.log(e); } - return null; + return Optional.empty(); } public IJavaElement getGetter(Type beanType, String propName) { String getterName = "get" + StringUtil.hyphensToCamelCase(propName, true); IType type = findType(beanType); - IMethod m = type.getMethod(getterName, NO_PARAMS); + IMethod m = type.getMethod(getterName, Stream.empty()); if (m.exists()) { return m; } diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/util/DeprecationUtil.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/util/DeprecationUtil.java index 617a0513bd..bc7c0bd096 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/util/DeprecationUtil.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/util/DeprecationUtil.java @@ -10,12 +10,11 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.metadata.util; +import java.util.Optional; + import org.springframework.boot.configurationmetadata.Deprecation; import org.springframework.ide.vscode.commons.java.IAnnotatable; -import org.springframework.ide.vscode.commons.java.IAnnotation; import org.springframework.ide.vscode.commons.java.IJavaElement; -import org.springframework.ide.vscode.commons.java.IMemberValuePair; -import org.springframework.ide.vscode.commons.util.Log; import com.google.common.collect.ImmutableSet; @@ -32,36 +31,29 @@ public class DeprecationUtil { * Extract {@link Deprecation} info from annotations on a {@link IJavaElement} */ public static Deprecation extract(IJavaElement je) { + Optional deprecation = Optional.empty(); if (je instanceof IAnnotatable) { - return extract((IAnnotatable)je); + deprecation = extract((IAnnotatable)je); } - return null; + return deprecation.isPresent() ? deprecation.get() : null; } /** * Extract {@link Deprecation} info from annotations on a {@link IJavaElement} */ - private static Deprecation extract(IAnnotatable m) { - try { - for (IAnnotation a : m.getAnnotations()) { - if (DEPRECATED_ANOT_NAMES.contains(a.getElementName())) { - Deprecation d = new Deprecation(); - for (IMemberValuePair pair : a.getMemberValuePairs()) { - String name = pair.getMemberName(); - if (name.equals("reason")) { - d.setReason((String) pair.getValue()); - } else if (name.equals("replacement")) { - d.setReplacement((String) pair.getValue()); - } - } - return d; + private static Optional extract(IAnnotatable m) { + return m.getAnnotations().filter(a -> DEPRECATED_ANOT_NAMES.contains(a.getElementName())).map(a -> { + Deprecation d = new Deprecation(); + a.getMemberValuePairs().forEach(pair -> { + String name = pair.getMemberName(); + if (name.equals("reason")) { + d.setReason((String) pair.getValue()); + } else if (name.equals("replacement")) { + d.setReplacement((String) pair.getValue()); } - } - } catch (Exception e) { - Log.log(e); - } - return null; + }); + return d; + }).findFirst(); } - } diff --git a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesMetadataTestData.java b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesMetadataTestData.java index 5b82858725..d12569ed35 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesMetadataTestData.java +++ b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/PropertiesMetadataTestData.java @@ -11,10 +11,9 @@ package org.springframework.ide.vscode.boot.properties.metadata; import java.nio.file.Path; -import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; +import java.util.stream.Stream; import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; import org.springframework.boot.configurationmetadata.ValueHint; @@ -88,8 +87,8 @@ public ItemConfigurer addPropertyMetadata(String id, String type, Object deflt, public SpringPropertyIndex createIndex() { SpringPropertyIndex index = new SpringPropertyIndex(ValueProviderRegistry.getDefault(), new IClasspath() { @Override - public Collection getClasspathEntries() throws Exception { - return Collections.emptyList(); + public Stream getClasspathEntries() throws Exception { + return Stream.empty(); } }); for (ConfigurationMetadataProperty propertyInfo : datas.values()) { diff --git a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/TypeUtilTest.java b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/TypeUtilTest.java index f08109299e..a7f53ad489 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/TypeUtilTest.java +++ b/vscode-extensions/commons/application-properties-metadata/src/test/java/org/springframework/ide/vscode/boot/properties/metadata/TypeUtilTest.java @@ -17,7 +17,6 @@ import java.util.List; import java.util.stream.Collectors; -import org.junit.Ignore; import org.junit.Test; import org.springframework.ide.vscode.application.properties.metadata.types.Type; import org.springframework.ide.vscode.application.properties.metadata.types.TypeParser; @@ -31,13 +30,10 @@ /** * Tests for TypeUtil * - * TODO: {@link IJavaProject#findType(String)} (or IClasspath#findType(String)) needs to be implemented then uncomment the tests! - * * @author Kris De Volder * @author Alex Boyko * */ -@Ignore public class TypeUtilTest { private ProjectsHarness projects = ProjectsHarness.INSTANCE; @@ -132,14 +128,14 @@ private void assertType(String expectedType, Type actualType) { assertEquals(TypeParser.parse(expectedType), actualType); } - @Test - public void testTypeFromSignature() throws Exception { - useProject("enums-boot-1.3.2-app"); - assertType("java.lang.String", Type.fromSignature("QString;", project.findType("demo.ColorData"))); - assertType("java.lang.String", Type.fromSignature("Ljava.lang.String;", project.findType("demo.ColorData"))); - assertType("java.lang.String[]", Type.fromSignature("[Ljava.lang.String;", project.findType("demo.ColorData"))); - assertType("java.lang.String[]", Type.fromSignature("[QString;", project.findType("demo.ColorData"))); - } +// @Test +// public void testTypeFromSignature() throws Exception { +// useProject("enums-boot-1.3.2-app"); +// assertType("java.lang.String", Type.fromSignature("QString;", project.findType("demo.ColorData"))); +// assertType("java.lang.String", Type.fromSignature("Ljava.lang.String;", project.findType("demo.ColorData"))); +// assertType("java.lang.String[]", Type.fromSignature("[Ljava.lang.String;", project.findType("demo.ColorData"))); +// assertType("java.lang.String[]", Type.fromSignature("[QString;", project.findType("demo.ColorData"))); +// } private void useProject(String name) throws Exception { project = projects.mavenProject(name);; diff --git a/vscode-extensions/commons/commons-java/pom.xml b/vscode-extensions/commons/commons-java/pom.xml index 4bac01ea8f..abb8bdd511 100644 --- a/vscode-extensions/commons/commons-java/pom.xml +++ b/vscode-extensions/commons/commons-java/pom.xml @@ -18,5 +18,10 @@ commons-util ${project.version} + + org.jboss + jandex + 2.0.3.Final + \ No newline at end of file diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ArrayTypeWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ArrayTypeWrapper.java new file mode 100644 index 0000000000..13a30820d7 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ArrayTypeWrapper.java @@ -0,0 +1,30 @@ +package org.springframework.ide.vscode.commons.jandex; + +import static org.springframework.ide.vscode.commons.jandex.Wrappers.wrap; + +import org.jboss.jandex.ArrayType; +import org.springframework.ide.vscode.commons.java.IArrayType; +import org.springframework.ide.vscode.commons.java.IJavaType; + +final class ArrayTypeWrapper extends TypeWrapper implements IArrayType { + + ArrayTypeWrapper(ArrayType type) { + super(type); + } + + @Override + public String name() { + return getType().name().toString(); + } + + @Override + public int dimensions() { + return getType().dimensions(); + } + + @Override + public IJavaType component() { + return wrap(getType().component()); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ClassTypeWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ClassTypeWrapper.java new file mode 100644 index 0000000000..c71688fc1d --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ClassTypeWrapper.java @@ -0,0 +1,17 @@ +package org.springframework.ide.vscode.commons.jandex; + +import org.jboss.jandex.ClassType; +import org.springframework.ide.vscode.commons.java.IClassType; + +final class ClassTypeWrapper extends TypeWrapper implements IClassType { + + ClassTypeWrapper(ClassType type) { + super(type); + } + + @Override + public String name() { + return getType().name().toString(); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java new file mode 100644 index 0000000000..e82bcd1b50 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java @@ -0,0 +1,124 @@ +package org.springframework.ide.vscode.commons.jandex; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.Iterator; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.jboss.jandex.CompositeIndex; +import org.jboss.jandex.DotName; +import org.jboss.jandex.IndexReader; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.Indexer; +import org.jboss.jandex.JarIndexer; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.util.Log; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; + +public class JandexIndex { + + @FunctionalInterface + public static interface IndexFileFinder { + File findIndexFile(File jarFile); + } + + private Supplier index; + + public JandexIndex(Stream classpathEntries) { + this(classpathEntries, jarFile -> null, Optional.empty()); + } + + public JandexIndex(Stream classpathEntries, IndexFileFinder indexFileFinder) { + this(classpathEntries, indexFileFinder, Optional.empty()); + } + + public JandexIndex(Stream classpathEntries, Optional baseIndex) { + this(classpathEntries, jarFile -> null, baseIndex); + } + + public JandexIndex(Stream classpathEntries, IndexFileFinder indexFileFinder, Optional baseIndex) { + index = Suppliers.memoize(() -> { + if (baseIndex.isPresent()) { + return CompositeIndex.create(baseIndex.get().index.get(), buildIndex(classpathEntries, indexFileFinder)); + } else { + return buildIndex(classpathEntries, indexFileFinder); + } + }); + } + + private static CompositeIndex buildIndex(Stream classpathEntries, IndexFileFinder indexFileFinder) { + return CompositeIndex.create(classpathEntries + .map(entry -> entry.toFile()) + .map(file -> { + if (file.isFile() && file.getName().endsWith(".jar")) { + return indexJar(file, indexFileFinder); + } else if (file.isDirectory()) { + return indexFolder(file); + } else { + return Optional.empty(); + } + }) + .filter(o -> o.isPresent()) + .map(o -> o.get()) + .collect(Collectors.toList())); + } + + private static Optional indexFolder(File folder) { + Indexer indexer = new Indexer(); + for (Iterator itr = com.google.common.io.Files.fileTreeTraverser().breadthFirstTraversal(folder).iterator(); itr.hasNext();) { + File file = itr.next(); + if (file.isFile() && file.getName().endsWith(".class")) { + try { + final InputStream stream = new FileInputStream(file); + try { + indexer.index(stream); + } finally { + try { + stream.close(); + } catch (Exception ignore) { + } + } + } catch (Exception e) { + Log.log(e); + } + } + } + return Optional.of(indexer.complete()); + } + + private static Optional indexJar(File file, IndexFileFinder indexFileFinder) { + try { + File indexFile = indexFileFinder.findIndexFile(file); + if (indexFile != null) { + if (indexFile.createNewFile()) { + return Optional.of(JarIndexer + .createJarIndex(file, new Indexer(), indexFile, + false, false, true, System.out, System.err) + .getIndex()); + } else { + return Optional.of(new IndexReader(new FileInputStream(indexFile)).read()); + } + } else { + return Optional.of(JarIndexer + .createJarIndex(file, new Indexer(), file.canWrite(), file.getParentFile().canWrite(), true) + .getIndex()); + } + } catch (IOException e) { + Log.log(e); + } + return Optional.empty(); + } + + public IType findType(String fqName) { + IndexView compositeIndex = index.get(); + return Wrappers.wrap(compositeIndex, compositeIndex.getClassByName(DotName.createSimple(fqName))); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ParameterizedTypeWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ParameterizedTypeWrapper.java new file mode 100644 index 0000000000..6410705c1d --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/ParameterizedTypeWrapper.java @@ -0,0 +1,31 @@ +package org.springframework.ide.vscode.commons.jandex; + +import static org.springframework.ide.vscode.commons.jandex.Wrappers.wrap; +import java.util.stream.Stream; + +import org.jboss.jandex.ParameterizedType; +import org.springframework.ide.vscode.commons.java.IJavaType; +import org.springframework.ide.vscode.commons.java.IParameterizedType; + +final class ParameterizedTypeWrapper extends TypeWrapper implements IParameterizedType { + + ParameterizedTypeWrapper(ParameterizedType type) { + super(type); + } + + @Override + public String name() { + return getType().name().toString(); + } + + @Override + public IJavaType owner() { + return wrap(getType().owner()); + } + + @Override + public Stream arguments() { + return getType().arguments().stream().map(Wrappers::wrap); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeVariableWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeVariableWrapper.java new file mode 100644 index 0000000000..df9ce9f157 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeVariableWrapper.java @@ -0,0 +1,17 @@ +package org.springframework.ide.vscode.commons.jandex; + +import org.jboss.jandex.TypeVariable; +import org.springframework.ide.vscode.commons.java.ITypeVariable; + +final class TypeVariableWrapper extends TypeWrapper implements ITypeVariable { + + TypeVariableWrapper(TypeVariable type) { + super(type); + } + + @Override + public String name() { + return getType().name().toString(); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeWrapper.java new file mode 100644 index 0000000000..2bbcbc22c7 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/TypeWrapper.java @@ -0,0 +1,34 @@ +package org.springframework.ide.vscode.commons.jandex; + +class TypeWrapper { + + private T type; + + TypeWrapper(T type) { + this.type = type; + } + + T getType() { + return type; + } + + @Override + public int hashCode() { + return type.hashCode(); + } + + @SuppressWarnings("unchecked") + @Override + public boolean equals(Object obj) { + if (obj instanceof TypeWrapper) { + return type.equals(((TypeWrapper)obj).type); + } + return super.equals(obj); + } + + @Override + public String toString() { + return type.toString(); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/UnresolvedTypeVariableWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/UnresolvedTypeVariableWrapper.java new file mode 100644 index 0000000000..580a40a2d5 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/UnresolvedTypeVariableWrapper.java @@ -0,0 +1,17 @@ +package org.springframework.ide.vscode.commons.jandex; + +import org.jboss.jandex.UnresolvedTypeVariable; +import org.springframework.ide.vscode.commons.java.IUnresolvedTypeVariable; + +final class UnresolvedTypeVariableWrapper extends TypeWrapper implements IUnresolvedTypeVariable { + + UnresolvedTypeVariableWrapper(UnresolvedTypeVariable type) { + super(type); + } + + @Override + public String name() { + return getType().name().toString(); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/WildcardTypeWrapper.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/WildcardTypeWrapper.java new file mode 100644 index 0000000000..5b231dd730 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/WildcardTypeWrapper.java @@ -0,0 +1,17 @@ +package org.springframework.ide.vscode.commons.jandex; + +import org.jboss.jandex.WildcardType; +import org.springframework.ide.vscode.commons.java.IWildcardType; + +final class WildcardTypeWrapper extends TypeWrapper implements IWildcardType { + + WildcardTypeWrapper(WildcardType type) { + super(type); + } + + @Override + public String name() { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/Wrappers.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/Wrappers.java new file mode 100644 index 0000000000..0e88fd9dc7 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/Wrappers.java @@ -0,0 +1,350 @@ +package org.springframework.ide.vscode.commons.jandex; + +import static org.springframework.ide.vscode.commons.util.Assert.isNotNull; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationValue; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; +import org.jboss.jandex.FieldInfo; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.MethodInfo; +import org.jboss.jandex.PrimitiveType; +import org.jboss.jandex.Type; +import org.springframework.ide.vscode.commons.java.IAnnotation; +import org.springframework.ide.vscode.commons.java.IField; +import org.springframework.ide.vscode.commons.java.IJavaType; +import org.springframework.ide.vscode.commons.java.IMemberValuePair; +import org.springframework.ide.vscode.commons.java.IMethod; +import org.springframework.ide.vscode.commons.java.IPrimitiveType; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.java.IVoidType; +import org.springframework.ide.vscode.commons.util.HtmlSnippet; + +public class Wrappers { + + private static final int AccEnum = 0x4000; + + public static IType wrap(IndexView index, ClassInfo info) { + if (info == null) { + return null; + } + return new IType() { + + @Override + public int getFlags() { + return info.flags(); + } + + @Override + public IType getDeclaringType() { + DotName enclosingClass = info.enclosingClass(); + return enclosingClass == null ? null : wrap(index, index.getClassByName(enclosingClass)); + } + + @Override + public String getElementName() { + return info.simpleName(); + } + + @Override + public HtmlSnippet getJavaDoc() { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public Stream getAnnotations() { + // TODO: check correctness! + return info.annotations().get(info.name()).stream().map(Wrappers::wrap); + } + + @Override + public boolean isClass() { + return true; + } + + @Override + public boolean isEnum() { + return (info.flags() & AccEnum) != 0; + } + + @Override + public boolean isInterface() { + return false; + } + + @Override + public String getFullyQualifiedName() { + return info.name().toString(); + } + + @Override + public IField getField(String name) { + return wrap(index, info.field(name)); + } + + @Override + public Stream getFields() { + return info.fields().stream().map(f -> { + return wrap(index, f); + }); + } + + @Override + public IMethod getMethod(String name, Stream parameters) { + List typeParameters = parameters.map(Wrappers::from).collect(Collectors.toList()); + return wrap(index, info.method(name, typeParameters.toArray(new Type[typeParameters.size()]))); + } + + @Override + public Stream getMethods() { + return info.methods().stream().map(m -> { + return wrap(index, m); + }); + } + + @Override + public String toString() { + return info.toString(); + } + + }; + } + + public static IField wrap(IndexView index, FieldInfo field) { + if (field == null) { + return null; + } + return new IField() { + + @Override + public int getFlags() { + return field.flags(); + } + + @Override + public IType getDeclaringType() { + return wrap(index, field.declaringClass()); + } + + @Override + public String getElementName() { + return field.name(); + } + + @Override + public HtmlSnippet getJavaDoc() { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public Stream getAnnotations() { + return field.annotations().stream().map(a -> { + return wrap(a); + }); + } + + @Override + public boolean isEnumConstant() { + return (field.flags() & AccEnum) != 0; + } + + @Override + public String toString() { + return field.toString(); + } + }; + } + + public static IMethod wrap(IndexView index, MethodInfo method) { + isNotNull(index); + isNotNull(method); + return new IMethod() { + + @Override + public int getFlags() { + return method.flags(); + } + + @Override + public IType getDeclaringType() { + return wrap(index, method.declaringClass()); + } + + @Override + public String getElementName() { + return method.name(); + } + + @Override + public HtmlSnippet getJavaDoc() { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public Stream getAnnotations() { + return method.annotations().stream().map(Wrappers::wrap); + } + + @Override + public IJavaType getReturnType() { + return wrap(method.returnType()); + } + +// @Override +// public String getSignature() { +// StringBuilder sb = new StringBuilder(); +// sb.append('('); +// method.parameters().forEach(p -> sb.append(signature(p))); +// sb.append(')'); +// sb.append(getReturnType()); +// return sb.toString(); +// } + + @Override + public String toString() { + return method.toString(); + } + + @Override + public Stream parameters() { + return method.parameters().stream().map(Wrappers::wrap); + } + }; + } + + public static IAnnotation wrap(AnnotationInstance annotation) { + isNotNull(annotation); + return new IAnnotation() { + + @Override + public String getElementName() { + return annotation.name().toString(); + } + + @Override + public HtmlSnippet getJavaDoc() { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public Stream getMemberValuePairs() { + return annotation.values().stream().map(av -> { + return wrap(av); + }); + } + + @Override + public String toString() { + return annotation.toString(); + } + }; + } + + public static IMemberValuePair wrap(AnnotationValue annotationValue) { + if (annotationValue == null) { + return null; + } + return new IMemberValuePair() { + + @Override + public String getMemberName() { + return annotationValue.name(); + } + + @Override + public Object getValue() { + return annotationValue.value(); + } + + @Override + public String toString() { + return annotationValue.toString(); + } + }; + } + + public static Type createParameterTypeFromSignature(IndexView index, String signature) { + if (signature == null) { + return null; + } + throw new UnsupportedOperationException("Not yet implemented"); + } + + public static IPrimitiveType wrap(PrimitiveType type) { + switch (type.primitive()) { + case SHORT: + return IPrimitiveType.SHORT; + case LONG: + return IPrimitiveType.LONG; + case BYTE: + return IPrimitiveType.BYTE; + case DOUBLE: + return IPrimitiveType.DOUBLE; + case BOOLEAN: + return IPrimitiveType.BOOLEAN; + case CHAR: + return IPrimitiveType.CHAR; + case FLOAT: + return IPrimitiveType.FLOAT; + case INT: + return IPrimitiveType.INT; + } + throw new IllegalArgumentException("Invalid Java primitive type! " + type.toString()); + } + + @SuppressWarnings("unchecked") + private static Type from(IJavaType type) { + if (type instanceof TypeWrapper) { + return ((TypeWrapper)type).getType(); + } + throw new IllegalArgumentException("Not a Jandex wrapped typed!"); + } + + public static IJavaType wrap(Type type) { + switch (type.kind()) { + case ARRAY: + return new ArrayTypeWrapper(type.asArrayType()); + case CLASS: + return new ClassTypeWrapper(type.asClassType()); + case PARAMETERIZED_TYPE: + return new ParameterizedTypeWrapper(type.asParameterizedType()); + case PRIMITIVE: + return wrap(type.asPrimitiveType()); + case TYPE_VARIABLE: + return new TypeVariableWrapper(type.asTypeVariable()); + case UNRESOLVED_TYPE_VARIABLE: + return new UnresolvedTypeVariableWrapper(type.asUnresolvedTypeVariable()); + case VOID: + return IVoidType.DEFAULT; + case WILDCARD_TYPE: + return new WildcardTypeWrapper(type.asWildcardType()); + } + throw new IllegalArgumentException("Invalid Java Type " + type.toString()); + } + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotatable.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotatable.java index d25caf3a63..0870b19097 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotatable.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotatable.java @@ -1,7 +1,9 @@ package org.springframework.ide.vscode.commons.java; +import java.util.stream.Stream; + public interface IAnnotatable extends IJavaElement { - IAnnotation[] getAnnotations(); + Stream getAnnotations(); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotation.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotation.java index 8164f25eb1..880094e362 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotation.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IAnnotation.java @@ -1,5 +1,7 @@ package org.springframework.ide.vscode.commons.java; +import java.util.stream.Stream; + public interface IAnnotation extends IJavaElement { /** @@ -10,6 +12,6 @@ public interface IAnnotation extends IJavaElement { * * @return the member-value pairs of this annotation */ - IMemberValuePair[] getMemberValuePairs(); + Stream getMemberValuePairs(); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IArrayType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IArrayType.java new file mode 100644 index 0000000000..241fdb3287 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IArrayType.java @@ -0,0 +1,9 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IArrayType extends IJavaType { + + int dimensions(); + + IJavaType component(); + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClassType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClassType.java new file mode 100644 index 0000000000..06dcc5e4a7 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClassType.java @@ -0,0 +1,5 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IClassType extends IJavaType { + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java index 82db92edb4..5f4f1dbd66 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java @@ -1,33 +1,33 @@ -/******************************************************************************* - * Copyright (c) 2016 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.commons.java; - -import java.nio.file.Path; -import java.util.Collection; - -/** - * Classpath for a Java artifact - * - * @author Kris De Volder - * @author Alex Boyko - * - */ -public interface IClasspath { - - /** - * Classpath entries paths - * - * @return collection of classpath entries in a form file/folder paths - * @throws Exception - */ - Collection getClasspathEntries() throws Exception; - -} +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.java; + +import java.nio.file.Path; +import java.util.stream.Stream; + +/** + * Classpath for a Java artifact + * + * @author Kris De Volder + * @author Alex Boyko + * + */ +public interface IClasspath { + + /** + * Classpath entries paths + * + * @return collection of classpath entries in a form file/folder paths + * @throws Exception + */ + Stream getClasspathEntries() throws Exception; + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaType.java new file mode 100644 index 0000000000..a777712be1 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaType.java @@ -0,0 +1,7 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IJavaType { + + String name(); + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IMethod.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IMethod.java index 89487e95b6..eed8b39533 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IMethod.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IMethod.java @@ -1,5 +1,7 @@ package org.springframework.ide.vscode.commons.java; +import java.util.stream.Stream; + public interface IMethod extends IMember { /** @@ -20,28 +22,34 @@ public interface IMethod extends IMember { * @return the type signature of the return value of this method, void for constructors * @see Signature */ - String getReturnType(); + IJavaType getReturnType(); +// /** +// * Returns the signature of this method. This includes the signatures for the +// * parameter types and return type, but does not include the method name, +// * exception types, or type parameters. +// *

+// * For example, a source method declared as public void foo(String text, int length) +// * would return "(QString;I)V". +// *

+// *

+// * The type signatures embedded in the method signature may be either unresolved +// * (for source types) or resolved (for binary types), and either basic (for +// * basic types) or rich (for parameterized types). See {@link Signature} for +// * details. +// *

+// * +// * @return the signature of this method +// * @exception JavaModelException if this element does not exist or if an +// * exception occurs while accessing its corresponding resource. +// * @see Signature +// */ +// String getSignature(); + /** - * Returns the signature of this method. This includes the signatures for the - * parameter types and return type, but does not include the method name, - * exception types, or type parameters. - *

- * For example, a source method declared as public void foo(String text, int length) - * would return "(QString;I)V". - *

- *

- * The type signatures embedded in the method signature may be either unresolved - * (for source types) or resolved (for binary types), and either basic (for - * basic types) or rich (for parameterized types). See {@link Signature} for - * details. - *

- * - * @return the signature of this method - * @exception JavaModelException if this element does not exist or if an - * exception occurs while accessing its corresponding resource. - * @see Signature + * Returns parameter types of this method + * @return */ - String getSignature(); + Stream parameters(); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IParameterizedType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IParameterizedType.java new file mode 100644 index 0000000000..af14b6c150 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IParameterizedType.java @@ -0,0 +1,11 @@ +package org.springframework.ide.vscode.commons.java; + +import java.util.stream.Stream; + +public interface IParameterizedType extends IJavaType { + + IJavaType owner(); + + Stream arguments(); + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IPrimitiveType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IPrimitiveType.java new file mode 100644 index 0000000000..c3716d6f15 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IPrimitiveType.java @@ -0,0 +1,21 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IPrimitiveType extends IJavaType { + + static IPrimitiveType INT = () -> "I"; + + static IPrimitiveType BOOLEAN = () -> "Z"; + + static IPrimitiveType CHAR = () -> "C"; + + static IPrimitiveType FLOAT = () -> "F"; + + static IPrimitiveType BYTE = () -> "B"; + + static IPrimitiveType DOUBLE = () -> "D"; + + static IPrimitiveType LONG = () -> "J"; + + static IPrimitiveType SHORT = () -> "S"; + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IType.java index c4e4a59ccf..dae58510e3 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IType.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IType.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.java; +import java.util.stream.Stream; + /** * Replaces eclipse JDT IType. */ @@ -56,7 +58,7 @@ public interface IType extends IMember { * * @return the fields declared by this type */ - IField[] getFields(); + Stream getFields(); /** * Returns the method with the specified name and parameter types @@ -76,7 +78,7 @@ public interface IType extends IMember { * @param parameterTypeSignatures the given parameter types * @return the method with the specified name and parameter types in this type */ - IMethod getMethod(String name, String[] parameterTypeSignatures); + IMethod getMethod(String name, Stream parameters); /** * Returns the methods and constructors declared by this type. @@ -88,33 +90,33 @@ public interface IType extends IMember { * * @return the methods and constructors declared by this type */ - IMethod[] getMethods(); + Stream getMethods(); - /** - * Resolves the given type name within the context of this type (depending on the type hierarchy - * and its imports). - *

- * Multiple answers might be found in case there are ambiguous matches. - *

- *

- * Each matching type name is decomposed as an array of two strings, the first denoting the package - * name (dot-separated) and the second being the type name. The package name is empty if it is the - * default package. The type name is the type qualified name using a '.' enclosing type separator. - *

- *

- * Returns null if unable to find any matching type. - *

- *

- * For example, resolution of "Object" would typically return - * {{"java.lang", "Object"}}. Another resolution that returns - * {{"", "X.Inner"}} represents the inner type Inner defined in type X in the - * default package. - *

- * - * @param typeName the given type name - * @return the resolved type names or null if unable to find any matching type - * @see #getTypeQualifiedName(char) - */ - String[][] resolveType(String typeName); +// /** +// * Resolves the given type name within the context of this type (depending on the type hierarchy +// * and its imports). +// *

+// * Multiple answers might be found in case there are ambiguous matches. +// *

+// *

+// * Each matching type name is decomposed as an array of two strings, the first denoting the package +// * name (dot-separated) and the second being the type name. The package name is empty if it is the +// * default package. The type name is the type qualified name using a '.' enclosing type separator. +// *

+// *

+// * Returns null if unable to find any matching type. +// *

+// *

+// * For example, resolution of "Object" would typically return +// * {{"java.lang", "Object"}}. Another resolution that returns +// * {{"", "X.Inner"}} represents the inner type Inner defined in type X in the +// * default package. +// *

+// * +// * @param typeName the given type name +// * @return the resolved type names or null if unable to find any matching type +// * @see #getTypeQualifiedName(char) +// */ +// String[][] resolveType(String typeName); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ITypeVariable.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ITypeVariable.java new file mode 100644 index 0000000000..38734de84a --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ITypeVariable.java @@ -0,0 +1,5 @@ +package org.springframework.ide.vscode.commons.java; + +public interface ITypeVariable extends IJavaType { + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IUnresolvedTypeVariable.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IUnresolvedTypeVariable.java new file mode 100644 index 0000000000..877a227299 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IUnresolvedTypeVariable.java @@ -0,0 +1,5 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IUnresolvedTypeVariable extends IJavaType { + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IVoidType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IVoidType.java new file mode 100644 index 0000000000..6a043b8693 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IVoidType.java @@ -0,0 +1,14 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IVoidType extends IJavaType { + + static IVoidType DEFAULT = new IVoidType() { + + @Override + public String name() { + return "V"; + } + + }; + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IWildcardType.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IWildcardType.java new file mode 100644 index 0000000000..b1062ccfb7 --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IWildcardType.java @@ -0,0 +1,5 @@ +package org.springframework.ide.vscode.commons.java; + +public interface IWildcardType extends IJavaType { + +} diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java index e7ff94aacc..15926b6d66 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java @@ -1,5 +1,7 @@ package org.springframework.ide.vscode.commons.languageserver.reconcile; +import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; + /** * An implementation of {@link ReconcileProblem} that is just a simple data object. * @@ -45,4 +47,24 @@ public String getCode() { return getType().getCode(); } + /** + * Attempt to enlarge a empty document region to include a + * character that can be visibly underlined. + */ + protected static DocumentRegion makeVisible(DocumentRegion region) { + DocumentRegion altRegion = region.textAfter(1); + if (!altRegion.isEmpty() && canUnderline(altRegion.charAt(0))) { + return altRegion; + } + altRegion = region.textBefore(1); + if (!altRegion.isEmpty() && canUnderline(altRegion.charAt(0))) { + return altRegion; + } + return region; + } + + private static boolean canUnderline(char c) { + return c!='\n'&&c!='\r'; + } + } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java index adcbd1fb5c..bff138460b 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java @@ -17,13 +17,16 @@ import java.io.InputStreamReader; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; @@ -46,8 +49,13 @@ import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; import org.eclipse.aether.util.graph.visitor.CloningDependencyVisitor; import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; +import org.springframework.ide.vscode.commons.jandex.JandexIndex; import org.springframework.ide.vscode.commons.util.ExternalCommand; import org.springframework.ide.vscode.commons.util.ExternalProcess; +import org.springframework.ide.vscode.commons.util.Log; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; /** * Maven Core functionality @@ -57,6 +65,10 @@ */ public class MavenCore { + public static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; + private static final String JAVA_HOME = "java.home"; + private static final String JAVA_RUNTIME_VERSION = "java.runtime.version"; + private static final String JAVA_BOOT_CLASS_PATH = "sun.boot.class.path"; public static final String CLASSPATH_TXT = "classpath.txt"; public static final String POM_XML = "pom.xml"; @@ -64,6 +76,14 @@ public class MavenCore { private MavenBridge maven = new MavenBridge(); + private Supplier> javaCoreIndex = Suppliers.memoize(() -> { + try { + return Optional.of(new JandexIndex(getJreLibs(), jarFile -> findIndexFile(jarFile))); + } catch (MavenException e) { + return Optional.empty(); + } + }); + public static MavenCore getInstance() { if (instance == null) { instance = new MavenCore(); @@ -78,11 +98,11 @@ public static MavenCore getInstance() { * @return set of classpath entries * @throws IOException */ - public static Set readClassPathFile(Path classPathFilePath) throws IOException { + public static Stream readClassPathFile(Path classPathFilePath) throws IOException { InputStream in = Files.newInputStream(classPathFilePath); String text = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining()); Path dir = classPathFilePath.getParent(); - return Arrays.stream(text.split(File.pathSeparator)).map(dir::resolve).collect(Collectors.toSet()); + return Arrays.stream(text.split(File.pathSeparator)).map(dir::resolve); } /** @@ -96,7 +116,7 @@ public static void buildMavenProject(Path testProjectPath) throws Exception { ? testProjectPath.resolve("mvnw.cmd") : testProjectPath.resolve("mvnw"); mvnwPath.toFile().setExecutable(true); ExternalProcess process = new ExternalProcess(testProjectPath.toFile(), - new ExternalCommand(mvnwPath.toAbsolutePath().toString(), "clean", "package"), true); + new ExternalCommand(mvnwPath.toAbsolutePath().toString(), "clean", "package", "-DskipTests"), true); if (process.getExitValue() != 0) { throw new RuntimeException("Failed to build test project"); } @@ -214,4 +234,33 @@ public Set resolveDependencies(MavenProject project, String scope) thr return artifacts; } + + public Stream getJreLibs() throws MavenException { + String s = (String) maven.createExecutionRequest().getSystemProperties().get(JAVA_BOOT_CLASS_PATH); + return Arrays.stream(s.split(File.pathSeparator)).map(File::new).filter(f -> f.canRead()).map(f -> Paths.get(f.toURI())); + } + + private String getJavaRuntimeVersion() throws MavenException { + return maven.createExecutionRequest().getSystemProperties().getProperty(JAVA_RUNTIME_VERSION); + } + + private String getJavaHome() throws MavenException { + return maven.createExecutionRequest().getSystemProperties().getProperty(JAVA_HOME); + } + + private File findIndexFile(File jarFile) { + String suffix = null; + try { + if (jarFile.toString().startsWith(getJavaHome())) { + suffix = getJavaRuntimeVersion(); + } + } catch (MavenException e) { + Log.log(e); + } + return new File(System.getProperty(JAVA_IO_TMPDIR), jarFile.getName() + suffix); + } + + public Optional getJavaIndexForJreLibs() { + return javaCoreIndex.get(); + } } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java index 211a146bab..3d577cf5a2 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java @@ -56,8 +56,7 @@ public boolean exists() { @Override public IType findType(String fqName) { - // TODO Auto-generated method stub - return null; + return classpath.findType(fqName); } @Override diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index be83467885..7754934661 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -1,54 +1,74 @@ -/******************************************************************************* - * Copyright (c) 2016 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.commons.maven.java; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -import org.apache.maven.project.MavenProject; -import org.springframework.ide.vscode.commons.java.IClasspath; -import org.springframework.ide.vscode.commons.maven.MavenCore; - -/** - * Classpath for a maven project - * - * @author Alex Boyko - * - */ -public class MavenProjectClasspath implements IClasspath { - - private MavenCore maven; - private MavenProject project; - - public MavenProjectClasspath(MavenProject project) { - this(project, MavenCore.getInstance()); - } - - MavenProjectClasspath(MavenProject project, MavenCore maven) { - this.maven = maven; - this.project = project; - } - - @Override - public Collection getClasspathEntries() throws Exception { - List entries = maven.resolveDependencies(project, null).stream().map(artifact -> { - return Paths.get(artifact.getFile().toURI()); - }).collect(Collectors.toList()); - entries.add(Paths.get(new File(project.getBuild().getOutputDirectory()).toURI())); - entries.add(Paths.get(new File(project.getBuild().getTestOutputDirectory()).toURI())); - return entries; - } - -} +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.maven.java; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.apache.maven.project.MavenProject; +import org.springframework.ide.vscode.commons.jandex.JandexIndex; +import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.maven.MavenCore; +import org.springframework.ide.vscode.commons.util.Log; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; + +/** + * Classpath for a maven project + * + * @author Alex Boyko + * + */ +public class MavenProjectClasspath implements IClasspath { + + private MavenCore maven; + private MavenProject project; + private Supplier javaIndex; + + public MavenProjectClasspath(MavenProject project) { + this(project, MavenCore.getInstance()); + } + + MavenProjectClasspath(MavenProject project, MavenCore maven) { + this.maven = maven; + this.project = project; + this.javaIndex = Suppliers.memoize(() -> { + Stream classpathEntries = Stream.empty(); + try { + classpathEntries = getClasspathEntries(); + } catch (Exception e) { + Log.log(e); + } + return new JandexIndex(classpathEntries, jarFile -> findIndexFile(jarFile), maven.getJavaIndexForJreLibs()); + }); + } + + @Override + public Stream getClasspathEntries() throws Exception { + return Stream.concat(maven.resolveDependencies(project, null).stream().map(artifact -> { + return Paths.get(artifact.getFile().toURI()); + }), Stream.of(Paths.get(new File(project.getBuild().getOutputDirectory()).toURI()), + Paths.get(new File(project.getBuild().getTestOutputDirectory()).toURI()))); + } + + public IType findType(String fqName) { + return javaIndex.get().findType(fqName); + } + + private File findIndexFile(File jarFile) { + return new File(System.getProperty(MavenCore.JAVA_IO_TMPDIR), jarFile.getName() + jarFile.lastModified()); + } + +} diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java index f475e3018b..732d4c45aa 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java @@ -1,42 +1,40 @@ -/******************************************************************************* - * Copyright (c) 2016 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.commons.maven.java.classpathfile; - -import java.nio.file.Path; -import java.util.Collection; -import java.util.Set; - -import org.springframework.ide.vscode.commons.java.IClasspath; -import org.springframework.ide.vscode.commons.maven.MavenCore; - -/** - * Classpath for a project containing classpath text file - * - * @author Alex Boyko - * - */ -public class FileClasspath implements IClasspath { - - private Path classpathFilePath; - - public FileClasspath(Path classpathFilePath) { - this.classpathFilePath = classpathFilePath; - } - - @Override - public Collection getClasspathEntries() throws Exception { - Set entries = MavenCore.readClassPathFile(classpathFilePath); - entries.add(classpathFilePath.getParent().resolve("target/classes")); - entries.add(classpathFilePath.getParent().resolve("target/test-classes")); - return entries; - } - -} +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.maven.java.classpathfile; + +import java.nio.file.Path; +import java.util.stream.Stream; + +import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.maven.MavenCore; + +/** + * Classpath for a project containing classpath text file + * + * @author Alex Boyko + * + */ +public class FileClasspath implements IClasspath { + + private Path classpathFilePath; + + public FileClasspath(Path classpathFilePath) { + this.classpathFilePath = classpathFilePath; + } + + @Override + public Stream getClasspathEntries() throws Exception { + return Stream.concat(MavenCore.readClassPathFile(classpathFilePath), + Stream.of(classpathFilePath.getParent().resolve("target/classes"), + classpathFilePath.getParent().resolve("target/test-classes"))); + } + +} diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java index fb84ca4e75..3bc095cc89 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java @@ -28,9 +28,8 @@ */ public class DependencyTreeTest { - @Test - public void mavenTest() throws Exception { - Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/empty-boot-project-with-classpath-file").toURI()); + private void testMavenClasspath(String projectName) throws Exception { + Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); MavenCore.buildMavenProject(testProjectPath); MavenProject project = MavenCore.getInstance().readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); @@ -38,8 +37,18 @@ public void mavenTest() throws Exception { return Paths.get(artifact.getFile().toURI()); }).collect(Collectors.toSet());; - Set expectedClasspath = MavenCore.readClassPathFile(testProjectPath.resolve(MavenCore.CLASSPATH_TXT)); + Set expectedClasspath = MavenCore.readClassPathFile(testProjectPath.resolve(MavenCore.CLASSPATH_TXT)).collect(Collectors.toSet()); assertEquals(expectedClasspath, calculatedClassPath); } + + @Test + public void mavenClasspathTest_1() throws Exception { + testMavenClasspath("empty-boot-project-with-classpath-file"); + } + @Test + public void mavenClasspathTest_2() throws Exception { + testMavenClasspath("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); + } + } diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java new file mode 100644 index 0000000000..d49b0594f2 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -0,0 +1,65 @@ +package org.springframework.ide.vscode.commons.maven; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.Test; +import org.springframework.ide.vscode.commons.java.IMethod; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.java.IVoidType; +import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +public class JavaIndexTest { + + private static LoadingCache projectsCache = CacheBuilder.newBuilder().build(new CacheLoader() { + + @Override + public MavenJavaProject load(String projectName) throws Exception { + Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); + MavenCore.buildMavenProject(testProjectPath); + return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + } + + }); + + @Test + public void findClassInJar() throws Exception { + MavenJavaProject project = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); + IType type = project.findType("org.springframework.test.web.client.ExpectedCount"); + assertNotNull(type); + } + + @Test + public void findClassInOutputFolder() throws Exception { + MavenJavaProject project = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); + IType type = project.findType("hello.Greeting"); + assertNotNull(type); + } + + @Test + public void classNotFound() throws Exception { + MavenJavaProject project = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); + IType type = project.findType("hello.NonExistentClass"); + assertNull(type); + } + + @Test + public void voidMethodNoParams() throws Exception { + MavenJavaProject project = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); + IType type = project.findType("java.util.ArrayList"); + assertNotNull(type); + IMethod m = type.getMethod("clear", Stream.empty()); + assertEquals("clear", m.getElementName()); + assertEquals(IVoidType.DEFAULT, m.getReturnType()); + assertEquals(0, m.parameters().count()); + } +} diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.gitignore b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.jar b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..5fd4d5023f Binary files /dev/null and b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.jar differ diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.properties b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/build.gradle b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/build.gradle new file mode 100644 index 0000000000..d04802cd4d --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/build.gradle @@ -0,0 +1,30 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE") + } +} + +apply plugin: 'java' +apply plugin: 'spring-boot' + +jar { + baseName = 'gs-rest-service-cors' + version = '0.1.0' +} + +repositories { + mavenCentral() +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +dependencies { + compile("org.springframework.boot:spring-boot-starter-web") + testCompile("org.springframework.boot:spring-boot-starter-test") + testCompile("org.apache.httpcomponents:httpclient:4.5.2") +} + diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradle/wrapper/gradle-wrapper.properties b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..3ddf2990f8 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Aug 29 13:08:17 CDT 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew new file mode 100755 index 0000000000..9d82f78915 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew.bat b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew.bat new file mode 100644 index 0000000000..8a0b282aa6 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/manifest.yml b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/manifest.yml new file mode 100644 index 0000000000..f48c3b0ded --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/manifest.yml @@ -0,0 +1,11 @@ +--- +applications: +- name: rest-service-guides + memory: 256M + instances: 1 + random-route: true + domain: cfapps.io + timeout: 180 + buildpack: java_buildpack +# For Maven target/gs-rest-service-cors-0.1.0.jar + path: build/libs/gs-rest-service-cors-0.1.0.jar diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw new file mode 100755 index 0000000000..a1ba1bf554 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw @@ -0,0 +1,233 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} "$@" diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw.cmd b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw.cmd new file mode 100755 index 0000000000..2b934e89dd --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% \ No newline at end of file diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/pom.xml b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/pom.xml new file mode 100644 index 0000000000..3235b91434 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + org.springframework + gs-rest-service-cors + 0.1.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.4.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.httpcomponents + httpclient + 4.5.2 + test + + + + + 1.8 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-dependency-plugin + + + build-classpath + generate-sources + + build-classpath + + + + + classpath.txt + + + + + + diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/hello.js b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/hello.js new file mode 100644 index 0000000000..b9e904b749 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/hello.js @@ -0,0 +1,9 @@ +$(document).ready(function() { + $.ajax({ + url: "http://localhost:8080/greeting" + }).then(function(data, status, jqxhr) { + $('.greeting-id').append(data.id); + $('.greeting-content').append(data.content); + console.log(jqxhr); + }); +}); diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/index.html b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/index.html new file mode 100644 index 0000000000..6f66dd761b --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/public/index.html @@ -0,0 +1,15 @@ + + + + Hello CORS + + + + + +
+

The ID is

+

The content is

+
+ + diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java new file mode 100644 index 0000000000..a70be84e43 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java @@ -0,0 +1,27 @@ +package hello; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurerAdapter() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000"); + } + }; + } + +} diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Greeting.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Greeting.java new file mode 100644 index 0000000000..7e631d9ec7 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Greeting.java @@ -0,0 +1,25 @@ +package hello; + +public class Greeting { + + private final long id; + private final String content; + + public Greeting() { + this.id = -1; + this.content = ""; + } + + public Greeting(long id, String content) { + this.id = id; + this.content = content; + } + + public long getId() { + return id; + } + + public String getContent() { + return content; + } +} diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java new file mode 100644 index 0000000000..414eddb0c0 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java @@ -0,0 +1,29 @@ +package hello; + +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class GreetingController { + + private static final String template = "Hello, %s!"; + private final AtomicLong counter = new AtomicLong(); + + @CrossOrigin(origins = "http://localhost:9000") + @GetMapping("/greeting") + public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) { + System.out.println("==== in greeting ===="); + return new Greeting(counter.incrementAndGet(), String.format(template, name)); + } + + @GetMapping("/greeting-javaconfig") + public Greeting greetingWithJavaconfig(@RequestParam(required=false, defaultValue="World") String name) { + System.out.println("==== in greeting ===="); + return new Greeting(counter.incrementAndGet(), String.format(template, name)); + } + +} diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/test/java/hello/GreetingIntegrationTests.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/test/java/hello/GreetingIntegrationTests.java new file mode 100644 index 0000000000..86a0dbc0e4 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/test/java/hello/GreetingIntegrationTests.java @@ -0,0 +1,49 @@ +package hello; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GreetingIntegrationTests { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + public void corsWithAnnotation() { + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.ORIGIN, "http://localhost:9000"); + HttpEntity requestEntity = new HttpEntity(headers); + ResponseEntity entity = this.restTemplate.exchange("/greeting", HttpMethod.GET, requestEntity, Greeting.class); + assertEquals(HttpStatus.OK, entity.getStatusCode()); + assertEquals("http://localhost:9000", entity.getHeaders().getAccessControlAllowOrigin()); + Greeting greeting = entity.getBody(); + assertEquals("Hello, World!", greeting.getContent()); + } + + @Test + public void corsWithJavaconfig() { + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.ORIGIN, "http://localhost:9000"); + HttpEntity requestEntity = new HttpEntity(headers); + ResponseEntity entity = this.restTemplate.exchange("/greeting-javaconfig", HttpMethod.GET, requestEntity, Greeting.class); + assertEquals(HttpStatus.OK, entity.getStatusCode()); + assertEquals("http://localhost:9000", entity.getHeaders().getAccessControlAllowOrigin()); + Greeting greeting = entity.getBody(); + assertEquals("Hello, World!", greeting.getContent()); + } + +} \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/.gitignore b/vscode-extensions/commons/project-test-harness/.gitignore index ceaca19dca..36dc59cb64 100644 --- a/vscode-extensions/commons/project-test-harness/.gitignore +++ b/vscode-extensions/commons/project-test-harness/.gitignore @@ -1,3 +1,5 @@ /.classpath /.project **/classpath.txt +**/.project +**/.settings/*.* diff --git a/vscode-extensions/commons/project-test-harness/src/main/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java b/vscode-extensions/commons/project-test-harness/src/main/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java index 68b0230e63..02b9efb6b6 100644 --- a/vscode-extensions/commons/project-test-harness/src/main/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java +++ b/vscode-extensions/commons/project-test-harness/src/main/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java @@ -48,6 +48,7 @@ public IJavaProject project(ProjectType type, String name) throws Exception { Path testProjectPath = getProjectPath(name); switch (type) { case MAVEN: + MavenCore.buildMavenProject(testProjectPath); return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); case CLASSPATH_TXT: MavenCore.buildMavenProject(testProjectPath); diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.jar b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..c6feb8bb6f Binary files /dev/null and b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.jar differ diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.properties b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..6637cedb28 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw new file mode 100755 index 0000000000..6ecc150ae0 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw @@ -0,0 +1,236 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in $@ +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw.cmd b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw.cmd new file mode 100644 index 0000000000..8bb8275416 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/mvnw.cmd @@ -0,0 +1,146 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in %* +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/pom.xml b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/pom.xml new file mode 100644 index 0000000000..f3eca0fd49 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + com.example + sts-4231 + 0.0.1-SNAPSHOT + jar + + sts-4231 + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.3.0.BUILD-SNAPSHOT + + + + + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-config-server + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-starter-parent + Brixton.M1 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/main/java/com/example/Sts4231Application.java b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/main/java/com/example/Sts4231Application.java new file mode 100644 index 0000000000..a28cfb1673 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/main/java/com/example/Sts4231Application.java @@ -0,0 +1,12 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Sts4231Application { + + public static void main(String[] args) { + SpringApplication.run(Sts4231Application.class, args); + } +} diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/main/resources/application.properties b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/test/java/com/example/Sts4231ApplicationTests.java b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/test/java/com/example/Sts4231ApplicationTests.java new file mode 100644 index 0000000000..ffd31156d6 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.0-app-sts-4231/src/test/java/com/example/Sts4231ApplicationTests.java @@ -0,0 +1,18 @@ +package com.example; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = Sts4231Application.class) +@WebAppConfiguration +public class Sts4231ApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.jar b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..c6feb8bb6f Binary files /dev/null and b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.jar differ diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.properties b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..6637cedb28 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw new file mode 100755 index 0000000000..6ecc150ae0 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw @@ -0,0 +1,236 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in $@ +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw.cmd b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw.cmd new file mode 100644 index 0000000000..8bb8275416 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/mvnw.cmd @@ -0,0 +1,146 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in %* +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/pom.xml b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/pom.xml new file mode 100644 index 0000000000..49ff0c4f82 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.example + demo + 0.0.1-SNAPSHOT + jar + + demo-with-resource-prop + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.3.3.RELEASE + + + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/DemoWithResourcePropApplication.java b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/DemoWithResourcePropApplication.java new file mode 100644 index 0000000000..94c54576e6 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/DemoWithResourcePropApplication.java @@ -0,0 +1,12 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoWithResourcePropApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoWithResourcePropApplication.class, args); + } +} diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeController.java b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeController.java new file mode 100644 index 0000000000..b99c842ad5 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeController.java @@ -0,0 +1,30 @@ +package com.example; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WelcomeController { + + @Autowired + private WelcomeProperties welcome; + + @RequestMapping(value="/", produces="text/plain") + public Resource welcome() { + return welcome.getResource(); + } + + /** + * Shows some debug infos. + */ + @RequestMapping("/debug") + public String debug() throws IOException { + Resource rsrc = welcome.getResource(); + return rsrc.getURI().toString(); + } + +} diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeProperties.java b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeProperties.java new file mode 100644 index 0000000000..b16d811342 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/java/com/example/WelcomeProperties.java @@ -0,0 +1,31 @@ +package com.example; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("my.welcome") +public class WelcomeProperties { + + private Resource resource; + + private String path; + + public Resource getResource() { + return resource; + } + + public void setResource(Resource resource) { + this.resource = resource; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + +} diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000000..3ee47c491e --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,15 @@ +{ + "hints": [ + { + "name": "my.welcome.path", + "providers": [ + { + "name": "handle-as", + "parameters": { + "target": "org.springframework.core.io.Resource" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/application.yml b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/application.yml new file mode 100644 index 0000000000..cea10402ce --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/application.yml @@ -0,0 +1,3 @@ +my: + welcome: + resource: classpath:txt/welcome.txt \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/txt/welcome.txt b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/txt/welcome.txt new file mode 100644 index 0000000000..4c4081f2b9 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/boot-1.3.3-app-with-resource-prop/src/main/resources/txt/welcome.txt @@ -0,0 +1,9 @@ +Welcome to the Resource Demo App +-------------------------------- + +This app demonstrates how to use a configuration property of type +'Resource' to point to a resource loaded from your classpath. + +If you are seeing the contents of this file then it is working. + +This file is a resource on your classpath :-) \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.jar b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..c6feb8bb6f Binary files /dev/null and b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.jar differ diff --git a/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.properties b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..6637cedb28 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip \ No newline at end of file diff --git a/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw new file mode 100755 index 0000000000..6ecc150ae0 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw @@ -0,0 +1,236 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in $@ +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw.cmd b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw.cmd new file mode 100644 index 0000000000..8bb8275416 --- /dev/null +++ b/vscode-extensions/commons/project-test-harness/test-projects/empty-boot-1.3.0-app/mvnw.cmd @@ -0,0 +1,146 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in %* +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java index d788c0a09b..09b785008d 100644 --- a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java +++ b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java @@ -13,14 +13,10 @@ import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtilProvider; import org.springframework.ide.vscode.application.properties.reconcile.SpringPropertiesReconcileEngine; -import org.springframework.ide.vscode.commons.languageserver.reconcile.BadWordReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.languageserver.util.TextDocument; -import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; -import org.springframework.ide.vscode.java.properties.parser.ParseResults; -import org.springframework.ide.vscode.java.properties.parser.Parser; import io.typefox.lsapi.TextDocumentSyncKind; import io.typefox.lsapi.impl.ServerCapabilitiesImpl; @@ -33,13 +29,6 @@ */ public class ApplicationPropertiesLanguageServer extends SimpleLanguageServer { - private static final String SYNTAX_ERROR_HEADER_MSG = "Syntax Error: "; - private static final String YNTAX_ERROR_MSG__UNEXPECTED_END_OF_INPUT = "Unexpected end of input, value identifier is expected"; - private static final String SYNTAX_ERROR_MSG__UNEXPECTED_END_OF_LINE = "Unexpected end of line, value identifier is expected"; - - private ParseResults parseResults; - private Parser parser; - private SpringPropertyIndexProvider indexProvider; private TypeUtilProvider typeUtilProvider; @@ -47,7 +36,6 @@ public class ApplicationPropertiesLanguageServer extends SimpleLanguageServer { public ApplicationPropertiesLanguageServer(SpringPropertyIndexProvider indexProvider, TypeUtilProvider typeUtilProvider) { this.indexProvider = indexProvider; this.typeUtilProvider = typeUtilProvider; - this.parser = new AntlrParser(); SimpleTextDocumentService documents = getTextDocumentService(); IReconcileEngine reconcileEngine = getReconcileEngine(); @@ -55,37 +43,7 @@ public ApplicationPropertiesLanguageServer(SpringPropertyIndexProvider indexProv TextDocument doc = params.getDocument(); validateWith(doc, reconcileEngine); }); - -// documents.onDidChangeContent(params -> { -// System.out.println("Document changed: "+params); -// TextDocument doc = params.getDocument(); -// parseResults = parser.parse(doc.getText()); -// validateDocument(documents, doc); -// }); - } - -// private void validateDocument(SimpleTextDocumentService documents, TextDocument doc) { -// documents.publishDiagnostics(doc, parseResults.syntaxErrors.stream().map(problem -> { -// DiagnosticImpl diagnostic = new DiagnosticImpl(); -// diagnostic.setMessage(createSyntaxErrorMessage(problem.getMessage())); -// diagnostic.setCode(problem.getCode()); -// diagnostic.setSeverity(DiagnosticSeverity.Error); -// diagnostic.setSource("java-properties"); -// diagnostic.setRange(doc.toRange(problem.getOffset(), problem.getLength())); -// return diagnostic; -// }).collect(Collectors.toList())); -// } -// -// private static String createSyntaxErrorMessage(String parserMessage) { -// String message = parserMessage; -// if (parserMessage.contains("extraneous input '\\n' expecting")) { -// message = SYNTAX_ERROR_MSG__UNEXPECTED_END_OF_LINE; -// } else if (parserMessage.contains("mismatched input '' expecting")) { -// message = YNTAX_ERROR_MSG__UNEXPECTED_END_OF_INPUT; -// } -// return SYNTAX_ERROR_HEADER_MSG + message; -// } @Override protected ServerCapabilitiesImpl getServerCapabilities() { diff --git a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/reconcile/SpringPropertiesReconcileEngine.java b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/reconcile/SpringPropertiesReconcileEngine.java index c5dc5fdcf4..ea75dd9c1e 100644 --- a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/reconcile/SpringPropertiesReconcileEngine.java +++ b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/reconcile/SpringPropertiesReconcileEngine.java @@ -60,25 +60,27 @@ public class SpringPropertiesReconcileEngine implements IReconcileEngine { "(\\s|\\\\\\s)*,(\\s|\\\\\\s)*" ); -// private static final Pattern SPACES = Pattern.compile( -// "(\\s|\\\\\\s)*" -// ); - - /** - * Regexp that matches a whitespace, including escaped whitespace - */ -// private static final Pattern ASSIGN = SpringPropertiesCompletionEngine.ASSIGN; + private static final Pattern SPACES = Pattern.compile( + "(\\s|\\\\\\s)*" + ); private SpringPropertyIndexProvider fIndexProvider; private TypeUtilProvider typeUtilProvider; private final DelimitedListReconciler commaListReconciler = new DelimitedListReconciler(COMMA, this::reconcileType); private Parser parser = new AntlrParser(); + private boolean recordSyntaxErrors = false; + public SpringPropertiesReconcileEngine(SpringPropertyIndexProvider provider, TypeUtilProvider typeUtilProvider) { + this(provider, typeUtilProvider, true); + } + + public SpringPropertiesReconcileEngine(SpringPropertyIndexProvider provider, TypeUtilProvider typeUtilProvider, boolean recordSyntaxErrors) { this.fIndexProvider = provider; this.typeUtilProvider = typeUtilProvider; + this.recordSyntaxErrors = recordSyntaxErrors; } - + public void reconcile(IDocument doc, IProblemCollector problemCollector) { FuzzyMap index = fIndexProvider.getIndex(doc); problemCollector.beginCollecting(); @@ -86,10 +88,12 @@ public void reconcile(IDocument doc, IProblemCollector problemCollector) { ParseResults results = parser.parse(doc.get()); DuplicateNameChecker duplicateNameChecker = new DuplicateNameChecker(problemCollector); - results.syntaxErrors.forEach(syntaxError -> { - problemCollector.accept(problem(PROP_SYNTAX_ERROR, syntaxError.getMessage(), syntaxError.getOffset(), - syntaxError.getLength())); - }); + if (recordSyntaxErrors) { + results.syntaxErrors.forEach(syntaxError -> { + problemCollector.accept(problem(PROP_SYNTAX_ERROR, syntaxError.getMessage(), syntaxError.getOffset(), + syntaxError.getLength())); + }); + } if (index==null || index.isEmpty()) { //don't report errors when index is empty, simply don't check (otherwise we will just reprot @@ -136,6 +140,14 @@ public void reconcile(IDocument doc, IProblemCollector problemCollector) { } } + public void setRecordSyntaxErrors(boolean recordSyntaxErrors) { + this.recordSyntaxErrors = recordSyntaxErrors; + } + + public boolean isRecordSyntaxErrors() { + return recordSyntaxErrors ; + } + protected SpringPropertyProblem problemDeprecated(DocumentRegion region, PropertyInfo property) { SpringPropertyProblem p = problem(PROP_DEPRECATED, TypeUtil.deprecatedPropertyMessage( @@ -163,18 +175,8 @@ protected SpringPropertyProblem problemUnkownProperty(DocumentRegion fullNameReg } private void reconcileType(IDocument doc, Type expectType, Node value, IProblemCollector problems) { -// DocumentRegion escapedValue = getAssignedValue(doc, regions, i); -// if (escapedValue==null) { -// int charPos = DocumentUtil.lastNonWhitespaceCharOfRegion(doc, regions[i]); -// if (charPos>=0) { -// problems.accept(problem(SpringPropertiesProblemType.PROP_VALUE_TYPE_MISMATCH, -// "Expecting '"+typeUtil.niceTypeName(expectType)+"'", -// charPos, 1)); -// } -// } else { -// reconcileType(escapedValue, expectType, problems); -// } - reconcileType(createRegion(doc, value), expectType, + // Trim start and end spaces from the value node + reconcileType(createRegion(doc, value).trimStart(SPACES).trimEnd(SPACES), expectType, problems); } @@ -188,7 +190,7 @@ private DocumentRegion createRegion(IDocument doc, Node value) { } return new DocumentRegion(doc, value.getOffset(), value.getOffset() + length); } - + private void reconcileType(DocumentRegion region, Type expectType, IProblemCollector problems) { TypeUtil typeUtil = typeUtilProvider.getTypeUtil(region.getDocument()); ValueParser parser = typeUtil.getValueParser(expectType); @@ -209,23 +211,6 @@ private void reconcileType(DocumentRegion region, Type expectType, IProblemColle } } -// private DocumentRegion getAssignedValue(IDocument doc, ITypedRegion[] regions, int i) { -// int valueRegionIndex = i+1; -// if (valueRegionIndex", "foo.name-colors.something=GREEN<*>"); } - @Ignore @Test public void testEnumMapValueReconciling() throws Exception { + @Test public void testEnumMapValueReconciling() throws Exception { IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); @@ -597,7 +597,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { ); } - @Ignore @Test public void testEnumMapKeyReconciling() throws Exception { + @Test public void testEnumMapKeyReconciling() throws Exception { IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); @@ -652,7 +652,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { assertCompletionsVariations("foo.data.col<*>", "foo.data.color-children.<*>"); } - @Ignore @Test public void testPojoReconciling() throws Exception { + @Test public void testPojoReconciling() throws Exception { IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); @@ -753,7 +753,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { ); } - @Ignore @Test public void testEnumsInLowerCaseReconciling() throws Exception { + @Test public void testEnumsInLowerCaseReconciling() throws Exception { IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); @@ -787,7 +787,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { editor = newEditor( "foo.color-data.red.next=green\n" + - "foo.color-data.red.next=not a color\n" + + "foo.color-data.green.next=not a color\n" + "foo.color-data.red.bogus=green\n" + "foo.color-data.red.name=Rood\n" ); @@ -860,32 +860,38 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { assertCompletion("relaxedColor=b<*>", "relaxedColor=blue<*>"); } - @Ignore @Test public void testReconcileDeprecatedProperty() throws Exception { + /* + * TODO: Remove editor.setText(contents) after the call to deprecate(...) once property index listener mechanism is in place + */ + @Test public void testReconcileDeprecatedProperty() throws Exception { data("error.path", "java.lang.String", null, "Path of the error controller."); - Editor editor = newEditor( - "# a comment\n"+ - "error.path=foo\n" - ); + String contents = "# a comment\n" + + "error.path=foo\n"; + Editor editor = newEditor(contents); deprecate("error.path", "server.error.path", null); + editor.setText(contents); editor.assertProblems( "error.path|Deprecated: Use 'server.error.path'" //no other problems ); deprecate("error.path", "server.error.path", "This is old."); + editor.setText(contents); editor.assertProblems( "error.path|Deprecated: Use 'server.error.path' instead. Reason: This is old." //no other problems ); deprecate("error.path", null, "This is old."); + editor.setText(contents); editor.assertProblems( "error.path|Deprecated: This is old." //no other problems ); deprecate("error.path", null, null); + editor.setText(contents); editor.assertProblems( "error.path|Deprecated!" //no other problems @@ -948,7 +954,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { ); } - @Ignore @Test public void testDeprecatedBeanPropertyReconcile() throws Exception { + @Test public void testDeprecatedBeanPropertyReconcile() throws Exception { IJavaProject p = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(p); data("foo", "demo.Deprecater", null, "A Bean with deprecated properties"); @@ -1151,7 +1157,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { } - @Ignore @Test public void test_STS_3335_reconcile_list_nested_in_Map_of_String() throws Exception { + @Test public void test_STS_3335_reconcile_list_nested_in_Map_of_String() throws Exception { Editor editor; useProject(createPredefinedMavenProject("boot-1.3.3-sts-4335")); @@ -1382,7 +1388,7 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { editor.assertLinkTargets("java.lang.String", "java.lang.String"); } - @Ignore @Test public void testCommaListReconcile() throws Exception { + @Test public void testCommaListReconcile() throws Exception { Editor editor; IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); @@ -1391,13 +1397,13 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { data("my.colors", "java.util.List", null, "Ooh! nice colors!"); - editor = newEditor( - "#comment\n" + - "my.colors=RED, green, not-a-color , BLUE" - ); - editor.assertProblems( - "not-a-color|demo.Color" - ); +// editor = newEditor( +// "#comment\n" + +// "my.colors=RED, green, not-a-color , BLUE" +// ); +// editor.assertProblems( +// "not-a-color|demo.Color" +// ); editor = newEditor( "my.colors=\\\n" + @@ -1553,6 +1559,16 @@ public void linterRunsOnDocumentOpenAndChange() throws Exception { @Override protected SimpleLanguageServer newLanguageServer() { return new ApplicationPropertiesLanguageServer(md.getIndexProvider(), typeUtilProvider); +// return new ApplicationPropertiesLanguageServer(md.getIndexProvider(), typeUtilProvider) { +// +// @Override +// protected IReconcileEngine getReconcileEngine() { +// SpringPropertiesReconcileEngine reconcileEngine = (SpringPropertiesReconcileEngine) super.getReconcileEngine(); +// reconcileEngine.setRecordSyntaxErrors(false); +// return reconcileEngine; +// } +// +// }; } /** diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java index 77ebaac6e9..12b51a54c3 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java @@ -112,7 +112,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testHoverInfoForEnumValueInMapKey() throws Exception { Editor editor; - IJavaProject project = createPredefinedMavenProject("boot13"); + IJavaProject project = createPredefinedMavenProject("empty-boot-1.3.0-app"); useProject(project); //This test will fail if source jars haven't been downloaded. @@ -144,7 +144,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testHoverInfoForEnumValueInMapKeyCompletion() throws Exception { - IJavaProject project = createPredefinedMavenProject("boot13"); + IJavaProject project = createPredefinedMavenProject("empty-boot-1.3.0-app"); useProject(project); //This test will fail if source jars haven't been downloaded. @@ -201,7 +201,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testUserDefinedHoversandLinkTargets() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("foo.link-tester", "demo.LinkTestSubject", null, "for testing different Pojo link cases"); Editor editor = newEditor( "#A comment at the start\n" + @@ -228,7 +228,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testHyperlinkTargets() throws Exception { System.out.println(">>> testHyperlinkTargets"); - IJavaProject p = createPredefinedMavenProject("demo"); + IJavaProject p = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(p); Editor editor = newEditor( @@ -276,7 +276,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void test_STS_4140_StringArrayReconciling() throws Exception { + @Test public void test_STS_4140_StringArrayReconciling() throws Exception { defaultTestData(); Editor editor; @@ -319,7 +319,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void test_STS_4140_StringArrayCompletion() throws Exception { + @Test public void test_STS_4140_StringArrayCompletion() throws Exception { defaultTestData(); assertCompletion( @@ -334,7 +334,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileIntegerScalar() throws Exception { + @Test public void testReconcileIntegerScalar() throws Exception { data("server.port", "java.lang.Integer", null, "Port of server"); data("server.threads", "java.lang.Integer", null, "Number of threads for server threadpool"); Editor editor = newEditor( @@ -349,7 +349,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileExpectMapping() throws Exception { + @Test public void testReconcileExpectMapping() throws Exception { defaultTestData(); Editor editor = newEditor( "server:\n" + @@ -361,7 +361,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileExpectScalar() throws Exception { + @Test public void testReconcileExpectScalar() throws Exception { defaultTestData(); Editor editor = newEditor( "server:\n" + @@ -374,7 +374,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileCamelCaseBasic() throws Exception { + @Test public void testReconcileCamelCaseBasic() throws Exception { Editor editor; data("something.with-many-parts", "java.lang.Integer", "For testing tolerance of camelCase", null); data("something.with-parts.and-more", "java.lang.Integer", "For testing tolerance of camelCase", null); @@ -423,7 +423,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testContentAssistCamelCaseBasic() throws Exception { + @Test public void testContentAssistCamelCaseBasic() throws Exception { data("something.with-many-parts", "java.lang.Integer", "For testing tolerance of camelCase", null); data("something.with-parts.and-more", "java.lang.Integer", "For testing tolerance of camelCase", null); @@ -438,10 +438,10 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileCamelCaseBeanProp() throws Exception { + @Test public void testReconcileCamelCaseBeanProp() throws Exception { Editor editor; - IJavaProject p = createPredefinedMavenProject("demo"); + IJavaProject p = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(p); data("demo.bean", "demo.CamelCaser", "For testing tolerance of camelCase", null); @@ -494,8 +494,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testContentAssistCamelCaseBeanProp() throws Exception { - IJavaProject p = createPredefinedMavenProject("demo"); + @Test public void testContentAssistCamelCaseBeanProp() throws Exception { + IJavaProject p = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(p); data("demo.bean", "demo.CamelCaser", "For testing tolerance of camelCase", null); @@ -545,8 +545,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testReconcileBeanPropName() throws Exception { - IJavaProject p = createPredefinedMavenProject("demo-list-of-pojo"); + @Test public void testReconcileBeanPropName() throws Exception { + IJavaProject p = createPredefinedMavenProject("boot-1.2.1-app-properties-list-of-pojo"); useProject(p); assertNotNull(p.findType("demo.Foo")); data("some-foo", "demo.Foo", null, "some Foo pojo property"); @@ -565,7 +565,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testIgnoreSpringExpression() throws Exception { + @Test public void testIgnoreSpringExpression() throws Exception { defaultTestData(); Editor editor = newEditor( "server:\n" + @@ -577,8 +577,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcilePojoArray() throws Exception { - IJavaProject p = createPredefinedMavenProject("demo-list-of-pojo"); + @Test public void testReconcilePojoArray() throws Exception { + IJavaProject p = createPredefinedMavenProject("boot-1.2.1-app-properties-list-of-pojo"); useProject(p); assertNotNull(p.findType("demo.Foo")); @@ -630,7 +630,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testReconcileSequenceGotAtomicType() throws Exception { + @Test public void testReconcileSequenceGotAtomicType() throws Exception { defaultTestData(); Editor editor = newEditor( "liquibase:\n" + @@ -642,7 +642,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileSequenceGotMapType() throws Exception { + @Test public void testReconcileSequenceGotMapType() throws Exception { data("the-map", "java.util.Map", null, "Nice mappy"); Editor editor = newEditor( "the-map:\n" + @@ -654,8 +654,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testEnumPropertyReconciling() throws Exception { - IJavaProject p = createPredefinedMavenProject("demo-enum"); + @Test public void testEnumPropertyReconciling() throws Exception { + IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); assertNotNull(p.findType("demo.Color")); @@ -679,8 +679,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); editor.assertProblems( - "bad: BLUE|Expecting a 'demo.Color[RED, GREEN, BLUE]' but got a 'Mapping' node", - "Bogus|Expecting a 'demo.Color[RED, GREEN, BLUE]' but got 'Bogus'" + "bad: BLUE|Expecting a 'demo.Color", + "Bogus|Expecting a 'demo.Color" ); } @@ -737,7 +737,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testContentAssistNullContext() throws Exception { + @Test public void testContentAssistNullContext() throws Exception { defaultTestData(); assertCompletions( "#A comment\n" + @@ -749,7 +749,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testContentAssistNested() throws Exception { + @Test public void testContentAssistNested() throws Exception { data("server.port", "java.lang.Integer", null, "Server http port"); data("server.address", "java.lang.String", "localhost", "Server host address"); @@ -1010,7 +1010,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testContentAssistPropertyWithPojoType() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); //Try in-place completion assertCompletion( @@ -1037,7 +1037,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testContentAssistPropertyWithEnumType() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); //Try in-place completion assertCompletion( @@ -1097,7 +1097,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testCompletionForExistingBeanPropertiesAreDemoted() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); assertCompletions( "foo:\n" + " data:\n" + @@ -1175,7 +1175,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testNoCompletionsInsideComments() throws Exception { + @Test public void testNoCompletionsInsideComments() throws Exception { defaultTestData(); //Ensure this test is not trivially passing because of missing test data @@ -1428,7 +1428,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testBooleanValueCompletion() throws Exception { + @Test public void testBooleanValueCompletion() throws Exception { defaultTestData(); assertCompletions( "liquibase:\n" + @@ -1531,8 +1531,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testEnumValueCompletion() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testEnumValueCompletion() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("foo.color", "demo.Color", null, "A foonky colour"); assertCompletion("foo.c<*>", @@ -1553,8 +1553,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testEnumMapValueCompletion() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testEnumMapValueCompletion() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); assertCompletions( "foo:\n" + @@ -1586,8 +1586,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testEnumMapValueReconciling() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testEnumMapValueReconciling() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("foo.name-colors", "java.util.Map", null, "Map with colors in its values"); Editor editor; @@ -1619,7 +1619,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testEnumMapKeyCompletion() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("foo.color-names", "java.util.Map", null, "Map with colors in its keys"); data("foo.color-data", "java.util.Map", null, "Map with colors in its keys, and pojo in values"); @@ -1732,8 +1732,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testPojoReconciling() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testPojoReconciling() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); Editor editor = newEditor( "foo:\n" + @@ -1759,7 +1759,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testListOfAtomicCompletions() throws Exception { + @Test public void testListOfAtomicCompletions() throws Exception { data("foo.slist", "java.util.List", null, "list of strings"); data("foo.ulist", "java.util.List", null, "list of strings"); data("foo.dlist", "java.util.List", null, "list of doubles"); @@ -1777,8 +1777,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { " - <*>"); } - @Ignore @Test public void testEnumsInLowerCaseReconciling() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testEnumsInLowerCaseReconciling() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("simple.pants.size", "demo.ClothingSize", null, "The simple pant's size"); @@ -1837,7 +1837,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testEnumsInLowerCaseContentAssist() throws Exception { - IJavaProject p = createPredefinedMavenProject("demo-enum"); + IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); assertNotNull(p.findType("demo.ClothingSize")); @@ -1917,7 +1917,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testPojoInListCompletion() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); assertCompletion( "foo:\n" + @@ -2075,7 +2075,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void testDocumentSeparator() throws Exception { + @Test public void testDocumentSeparator() throws Exception { defaultTestData(); assertCompletion( @@ -2092,7 +2092,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testMultiProfileYamlReconcile() throws Exception { + @Test public void testMultiProfileYamlReconcile() throws Exception { Editor editor; //See https://issuetracker.springsource.com/browse/STS-4144 defaultTestData(); @@ -2122,7 +2122,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileArrayOfPrimitiveType() throws Exception { + @Test public void testReconcileArrayOfPrimitiveType() throws Exception { data("my.array", "int[]", null, "A primitive array"); data("my.boxarray", "int[]", null, "An array of boxed primitives"); data("my.list", "java.util.List", null, "A list of boxed types"); @@ -2164,13 +2164,13 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void test_STS4231() throws Exception { //Should the 'predefined' project need to be recreated... use the commented code below: // BootProjectTestHarness projectHarness = new BootProjectTestHarness(ResourcesPlugin.getWorkspace()); -// IJavaProject project = projectHarness.createBootProject("sts-4231", +// IJavaProject project = projectHarness.createBootProject("boot-1.3.0-app-sts-4231", // bootVersionAtLeast("1.3.0"), // withStarters("web", "cloud-config-server") // ); //For more robust test use predefined project which is not so much a moving target: - IJavaProject project = createPredefinedMavenProject("sts-4231"); + IJavaProject project = createPredefinedMavenProject("boot-1.3.0-app-sts-4231"); useProject(project); assertCompletionsDisplayString( @@ -2231,7 +2231,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void test_STS_4254_MapStringObjectReconciling() throws Exception { + @Test public void test_STS_4254_MapStringObjectReconciling() throws Exception { Editor editor; data("info", "java.util.Map", null, "Info for the actuator's info endpoint."); @@ -2267,7 +2267,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void test_STS_4254_MapStringStringReconciling() throws Exception { + @Test public void test_STS_4254_MapStringStringReconciling() throws Exception { Editor editor; data("info", "java.util.Map", null, "Info for the actuator's info endpoint."); @@ -2297,7 +2297,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void test_STS_4254_MapStringIntegerReconciling() throws Exception { + @Test public void test_STS_4254_MapStringIntegerReconciling() throws Exception { Editor editor; data("info", "java.util.Map", null, "Info for the actuator's info endpoint."); @@ -2348,33 +2348,43 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testDeprecatedReconcileProperty() throws Exception { + /* + * TODO: Remove editor.setText(contents) after the call to deprecate(...) once property index listener mechanism is in place + */ + @Test public void testDeprecatedReconcileProperty() throws Exception { data("error.path", "java.lang.String", null, "Path of the error controller."); - Editor editor = newEditor( - "# a comment\n"+ + + String contents = "# a comment\n"+ "error:\n"+ - " path: foo\n" + " path: foo\n"; + + Editor editor = newEditor( + contents ); deprecate("error.path", "server.error.path", null); + editor.setText(contents); editor.assertProblems( "path|'error.path' is Deprecated: Use 'server.error.path'" //no other problems ); deprecate("error.path", "server.error.path", "This is old."); + editor.setText(contents); editor.assertProblems( "path|'error.path' is Deprecated: Use 'server.error.path' instead. Reason: This is old." //no other problems ); deprecate("error.path", null, "This is old."); + editor.setText(contents); editor.assertProblems( "path|'error.path' is Deprecated: This is old." //no other problems ); deprecate("error.path", null, null); + editor.setText(contents); editor.assertProblems( "path|'error.path' is Deprecated!" //no other problems @@ -2421,7 +2431,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testDeprecatedBeanPropertyHoverInfo() throws Exception { - IJavaProject jp = createPredefinedMavenProject("demo"); + IJavaProject jp = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(jp); data("foo", "demo.Deprecater", null, "A bean with deprecated property."); Editor editor = newEditor( @@ -2433,8 +2443,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { editor.assertHoverContains("name", "Deprecated!"); } - @Ignore @Test public void testDeprecatedBeanPropertyReconcile() throws Exception { - IJavaProject jp = createPredefinedMavenProject("demo"); + @Test public void testDeprecatedBeanPropertyReconcile() throws Exception { + IJavaProject jp = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(jp); data("foo", "demo.Deprecater", null, "A Bean with deprecated properties"); @@ -2467,7 +2477,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testDeprecatedBeanPropertyCompletions() throws Exception { - IJavaProject jp = createPredefinedMavenProject("demo"); + IJavaProject jp = createPredefinedMavenProject("tricky-getters-boot-1.3.1-app"); useProject(jp); data("foo", "demo.Deprecater", null, "A Bean with deprecated properties"); @@ -2791,7 +2801,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } } - @Ignore @Test public void testReconcileDuplicateProperties() throws Exception { + @Test public void testReconcileDuplicateProperties() throws Exception { defaultTestData(); Editor editor = newEditor( "spring:\n" + @@ -2806,7 +2816,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileDuplicatePropertiesNested() throws Exception { + @Test public void testReconcileDuplicatePropertiesNested() throws Exception { data("foo.person.name", "String", null, "Name of person"); data("foo.person.family", "String", null, "Family name of person"); Editor editor = newEditor( @@ -2822,8 +2832,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testReconcileDuplicatePropertiesInBean() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + @Test public void testReconcileDuplicatePropertiesInBean() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("some.color", "demo.ColorData", null, "Some info about a color."); Editor editor = newEditor( "some:\n" + @@ -2837,7 +2847,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testCharSetCompletions() throws Exception { + @Test public void testCharSetCompletions() throws Exception { data("foobar.encoding", "java.nio.charset.Charset", null, "The charset-encoding to use for foobars"); assertCompletions( @@ -2859,7 +2869,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testLocaleCompletions() throws Exception { + @Test public void testLocaleCompletions() throws Exception { data("foobar.locale", "java.util.Locale", null, "The locale for foobars"); assertCompletions( @@ -2881,7 +2891,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testMimeTypeCompletions() throws Exception { + @Test public void testMimeTypeCompletions() throws Exception { data("foobar.mime", "org.springframework.util.MimeType", null, "The mimetype for foobars"); assertCompletions( @@ -2903,10 +2913,10 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testPropertyValueHintCompletions() throws Exception { + @Test public void testPropertyValueHintCompletions() throws Exception { //Test that 'value hints' work when property name is associated with 'value' hints. // via boot metadata. - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletionsDisplayString( "spring:\n" + @@ -2919,8 +2929,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testPropertyListHintCompletions() throws Exception { - useProject(createPredefinedMavenProject("boot13")); + @Test public void testPropertyListHintCompletions() throws Exception { + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletion( "management:\n" + @@ -2949,8 +2959,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testPropertyMapValueCompletions() throws Exception { - useProject(createPredefinedMavenProject("boot13")); + @Test public void testPropertyMapValueCompletions() throws Exception { + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletionsDisplayString( "logging:\n" + @@ -2968,7 +2978,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testPropertyMapKeyCompletions() throws Exception { - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletionWithLabel( "logging:\n" + " level:\n" + @@ -2982,8 +2992,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testEscapeStringValueStartingWithStar() throws Exception { - useProject(createPredefinedMavenProject("boot13")); + @Test public void testEscapeStringValueStartingWithStar() throws Exception { + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletions( "endpoints:\n"+ " cors:\n"+ @@ -2997,7 +3007,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testEscapeStringValueWithAQuote() throws Exception { + @Test public void testEscapeStringValueWithAQuote() throws Exception { data("foo.quote", "java.lang.String", null, "Character to used to surround quotes"); valueHints("foo.quote", "\"", "'", "`"); @@ -3042,7 +3052,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); // the provider can't be reliably tested if its not allowed to // fetch all its values (even though in 'production' you // wouldn't want it to block the UI thread for this long. - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); //Finds a package: assertCompletionWithLabel( "logging:\n" + @@ -3073,7 +3083,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testSimpleResourceCompletion() throws Exception { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); data("my.nice.resource", "org.springframework.core.io.Resource", null, "A very nice resource."); @@ -3117,7 +3127,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testClasspathResourceCompletion() throws Exception { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); data("my.nice.resource", "org.springframework.core.io.Resource", null, "A very nice resource."); data("my.nice.list", "java.util.List", null, "A nice list of resources."); @@ -3232,7 +3242,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testClassReferenceCompletion() throws Exception { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); - useProject(createPredefinedMavenProject("boot13_with_mongo")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-with-mongo")); assertCompletion( "spring:\n" + @@ -3273,7 +3283,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); //Test what happens when 'target' type isn't on the classpath: - useProject(createPredefinedMavenProject("boot13")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-app")); assertCompletionsDisplayString( "spring:\n" + " data:\n" + @@ -3286,7 +3296,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testClassReferenceInValueLink() throws Exception { Editor editor; - useProject(createPredefinedMavenProject("boot13_with_mongo")); + useProject(createPredefinedMavenProject("empty-boot-1.3.0-with-mongo")); editor = newEditor( "spring:\n" + @@ -3316,9 +3326,9 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { editor.assertLinkTargets("java.lang.String", "java.lang.String"); } - @Ignore @Test public void test_STS_3335_reconcile_list_nested_in_Map_of_String() throws Exception { + @Test public void test_STS_3335_reconcile_list_nested_in_Map_of_String() throws Exception { Editor editor; - useProject(createPredefinedMavenProject("demo-sts-4335")); + useProject(createPredefinedMavenProject("boot-1.3.3-sts-4335")); editor = newEditor( "test-map:\n" + @@ -3344,8 +3354,8 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } - @Ignore @Test public void test_STS_3335_completions_list_nested_in_Map_of_String() throws Exception { - useProject(createPredefinedMavenProject("demo-sts-4335")); + @Test public void test_STS_3335_completions_list_nested_in_Map_of_String() throws Exception { + useProject(createPredefinedMavenProject("boot-1.3.3-sts-4335")); assertCompletions( "test-map:\n" + @@ -3394,7 +3404,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testBootBug5905() throws Exception { - useProject(createPredefinedMavenProject("demo-with-resource-prop")); + useProject(createPredefinedMavenProject("boot-1.3.3-app-with-resource-prop")); //Check the metadata reflects the 'handle-as': PropertyInfo metadata = getIndexProvider().getIndex(null).get("my.welcome.path"); @@ -3415,7 +3425,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testEnumJavaDocShownInValueContentAssist() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("my.background", "demo.Color", null, "Color to use as default background."); assertCompletionWithInfoHover( @@ -3429,7 +3439,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { } @Ignore @Test public void testEnumJavaDocShownInValueHover() throws Exception { - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("my.background", "demo.Color", null, "Color to use as default background."); Editor editor; @@ -3449,7 +3459,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testHyperLinkEnumValue() throws Exception { Editor editor; - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("my.background", "demo.Color", null, "Color to use as default background."); editor = newEditor( @@ -3467,7 +3477,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Ignore @Test public void testHyperLinkEnumValueInMapKey() throws Exception { Editor editor; - useProject(createPredefinedMavenProject("demo-enum")); + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); data("my.color.map", "java.util.Map", null, "Pretty names for the colors."); editor = newEditor(