Browse Source

DATACMNS-1249 - Fix line endings to LF.

pull/301/head
Mark Paluch 8 years ago
parent
commit
e9eacfceca
  1. 300
      src/main/java/org/springframework/data/config/ParsingUtils.java
  2. 252
      src/main/java/org/springframework/data/geo/Box.java
  3. 272
      src/main/java/org/springframework/data/geo/Circle.java
  4. 272
      src/main/java/org/springframework/data/geo/Point.java
  5. 186
      src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java
  6. 96
      src/main/java/org/springframework/data/history/RevisionMetadata.java
  7. 178
      src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java
  8. 448
      src/main/java/org/springframework/data/util/Version.java
  9. 478
      src/main/resources/org/springframework/data/domain/jaxb/atom.xsd
  10. 332
      src/test/java/org/springframework/data/util/VersionUnitTests.java
  11. 12
      src/test/resources/META-INF/beans.xml

300
src/main/java/org/springframework/data/config/ParsingUtils.java

@ -1,150 +1,150 @@
/* /*
* Copyright 2011-2012 the original author or authors. * Copyright 2011-2012 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.config; package org.springframework.data.config;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean; import org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean;
import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;
/** /**
* Utility methods for {@link BeanDefinitionParser} implementations. * Utility methods for {@link BeanDefinitionParser} implementations.
* *
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public abstract class ParsingUtils { public abstract class ParsingUtils {
private ParsingUtils() { private ParsingUtils() {
} }
/** /**
* Configures a property value for the given property name reading the attribute of the given name from the given * Configures a property value for the given property name reading the attribute of the given name from the given
* {@link Element} if the attribute is configured. * {@link Element} if the attribute is configured.
* *
* @param builder must not be {@literal null}. * @param builder must not be {@literal null}.
* @param element must not be {@literal null}. * @param element must not be {@literal null}.
* @param attrName must not be {@literal null} or empty. * @param attrName must not be {@literal null} or empty.
* @param propertyName must not be {@literal null} or empty. * @param propertyName must not be {@literal null} or empty.
*/ */
public static void setPropertyValue(BeanDefinitionBuilder builder, Element element, String attrName, public static void setPropertyValue(BeanDefinitionBuilder builder, Element element, String attrName,
String propertyName) { String propertyName) {
Assert.notNull(builder, "BeanDefinitionBuilder must not be null!"); Assert.notNull(builder, "BeanDefinitionBuilder must not be null!");
Assert.notNull(element, "Element must not be null!"); Assert.notNull(element, "Element must not be null!");
Assert.hasText(attrName, "Attribute name must not be null!"); Assert.hasText(attrName, "Attribute name must not be null!");
Assert.hasText(propertyName, "Property name must not be null!"); Assert.hasText(propertyName, "Property name must not be null!");
String attr = element.getAttribute(attrName); String attr = element.getAttribute(attrName);
if (StringUtils.hasText(attr)) { if (StringUtils.hasText(attr)) {
builder.addPropertyValue(propertyName, attr); builder.addPropertyValue(propertyName, attr);
} }
} }
/** /**
* Sets the property with the given attribute name on the given {@link BeanDefinitionBuilder} to the value of the * Sets the property with the given attribute name on the given {@link BeanDefinitionBuilder} to the value of the
* attribute with the given name if the attribute is configured. * attribute with the given name if the attribute is configured.
* *
* @param builder must not be {@literal null}. * @param builder must not be {@literal null}.
* @param element must not be {@literal null}. * @param element must not be {@literal null}.
* @param attribute must not be {@literal null} or empty. * @param attribute must not be {@literal null} or empty.
*/ */
public static void setPropertyValue(BeanDefinitionBuilder builder, Element element, String attribute) { public static void setPropertyValue(BeanDefinitionBuilder builder, Element element, String attribute) {
setPropertyValue(builder, element, attribute, attribute); setPropertyValue(builder, element, attribute, attribute);
} }
/** /**
* Configures a bean property reference with the value of the attribute of the given name if it is configured. * Configures a bean property reference with the value of the attribute of the given name if it is configured.
* *
* @param builder must not be {@literal null}. * @param builder must not be {@literal null}.
* @param element must not be {@literal null}. * @param element must not be {@literal null}.
* @param attribute must not be {@literal null} or empty. * @param attribute must not be {@literal null} or empty.
* @param property must not be {@literal null}or empty. * @param property must not be {@literal null}or empty.
*/ */
public static void setPropertyReference(BeanDefinitionBuilder builder, Element element, String attribute, public static void setPropertyReference(BeanDefinitionBuilder builder, Element element, String attribute,
String property) { String property) {
Assert.notNull(builder, "BeanDefinitionBuilder must not be null!"); Assert.notNull(builder, "BeanDefinitionBuilder must not be null!");
Assert.notNull(element, "Element must not be null!"); Assert.notNull(element, "Element must not be null!");
Assert.hasText(attribute, "Attribute name must not be null!"); Assert.hasText(attribute, "Attribute name must not be null!");
Assert.hasText(property, "Property name must not be null!"); Assert.hasText(property, "Property name must not be null!");
String value = element.getAttribute(attribute); String value = element.getAttribute(attribute);
if (StringUtils.hasText(value)) { if (StringUtils.hasText(value)) {
builder.addPropertyReference(property, value); builder.addPropertyReference(property, value);
} }
} }
/** /**
* Returns the {@link BeanDefinition} built by the given {@link BeanDefinitionBuilder} enriched with source * Returns the {@link BeanDefinition} built by the given {@link BeanDefinitionBuilder} enriched with source
* information derived from the given {@link Element}. * information derived from the given {@link Element}.
* *
* @param builder must not be {@literal null}. * @param builder must not be {@literal null}.
* @param context must not be {@literal null}. * @param context must not be {@literal null}.
* @param element must not be {@literal null}. * @param element must not be {@literal null}.
* @return * @return
*/ */
public static AbstractBeanDefinition getSourceBeanDefinition(BeanDefinitionBuilder builder, ParserContext context, public static AbstractBeanDefinition getSourceBeanDefinition(BeanDefinitionBuilder builder, ParserContext context,
Element element) { Element element) {
Assert.notNull(element, "Element must not be null!"); Assert.notNull(element, "Element must not be null!");
Assert.notNull(context, "ParserContext must not be null!"); Assert.notNull(context, "ParserContext must not be null!");
return getSourceBeanDefinition(builder, context.extractSource(element)); return getSourceBeanDefinition(builder, context.extractSource(element));
} }
/** /**
* Returns the {@link AbstractBeanDefinition} built by the given builder with the given extracted source applied. * Returns the {@link AbstractBeanDefinition} built by the given builder with the given extracted source applied.
* *
* @param builder must not be {@literal null}. * @param builder must not be {@literal null}.
* @param source * @param source
* @return * @return
*/ */
public static AbstractBeanDefinition getSourceBeanDefinition(BeanDefinitionBuilder builder, Object source) { public static AbstractBeanDefinition getSourceBeanDefinition(BeanDefinitionBuilder builder, Object source) {
Assert.notNull(builder, "Builder must not be null!"); Assert.notNull(builder, "Builder must not be null!");
AbstractBeanDefinition definition = builder.getRawBeanDefinition(); AbstractBeanDefinition definition = builder.getRawBeanDefinition();
definition.setSource(source); definition.setSource(source);
return definition; return definition;
} }
/** /**
* Returns a {@link BeanDefinition} for an {@link ObjectFactoryCreatingFactoryBean} pointing to the bean with the * Returns a {@link BeanDefinition} for an {@link ObjectFactoryCreatingFactoryBean} pointing to the bean with the
* given name. * given name.
* *
* @param targetBeanName must not be {@literal null} or empty. * @param targetBeanName must not be {@literal null} or empty.
* @param source * @param source
* @return * @return
*/ */
public static AbstractBeanDefinition getObjectFactoryBeanDefinition(String targetBeanName, Object source) { public static AbstractBeanDefinition getObjectFactoryBeanDefinition(String targetBeanName, Object source) {
Assert.hasText(targetBeanName, "Target bean name must not be null or empty!"); Assert.hasText(targetBeanName, "Target bean name must not be null or empty!");
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ObjectFactoryCreatingFactoryBean.class); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ObjectFactoryCreatingFactoryBean.class);
builder.addPropertyValue("targetBeanName", targetBeanName); builder.addPropertyValue("targetBeanName", targetBeanName);
builder.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE); builder.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE);
return getSourceBeanDefinition(builder, source); return getSourceBeanDefinition(builder, source);
} }
} }

252
src/main/java/org/springframework/data/geo/Box.java

@ -1,126 +1,126 @@
/* /*
* Copyright 2010-2014 the original author or authors. * Copyright 2010-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.geo; package org.springframework.data.geo;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Represents a geospatial box value * Represents a geospatial box value
* *
* @author Mark Pollack * @author Mark Pollack
* @author Oliver Gierke * @author Oliver Gierke
* @author Thomas Darimont * @author Thomas Darimont
* @since 1.8 * @since 1.8
*/ */
public class Box implements Shape { public class Box implements Shape {
private static final long serialVersionUID = 8198095179084040711L; private static final long serialVersionUID = 8198095179084040711L;
private final Point first; private final Point first;
private final Point second; private final Point second;
/** /**
* Creates a new Box spanning from the given first to the second {@link Point}. * Creates a new Box spanning from the given first to the second {@link Point}.
* *
* @param first must not be {@literal null}. * @param first must not be {@literal null}.
* @param second must not be {@literal null}. * @param second must not be {@literal null}.
*/ */
public Box(Point first, Point second) { public Box(Point first, Point second) {
Assert.notNull(first, "First point must not be null!"); Assert.notNull(first, "First point must not be null!");
Assert.notNull(second, "Second point must not be null!"); Assert.notNull(second, "Second point must not be null!");
this.first = first; this.first = first;
this.second = second; this.second = second;
} }
/** /**
* Creates a new Box from the given {@code first} to the {@code second} point represented as the {@literal double[]}. * Creates a new Box from the given {@code first} to the {@code second} point represented as the {@literal double[]}.
* *
* @param first must not be {@literal null} and contain exactly 2 doubles. * @param first must not be {@literal null} and contain exactly 2 doubles.
* @param second must not be {@literal null} and contain exactly 2 doubles. * @param second must not be {@literal null} and contain exactly 2 doubles.
*/ */
public Box(double[] first, double[] second) { public Box(double[] first, double[] second) {
Assert.isTrue(first.length == 2, "Point array has to have 2 elements!"); Assert.isTrue(first.length == 2, "Point array has to have 2 elements!");
Assert.isTrue(second.length == 2, "Point array has to have 2 elements!"); Assert.isTrue(second.length == 2, "Point array has to have 2 elements!");
this.first = new Point(first[0], first[1]); this.first = new Point(first[0], first[1]);
this.second = new Point(second[0], second[1]); this.second = new Point(second[0], second[1]);
} }
/** /**
* Returns the first {@link Point} making up the {@link Box}. * Returns the first {@link Point} making up the {@link Box}.
* *
* @return * @return
*/ */
public Point getFirst() { public Point getFirst() {
return first; return first;
} }
/** /**
* Returns the second {@link Point} making up the {@link Box}. * Returns the second {@link Point} making up the {@link Box}.
* *
* @return * @return
*/ */
public Point getSecond() { public Point getSecond() {
return second; return second;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
@Override @Override
public String toString() { public String toString() {
return String.format("Box [%s, %s]", first, second); return String.format("Box [%s, %s]", first, second);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
int result = 31; int result = 31;
result += 17 * first.hashCode(); result += 17 * first.hashCode();
result += 17 * second.hashCode(); result += 17 * second.hashCode();
return result; return result;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (!(obj instanceof Box)) { if (!(obj instanceof Box)) {
return false; return false;
} }
Box that = (Box) obj; Box that = (Box) obj;
return this.first.equals(that.first) && this.second.equals(that.second); return this.first.equals(that.first) && this.second.equals(that.second);
} }
} }

272
src/main/java/org/springframework/data/geo/Circle.java

@ -1,136 +1,136 @@
/* /*
* Copyright 2010-2014 the original author or authors. * Copyright 2010-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.geo; package org.springframework.data.geo;
import org.springframework.data.annotation.PersistenceConstructor; import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Represents a geospatial circle value * Represents a geospatial circle value
* *
* @author Mark Pollack * @author Mark Pollack
* @author Oliver Gierke * @author Oliver Gierke
* @author Thomas Darimont * @author Thomas Darimont
* @since 1.8 * @since 1.8
*/ */
public class Circle implements Shape { public class Circle implements Shape {
private static final long serialVersionUID = 5215611530535947924L; private static final long serialVersionUID = 5215611530535947924L;
private final Point center; private final Point center;
private final Distance radius; private final Distance radius;
/** /**
* Creates a new {@link Circle} from the given {@link Point} and radius. * Creates a new {@link Circle} from the given {@link Point} and radius.
* *
* @param center must not be {@literal null}. * @param center must not be {@literal null}.
* @param radius must not be {@literal null} and it's value greater or equal to zero. * @param radius must not be {@literal null} and it's value greater or equal to zero.
*/ */
@PersistenceConstructor @PersistenceConstructor
public Circle(Point center, Distance radius) { public Circle(Point center, Distance radius) {
Assert.notNull(center, "Center point must not be null!"); Assert.notNull(center, "Center point must not be null!");
Assert.notNull(radius, "Radius must not be null!"); Assert.notNull(radius, "Radius must not be null!");
Assert.isTrue(radius.getValue() >= 0, "Radius must not be negative!"); Assert.isTrue(radius.getValue() >= 0, "Radius must not be negative!");
this.center = center; this.center = center;
this.radius = radius; this.radius = radius;
} }
/** /**
* Creates a new {@link Circle} from the given {@link Point} and radius. * Creates a new {@link Circle} from the given {@link Point} and radius.
* *
* @param center must not be {@literal null}. * @param center must not be {@literal null}.
* @param radius's value must be greater or equal to zero. * @param radius's value must be greater or equal to zero.
*/ */
public Circle(Point center, double radius) { public Circle(Point center, double radius) {
this(center, new Distance(radius)); this(center, new Distance(radius));
} }
/** /**
* Creates a new {@link Circle} from the given coordinates and radius as {@link Distance} with a * Creates a new {@link Circle} from the given coordinates and radius as {@link Distance} with a
* {@link Metrics#NEUTRAL}. * {@link Metrics#NEUTRAL}.
* *
* @param centerX * @param centerX
* @param centerY * @param centerY
* @param radius must be greater or equal to zero. * @param radius must be greater or equal to zero.
*/ */
public Circle(double centerX, double centerY, double radius) { public Circle(double centerX, double centerY, double radius) {
this(new Point(centerX, centerY), new Distance(radius)); this(new Point(centerX, centerY), new Distance(radius));
} }
/** /**
* Returns the center of the {@link Circle}. * Returns the center of the {@link Circle}.
* *
* @return will never be {@literal null}. * @return will never be {@literal null}.
*/ */
public Point getCenter() { public Point getCenter() {
return center; return center;
} }
/** /**
* Returns the radius of the {@link Circle}. * Returns the radius of the {@link Circle}.
* *
* @return * @return
*/ */
public Distance getRadius() { public Distance getRadius() {
return radius; return radius;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
@Override @Override
public String toString() { public String toString() {
return String.format("Circle: [center=%s, radius=%s]", center, radius); return String.format("Circle: [center=%s, radius=%s]", center, radius);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (!(obj instanceof Circle)) { if (!(obj instanceof Circle)) {
return false; return false;
} }
Circle that = (Circle) obj; Circle that = (Circle) obj;
return this.center.equals(that.center) && this.radius.equals(that.radius); return this.center.equals(that.center) && this.radius.equals(that.radius);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
int result = 17; int result = 17;
result += 31 * center.hashCode(); result += 31 * center.hashCode();
result += 31 * radius.hashCode(); result += 31 * radius.hashCode();
return result; return result;
} }
} }

272
src/main/java/org/springframework/data/geo/Point.java

@ -1,136 +1,136 @@
/* /*
* Copyright 2010-2014 the original author or authors. * Copyright 2010-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.geo; package org.springframework.data.geo;
import java.io.Serializable; import java.io.Serializable;
import java.util.Locale; import java.util.Locale;
import org.springframework.data.annotation.PersistenceConstructor; import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Represents a geospatial point value. * Represents a geospatial point value.
* *
* @author Mark Pollack * @author Mark Pollack
* @author Oliver Gierke * @author Oliver Gierke
* @author Thomas Darimont * @author Thomas Darimont
* @since 1.8 * @since 1.8
*/ */
public class Point implements Serializable { public class Point implements Serializable {
private static final long serialVersionUID = 3583151228933783558L; private static final long serialVersionUID = 3583151228933783558L;
private final double x; private final double x;
private final double y; private final double y;
/** /**
* Creates a {@link Point} from the given {@code x}, {@code y} coordinate. * Creates a {@link Point} from the given {@code x}, {@code y} coordinate.
* *
* @param x * @param x
* @param y * @param y
*/ */
@PersistenceConstructor @PersistenceConstructor
public Point(double x, double y) { public Point(double x, double y) {
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
/** /**
* Creates a {@link Point} from the given {@link Point} coordinate. * Creates a {@link Point} from the given {@link Point} coordinate.
* *
* @param point must not be {@literal null}. * @param point must not be {@literal null}.
*/ */
public Point(Point point) { public Point(Point point) {
Assert.notNull(point, "Source point must not be null!"); Assert.notNull(point, "Source point must not be null!");
this.x = point.x; this.x = point.x;
this.y = point.y; this.y = point.y;
} }
/** /**
* Returns the x-coordinate of the {@link Point}. * Returns the x-coordinate of the {@link Point}.
* *
* @return * @return
*/ */
public double getX() { public double getX() {
return x; return x;
} }
/** /**
* Returns the y-coordinate of the {@link Point}. * Returns the y-coordinate of the {@link Point}.
* *
* @return * @return
*/ */
public double getY() { public double getY() {
return y; return y;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
int result = 1; int result = 1;
long temp = Double.doubleToLongBits(x); long temp = Double.doubleToLongBits(x);
result = 31 * result + (int) (temp ^ temp >>> 32); result = 31 * result + (int) (temp ^ temp >>> 32);
temp = Double.doubleToLongBits(y); temp = Double.doubleToLongBits(y);
result = 31 * result + (int) (temp ^ temp >>> 32); result = 31 * result + (int) (temp ^ temp >>> 32);
return result; return result;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (!(obj instanceof Point)) { if (!(obj instanceof Point)) {
return false; return false;
} }
Point other = (Point) obj; Point other = (Point) obj;
if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x)) { if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x)) {
return false; return false;
} }
if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y)) { if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y)) {
return false; return false;
} }
return true; return true;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
@Override @Override
public String toString() { public String toString() {
return String.format(Locale.ENGLISH, "Point [x=%f, y=%f]", x, y); return String.format(Locale.ENGLISH, "Point [x=%f, y=%f]", x, y);
} }
} }

186
src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java

@ -1,93 +1,93 @@
/* /*
* Copyright 2012 the original author or authors. * Copyright 2012 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.history; package org.springframework.data.history;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.springframework.data.util.AnnotationDetectionFieldCallback; import org.springframework.data.util.AnnotationDetectionFieldCallback;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
/** /**
* A {@link RevisionMetadata} implementation that inspects the given object for fields with the configured annotations * A {@link RevisionMetadata} implementation that inspects the given object for fields with the configured annotations
* and returns the field's values on calls to {@link #getRevisionDate()} and {@link #getRevisionNumber()}. * and returns the field's values on calls to {@link #getRevisionDate()} and {@link #getRevisionNumber()}.
* *
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public class AnnotationRevisionMetadata<N extends Number & Comparable<N>> implements RevisionMetadata<N> { public class AnnotationRevisionMetadata<N extends Number & Comparable<N>> implements RevisionMetadata<N> {
private final Object entity; private final Object entity;
private final N revisionNumber; private final N revisionNumber;
private final DateTime revisionDate; private final DateTime revisionDate;
/** /**
* Creates a new {@link AnnotationRevisionMetadata} inspecing the given entity for the given annotations. If no * Creates a new {@link AnnotationRevisionMetadata} inspecing the given entity for the given annotations. If no
* annotations will be provided these values will not be looked up from the entity and return {@literal null}. * annotations will be provided these values will not be looked up from the entity and return {@literal null}.
* *
* @param entity must not be {@literal null}. * @param entity must not be {@literal null}.
* @param revisionNumberAnnotation * @param revisionNumberAnnotation
* @param revisionTimeStampAnnotation * @param revisionTimeStampAnnotation
*/ */
public AnnotationRevisionMetadata(final Object entity, Class<? extends Annotation> revisionNumberAnnotation, public AnnotationRevisionMetadata(final Object entity, Class<? extends Annotation> revisionNumberAnnotation,
Class<? extends Annotation> revisionTimeStampAnnotation) { Class<? extends Annotation> revisionTimeStampAnnotation) {
Assert.notNull(entity, "Entity must not be null!"); Assert.notNull(entity, "Entity must not be null!");
this.entity = entity; this.entity = entity;
if (revisionNumberAnnotation != null) { if (revisionNumberAnnotation != null) {
AnnotationDetectionFieldCallback numberCallback = new AnnotationDetectionFieldCallback(revisionNumberAnnotation); AnnotationDetectionFieldCallback numberCallback = new AnnotationDetectionFieldCallback(revisionNumberAnnotation);
ReflectionUtils.doWithFields(entity.getClass(), numberCallback); ReflectionUtils.doWithFields(entity.getClass(), numberCallback);
this.revisionNumber = numberCallback.getValue(entity); this.revisionNumber = numberCallback.getValue(entity);
} else { } else {
this.revisionNumber = null; this.revisionNumber = null;
} }
if (revisionTimeStampAnnotation != null) { if (revisionTimeStampAnnotation != null) {
AnnotationDetectionFieldCallback revisionCallback = new AnnotationDetectionFieldCallback( AnnotationDetectionFieldCallback revisionCallback = new AnnotationDetectionFieldCallback(
revisionTimeStampAnnotation); revisionTimeStampAnnotation);
ReflectionUtils.doWithFields(entity.getClass(), revisionCallback); ReflectionUtils.doWithFields(entity.getClass(), revisionCallback);
this.revisionDate = new DateTime(revisionCallback.getValue(entity)); this.revisionDate = new DateTime(revisionCallback.getValue(entity));
} else { } else {
this.revisionDate = null; this.revisionDate = null;
} }
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.repository.history.RevisionMetadata#getRevisionNumber() * @see org.springframework.data.repository.history.RevisionMetadata#getRevisionNumber()
*/ */
public N getRevisionNumber() { public N getRevisionNumber() {
return revisionNumber; return revisionNumber;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.repository.history.RevisionMetadata#getRevisionDate() * @see org.springframework.data.repository.history.RevisionMetadata#getRevisionDate()
*/ */
public DateTime getRevisionDate() { public DateTime getRevisionDate() {
return revisionDate; return revisionDate;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.repository.history.RevisionMetadata#getDelegate() * @see org.springframework.data.repository.history.RevisionMetadata#getDelegate()
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T> T getDelegate() { public <T> T getDelegate() {
return (T) entity; return (T) entity;
} }
} }

96
src/main/java/org/springframework/data/history/RevisionMetadata.java

@ -1,48 +1,48 @@
/* /*
* Copyright 2012 the original author or authors. * Copyright 2012 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.history; package org.springframework.data.history;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** /**
* Metadata about a revision. * Metadata about a revision.
* *
* @author Philipp Huegelmeyer * @author Philipp Huegelmeyer
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public interface RevisionMetadata<N extends Number & Comparable<N>> { public interface RevisionMetadata<N extends Number & Comparable<N>> {
/** /**
* Returns the revision number of the revision. * Returns the revision number of the revision.
* *
* @return * @return
*/ */
N getRevisionNumber(); N getRevisionNumber();
/** /**
* Returns the date of the revision. * Returns the date of the revision.
* *
* @return * @return
*/ */
DateTime getRevisionDate(); DateTime getRevisionDate();
/** /**
* Returns the underlying revision metadata which might provider more detailed implementation specific information. * Returns the underlying revision metadata which might provider more detailed implementation specific information.
* *
* @return * @return
*/ */
<T> T getDelegate(); <T> T getDelegate();
} }

178
src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java

@ -1,89 +1,89 @@
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.util; package org.springframework.data.util;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldCallback; import org.springframework.util.ReflectionUtils.FieldCallback;
/** /**
* A {@link FieldCallback} that will inspect each field for a given annotation. This field's type can then be accessed * A {@link FieldCallback} that will inspect each field for a given annotation. This field's type can then be accessed
* afterwards. * afterwards.
* *
* @author Oliver Gierke * @author Oliver Gierke
* @author Christoph Strobl * @author Christoph Strobl
*/ */
public class AnnotationDetectionFieldCallback implements FieldCallback { public class AnnotationDetectionFieldCallback implements FieldCallback {
private final Class<? extends Annotation> annotationType; private final Class<? extends Annotation> annotationType;
private Field field; private Field field;
/** /**
* Creates a new {@link AnnotationDetectionFieldCallback} scanning for an annotation of the given type. * Creates a new {@link AnnotationDetectionFieldCallback} scanning for an annotation of the given type.
* *
* @param annotationType must not be {@literal null}. * @param annotationType must not be {@literal null}.
*/ */
public AnnotationDetectionFieldCallback(Class<? extends Annotation> annotationType) { public AnnotationDetectionFieldCallback(Class<? extends Annotation> annotationType) {
Assert.notNull(annotationType, "AnnotationType must not be null!"); Assert.notNull(annotationType, "AnnotationType must not be null!");
this.annotationType = annotationType; this.annotationType = annotationType;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.util.ReflectionUtils.FieldCallback#doWith(java.lang.reflect.Field) * @see org.springframework.util.ReflectionUtils.FieldCallback#doWith(java.lang.reflect.Field)
*/ */
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
if (this.field != null) { if (this.field != null) {
return; return;
} }
Annotation annotation = AnnotatedElementUtils.findMergedAnnotation(field, annotationType); Annotation annotation = AnnotatedElementUtils.findMergedAnnotation(field, annotationType);
if (annotation != null) { if (annotation != null) {
this.field = field; this.field = field;
ReflectionUtils.makeAccessible(this.field); ReflectionUtils.makeAccessible(this.field);
} }
} }
/** /**
* Returns the type of the field. * Returns the type of the field.
* *
* @return * @return
*/ */
public Class<?> getType() { public Class<?> getType() {
return field == null ? null : field.getType(); return field == null ? null : field.getType();
} }
/** /**
* Retrieves the value of the field by reflection. * Retrieves the value of the field by reflection.
* *
* @param source must not be {@literal null}. * @param source must not be {@literal null}.
* @return * @return
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T> T getValue(Object source) { public <T> T getValue(Object source) {
Assert.notNull(source, "Source object must not be null!"); Assert.notNull(source, "Source object must not be null!");
return field == null ? null : (T) ReflectionUtils.getField(field, source); return field == null ? null : (T) ReflectionUtils.getField(field, source);
} }
} }

448
src/main/java/org/springframework/data/util/Version.java

@ -1,224 +1,224 @@
/* /*
* Copyright 2013-2015 the original author or authors. * Copyright 2013-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.util; package org.springframework.data.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
* Value object to represent a Version consisting of major, minor and bugfix part. * Value object to represent a Version consisting of major, minor and bugfix part.
* *
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public class Version implements Comparable<Version> { public class Version implements Comparable<Version> {
private static final String VERSION_PARSE_ERROR = "Invalid version string! Could not parse segment %s within %s."; private static final String VERSION_PARSE_ERROR = "Invalid version string! Could not parse segment %s within %s.";
private final int major; private final int major;
private final int minor; private final int minor;
private final int bugfix; private final int bugfix;
private final int build; private final int build;
/** /**
* Creates a new {@link Version} from the given integer values. At least one value has to be given but a maximum of 4. * Creates a new {@link Version} from the given integer values. At least one value has to be given but a maximum of 4.
* *
* @param parts must not be {@literal null} or empty. * @param parts must not be {@literal null} or empty.
*/ */
public Version(int... parts) { public Version(int... parts) {
Assert.notNull(parts, "Parts must not be null!"); Assert.notNull(parts, "Parts must not be null!");
Assert.isTrue(parts.length > 0 && parts.length < 5, String.format("Invalid parts length. 0 < %s < 5", parts.length)); Assert.isTrue(parts.length > 0 && parts.length < 5, String.format("Invalid parts length. 0 < %s < 5", parts.length));
this.major = parts[0]; this.major = parts[0];
this.minor = parts.length > 1 ? parts[1] : 0; this.minor = parts.length > 1 ? parts[1] : 0;
this.bugfix = parts.length > 2 ? parts[2] : 0; this.bugfix = parts.length > 2 ? parts[2] : 0;
this.build = parts.length > 3 ? parts[3] : 0; this.build = parts.length > 3 ? parts[3] : 0;
Assert.isTrue(major >= 0, "Major version must be greater or equal zero!"); Assert.isTrue(major >= 0, "Major version must be greater or equal zero!");
Assert.isTrue(minor >= 0, "Minor version must be greater or equal zero!"); Assert.isTrue(minor >= 0, "Minor version must be greater or equal zero!");
Assert.isTrue(bugfix >= 0, "Bugfix version must be greater or equal zero!"); Assert.isTrue(bugfix >= 0, "Bugfix version must be greater or equal zero!");
Assert.isTrue(build >= 0, "Build version must be greater or equal zero!"); Assert.isTrue(build >= 0, "Build version must be greater or equal zero!");
} }
/** /**
* Parses the given string representation of a version into a {@link Version} object. * Parses the given string representation of a version into a {@link Version} object.
* *
* @param version must not be {@literal null} or empty. * @param version must not be {@literal null} or empty.
* @return * @return
*/ */
public static Version parse(String version) { public static Version parse(String version) {
Assert.hasText(version, "Version must not be null o empty!"); Assert.hasText(version, "Version must not be null o empty!");
String[] parts = version.trim().split("\\."); String[] parts = version.trim().split("\\.");
int[] intParts = new int[parts.length]; int[] intParts = new int[parts.length];
for (int i = 0; i < parts.length; i++) { for (int i = 0; i < parts.length; i++) {
String input = i == parts.length - 1 ? parts[i].replaceAll("\\D.*", "") : parts[i]; String input = i == parts.length - 1 ? parts[i].replaceAll("\\D.*", "") : parts[i];
if (StringUtils.hasText(input)) { if (StringUtils.hasText(input)) {
try { try {
intParts[i] = Integer.parseInt(input); intParts[i] = Integer.parseInt(input);
} catch (IllegalArgumentException o_O) { } catch (IllegalArgumentException o_O) {
throw new IllegalArgumentException(String.format(VERSION_PARSE_ERROR, input, version), o_O); throw new IllegalArgumentException(String.format(VERSION_PARSE_ERROR, input, version), o_O);
} }
} }
} }
return new Version(intParts); return new Version(intParts);
} }
/** /**
* Returns whether the current {@link Version} is greater (newer) than the given one. * Returns whether the current {@link Version} is greater (newer) than the given one.
* *
* @param version * @param version
* @return * @return
*/ */
public boolean isGreaterThan(Version version) { public boolean isGreaterThan(Version version) {
return compareTo(version) > 0; return compareTo(version) > 0;
} }
/** /**
* Returns whether the current {@link Version} is greater (newer) or the same as the given one. * Returns whether the current {@link Version} is greater (newer) or the same as the given one.
* *
* @param version * @param version
* @return * @return
*/ */
public boolean isGreaterThanOrEqualTo(Version version) { public boolean isGreaterThanOrEqualTo(Version version) {
return compareTo(version) >= 0; return compareTo(version) >= 0;
} }
/** /**
* Returns whether the current {@link Version} is the same as the given one. * Returns whether the current {@link Version} is the same as the given one.
* *
* @param version * @param version
* @return * @return
*/ */
public boolean is(Version version) { public boolean is(Version version) {
return equals(version); return equals(version);
} }
/** /**
* Returns whether the current {@link Version} is less (older) than the given one. * Returns whether the current {@link Version} is less (older) than the given one.
* *
* @param version * @param version
* @return * @return
*/ */
public boolean isLessThan(Version version) { public boolean isLessThan(Version version) {
return compareTo(version) < 0; return compareTo(version) < 0;
} }
/** /**
* Returns whether the current {@link Version} is less (older) or equal to the current one. * Returns whether the current {@link Version} is less (older) or equal to the current one.
* *
* @param version * @param version
* @return * @return
*/ */
public boolean isLessThanOrEqualTo(Version version) { public boolean isLessThanOrEqualTo(Version version) {
return compareTo(version) <= 0; return compareTo(version) <= 0;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object) * @see java.lang.Comparable#compareTo(java.lang.Object)
*/ */
public int compareTo(Version that) { public int compareTo(Version that) {
if (that == null) { if (that == null) {
return 1; return 1;
} }
if (major != that.major) { if (major != that.major) {
return major - that.major; return major - that.major;
} }
if (minor != that.minor) { if (minor != that.minor) {
return minor - that.minor; return minor - that.minor;
} }
if (bugfix != that.bugfix) { if (bugfix != that.bugfix) {
return bugfix - that.bugfix; return bugfix - that.bugfix;
} }
if (build != that.build) { if (build != that.build) {
return build - that.build; return build - that.build;
} }
return 0; return 0;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (!(obj instanceof Version)) { if (!(obj instanceof Version)) {
return false; return false;
} }
Version that = (Version) obj; Version that = (Version) obj;
return this.major == that.major && this.minor == that.minor && this.bugfix == that.bugfix return this.major == that.major && this.minor == that.minor && this.bugfix == that.bugfix
&& this.build == that.build; && this.build == that.build;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
int result = 17; int result = 17;
result += 31 * major; result += 31 * major;
result += 31 * minor; result += 31 * minor;
result += 31 * bugfix; result += 31 * bugfix;
result += 31 * build; result += 31 * build;
return result; return result;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
@Override @Override
public String toString() { public String toString() {
List<Integer> digits = new ArrayList<Integer>(); List<Integer> digits = new ArrayList<Integer>();
digits.add(major); digits.add(major);
digits.add(minor); digits.add(minor);
if (build != 0 || bugfix != 0) { if (build != 0 || bugfix != 0) {
digits.add(bugfix); digits.add(bugfix);
} }
if (build != 0) { if (build != 0) {
digits.add(build); digits.add(build);
} }
return StringUtils.collectionToDelimitedString(digits, "."); return StringUtils.collectionToDelimitedString(digits, ".");
} }
} }

478
src/main/resources/org/springframework/data/domain/jaxb/atom.xsd

@ -1,240 +1,240 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://www.w3.org/2005/Atom" elementFormDefault="qualified" <xs:schema targetNamespace="http://www.w3.org/2005/Atom" elementFormDefault="qualified"
attributeFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema"> xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
This version of the Atom schema is based on version 1.0 of the format specifications, This version of the Atom schema is based on version 1.0 of the format specifications,
found here http://www.atomenabled.org/developers/syndication/atom-format-spec.php. found here http://www.atomenabled.org/developers/syndication/atom-format-spec.php.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd" /> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd" />
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
An Atom document may have two root elements, feed and entry, as defined in section 2. An Atom document may have two root elements, feed and entry, as defined in section 2.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:element name="feed" type="atom:feedType"/> <xs:element name="feed" type="atom:feedType"/>
<xs:element name="entry" type="atom:entryType"/> <xs:element name="entry" type="atom:entryType"/>
<xs:complexType name="textType" mixed="true"> <xs:complexType name="textType" mixed="true">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom text construct is defined in section 3.1 of the format spec. The Atom text construct is defined in section 3.1 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:sequence> <xs:sequence>
<xs:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/> <xs:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/>
</xs:sequence> </xs:sequence>
<xs:attribute name="type" > <xs:attribute name="type" >
<xs:simpleType> <xs:simpleType>
<xs:restriction base="xs:token"> <xs:restriction base="xs:token">
<xs:enumeration value="text"/> <xs:enumeration value="text"/>
<xs:enumeration value="html"/> <xs:enumeration value="html"/>
<xs:enumeration value="xhtml"/> <xs:enumeration value="xhtml"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
</xs:attribute> </xs:attribute>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="personType"> <xs:complexType name="personType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom person construct is defined in section 3.2 of the format spec. The Atom person construct is defined in section 3.2 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:choice minOccurs="1" maxOccurs="unbounded"> <xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" /> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="uri" type="atom:uriType" minOccurs="0" maxOccurs="1" /> <xs:element name="uri" type="atom:uriType" minOccurs="0" maxOccurs="1" />
<xs:element name="email" type="atom:emailType" minOccurs="0" maxOccurs="1" /> <xs:element name="email" type="atom:emailType" minOccurs="0" maxOccurs="1" />
<xs:any namespace="##other"/> <xs:any namespace="##other"/>
</xs:choice> </xs:choice>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:simpleType name="emailType"> <xs:simpleType name="emailType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
Schema definition for an email address. Schema definition for an email address.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:restriction base="xs:normalizedString"> <xs:restriction base="xs:normalizedString">
<xs:pattern value="\w+@(\w+\.)+\w+" /> <xs:pattern value="\w+@(\w+\.)+\w+" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:complexType name="feedType"> <xs:complexType name="feedType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom feed construct is defined in section 4.1.1 of the format spec. The Atom feed construct is defined in section 4.1.1 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:choice minOccurs="3" maxOccurs="unbounded"> <xs:choice minOccurs="3" maxOccurs="unbounded">
<xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1" /> <xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1" />
<xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1" /> <xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1" />
<xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1" /> <xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1" />
<xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1" /> <xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1" />
<xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1" /> <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1" />
<xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1" /> <xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1" />
<xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1" /> <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1" />
<xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1" /> <xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1" />
<xs:element name="entry" type="atom:entryType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="entry" type="atom:entryType" minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice> </xs:choice>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="entryType"> <xs:complexType name="entryType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom entry construct is defined in section 4.1.2 of the format spec. The Atom entry construct is defined in section 4.1.2 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="content" type="atom:contentType" minOccurs="0" maxOccurs="1" /> <xs:element name="content" type="atom:contentType" minOccurs="0" maxOccurs="1" />
<xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1" /> <xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1" />
<xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded" /> <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="published" type="atom:dateTimeType" minOccurs="0" maxOccurs="1" /> <xs:element name="published" type="atom:dateTimeType" minOccurs="0" maxOccurs="1" />
<xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1" /> <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1" />
<xs:element name="source" type="atom:textType" minOccurs="0" maxOccurs="1" /> <xs:element name="source" type="atom:textType" minOccurs="0" maxOccurs="1" />
<xs:element name="summary" type="atom:textType" minOccurs="0" maxOccurs="1" /> <xs:element name="summary" type="atom:textType" minOccurs="0" maxOccurs="1" />
<xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1" /> <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1" />
<xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1" /> <xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice> </xs:choice>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="contentType" mixed="true"> <xs:complexType name="contentType" mixed="true">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom content construct is defined in section 4.1.3 of the format spec. The Atom content construct is defined in section 4.1.3 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:sequence> <xs:sequence>
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" /> <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence> </xs:sequence>
<xs:attribute name="type" type="xs:string"/> <xs:attribute name="type" type="xs:string"/>
<xs:attribute name="src" type="xs:anyURI"/> <xs:attribute name="src" type="xs:anyURI"/>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="categoryType"> <xs:complexType name="categoryType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom cagegory construct is defined in section 4.2.2 of the format spec. The Atom cagegory construct is defined in section 4.2.2 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:attribute name="term" type="xs:string" use="required"/> <xs:attribute name="term" type="xs:string" use="required"/>
<xs:attribute name="scheme" type="xs:anyURI" use="optional"/> <xs:attribute name="scheme" type="xs:anyURI" use="optional"/>
<xs:attribute name="label" type="xs:string" use="optional"/> <xs:attribute name="label" type="xs:string" use="optional"/>
<xs:attributeGroup ref="atom:commonAttributes" /> <xs:attributeGroup ref="atom:commonAttributes" />
</xs:complexType> </xs:complexType>
<xs:complexType name="generatorType"> <xs:complexType name="generatorType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom generator element is defined in section 4.2.4 of the format spec. The Atom generator element is defined in section 4.2.4 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:string"> <xs:extension base="xs:string">
<xs:attribute name="uri" use="optional" type="xs:anyURI" /> <xs:attribute name="uri" use="optional" type="xs:anyURI" />
<xs:attribute name="version" use="optional" type="xs:string" /> <xs:attribute name="version" use="optional" type="xs:string" />
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="iconType"> <xs:complexType name="iconType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom icon construct is defined in section 4.2.5 of the format spec. The Atom icon construct is defined in section 4.2.5 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:anyURI"> <xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="idType"> <xs:complexType name="idType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom id construct is defined in section 4.2.6 of the format spec. The Atom id construct is defined in section 4.2.6 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:anyURI"> <xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="linkType" mixed="true"> <xs:complexType name="linkType" mixed="true">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom link construct is defined in section 3.4 of the format spec. The Atom link construct is defined in section 3.4 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:attribute name="href" use="required" type="xs:anyURI" /> <xs:attribute name="href" use="required" type="xs:anyURI" />
<xs:attribute name="rel" type="xs:string" use="optional"/> <xs:attribute name="rel" type="xs:string" use="optional"/>
<xs:attribute name="type" use="optional" type="xs:string" /> <xs:attribute name="type" use="optional" type="xs:string" />
<xs:attribute name="hreflang" use="optional" type="xs:NMTOKEN" /> <xs:attribute name="hreflang" use="optional" type="xs:NMTOKEN" />
<xs:attribute name="title" use="optional" type="xs:string" /> <xs:attribute name="title" use="optional" type="xs:string" />
<xs:attribute name="length" use="optional" type="xs:positiveInteger" /> <xs:attribute name="length" use="optional" type="xs:positiveInteger" />
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="logoType"> <xs:complexType name="logoType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom logo construct is defined in section 4.2.8 of the format spec. The Atom logo construct is defined in section 4.2.8 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:anyURI"> <xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="sourceType"> <xs:complexType name="sourceType">
<xs:annotation> <xs:annotation>
<xs:documentation> <xs:documentation>
The Atom source construct is defined in section 4.2.11 of the format spec. The Atom source construct is defined in section 4.2.11 of the format spec.
</xs:documentation> </xs:documentation>
</xs:annotation> </xs:annotation>
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1"/> <xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1"/>
<xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1"/> <xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1"/>
<xs:element name="id" type="atom:idType" minOccurs="0" maxOccurs="1"/> <xs:element name="id" type="atom:idType" minOccurs="0" maxOccurs="1"/>
<xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1"/> <xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1"/>
<xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1"/> <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1"/>
<xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1"/> <xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1"/>
<xs:element name="title" type="atom:textType" minOccurs="0" maxOccurs="1"/> <xs:element name="title" type="atom:textType" minOccurs="0" maxOccurs="1"/>
<xs:element name="updated" type="atom:dateTimeType" minOccurs="0" maxOccurs="1"/> <xs:element name="updated" type="atom:dateTimeType" minOccurs="0" maxOccurs="1"/>
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice> </xs:choice>
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:complexType> </xs:complexType>
<xs:complexType name="uriType"> <xs:complexType name="uriType">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:anyURI"> <xs:extension base="xs:anyURI">
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="dateTimeType"> <xs:complexType name="dateTimeType">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:dateTime"> <xs:extension base="xs:dateTime">
<xs:attributeGroup ref="atom:commonAttributes"/> <xs:attributeGroup ref="atom:commonAttributes"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:attributeGroup name="commonAttributes"> <xs:attributeGroup name="commonAttributes">
<xs:attribute ref="xml:base" /> <xs:attribute ref="xml:base" />
<xs:attribute ref="xml:lang" /> <xs:attribute ref="xml:lang" />
<xs:anyAttribute namespace="##other"/> <xs:anyAttribute namespace="##other"/>
</xs:attributeGroup> </xs:attributeGroup>
</xs:schema> </xs:schema>

332
src/test/java/org/springframework/data/util/VersionUnitTests.java

@ -1,166 +1,166 @@
/* /*
* Copyright 2015-2017 the original author or authors. * Copyright 2015-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.util; package org.springframework.data.util;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
/** /**
* Unit tests for {@link Version}. * Unit tests for {@link Version}.
* *
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public class VersionUnitTests { public class VersionUnitTests {
public @Rule ExpectedException exception = ExpectedException.none(); public @Rule ExpectedException exception = ExpectedException.none();
@Test // DATCMNS-384 @Test // DATCMNS-384
public void sameVersionsEqualOneDigits() { public void sameVersionsEqualOneDigits() {
Version first = new Version(6); Version first = new Version(6);
Version second = new Version(6); Version second = new Version(6);
assertThat(first, is(second)); assertThat(first, is(second));
assertThat(second, is(first)); assertThat(second, is(first));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void sameVersionsEqualTwoDigits() { public void sameVersionsEqualTwoDigits() {
Version first = new Version(5, 2); Version first = new Version(5, 2);
Version second = new Version(5, 2); Version second = new Version(5, 2);
assertThat(first, is(second)); assertThat(first, is(second));
assertThat(second, is(first)); assertThat(second, is(first));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void sameVersionsEqualThreeDigits() { public void sameVersionsEqualThreeDigits() {
Version first = new Version(1, 2, 3); Version first = new Version(1, 2, 3);
Version second = new Version(1, 2, 3); Version second = new Version(1, 2, 3);
assertThat(first, is(second)); assertThat(first, is(second));
assertThat(second, is(first)); assertThat(second, is(first));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void sameVersionsEqualFourDigits() { public void sameVersionsEqualFourDigits() {
Version first = new Version(1, 2, 3, 1000); Version first = new Version(1, 2, 3, 1000);
Version second = new Version(1, 2, 3, 1000); Version second = new Version(1, 2, 3, 1000);
assertThat(first, is(second)); assertThat(first, is(second));
assertThat(second, is(first)); assertThat(second, is(first));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void parsesVersionCorrectlyOneDigits() { public void parsesVersionCorrectlyOneDigits() {
Version version = Version.parse("5"); Version version = Version.parse("5");
assertThat(version, is(new Version(5))); assertThat(version, is(new Version(5)));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void parsesVersionCorrectlyTwoDigits() { public void parsesVersionCorrectlyTwoDigits() {
Version version = Version.parse("5.2"); Version version = Version.parse("5.2");
assertThat(version, is(new Version(5, 2))); assertThat(version, is(new Version(5, 2)));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void parsesVersionCorrectlyThreeDigits() { public void parsesVersionCorrectlyThreeDigits() {
Version version = Version.parse("12.1.3"); Version version = Version.parse("12.1.3");
assertThat(version, is(new Version(12, 1, 3))); assertThat(version, is(new Version(12, 1, 3)));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void parsesVersionCorrectlyFourDigits() { public void parsesVersionCorrectlyFourDigits() {
Version version = Version.parse("12.1.3.1000"); Version version = Version.parse("12.1.3.1000");
assertThat(version, is(new Version(12, 1, 3, 1000))); assertThat(version, is(new Version(12, 1, 3, 1000)));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void comparesToCorrectly() { public void comparesToCorrectly() {
Version version = new Version(1, 2, 3, 1000); Version version = new Version(1, 2, 3, 1000);
Version nextBuild = new Version(1, 2, 3, 1001); Version nextBuild = new Version(1, 2, 3, 1001);
Version nextBugfix = new Version(1, 2, 4); Version nextBugfix = new Version(1, 2, 4);
Version nextMinor = new Version(1, 3); Version nextMinor = new Version(1, 3);
Version nextMajor = new Version(2); Version nextMajor = new Version(2);
assertThat(nextMajor.isGreaterThan(nextMinor), is(true)); assertThat(nextMajor.isGreaterThan(nextMinor), is(true));
assertThat(nextMajor.isGreaterThan(nextMajor), is(false)); assertThat(nextMajor.isGreaterThan(nextMajor), is(false));
assertThat(nextMajor.is(nextMajor), is(true)); assertThat(nextMajor.is(nextMajor), is(true));
assertThat(nextMinor.isLessThan(nextMajor), is(true)); assertThat(nextMinor.isLessThan(nextMajor), is(true));
assertThat(nextMinor.isLessThan(nextMinor), is(false)); assertThat(nextMinor.isLessThan(nextMinor), is(false));
assertThat(nextMajor.compareTo(nextMajor), is(0)); assertThat(nextMajor.compareTo(nextMajor), is(0));
assertThat(nextMinor.compareTo(nextMinor), is(0)); assertThat(nextMinor.compareTo(nextMinor), is(0));
assertThat(nextBugfix.compareTo(nextBugfix), is(0)); assertThat(nextBugfix.compareTo(nextBugfix), is(0));
assertThat(nextBuild.compareTo(nextBuild), is(0)); assertThat(nextBuild.compareTo(nextBuild), is(0));
assertThat(version.compareTo(nextMajor), is(lessThan(0))); assertThat(version.compareTo(nextMajor), is(lessThan(0)));
assertThat(version.compareTo(nextMinor), is(lessThan(0))); assertThat(version.compareTo(nextMinor), is(lessThan(0)));
assertThat(version.compareTo(nextBugfix), is(lessThan(0))); assertThat(version.compareTo(nextBugfix), is(lessThan(0)));
assertThat(version.compareTo(nextBuild), is(lessThan(0))); assertThat(version.compareTo(nextBuild), is(lessThan(0)));
assertThat(version.compareTo(null), is(greaterThan(0))); assertThat(version.compareTo(null), is(greaterThan(0)));
assertThat(nextMajor.compareTo(version), is(greaterThan(0))); assertThat(nextMajor.compareTo(version), is(greaterThan(0)));
assertThat(nextMinor.compareTo(version), is(greaterThan(0))); assertThat(nextMinor.compareTo(version), is(greaterThan(0)));
assertThat(nextBugfix.compareTo(version), is(greaterThan(0))); assertThat(nextBugfix.compareTo(version), is(greaterThan(0)));
assertThat(nextBuild.compareTo(version), is(greaterThan(0))); assertThat(nextBuild.compareTo(version), is(greaterThan(0)));
} }
@Test // DATCMNS-384 @Test // DATCMNS-384
public void removesTrailingZerosAfterSecondValueForToString() { public void removesTrailingZerosAfterSecondValueForToString() {
assertThat(new Version(2).toString(), is("2.0")); assertThat(new Version(2).toString(), is("2.0"));
assertThat(new Version(2, 0).toString(), is("2.0")); assertThat(new Version(2, 0).toString(), is("2.0"));
assertThat(new Version(2, 0, 0).toString(), is("2.0")); assertThat(new Version(2, 0, 0).toString(), is("2.0"));
assertThat(new Version(2, 0, 0, 0).toString(), is("2.0")); assertThat(new Version(2, 0, 0, 0).toString(), is("2.0"));
assertThat(new Version(2, 0, 1).toString(), is("2.0.1")); assertThat(new Version(2, 0, 1).toString(), is("2.0.1"));
assertThat(new Version(2, 0, 1, 0).toString(), is("2.0.1")); assertThat(new Version(2, 0, 1, 0).toString(), is("2.0.1"));
assertThat(new Version(2, 0, 0, 1).toString(), is("2.0.0.1")); assertThat(new Version(2, 0, 0, 1).toString(), is("2.0.0.1"));
} }
@Test // DATACMNS-496 @Test // DATACMNS-496
public void parseShouldRemoveNonNumericVersionParts() { public void parseShouldRemoveNonNumericVersionParts() {
assertThat(Version.parse("2.0.0-rc1"), is(new Version(2, 0, 0))); assertThat(Version.parse("2.0.0-rc1"), is(new Version(2, 0, 0)));
} }
@Test // DATACMNS-719, DATACMNS-496 @Test // DATACMNS-719, DATACMNS-496
public void removesNonNumericSuffix() { public void removesNonNumericSuffix() {
assertThat(Version.parse("4.2.0.RELEASE"), is(new Version(4, 2, 0))); assertThat(Version.parse("4.2.0.RELEASE"), is(new Version(4, 2, 0)));
} }
@Test // DATACMNS-719, DATACMNS-496 @Test // DATACMNS-719, DATACMNS-496
public void rejectsNonNumericPartOnNonLastPosition() { public void rejectsNonNumericPartOnNonLastPosition() {
exception.expect(IllegalArgumentException.class); exception.expect(IllegalArgumentException.class);
exception.expectCause(Matchers.<Throwable> instanceOf(IllegalArgumentException.class)); exception.expectCause(Matchers.<Throwable> instanceOf(IllegalArgumentException.class));
exception.expectMessage("1.RELEASE.2"); exception.expectMessage("1.RELEASE.2");
Version.parse("1.RELEASE.2"); Version.parse("1.RELEASE.2");
} }
} }

12
src/test/resources/META-INF/beans.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" <beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans> </beans>

Loading…
Cancel
Save